.\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.07) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .ie \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .el \{\ . de IX .. .\} .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "PDF::Report 3pm" .TH PDF::Report 3pm "2009-06-17" "perl v5.10.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "PDF::Report" .IX Header "PDF::Report" .SH "NAME" PDF::Report \- A wrapper written for PDF::API2 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use PDF::Report; \& \& my $pdf = new PDF::Report(%opts); .Ve .SH "METHODS" .IX Header "METHODS" .ie n .IP "my $pdf = new PDF::Report(%opts);" 4 .el .IP "my \f(CW$pdf\fR = new PDF::Report(%opts);" 4 .IX Item "my $pdf = new PDF::Report(%opts);" .Vb 3 \& Creates a new pdf report object. \& If no %opts are specified the module \& will use the factory defaults. .Ve .Sp \&\fBExample:\fR .Sp .Vb 2 \& my $pdf = new PDF::Report(PageSize => "letter", \& PageOrientation => "Landscape"); \& \& my $pdf = new PDF::Report(File => $file); .Ve .Sp \&\f(CW%opts:\fR .Sp .Vb 6 \& PageSize \- \*(Aq4A\*(Aq, \*(Aq2A\*(Aq, \*(AqA0\*(Aq, \*(AqA1\*(Aq, \*(AqA2\*(Aq, \& \*(AqA3\*(Aq, \*(AqA4\*(Aq, \*(AqA5\*(Aq, \*(AqA6\*(Aq, \*(Aq4B\*(Aq, \& \*(Aq2B\*(Aq, \*(AqB0\*(Aq, \*(AqB1\*(Aq, \*(AqB2\*(Aq, \*(AqB3\*(Aq, \& \*(AqB4\*(Aq, \*(AqB5\*(Aq, \*(AqB6\*(Aq, \*(AqLETTER\*(Aq, \& \*(AqBROADSHEET\*(Aq, \*(AqLEDGER\*(Aq, \*(AqTABLOID\*(Aq, \& \*(AqLEGAL\*(Aq, \*(AqEXECUTIVE\*(Aq, \*(Aq36X36\*(Aq \& \& PageOrientation \- \*(AqPortrait\*(Aq, \*(AqLandscape\*(Aq .Ve .ie n .IP "$pdf\->newpage($nopage);" 4 .el .IP "\f(CW$pdf\fR\->newpage($nopage);" 4 .IX Item "$pdf->newpage($nopage);" Creates a new blank page. Pass \f(CW$nopage\fR = 1 to toggle page numbering. .ie n .IP "$pdf\->openpage($index);" 4 .el .IP "\f(CW$pdf\fR\->openpage($index);" 4 .IX Item "$pdf->openpage($index);" If no index is specified, this will open the last page of the document. .ie n .IP "($pagewidth, $pageheight) = $pdf\->\fIgetPageDimensions()\fR;" 4 .el .IP "($pagewidth, \f(CW$pageheight\fR) = \f(CW$pdf\fR\->\fIgetPageDimensions()\fR;" 4 .IX Item "($pagewidth, $pageheight) = $pdf->getPageDimensions();" Returns the width and height of the page according to what page size chosen in \*(L"new\*(R". .ie n .IP "$pdf\->addRawText($text, $x, $y, $color, $underline, $indent, $rotate);" 4 .el .IP "\f(CW$pdf\fR\->addRawText($text, \f(CW$x\fR, \f(CW$y\fR, \f(CW$color\fR, \f(CW$underline\fR, \f(CW$indent\fR, \f(CW$rotate\fR);" 4 .IX Item "$pdf->addRawText($text, $x, $y, $color, $underline, $indent, $rotate);" Add \f(CW$text\fR at position \f(CW$x\fR, \f(CW$y\fR with \f(CW$color\fR, \f(CW$underline\fR, \f(CW$indent\fR and/or \f(CW$rotate\fR. .Sp \&\s-1PDF::API2\s0 Removes all space between every word in the string you pass and then rejoins each word with one space. If you want to use a string with more than one space between words for formatting purposes, you can either use the hack below or change \s-1PDF::API2\s0 (that's what I did ;). The code below may or may not work according to what font you are using. I used 2 \exA0 per space because that worked for the Helvetica font I was using. .Sp \&\fBTo use a fixed width string with more than one space between words, you can do something like:\fR .Sp .Vb 10 \& sub replaceSpace { \& my $text = shift; \& my $nbsp = "\exA0"; \& my $new = \*(Aq\*(Aq; \& my @words = split(/ /, $text); \& foreach my $word (@words) { \& if (length($word)) { \& $new.=$word . \*(Aq \*(Aq; \& } else { \& $new.=$nbsp . $nbsp; \& } \& } \& chop($new); \& return $new; \& } .Ve .ie n .IP "$pdf\->setAddTextPos($hPos, $vPos);" 4 .el .IP "\f(CW$pdf\fR\->setAddTextPos($hPos, \f(CW$vPos\fR);" 4 .IX Item "$pdf->setAddTextPos($hPos, $vPos);" Set the position on the page. Used by the addText function. .ie n .IP "($hPos, $vPos) = $pdf\->\fIgetAddTextPos()\fR;" 4 .el .IP "($hPos, \f(CW$vPos\fR) = \f(CW$pdf\fR\->\fIgetAddTextPos()\fR;" 4 .IX Item "($hPos, $vPos) = $pdf->getAddTextPos();" Return the (x, y) value of the text position. .ie n .IP "$pdf\->setAlign($align);" 4 .el .IP "\f(CW$pdf\fR\->setAlign($align);" 4 .IX Item "$pdf->setAlign($align);" Set the justification of the text. Used by the addText function. .ie n .IP "$align = $pdf\->\fIgetAlign()\fR;" 4 .el .IP "\f(CW$align\fR = \f(CW$pdf\fR\->\fIgetAlign()\fR;" 4 .IX Item "$align = $pdf->getAlign();" Returns the text justification. .ie n .IP "$newtext = $pdf\->wrapText($text, $width);" 4 .el .IP "\f(CW$newtext\fR = \f(CW$pdf\fR\->wrapText($text, \f(CW$width\fR);" 4 .IX Item "$newtext = $pdf->wrapText($text, $width);" This is a helper function called by addText, which can be called by itself. \&\fIwrapText()\fR wraps \f(CW$text\fR within \f(CW$width\fR. .ie n .IP "$pdf\->addText($text, $hPos, $textWidth, $textHeight);" 4 .el .IP "\f(CW$pdf\fR\->addText($text, \f(CW$hPos\fR, \f(CW$textWidth\fR, \f(CW$textHeight\fR);" 4 .IX Item "$pdf->addText($text, $hPos, $textWidth, $textHeight);" Takes \f(CW$text\fR and prints it to the current page at \f(CW$hPos\fR. You may just want to pass this function \f(CW$text\fR if the text is \*(L"pre-wrapped\*(R" and setAddTextPos has been called previously. Pass a \f(CW$hPos\fR to change the position the text will be printed on the page. Pass a \f(CW$textWidth\fR and addText will wrap the text for you. \f(CW$textHeight\fR controls the row height. .ie n .IP "$pdf\->addParagraph($text, $hPos, $vPos, $width, $height, $indent, $lead);" 4 .el .IP "\f(CW$pdf\fR\->addParagraph($text, \f(CW$hPos\fR, \f(CW$vPos\fR, \f(CW$width\fR, \f(CW$height\fR, \f(CW$indent\fR, \f(CW$lead\fR);" 4 .IX Item "$pdf->addParagraph($text, $hPos, $vPos, $width, $height, $indent, $lead);" Add \f(CW$text\fR at ($hPos, \f(CW$vPos\fR) within \f(CW$width\fR and \f(CW$height\fR, with \f(CW$indent\fR. \&\f(CW$indent\fR is the number of spaces at the beginning of the first line. .ie n .IP "$pdf\->centerString($a, $b, $yPos, $text);" 4 .el .IP "\f(CW$pdf\fR\->centerString($a, \f(CW$b\fR, \f(CW$yPos\fR, \f(CW$text\fR);" 4 .IX Item "$pdf->centerString($a, $b, $yPos, $text);" Centers \f(CW$text\fR between points \f(CW$a\fR and \f(CW$b\fR at position \f(CW$yPos\fR. Be careful how much text you try to jam between those points, this function shrinks the text till it fits! .ie n .IP "$pdf\->getStringWidth($String);" 4 .el .IP "\f(CW$pdf\fR\->getStringWidth($String);" 4 .IX Item "$pdf->getStringWidth($String);" Returns the width of \f(CW$String\fR according to the current font and fontsize being used. .ie n .IP "$pdf\->addImg($file, $x, $y);" 4 .el .IP "\f(CW$pdf\fR\->addImg($file, \f(CW$x\fR, \f(CW$y\fR);" 4 .IX Item "$pdf->addImg($file, $x, $y);" Add image \f(CW$file\fR to the current page at position ($x, \f(CW$y\fR). .ie n .IP "$pdf\->addImgScaled($file, $x, $y, $scale);" 4 .el .IP "\f(CW$pdf\fR\->addImgScaled($file, \f(CW$x\fR, \f(CW$y\fR, \f(CW$scale\fR);" 4 .IX Item "$pdf->addImgScaled($file, $x, $y, $scale);" Add image \f(CW$file\fR to the current page at position ($x, \f(CW$y\fR) scaled to \f(CW$scale\fR. .ie n .IP "$pdf\->setGfxLineWidth($width);" 4 .el .IP "\f(CW$pdf\fR\->setGfxLineWidth($width);" 4 .IX Item "$pdf->setGfxLineWidth($width);" Set the line width drawn on the page. .ie n .IP "$width = $pdf\->\fIgetGfxLineWidth()\fR;" 4 .el .IP "\f(CW$width\fR = \f(CW$pdf\fR\->\fIgetGfxLineWidth()\fR;" 4 .IX Item "$width = $pdf->getGfxLineWidth();" Returns the current line width. .ie n .IP "$pdf\->drawLine($x1, $y1, $x2, $y2);" 4 .el .IP "\f(CW$pdf\fR\->drawLine($x1, \f(CW$y1\fR, \f(CW$x2\fR, \f(CW$y2\fR);" 4 .IX Item "$pdf->drawLine($x1, $y1, $x2, $y2);" Draw a line on the current page starting at ($x1, \f(CW$y1\fR) and ending at ($x2, \f(CW$y2\fR). .ie n .IP "$pdf\->drawRect($x1, $y1, $x2, $y2);" 4 .el .IP "\f(CW$pdf\fR\->drawRect($x1, \f(CW$y1\fR, \f(CW$x2\fR, \f(CW$y2\fR);" 4 .IX Item "$pdf->drawRect($x1, $y1, $x2, $y2);" Draw a rectangle on the current page. Top left corner is represented by ($x1, \f(CW$y1\fR) and the bottom right corner is ($x2, \f(CW$y2\fR). .ie n .IP "$pdf\->shadeRect($x1, $y1, $x2, $y2, $color);" 4 .el .IP "\f(CW$pdf\fR\->shadeRect($x1, \f(CW$y1\fR, \f(CW$x2\fR, \f(CW$y2\fR, \f(CW$color\fR);" 4 .IX Item "$pdf->shadeRect($x1, $y1, $x2, $y2, $color);" Shade a rectangle with \f(CW$color\fR. Top left corner is ($x1, \f(CW$y1\fR) and the bottom right corner is ($x2, \f(CW$y2\fR). .IP "\fBDefined color-names are:\fR" 4 .IX Item "Defined color-names are:" aliceblue, antiquewhite, aqua, aquamarine, azure, beige, bisque, black, blanchedalmond, blue, blueviolet, brown, burlywood, cadetblue, chartreuse, chocolate, coral, cornflowerblue, cornsilk, crimson, cyan, darkblue, darkcyan, darkgoldenrod, darkgray, darkgreen, darkgrey, darkkhaki, darkmagenta, darkolivegreen, darkorange, darkorchid, darkred, darksalmon, darkseagreen, darkslateblue, darkslategray, darkslategrey, darkturquoise, darkviolet, deeppink, deepskyblue, dimgray, dimgrey, dodgerblue, firebrick, floralwhite, forestgreen, fuchsia, gainsboro, ghostwhite, gold, goldenrod, gray, grey, green, greenyellow, honeydew, hotpink, indianred, indigo, ivory, khaki, lavender, lavenderblush, lawngreen, lemonchiffon, lightblue, lightcoral, lightcyan, lightgoldenrodyellow, lightgray, lightgreen, lightgrey, lightpink, lightsalmon, lightseagreen, lightskyblue, lightslategray, lightslategrey, lightsteelblue, lightyellow, lime, limegreen, linen, magenta, maroon, mediumaquamarine, mediumblue, mediumorchid, mediumpurple, mediumseagreen, mediumslateblue, mediumspringgreen, mediumturquoise, mediumvioletred, midnightblue, mintcream, mistyrose, moccasin, navajowhite, navy, oldlace, olive, olivedrab, orange, orangered, orchid, palegoldenrod, palegreen, paleturquoise, palevioletred, papayawhip, peachpuff, peru, pink, plum, powderblue, purple, red, rosybrown, royalblue, saddlebrown, salmon, sandybrown, seagreen, seashell, sienna, silver, skyblue, slateblue, slategray, slategrey, snow, springgreen, steelblue, tan, teal, thistle, tomato, turquoise, violet, wheat, white, whitesmoke, yellow, yellowgreen .Sp or the rgb-hex-notation: .Sp .Vb 1 \& #rgb, #rrggbb, #rrrgggbbb and #rrrrggggbbbb .Ve .Sp or the cmyk-hex-notation: .Sp .Vb 1 \& %cmyk, %ccmmyykk, %cccmmmyyykkk and %ccccmmmmyyyykkkk .Ve .Sp and additionally the hsv-hex-notation: .Sp .Vb 1 \& !hsv, !hhssvv, !hhhsssvvv and !hhhhssssvvvv .Ve .ie n .IP "$pdf\->drawPieGraph($x, $y, $size, $rData, $rLabels);" 4 .el .IP "\f(CW$pdf\fR\->drawPieGraph($x, \f(CW$y\fR, \f(CW$size\fR, \f(CW$rData\fR, \f(CW$rLabels\fR);" 4 .IX Item "$pdf->drawPieGraph($x, $y, $size, $rData, $rLabels);" Method to create a piegraph using a reference to an array of values. It also takes a reference to an array for labels for each data value. A legend with all the colors and labels will appear if \f(CW$rLabels\fR is passed. \f(CW$x\fR and \&\f(CW$y\fR are the coordinates for the center of the pie and \f(CW$size\fR is the radius. .ie n .IP "$pdf\->drawBarcode($x, $y, $scale, $frame, $type, $code, $extn, $umzn, $lmzn, $zone, $quzn, $spcr, $ofwt, $fnsz, $text);" 4 .el .IP "\f(CW$pdf\fR\->drawBarcode($x, \f(CW$y\fR, \f(CW$scale\fR, \f(CW$frame\fR, \f(CW$type\fR, \f(CW$code\fR, \f(CW$extn\fR, \f(CW$umzn\fR, \f(CW$lmzn\fR, \f(CW$zone\fR, \f(CW$quzn\fR, \f(CW$spcr\fR, \f(CW$ofwt\fR, \f(CW$fnsz\fR, \f(CW$text\fR);" 4 .IX Item "$pdf->drawBarcode($x, $y, $scale, $frame, $type, $code, $extn, $umzn, $lmzn, $zone, $quzn, $spcr, $ofwt, $fnsz, $text);" This is really not that complicated, trust me! ;) I am pretty unfamiliar with barcode lingo and types so if I get any of this wrong, lemme know! This is a very flexible way to draw a barcode on your \s-1PDF\s0 document. \&\f(CW$x\fR and \f(CW$y\fR represent the center of the barcode's position on the document. \&\f(CW$scale\fR is the size of the entire barcode 1 being 1:1, which is all you'll need most likely. \f(CW$type\fR is the type of barcode which can be codabar, 2of5int, 3of9, code128, or ean13. \f(CW$code\fR is the alpha-numeric code which the barcode will represent. \f(CW$extn\fR is the extension to the \f(CW$code\fR, where applicable. \f(CW$umzn\fR is the upper mending zone and \&\f(CW$lmzn\fR is the lower mending zone. \f(CW$zone\fR is the the zone or height of the bars. \&\f(CW$quzn\fR is the quiet zone or the space between the frame and the barcode. \f(CW$spcr\fR is what to put between each number/character in the text. \f(CW$ofwt\fR is the overflow width. \f(CW$fnsz\fR is the fontsize used for the text. \f(CW$text\fR is optional text beneathe the barcode. .ie n .IP "$pdf\->setFont($font);" 4 .el .IP "\f(CW$pdf\fR\->setFont($font);" 4 .IX Item "$pdf->setFont($font);" Creates a new font object of type \f(CW$font\fR to be used in the page. .ie n .IP "$fontname = $pdf\->\fIgetFont()\fR;" 4 .el .IP "\f(CW$fontname\fR = \f(CW$pdf\fR\->\fIgetFont()\fR;" 4 .IX Item "$fontname = $pdf->getFont();" Returns the font name currently being used. .ie n .IP "$pdf\->setSize($size);" 4 .el .IP "\f(CW$pdf\fR\->setSize($size);" 4 .IX Item "$pdf->setSize($size);" Sets the fontsize to \f(CW$size\fR. Called before \fIsetFont()\fR. .ie n .IP "$fontsize = $pdf\->\fIgetSize()\fR;" 4 .el .IP "\f(CW$fontsize\fR = \f(CW$pdf\fR\->\fIgetSize()\fR;" 4 .IX Item "$fontsize = $pdf->getSize();" Returns the font size currently being used. .ie n .IP "$pdf\->setInfo(%infohash);" 4 .el .IP "\f(CW$pdf\fR\->setInfo(%infohash);" 4 .IX Item "$pdf->setInfo(%infohash);" Sets the info structure of the document. Valid keys for \f(CW%infohash:\fR Creator, Producer, CreationDate, Title, Subject, Author, etc. .ie n .IP "%infohash = $pdf\->\fIgetInfo()\fR;" 4 .el .IP "\f(CW%infohash\fR = \f(CW$pdf\fR\->\fIgetInfo()\fR;" 4 .IX Item "%infohash = $pdf->getInfo();" Gets meta-data from the info structure of the document. Valid keys for \f(CW%infohash:\fR Creator, Producer, CreationDate, Title, Subject, Author, etc. .ie n .IP "$pdf\->saveAs($fileName);" 4 .el .IP "\f(CW$pdf\fR\->saveAs($fileName);" 4 .IX Item "$pdf->saveAs($fileName);" Saves the document to a file. .IP "\fBExample:\fR" 4 .IX Item "Example:" .Vb 3 \& # Save the document as "file.pdf" \& my $fileName = "file.pdf"; \& $pdf\->saveAs($fileName); .Ve .ie n .IP "print $pdf\->Finish(\e&\fIcallback()\fR);" 4 .el .IP "print \f(CW$pdf\fR\->Finish(\e&\fIcallback()\fR);" 4 .IX Item "print $pdf->Finish(&callback());" Returns the \s-1PDF\s0 document as text. Pass your own custom routine to do things on the footer of the page. Pass 'roman' for Roman Numeral page numbering. .IP "\fBExample:\fR" 4 .IX Item "Example:" .Vb 3 \& # Hand the document to the web browser \& print "Content\-type: application/pdf\en\en"; \& print $pdf\->Finish(); .Ve .SH "AUTHOR" .IX Header "AUTHOR" Andrew Orr