BOBO dHHHHHH lH T`&  Z- cwk).d.cwk8 8cU}pp 8ӨMortgage Analysisoto.cwk).d.cwk8 8cU}.cwk8 8` Ө._it.cwkgor`6 (#C0B9.cwk8 8cU}._Jaguar_submissions.cwk0B9.cwk8 8cU}._kc search list proto.cwk9.cwk8 8cU}storp x_AppleCSP.doc.cwk 8 8 8 8c xӨ._C++ Utilitiescwk 8 8 8 8cU}._CertJaguarBrainstorm#C0BB.cwk8 8cU}._CertJaguarBrainstorming7.cwkk8 8cU}._CSP Algorithms 0.6 (#C0B9.cwk8 cU}._it.cwkgorithms 0.6 (#C0B9.cwk8 8cU}._Jaguar_submissions.cwk0B9.cwk8 8cU}._kc search list proto.cwk9.cwk8 8cU}._Mortgage An H0Perry The CynicjFLOM!`xxHHLYg(HH(d'h l /c.O.YH/H/ c|8    } DSET(u(u ,l Z  t x | S([( S)<B /k"O %@)0Al>| Q k      Y v;S+FRGbn U !!*!,!="O""#g#s$%&'W'b)) ))*'*Q+H,l@       < B  ) K S   , - 0 A    ] d l      > |       e l q y           % [ a   a g      B  J  Q k               !  "   /  5        ,  2              Y       r s  v     ; S        t ~     < I            J T        D M                  4 =  ] h               + F  J V     V [  K Q             V \           bn         5  >    != !K  ! !  ! !  " "  # #   #9 #I  #g#s $d $m %- %6 % % & & 'W'b  's '  ' '  ( (  ( (  ) )   )> )J  ) )  ) *Q  * *  +V +_  +l +p  + +  , ,  ,' ,+  ,z !`rz ~   v ~       " %\ )Q Debugging Aids (Little Helpers when things go Bump in the Dark) What to do when things go wrong? You debug. Here is some help. The Importance of NDEBUG There is a single preprocessor #define symbol that can, in effect, turn all debugging code off. Its called NDEBUG. Simply add -DNDEBUG to your compiler arguments (CFLAGS) and recompile, and all debugging code you put into your code should go away. Of course, thats the theory. In practice, there are a few rules you should follow, and a few problems you should look out for. Lowercase vs. Uppercase Debug facilities whose names are ALL CAPS are (or could be) macros. Think of those as syntactic constructs, not as function calls. Conversely, debug facilities in lowercase are normal C++ constructs (functions, classes, members, etc.) and will behave as such . The Big Switches Obviously, any code can be removed for production builds by plac~ing it between the usual #if !defined(NDEBUG) ... #endif //NDEBUG This is somewhat ugly and can be hard to read, so use it sparingly. To remove a fairly small portion of code (say, one declaration or statement), use the IFDEBUG macro: IFDEBUG(unsigned int freeSlotCount = 0); If NDEBUG is defined, the argument is ignored; otherwise it is compiled. Note that IFDEBUG does not add a final semicolon, so it is validly used in part of a statement: int getMaxLength(State *state IFDEBUG(, bool verify = false)) will give getMaxLength a second argument only if NDEBUG is undefined. The reverse macro IFNDEBUG is also available, with the obvious reversed meaning. In the end, its up to your judgment as to how far you want to stretch the use of IFDEBUG and IFNDEBUG. At some point, using #if statements becomes more readable. Assertions and Errors The system provides an assert macro with the obvious meaning . Note that this is a macro, not a function we didnt invent its name (sorry). Assert will abort the program if its condition fails: assert(elements->first != NULL); The message generated will give the source location and expression string that failed, so you might as well make the expression as self-explanatory as possible. Note that for NDEBUG, the assert generates no code, so dont do anything with side effects in the asserted expression. Within the debugger, to intercept assertions, set a breakpoint on the C function abort. You may want to do this in your .gdbinit file. Generating Debug Messages The simplest application of debug logging is this: #include ... secdebug(subs, unexpected value %d for %s, theValue, theItemName); The secdebug macro works like printf. Its initial argument is a debug scope, an arbitrary string of up to 12 characters that identifies the subsystem this message belongs to. Compiled with default arguments, this code will log a message to the debug message stream. If compiled with NDEBUG, it will do nothing at all - in particular, it will not evaluate its arguments (no side effects, please!). If you want more detailed control, you can use the contents of namespace Debug. Take a look. Making Useful Debug Messages Printf-style formatting will let you make just about any debug messages you want. Here are some hints on making them nice, and making them fit in with the existing ones. If your message pertains to a C++ object, start it with the address of the object: secdebug(monitor, %p created with options 0x%x, this, options); If youre in a template and type information is useful, use typeName: secdebug(nexus, %p creating %s object, this, Debug::typeName().c_str()); Debug::typeName can be applied to either a type or an object. It returns a std::string representing the C++ name of the type . Displaying Debug Messages Just including debug calls in your code will get you nothing by default. You control the contents, destination, and various optional behaviors with environment variables. DEBUGSCOPE: What To Log In order to actually receive messages, you need to set environment variables. The DEBUGSCOPE variable can be set to a comma-separated list of scope strings, such as subs,thread. This causes all debug calls for the subs and thread scopes (and none other) to be displayed. The default (if DEBUGSCOPE is not set) is nothing. If you set DEBUGSCOPE to the special string all, then all scopes are displayed. You can also express all but these scopes by starting the variable with a dash: -thread,mutex will display all scopes except the mutex and thread ones. Note that secdebug calls with NULL scope strings will generate log messages even if DEBUGSCOPE is undefined or empty (this is an override feature used internally by the debug system). Removing the DEBUGSCOPE variable is thus not a foolproof way to turn all debug messages off. Set DEBUGDEST to /dev/null for that. DEBUGDEST: Where To Put It By default, debug messages go to the standard error of the process logging the message. You can set the DEBUGDEST variable to redirect messages to different destinations. If DEBUGDEST starts with a forward slash (/), it is an absolute filename path and the log goes there (appended, if the file exists). The file is opened in strict append mode, so multiple processes logging to the same file should not cause unseemly scrambling . If DEBUGDEST is of the form LOG_SOMETHING, it is interpreted as a syslog facility code, and the output goes to the system syslog facility. The priority used is always LOG_DEBUG. It is up to you to set up the syslog.conf file to direct log output to wherever you want it. If DEBUGDEST is of the form >&n, with n a decimal number, then output is redirected to file descriptor n of the current process. You are responsible for setting this file descriptor up, presumably from a parent process or really early in your code. If none of the above applies, as a last resort, the value of DEBUGDEST is used as a (relative) filename. Dont rely on this behavior - it may change. DEBUGOPTIONS: More Choices The DEBUGOPTIONS environment variable can be used to specify additional configuration options for debug logging. The format of DEBUGOPTIONS is a comma-separated list of option values. These options and their behavior are partially specific to particular destinations. The scope option prepends scope identifiers to each output line. This is probably a good idea in most cases, since many debug messages assume you know which scope they are for. Of course, if you only display a single scope, this is superfluous. The thread option prepends the identifier of the current thread to each output line. This is helpful when debugging multi-threaded programs. The identifier used is an arbitrary hex string . The pid option prepends the process id of the process being tested. This is useful if you have multiple processes whose debug destinations coincide (because e.g. they share standard error). The date option tells file destinations to include the time-of-day of each message in the log. Resolution is to the nearest second. Note that the syslog demon always adds datestamps to its output, so specifying the date option with a syslog destination will get you duplicate datestamps. The noflush option tells file destinations not to flush the buffers after each log message. This speeds up large debug logs, but may lose you the last few messages if the program crashes hard. Noflush does not apply to the syslog destination, which is always flushed. Some destinations perform locking to ensure that multi-threaded programs do not see debug messages interspersed. In some situations this can cause unpleasant performance hits, and you can turn of this locking with the nolock option. If you do, your output may be mangled a bit. You can add additional options if you write your own logging sink objects (see expert use). Debug Dumps Debug logging is designed for simple, one-line status messages to keep track of what your program is doing (or isnt). If you need to produce voluminous output to dump internal data structures for analysis, debug logging is an inefficient way. Happily, there is also a debug dump facility. The DEBUGDUMP environment variable controls debug dumping the same way that DEBUGSCOPE controls logging. The two settings are independent. Both dumps and logs go to DEBUGDEST and are interspersed. To implement a debug dump, write code like this: #ifdef DEBUGDUMP if (Debug::dumping(acl)) { Debug::dump(%s {, name); for (int n = 0; n < limit; n++) Debug::dump( %s, elem[n].code); Debug::dump(}\n); } #endif DEBUGDUMP Debug::dumping tells you whether dumping a particular scope has been enabled. Debug::dump works just like printf, and can produce partial or multiple line output without restriction. It is usually a good idea to produce a whole set of lines within one section of dump code. To simplify matters, there is a macro IFDUMPING that, somewhat like IFDEBUG, expands to either nothing or its second argument: IFDUMPING(acl, debugDump(object release)); where debugDump would be a function you have defined (under #ifdef DEBUGDUMP) to perform the actual dump. Usage Hints To perform advanced filtering on debug log messages, dump them into a file and use UNIX tools (grep, awk, perl) to analyze them later. If you need to perform online analysis (while the program is running), use a named pipe (man mkfifo), set DEBUGDEST to the pathname of the pipe, and attach a grep/awk/perl script to the pipe to analyze the output. Another, somewhat more elegant approach, is to write a runner tool that creates a pipe, sets DEBUGDEST to >&fileno(p), and forks/executes the test program. This would allow the program to also use other debugging facilities (ptrace etc.) to\ control the program under test. Avoid using the debug dump facility unless you have a very good reason to output complex, verbose state dumps. The debug dump facility is more complicated and error prone than secdebug, and requires more work and maintainance in practice. Dont generate debug messages or dumps from signal handlers. You may deadlock if the mainline code is in the middle of a logging call. Expert Use The header file includes additional features for managing debug logging. All debug logging is managed through a Debug::Target object. You can subclass Target to implement your own selection and formatting facility. If you create an object of a subclass of Debug::Target before any debug call is made, it will become the default object used by all debug calls. Use The Source, Luke - or talk to Perry. Output SiQnks Actual output is performed by Target::Sink objects. If you have particular output requirements, you can subclass Target::Sink and install your sink object into the target: #include class MySink : public Debug::Target::Sink { ... } Debug::Target::get().to(new MySink(...)); This lets you direct output in any way you like. You can switch output sinks as often as you like; a previously installed sink is automatically deleted by the Target::to method. (This means that your sink objects better be dynamically allocated.) Note that the configure method of a Sink object is passed a configuration string that is usually obtained from the DEBUGOPTIONS environment variable. You can handle any kinds of option strings you like; Target and standard Sink types are tolerant towards option strings they dont recognize. ZNDSETT`" , 0 4 p$    ( Actually, some lowercase constructs are macros, but if they are, they will be nice macros: they will not evaluate their arguments more than once; they will not introduce interesting syntax behind your back, and so on.DSETT"`"    l     !  # # Assert is defined in .DSETT:F`QQQQl  : F r x  Q| In earlier versions (up to Jaguar), you directly called Debug::debug, which compiled into inline empty code for NDEBUG. That caused the compiler heart burn in certain situations.DSETT` p t x $    l This uses the gcc ABI interface, which is supported by gcc 3.1 and later. Since the Panther code base cant compile with gcc 2.95.2 anyway, you dont have to worry about it, unless you port to a non-gcc compiler, you poor guy.DSETT==`\    @$   ] ] Strict append mode doesnt generally work right on NFS file systems. You have been warned.DSETT`  ,  P$     The thread identifier used bears no resemblance to the identifiers that gdb may use, since gdb makes up its own identifiers pretty much from whole cloth.DSET2H Z  6*ZDSET2H 6 Z 6*ZDSUM(Perry The CynicHDNISTYLL"JSTYL     d    U  1     3 :  K       5       N    %000000 0 0 0 0 0 0!!0%""##0""$$0""%%0""&&0"$''0"$((0"$ ))0"$ **0"$ ++0"$ ,,0"#--0"#..0"%!//0"%%00110002200033000440025500266002 77002 88002 99002 ::001 ;;001 <<003==003%>>??0>>!@@0>> AA0>>!BB0>@"" CC0>@#DD0>@$ EE0>@% FF0>@& GG0>@' HH0>?#( II0>?#) JJ0>A* KK0>A+%LL,MM0LL$-NN0LL.OO0LL/ PP0LN0QQ0LN1RR0LN2SS0LN3TT0LN4UU0LN5VV0LM%: WW0LM%; XX0LO8 YY0LO9 ZZ,[[0ZZ- N\\0ZZ.]]0ZZ<^^0Z\0__0Z\=``0Z\>aa0Z\?bb0Z\@cc0Z[&: dd0Z]Aee Bff0ee'Cgg0ee Dhh0eg $ii0eg %jj0eg &kk0eg 'll0ef(Gmm0ef(Hnn oo8nn pp8nn qq8nn rr8nn ss8nn tt8nn uu8nn vv8nn ww8nn xx8nn yy8nn zz8nn {{)||8{{*}}8{{+~~8{{,8{{-8{{- 8{{-!8{{-"8{{-#8{{-$8{{-%  &8 '8 (8 )8 *8 + .  /,/,.%<- 6 6 N  $   4160  9,9, 2/! 0404141  323257155 " 84841411   66HASH $ ô׌Lô،Z"0Ҵ"<"%8e>n:7QQA,Qv,oQpvqrst u/vTwyxyz **gjkhi*lm,,,0f ,/,T,v*~y, ,Q=},*|,- AV BWy:6;$ ' ( ) *+/& EHFI9K 1#9c<M +& &6 '7 (8 )92=.z<>= %84@?44[3)5#D$E%F&G<JVB%R&S'T(U&YC$K @ A \ ]@X>d%Q/a0b'^-_.`:PO - -% & 2 26 2L:Qfeg{hmhiCodjak*k*k(l)m + m +m(n*n * n *p *p *qit rl tuzoz}Bod}nH= CHAR       7"    77"   " ( ' %         .     / * 2 !/  $  '& &  & )&    2  7  3"      */HASH (66 (- : 1       % ; &,  & ) 1# :"   1 .     8 7 5 0  < 9+ :4      3 # 42&*: 9: /:I CELL (8'          6x $ x         7E       F  ( s @HASH     ( ) :;,xx13   -  D"# $ % & '*+ 2345 89B !.<*GHC 10A=>?@ / F GRPH *G    HASH      J7.l RULR  \&`` $B  @  ` ` $ $$Hl D h  $Hl D h$Hl +B.[.Y+B.[.ff ~ ``f +B.[.T6HASH@  6I-&,'0Q(v)*+0 2,Qh/v /Ty,Qv ! " /# T$ y% 0  h5  B" ,"h0(1`4`3b b(c" d" $ KSEN HASHLKUP  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~#$NAMEDefault Default SSHeaderBodyFooterFootnoteFootnote Index Bullet Title Section 1 Q & AQQA DefinitionCode ChecklistNumberClassic" Blue Gray 10 Blue Gray 2>ColorfulL 3D Table 1Z 3D Table 2e AccountingnHarvard{LegalDiamondEmphasisFilename CodeLinesWarning Doc ReferenceSubtitle Section 2 Default TBDFNTM HelveticaGeneva Lucida GrandeTimesPalatinoCourierMCROMCROoBlNMARKMRKS MOBJWMBTSNAP""" HH HHQ @#o{Zo{o{cw{s5BNsF1=5BJR=5F15JR=B9cZ)JJRJR9-kg95BVV^=ZBB-kJR5NsNsJR%){VNsVNsRF1so{kZcso{g9u6ZZR=JRJRo{JRF1BRF1ZRNsZg9JR5VBZ^V=JRRVJRNsscNsNs%)F1cBZF1BRcBVB{BNsBZ=ZsZR2g9JRcRcBRRZc^VJRcRc^kZ^VZ^=F1B{)JNs^o{JRVJRZBRo{Zg9ccZRsJRVRZVkZ{{{s{sw{{wwk1VRVJR^cg9Nsg9F1VNscNsVV^Z^Zg9JRRRZg9s^VZg9=ZVV^F1ZcZkZNsRVZg9BVo{e ws{{wwo{{o{wo{sVwcg9{sscg9wwswswwRwsw{s{wswsg9w-sg9o{s g9ssco{kZckZwo{{޸?V=F1{BF1BJRBRF1R5VF1g9NsRZVR1g91JRkZZc?kZg9g9{g9g9NskZg9o{g9g9ckZkZ{kZo{ww^o{kZcsskZ{޸F{kZ{{w{{{{w{s{{sGc9=BkZNswVVBBJRRZNsF19NsF1JRBF1F11=F1BBwNsNsJRF1F1Rg9F1=kZNsF1g9^JR^Ns=F1^kZF1RRJRJRo{=NsJRBBNs=RcNsJR1kZBRwww{w{o{sswcso{o{o{w{swso{sww{swwwss{w{{g9g9w{kZs{KkZg9ccVR=RcNsVVcRsZ^NsF1V^RJRRwg9NsNsVVZZkZNskZNsVNscVJRNsNsJRVcRJRRNs=RNswZ^g9VVZg9RNsJRg9NsNsVJRJRRNskZJRNsg9g{o{wkZkZwsw {skZwwsso{o{g9wwg9sswkZkZkZso{kZ{w{kZo{wwkZw_(g9RZNsZVJRJRRJRVcRNsVcNsZkZZVkZRVo{JRcJRo{ZRJRkZNsRZRNscNsg9Ns^Qs{wkZ{o{{{{wwww{{ww{{{{!sV^ZNsVNsF1sRJRRg9kZF1=BNsNsVg9g9NskZRNsV=NswJRJRVR#cVcNsJR^^BNskZJRZR^JRNsRJRg9F1NsJRRZcF1F1wZJRVR^Ns^Ns9{w{w{{w{{wws5g9BF1BkZF1JR^F1F1JRJRBcF1JRF1VNsVJRNsc w,o{ws{swws{{wZo{swsw/ZVNsJR=JRBJRJR^NswJRB-kBJRBB= kZo{GkZ^Vcg9s^ZkZZR^sVVcco{o{Vg9Zc{^csZo{wkZZkZscZ{^cskZg9VckZZo{scZkZ^o{ZVg9Zscg9VccZZwg9ccso{ZkZo{kZ g9kZ{o{o{g9o{ssg9kZkZo{wkZkZ{kZkZw{kZg9g9kZwkZo{g9kZwkZsskZ swkZg9o{skZwo{kZ{kZ{o{g9o{Kg9RZZZg9VVZ^ZkZo{^Vg9VR^ZNscZs^JRc^^ZVV^RZg9o{JRV^Zo{Nsg9VRJRg9o{c{g9g9Vco{kZg9^{ZRVg9^ZJRkZg9^c{B{kZskZo{o{kZsskZso{{o{swkZskZkZso{o{{o{kZo{so{so{skZo{skZwkZo{sZso{skZo{kZswo{o{swswso{wo{kZkZo{kZww{q4sg9cg9VckZV{Vg9c^^cg9{kZZg9^ZwkZ^cg9ZZg9Rg9swcckZ^Vo{^Z^^Rw^o{kZc^g9oo{g9kZ^g9g9kZc{g9c^kZ^ccso{^^ckZcg9g9cg9g9{g9kZkZsg9^s^co{g9kZZg9g9scsg9^o{o{# kZBRg99RZZcJRF1JRVZ֩# so{kZscVg9o{wkZckZg9kZQkZww{{{{{{w{{{{{{{w^RZJRVBZNsRg9VR9kZNsNso{JRkZBVJRRF1Vg9JRVg9NsRJRRZBNsg9RJRVcNsg9NsJRg9kZRNsJRBF1RkZRRg9BVNskZ=ws{ww{w{g9kZo{ss{wo{/VZZ{wRRVcNsRRo{JRZVRZg9o{%kZswo{wkZw{^g9g9kZ^w%g9^g9Nsg9g9wwV^Z^^c{g9ss{{w {wo{wo{wws{wwo{w.swo{wsw{o{w{{wo{{w{sw{o{kZo{ww{ww{o{sws{w{wo{{w{HkZRF1kZ^ZRVJRZJRR^kZF1V^RRNskZNsVo{NssJRF1Vo{RkZVBZo{Vo{JRJRo{ZZRRVRJRVkZo{co{VRVRJRo{RkZF1cNskZVRNsRZRg9{5so{wskZwskZ{sswws{Vo{g9wskZo{ss{kZsg9wwskZ{wswo{o{wo{kZskZ^kZsw^kZswwwqo{RR^^o{NsRNso{VJRZ{RJRcR!NsVVRV^^cVRNsRNsRZg9o{F1RsJRg9ccZVV^Zg9NsF1cRKskZkZg9kZ^kZ{ws{wo{wo{{{o{w{so{{o{swo{o{{U&o{ckZVZg9ZkZg9Zcg9RVZkZ{Zc{o{ckZZcckZg9kZcg9ZkZ^g9swgo{{o{wo{wsww{s{{o{{{{sw{w{{sswo{ww{VcRRZ^Ro{JRkZJRNsNsF1Rg9VF1wJRJRVJR/Rg9VVJRNsNsRJR{NsVJRVJRJRF1sRg9^^NsJRNsR=NsVVRZg9F1JRwRcVZZVo{F1NsJRo{q4{wkZwkZkZ{{cwsswswsso{sww{^kZo{o{kZkZ{o{g9so{sssg9wg9{kZskZswso{wk kZRZZRNskZg9VRNscJR^R!NsRkZZRg9sBsRJRNs^cZJRNsg9VkZRRZg9Zg9cZRBVNsZZ_{{o{ww{wo{{s{kZ^kZkZo{kZs{{{{w{{kZcVVVcZ^ZcZRNsg9VkZ^g9Z^sscZZg9Zg9g9^cZo{{V^g9o{w^VccV{kZcZg9ZZo{o{Kw{{{{{ {ww{o{so{ws{w{q=F1g9F1BBkZF1RV=ZZRRNs^JR^^=JRF1^JRF1JRF11JRg9F1BNsg9F1^JRNsRZJRkZBg9BF15RB5JR9o{g9{wg9{{w{{*{kZF1cZR=^JRo{RF1^Vo{^RF1RRNsF1cZo{F1ZRg9NsRNsJRZRsF1NsZcF1cZRNsZo{NsF1VZBcVRNsRVZkZsVg9RZRVNsRkZo{ss{w{wswwsswo{{swskZswwssssw{{skZs{o{o{{kZ{ww{o{wo{w{{sw{swsso{o{g9^{sswsww{$o{Ro{NssRRVo{RRNs^JRNsVcJRBo{RVRcNskZZRVkZBRNscZZNs^sJRJRg9VJRg9R{^RVNsNs=cRVNsg9VRJRF1NsNs^g9NsVRkZ4g9{w{o{ws{so{^g9wo{s{wo{{kZ{{wwsww{s{o{wo{s{w{wwswss{ss{sswsww{{w{{wU&cF1F1JRg9JRJRF19o{B^^Ns==F1JRBBJRg99RF1B9JR^JRB=o{5=F1F1JR-kso{wo{skZg9o{3sB=-k=JR9=B1g999BRVRJRB9JRZֱ1wso{ws{o{sso{so{sws{sw{ޱ!o{{{{{&{kZF1cZZV9Zo{RZ^NsNsJRg9ZVwg9cZ^c{VRNsZkZ^F1Ro{NsRo{ZRNsZo{VRJRVV^cg9R^9g9ZNsg9NsRo{RkZg9NsVR^Vwssws{g9wkZso{{o{s{o{{o{s*{ss{wo{ww{o{ww{sg9skZo{V{swwsw{skZwkZw{so{{w{8g9NsNsg9sJRJRNsVF1Ro{skZBcJRJRF1g9cg9NsF1NsNskZJRwNsJRF1NssNsVJRZ^NsZZVg9^kZJRBsF1NsNsccBg9RF1JRNsg9R{F1VcNsRF1NsJRNskZ'{s{w{s{o{^F1F1R{{ss{޿Cc^ZVcco{VkZVZ^^wo{VVg9Z{ssw^ZV^o{{'o{{s{w{{kZF1ckZRJRZVg9NsR9NsF1g9kZJRNsw^JRVkZRRkZVZVNskZ^RZNsRVsZJR^^RNsZRNsVVkZcNsg9Nsg9cJRF1{JRZ=VJRco{NsVo{ o{o{{{wwkZo{^{cg9so{w6{sw^w{wwkZw{sswsw{swwsw{o{ZwkZkZso{sswo{cg9wg9kZo{kZg9o{g9w{ww{sKcJR=NsNsJRJRkZ5BcJRBB5o{BF1VF1=NsB=F1BcB^NsJRJRZF1BF19F1BF1JRg99ZNsF1NsF1=F1g9cVR1kZJRF1g9BF1g9BRRVNsg9RBkZF1B=Nsg9Usw{ww^{w o{swwo{{s{w{w ^=Ns=BF1=cF1F1^F10sF1g9BF1NskZc=g9BF1Ns=BF1^JRJRF1^F1BJRJRR5VBo{9g9F1F1RNs==F1F1cB9F1BR=BF1=wwsw{{{{{s{{s{VRNsVZg9VRkZ=RV^VRkZVkZVRJRRg9VNsJRZNsRVcg9F1g9VkZVRRF1RRVkZRVg9Nscg9sRV o{g9V^cwwRRkZ^VRkZ){wsskZg9wwo{wwVRws{skZo{o{kZsZwswwswo{s{ww{s{sg9s{sss{o{s{o{w{o{ws{w{wwso{?kZF1BRcNscJRo{F1F1g9JRkZVRNsg9sB=11BVVBcss#{kZwg9{wo{kZ=V^RJR==Z9VBF1kZV9JRF15JRw=NsB=NsBZַ;s{swwo{o{RskZw{o{JRwwswsscVw{޷9{g9{{{{{w{{{{Q$kZBcVNsRNs=Z^F1NsRJRJRNsRNsg9JRg9BVVBg9JRNsNsJRJRkZF1o{NsNsg9%wwsso{kZww;o{o{kZo{o{g9g9o{g9o{s{{w{{Is{F1RRJRRo{^RNsg9NsVNsRVRo{ZJRVRJRccRcRNsRZVJRg9^RJRZg9JRNsRZcRRVcVNscRVNsZkZkZNsRo{RNsg9F1Rg9cBZNscO{{{{{w{{w{{{{{o{RNskZJR;RJRRo{=ZVg9RF1kZNsNsckZRRkZRRkZF1VkZBZVNsRs=RR^RBcVJRRJRg9RRBVZ^Nsg9RNsg9cNsZ^sVV{{{;o{sJRZVVcwRsNsJRNsNsg9^cNs=JRNsJRRF1^wTNAMDC1473A3D28D802AB96F040B8A681FCPRT-.s com.apple.print.PrintSettings.PMColorMode com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMColorMode 3 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMCopies com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMCopies 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMDestinationType com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMDestinationType 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMFirstPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMFirstPage 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMLastPage com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMLastPage 9999 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PrintSettings.PMPageRange com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PrintSettings.PMPageRange 1 32000 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PrintSettingsTicket  com.apple.print.PageFormat.PMHorizontalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMHorizontalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMOrientation com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMOrientation 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalRes com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalRes 72 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMVerticalScaling com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMVerticalScaling 1 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.subTicket.paper_info_ticket com.apple.print.PageFormat.PMAdjustedPageRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPageRect 0.0 0.0 767.8798828125 587.51995849609375 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PageFormat.PMAdjustedPaperRect com.apple.print.ticket.creator com.apple.printingmanager com.apple.print.ticket.itemArray com.apple.print.PageFormat.PMAdjustedPaperRect -9.96002197265625 -11.520000457763672 782.03997802734375 600.47998046875 com.apple.print.ticket.client com.apple.printingmanager com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 0 com.apple.print.PaperInfo.PMPaperName com.apple.print.ticket.creator CUPS_CPL com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMPaperName na-letter com.apple.print.ticket.client CUPS_CPL com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPageRect com.apple.print.ticket.creator CUPS_CPL com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPageRect 0.0 0.0 767.8798828125 587.51995849609375 com.apple.print.ticket.client CUPS_CPL com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.PMUnadjustedPaperRect com.apple.print.ticket.creator CUPS_CPL com.apple.print.ticket.itemArray com.apple.print.PaperInfo.PMUnadjustedPaperRect -9.96002197265625 -11.520000457763672 782.03997802734375 600.47998046875 com.apple.print.ticket.client CUPS_CPL com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 1 com.apple.print.PaperInfo.ppd.PMPaperName com.apple.print.ticket.creator CUPS_CPL com.apple.print.ticket.itemArray com.apple.print.PaperInfo.ppd.PMPaperName Letter com.apple.print.ticket.client CUPS_CPL com.apple.print.ticket.modDate 2003-06-17T17:16:42Z com.apple.print.ticket.stateFlag 1 com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PaperInfoTicket com.apple.print.ticket.APIVersion 00.20 com.apple.print.ticket.privateLock com.apple.print.ticket.type com.apple.print.PageFormatTicket ETBLhDSUMTHDNITSTYLTMCROoBlNMARKWMBTSNAP TNAMĠCPRTETBLA