From patchwork Tue Jun 20 14:29:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 18752 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 741C2C3292 for ; Tue, 20 Jun 2023 14:29:22 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 3F9C3628C8; Tue, 20 Jun 2023 16:29:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1687271360; bh=isx0kpb7PaWO8SQy8nMzry65L0CBhbgORYCCL5eWRR4=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=sC0q5z5waHJlStRkMrzkLkopUzs1E0Reb2R9wXKwpkxztjhgfZ7iME4Ny7FTCmGX9 hRCxFmEYlAp8L7Hj9gA8ugzTCC79shdecDDF9G+bQY9eKMAa13/q4NvFVZWv2HfPlC qlexOWDbSO7GnUwUYria8H2p+YLxN7NEdT1Km3NsniZijZy0LBbsaEWPKPSMN8WN+e xeeUAz35yjREGtZaOoc7OZXXBQlXJFqutkPR3UZUleS7KqtneMeFKw1K9Q8wQe7FKq Mn1Wwy44Zi+kpLdCHaSzmjIdMz1OohXen6r+xSds1xajrgPIsgEVlbrbWcEOYiIQlD f0XoHKv/bW7Bw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 52B5F617B2 for ; Tue, 20 Jun 2023 16:29:18 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="SGDGEqhL"; dkim-atps=neutral Received: from uno.lan (unknown [IPv6:2001:b07:5d2e:52c9:72c3:346:a663:c82d]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 2DFCB10FE; Tue, 20 Jun 2023 16:28:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687271323; bh=isx0kpb7PaWO8SQy8nMzry65L0CBhbgORYCCL5eWRR4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=SGDGEqhL0Y2+qW3Lc14yhenyFDVn1rTGJtd4udWsCpHl85a95rC+rBICN9l2FT3HE iWhXbnlr8d5thgJprZn99qm81Y1nqWd0XqL54U38cM9mMOwr0zV104tJx2STHnJ/aY +tOqzfJ9CqerDh8CQ49CvlpXoPhA8czGrIHf1ZU0= To: libcamera-devel@lists.libcamera.org Date: Tue, 20 Jun 2023 16:29:01 +0200 Message-Id: <20230620142904.72600-2-jacopo.mondi@ideasonboard.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> References: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC 1/4] libcamera: camera_sensor: Cache rotationTransform_ X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" The rotationTransform_ depends on a V4L2 control whose value does not change for the whole lifetime of the camera. Instead of re-calculating it everytime the camera is configured, cache it at properties initialization time. Signed-off-by: Jacopo Mondi Reviewed-by: Umang Jain Reviewed-by: Laurent Pinchart --- include/libcamera/internal/camera_sensor.h | 1 + src/libcamera/camera_sensor.cpp | 54 +++++++++++++--------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 02c77ab037da..02b4b4d25e6d 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -107,6 +107,7 @@ private: Rectangle activeArea_; const BayerFormat *bayerFormat_; bool supportFlips_; + Transform rotationTransform_; ControlList properties_; diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index f3a5aa37149f..a15a6c89c5c8 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -461,18 +461,36 @@ int CameraSensor::initProperties() const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION); if (rotationControl != controls.end()) { + propertyValue = rotationControl->second.def().get(); + /* - * validateTransform() compensates for the mounting rotation. - * However, as a camera sensor can only compensate rotations - * by applying H/VFlips, only rotation of 180 degrees are - * automatically compensated. The other valid rotations (Rot90 - * and Rot270) require transposition, which the camera sensor - * cannot perform, so leave them untouched. + * Cache the Transform associated with the camera mounting + * rotation for later use in validateTransform(). + */ + bool success; + rotationTransform_ = transformFromRotation(propertyValue, &success); + if (!success) { + LOG(CameraSensor, Warning) + << "Invalid rotation of " << propertyValue + << " degrees - ignoring"; + rotationTransform_ = Transform::Identity; + } + + /* + * Adjust property::Rotation as validateTransform() compensates + * for the mounting rotation. However, as a camera sensor can + * only compensate rotations by applying H/VFlips, only rotation + * of 180 degrees are automatically compensated. The other valid + * rotations (Rot90 and Rot270) require transposition, which the + * camera sensor cannot perform, so leave them untouched. */ - propertyValue = rotationControl->second.def().get(); if (propertyValue == 180 && supportFlips_) propertyValue = 0; properties_.set(properties::Rotation, propertyValue); + } else { + LOG(CameraSensor, Warning) + << "Rotation control not available, default to 0 degreees"; + rotationTransform_ = Transform::Identity; } properties_.set(properties::PixelArraySize, pixelArraySize_); @@ -1038,21 +1056,11 @@ void CameraSensor::updateControlInfo() */ Transform CameraSensor::validateTransform(Transform *transform) const { - /* Adjust the requested transform to compensate the sensor mounting rotation. */ - const ControlInfoMap &controls = subdev_->controls(); - int rotation = 0; - - const auto &rotationControl = controls.find(V4L2_CID_CAMERA_SENSOR_ROTATION); - if (rotationControl != controls.end()) - rotation = rotationControl->second.def().get(); - - bool success; - Transform rotationTransform = transformFromRotation(rotation, &success); - if (!success) - LOG(CameraSensor, Warning) << "Invalid rotation of " << rotation - << " degrees - ignoring"; - - Transform combined = *transform * rotationTransform; + /* + * Combine the requested transform to compensate the sensor mounting + * rotation. + */ + Transform combined = *transform * rotationTransform_; /* * We combine the platform and user transform, but must "adjust away" @@ -1083,7 +1091,7 @@ Transform CameraSensor::validateTransform(Transform *transform) const * rise to this is the inverse of the rotation. (Recall that * combined = transform * rotationTransform.) */ - *transform = -rotationTransform; + *transform = -rotationTransform_; combined = Transform::Identity; } From patchwork Tue Jun 20 14:29:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 18755 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 090BAC3237 for ; Tue, 20 Jun 2023 15:02:17 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4BC1961E4F; Tue, 20 Jun 2023 17:02:16 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1687273336; bh=sXZ2cn55kCYdKBGFnXh8BZ/z8U9OhfNkafFRS+m+MOw=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=HjwgcBGR2Z2yWMAmJzd1NA1j83TBZsy/cn86KLMwHeOfHQ++1SZE1Yqc2cgL6op0H 4QakEJbji+aT0V3TrCMHyg/aTItFJ0AMf5B8TO2lv+yRYUk3lDg/hdxEeE9qRHfNi+ qdn3KtaMAmhM4D19wNnHPm22v9P5lk4L/yptBGyJj5v+vChgYz/CSzyfNKH1o5Jh9i T2G/c19UuYHynaMbGM/GDZXWVxulSK0kqLurhGXd6mz55P3nr1C34R30zHI9eZP/K8 UQIjauOPbVfBHuwyxfNHCc9yeKbOaL3OtEEZxgZ6pENjbAfMjY1yg1bDBD41/61bYF J4VfIAKvlZ+sg== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id EE29C628BF for ; Tue, 20 Jun 2023 16:29:18 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="sgnd7MgD"; dkim-atps=neutral Received: from uno.lan (unknown [IPv6:2001:b07:5d2e:52c9:72c3:346:a663:c82d]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B249515E9; Tue, 20 Jun 2023 16:28:43 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687271324; bh=sXZ2cn55kCYdKBGFnXh8BZ/z8U9OhfNkafFRS+m+MOw=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sgnd7MgDGdyBH/uH4OrXYeZbJT2uvbf9Q2mpWFYseMCA/czvRFA0orokF02XwsrR2 /FRwxnkUZXM29vVcIG/IE5poV86FIvMvnxtspopT0ZarVBsRXajbmujZBHwrtEcCQn A0Z/72xMGzJ2l1i8kWofnb8swqr6erp2qH3/pw+k= To: libcamera-devel@lists.libcamera.org Date: Tue, 20 Jun 2023 16:29:02 +0200 Message-Id: <20230620142904.72600-3-jacopo.mondi@ideasonboard.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> References: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> MIME-Version: 1.0 X-Mailman-Approved-At: Tue, 20 Jun 2023 17:02:15 +0200 Subject: [libcamera-devel] [RFC 2/4] libcamera: camera: Introduce CameraConfiguration::orientation X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Introduce CameraConfiguration::Orientation in the CameraConfiguration class. The Orienation enumeration defines all possible 2D transformations that can be applied to an image. The enumeration values follows the ones defined by the EXIF specification, Tag 247 'orientation'. The newly introduced filed is meant to replace CameraConfiguration::transform which is not removed yet not to break compilation. Signed-off-by: Jacopo Mondi --- Documentation/Doxyfile.in | 2 + Documentation/rotation/flip-rotate-0.eps | 170 ++++++++++++++++++ Documentation/rotation/flip-rotate-0.png | Bin 0 -> 16488 bytes Documentation/rotation/flip-rotate-180.eps | 191 ++++++++++++++++++++ Documentation/rotation/flip-rotate-180.png | Bin 0 -> 22198 bytes Documentation/rotation/flip-rotate-270.eps | 197 +++++++++++++++++++++ Documentation/rotation/flip-rotate-270.png | Bin 0 -> 21367 bytes Documentation/rotation/flip-rotate-90.eps | 195 ++++++++++++++++++++ Documentation/rotation/flip-rotate-90.png | Bin 0 -> 21020 bytes Documentation/rotation/rotate-0.eps | 169 ++++++++++++++++++ Documentation/rotation/rotate-0.png | Bin 0 -> 9086 bytes Documentation/rotation/rotate-180.eps | 189 ++++++++++++++++++++ Documentation/rotation/rotate-180.png | Bin 0 -> 22182 bytes Documentation/rotation/rotate-270.eps | 196 ++++++++++++++++++++ Documentation/rotation/rotate-270.png | Bin 0 -> 21016 bytes Documentation/rotation/rotate-90.eps | 196 ++++++++++++++++++++ Documentation/rotation/rotate-90.png | Bin 0 -> 21528 bytes include/libcamera/camera.h | 12 ++ src/libcamera/camera.cpp | 51 +++++- 19 files changed, 1567 insertions(+), 1 deletion(-) create mode 100644 Documentation/rotation/flip-rotate-0.eps create mode 100644 Documentation/rotation/flip-rotate-0.png create mode 100644 Documentation/rotation/flip-rotate-180.eps create mode 100644 Documentation/rotation/flip-rotate-180.png create mode 100644 Documentation/rotation/flip-rotate-270.eps create mode 100644 Documentation/rotation/flip-rotate-270.png create mode 100644 Documentation/rotation/flip-rotate-90.eps create mode 100644 Documentation/rotation/flip-rotate-90.png create mode 100644 Documentation/rotation/rotate-0.eps create mode 100644 Documentation/rotation/rotate-0.png create mode 100644 Documentation/rotation/rotate-180.eps create mode 100644 Documentation/rotation/rotate-180.png create mode 100644 Documentation/rotation/rotate-270.eps create mode 100644 Documentation/rotation/rotate-270.png create mode 100644 Documentation/rotation/rotate-90.eps create mode 100644 Documentation/rotation/rotate-90.png diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in index 1447abdb7d8c..b7fe29e6a0ba 100644 --- a/Documentation/Doxyfile.in +++ b/Documentation/Doxyfile.in @@ -78,6 +78,8 @@ EXPAND_ONLY_PREDEF = YES INCLUDE_PATH = "@TOP_SRCDIR@/include/libcamera" INCLUDE_FILE_PATTERNS = *.h +IMAGE_PATH = "@TOP_SRCDIR@/Documentation" + PREDEFINED = __DOXYGEN__ \ __cplusplus \ __attribute__(x)= diff --git a/Documentation/rotation/flip-rotate-0.eps b/Documentation/rotation/flip-rotate-0.eps new file mode 100644 index 000000000000..3abf587d10e0 --- /dev/null +++ b/Documentation/rotation/flip-rotate-0.eps @@ -0,0 +1,170 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.17.8 (https://cairographics.org) +%%CreationDate: Mon Jun 19 14:15:10 2023 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 1 349 301 +%%EndComments +%%BeginProlog +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +/cairo_data_source { + CairoDataIndex CairoData length lt + { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def } + { () } ifelse +} def +/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def +/cairo_image { image cairo_flush_ascii85_file } def +/cairo_imagemask { imagemask cairo_flush_ascii85_file } def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 1 349 301 +%%EndPageSetup +q 0 1 349 300 rectclip +1 0 0 -1 0 301 cm q +Q q +0 0 348.801 300 re W n +q +0 0 349 300 re W n +[ 348.800011 0 0 -300 0 300 ] concat +/cairo_ascii85_file currentfile /ASCII85Decode filter def +/DeviceGray setcolorspace +<< + /ImageType 1 + /Width 436 + /Height 375 + /Interpolate true + /BitsPerComponent 8 + /Decode [ 0 1 ] + /DataSource cairo_ascii85_file /FlateDecode filter + /ImageMatrix [ 436 0 0 -375 0 375 ] +>> +cairo_image + Gb"/lH'B#^*QJC]5o)cU+Nh+KLf'#%#Z3ln'SD9J)P_(1E"ej`NCL7;__oH$eQf/#H$T:YM + ;akP!]chgd=@tR.C_!F'GQP:,,k#3'i>"bSPWV@?+%Ap427eulL(,:If@]*VQ/c;rL)O0l2 + Gj+4qB'S4]msM\K:QFg@)!-'ETjP3J&+9VSk)&Hg32`m9SR%;/` + *BHAT%_5MgujP\hH1IfCqafId_iiNW'$.)R^K.M)Pi()pF&Jb + K*N*ZMJfq\#T>PIr*BOraR2A1[uCNhH2;]O./'CB5MWpBa_7;`U@Ho)Km^b)6m:mI)2.C*f + IC\%rgN+ansc6UC%s6=5?APT@m?4+,fL5r'fD-1%+D?E@Z'qXUVlV[_\nt]0Eq*BR^DL?Q& + Hh?8q9G-2XVo>7bhUoTiTMPMV`>Xgmmd.kojZ&1NaU\8n<1>hloJb4f=N;V + )Aq\280"h-H%6^7d>d1uXRAR+:J$CU&(j:(ZIP&jNV65%$h2d#bkE_V'rS=`YH+We9NFW.` + 0-(/JpV;r:^TT4sKQaBIQ&V^X;H)"a5_U2p]QA%e3,]Ii(D9F + E2+dF5a]6Y'9gk]pB_TH8k0_%8i85Q;eY/m++T'AbTeU/@*SgXk,DnCcWO#1*]/s_PZ8'ni + 2o8d>JP)Xk!>Nj&P%h#5@Oef^sT]eBVrZ&fci%-1@FWiN2&[b2%qPC!Jo0lgHFGY#=]ci`H + *(UE+3!3cK8iV%Fir:=Y,L0'(=acIJjf0Dup45#"]L]NPe91r3Fg__Ka/aWXen)VUR + i]j!#U8*8+aPLj](97t`I)&d#GhNm.3Tnk1Pe*rKr'S"UJ?'*d!UFh9)e="*^a)>!TO@D_' + 9He6U>qck@GMXSK&!X)jPd-9okNGriYB,#C5]/VS(DYoZibc+UI4^JM,Z8_/!?FPG^UX[(^ + -XM_$uk2*TBgNCY[Nc'ts.m2nu,]h"h"*I\Lk#9ATi<<;#e#L\JMFG*nYY@8W=3"L::4e<`/Y\U_)V73;71f)4Ztj^f<=UtZ(t:q(Ahhr)gnD<@#%4d%\;.;j9rKc]Ke_V^+Deu& + -TW&p'J30-2%G$>ni$?1%.%UYWYde-_\Rs+9nni.:coBV@%QQ!jfh,[Vj"R;#6"*IPp,?L!tnIcJl1LF + E["M]Ep7(R6>[BX)4^g.nu2$P]q:7qL+]C"uh)s*oHLih7UVd2q002M+R*#2_s5!_npfDHO + ;eKp1hkr(c:\iDef$k84c$A#c[C4Dnhh=>;RjX#eT8@K&>"mRG5*=,DPc0MKsQPe9th,]U= + FjK1X?]sY$2A?[)ZAQmt[gfd&E.@gVW[A@kM"u6G`JA8 + aJsYXWR[fhMf=2jGl+!3W6Jcf+N_N#(a + A7B[[!-BB\-@PjFe_$Z@oE8@K$dP6,k.B.(2]/(/9gB9)M+[5!ep3e@%[eA96QCX;*l.R13&TFBd^rrk$=DqJ)'#]a/Cj6<0Es + '9R/OCoQkP:a_XPRTu4^=U%u3?$KlD7_5_+l3)T$[(4e\pFm8CDB$5)Uba6^TD)N:4k[-Ja]tXr$;::Y;koYN5F4N'^Vqm,Jk1+#Eo"hs>G + ^"nMk/hsD@8TdnZjt_Om\F='^<'CbEMo!3i^7Y61=O53QY@!9G$Hkb$(Uq#!L7tq[N8glnl + j_6:AC\c=!IG(.QE)u&77q)RdVX[crTb60j.>Z/`.dQ_R42-)`.^ak%CS\V5CX8lLd#Z + O$A_7Ii%.C0XjA,:>";+>e:!ND5bB)JH/+6u> + _Yuur3\Y!<89a.J\$BX8Yl+F/2Xc4?f[&#FXssJh,Mb91&Sq\96_35DW_'KC=N8[d8@K$rT + PiE-A!+sf&(At0WDC[7F(32J728q#B'>s'*[gf,uSTg"NBk\@tAp\Ktpi,e]@V + &>N&?'*cVrLR-15L&,5Qp@m.a)-D6((-PD'/n&\M75J-WE!dDC[7J!d-@`#O2qtX + J=AL$!@ieToejUpacJdBkc?C#adAJsa@JXA#J=.An7%ElmLdVXV\9*a_p5t&<)X@TT)8,-/ + b5[>!R4ePV=)+M2STXXj38OTBOQu\.->N$m5r;6XG]R9NF\o"+Fr4FaB<^`b<#!E+Slr#9p + DC[hiW;h.8OPJ**Pn`Jk_:FE-SOF=iPD3++UtZ71bKoKOH')tpLumf4D^aF&*YfRW[_YG8j + l\M"e4@%`Q3VuPn`8fpQ0E,T:NTWDUtZ+.eX)n0A_f3CF&A'^DAsuW5Hb88h,[Vh"R8P$cR + XQ;[j=G8Y)9I]]E0;*]f1*ie$LSU5>MNHDQARY?17VaL5$D)mNfNR=!D,LGr)q,+OZe`MuD + t^\XM16E"V>0#dO;Thj@LD&a<&N(PAK;d?!OQJk1*[&=/qAM269*Ir)JO&:k,:74^Z1!YOZ + \j9akcJI!;,QCjfAJo^%P&a<$orBMAIh]@.D?5phME@ka,E#,Ot + Cm:]R^P2(0/5YD6'f\!>[>cr"9K32gk,>^c-CdZC=`!#t3%d;)Xhu,;_O2!.3P4,*CYbYiSK,A#rj^CS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM)) + sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))s + DSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sD + SS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sDSS:uMM))sE> + .;/U7Qt(>uc=[(,'Xp-lbW&]<+Z=:?*&s.4Ze3&rE?',0n1G[X_t[H'36VG@h-\2+B:pboj + rSL(*cU6_E983\jrSL(*cU6_E983\jrSL(*cU6_E983\jrSL(*cU6_E983\jrSL(*cU6_E9 + 83\jrSL(*cU6_E983\jrSL(*cU6_E983\jrSL(*cU6_E983\jrSL(*cU6_E983\`]='4"8j + I5>2bE]9[3XQ9;Y`Lj1q&eE(1&W3,k`\(7^rJW(e"s-'%0T#Q"CS_HGm6R0IV"#0o2IV?*3 + LJMRe+B`MdVi/@bN)Sd4.39.fB#&m$9c8]d?!M#:'1Cfph!,#j#N!!]2^_n"Lj1q&eE(1&W + 3,k_qS<8@Y%\.55B4TqZ"(rOf)&YEo^mPCG7L%-tE2EZ+Ob#:uS7qt9ADiCKB,\Q')*$ZlR + 0IV"#0o2IV?*3LJMRe+B`MdVi/@bN)Sd4.39.fB#+9M_q1WR53(k=GfomcokW=6U>(8M)*m + **P?G4B#f.V?C;L^Z!*oZJ7JV09Oo4nm)]h5+cS0a58[OcV)qqjPO#2h%XKX3%Hf +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/flip-rotate-0.png b/Documentation/rotation/flip-rotate-0.png new file mode 100644 index 0000000000000000000000000000000000000000..878ea43ed4fcf75f8e0b0c17b13aab31855b51eb GIT binary patch literal 16488 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 literal 0 HcmV?d00001 diff --git a/Documentation/rotation/flip-rotate-180.eps b/Documentation/rotation/flip-rotate-180.eps new file mode 100644 index 000000000000..eb3cbeb21404 --- /dev/null +++ b/Documentation/rotation/flip-rotate-180.eps @@ -0,0 +1,191 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.17.8 (https://cairographics.org) +%%CreationDate: Mon Jun 19 14:16:22 2023 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 1 349 301 +%%EndComments +%%BeginProlog +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +/cairo_data_source { + CairoDataIndex CairoData length lt + { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def } + { () } ifelse +} def +/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def +/cairo_image { image cairo_flush_ascii85_file } def +/cairo_imagemask { imagemask cairo_flush_ascii85_file } def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 1 349 301 +%%EndPageSetup +q 0 1 349 300 rectclip +1 0 0 -1 0 301 cm q +Q q +0 0 348.801 300 re W n +q +0 0 349 300 re W n +[ 348.800011 0 0 -300 0 300 ] concat +/cairo_ascii85_file currentfile /ASCII85Decode filter def +/DeviceGray setcolorspace +<< + /ImageType 1 + /Width 436 + /Height 375 + /Interpolate true + /BitsPerComponent 8 + /Decode [ 0 1 ] + /DataSource cairo_ascii85_file /FlateDecode filter + /ImageMatrix [ 436 0 0 -375 0 375 ] +>> +cairo_image + Gb"/lH(5T!J]F[8Nh2Fp(_.Dq3CRfs"=)!aG_!l36:6t)ba:+2F1D`'@B5#cR0g?A + cY=Wk^$\@'2N'sNJSQbA@R@SqjaFZ]6_(qF\c!Re^L_&?ZjudrdFf54tT_*QWO-clJ(b2!f + >t;G/4nbA*0084VFW)ru&p?ij62X.1_'?4X#3.HK?K7lmr?CEft[cB2Q=YR;upF]p:^_m0uk^bN1^_m0uk^bN1^ + _m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_ + m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m + 0uk^bN1^_m0uk^bN1^_m0uk^bN1^_m0uk^bN1^_n:!c7Z&8l_Nr=E#(uu1J?iICN]3hP[$1 + @KsN=G@?F:lK?E+'(![EpcJXYQb]NPP=\cipc[`>I3c!J1CN@9c>FDKM/L-emD9Ye3itRYr + X;YWF1X:P-rdZg(J2@1T1]Dn\rdZg(J2@1T1]Dn\rdZg(J2@1T1]Dn\rdZg(J2@1T1]Dn\r + dZg(J2@1T1]Dn\rdZg(J2@1T1]Dn\rdZg(J2@1T1]Dn\rdZg(J2@1T1]Dn\rdZg(0Y]D^@f + q)EXM5,p['pr>S(;SJhH@n>Q],=tW'tmLa5==@o5j9O['NKeB:7VEGB\6]F)o;Y1-Y]7=lg + sr.@[EH#)W/H]i16lRQ5,ga66h70FCO& + 3@fF*c0Pu54AcN"+lJ:sE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE + 2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2 + E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E + ]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaE2E]^ADiCaZ()hPD.c6-j2S2 + E%;-<:Z]\\1[$(sRQK<2IN;%J0/L@6pa>\!4KYiM)f!;%HVhLX&@uN_!/4Gge=A`43J[6U] + @t1"f-GL@9`dm9"f'OKrm!R8RYN]6fMBr=o.;:kdP!*rh0)*4>?Wk3]Q6]CX)4,^$EC0Po* + A=^2a6n,1T*8kdn1qT;O2S*lUYq(qi/BnYN'H6Z5N%Jbi/BnYN'H6Z5N%Jbi/BnYN'H6Z5N + %Jbi/BnYN'H6Z5N%Jbbi[,"J69$pk$rpcImq^ektBPa+;S>.bmQSE]ij5S/J)Pbp*\-ugIm + 1E/>_]"h"7GTc'"?W2t$iSDtKaP^@pIid#\S=PZeLZ"4J*FX^'KTh"SpZQTo-ooLSZF"*t; + Tgt6sg[/ahZ@4efg8q(6)1S+l$#$It_*`N^M/@$%WPlnA@/N9c5puX`?H:qU!Ya!tTIJ7&U + :>U5AJu$LlZ1sEiq6aq5XV[G#N@9'SnDf-aiE.)aopM?S/B[#U"?`K/!7*nfCENi.UA/CCp(AdFpXVV_7Tp + AuhA=jN&brc:":Ze"-6'g>TaT8k;NR7O`W]mtVbQ3bFe,&&<8-L$32\(uT=i'=Zf;hYtIf& + O`bG:>6[i)A.Z2Q4!d"C9Skdo+`X1\+HNN%[,`.l,(dTiU"MSEXRP'Xbget"Hg(CS5Fhk3! + U&DRM.WKcNhKqgT!_%Y&B+uo='-/EqZ%^NjY7N4_/L92,H6Z\Cc+(-^a8qM\sT/=WH`r0gC + (S=\olaLZ0Uq7n\o@JHCQFoQf&I?\VY)iij:9Tpi73,nOIf#b?%a@F7/q(8B(MbIn^#k[E8 + ^mI/M(_e$#ed,p?6J&`cKVn!L^,0+AArW\r\QIgaY.]4j[,oL[]qf#)Bq+H<; + dX&\>9#2/XXm<[W/U#h40H:`TS_9`Xh1m`+^m-lt$QlnOtaZXjm0thM7^M2:6C!p]IS$U_, + )oi.,[!oQkQh4_9D<>_AK.KE;c+:mWRNB/X%_Dc%e97N_nXV;\*8%0Ue[+h78h-JaU[B&GOG6rq + :V$u96!`JlR<0C!d/"3'\jV@BF;mM6;"kAk>U0Z6Uq:hU8[fl<)ZLX8)Je$6#jScg,j@ + 5LJ?%5p$O(\9,,iu+DguVE,"]6U#gNqs'P'd$h'<,GC>-C-P@2gU#T_G3P7)1>e/A'9Ld/h + R]/\cFgBa6\G:lpOTM>O"UmjNlf83S\3RV0.oEk_D&hK5ak1Ji#S`Pn",L&ZqTIpClB$:JF + Umj*W=oKGRYO;nbP4C0MeG'rkNFSH"Zc,+8FEVk,rRT>(Ap7VQ=-qV>AL/""P&?T<(D(4S0 + rR/]*7V)P@Bq\6'(OLj)-LW@d`i:!,15'SSDj_540ueDs%H?ro;;R5PAY!bY8PtHlcOC + )P8@gJ,=DQoGYkH$Jc4iR8`R]NU#-F2\[%od'*(r\4[l`[.n_;s7._JsQo[fR+r9oUk8PH] + /`pnK)fkh5\ms.]_K=]iER1[pp3U'9Mak\[pk\Q[@RCHFo5;t/!X`RN[G4X-:uaI4;^C0FAkT_7ES_p$Rnr,s3#DCsFNspgf=r,V^66<@:`#OAoD='[H(XF06aTO'#38ONPD.3r(/h)Y5:Y#f2=[Dc]'puIPX1#>4,ipX!a#/s:*e>S"j;lk.XuoHq?O?&l@ck9K5g`q;^Hfeq:)IN3Hq40qM9q`BE + k;a6K_49rDf\uB\O&tN<&lcf#HdFg)@jb!@p32e>I[Fr2Y?,r@-_mi7KWH#$USR"hSm%HcA + jh?JOTqF$M@btJ9q'j-WdS5]H@2?8We]M;L#'G>]6(L#;bN12;VT/:JI*P\i(;JnCCViBnV + 5=Xc"SX8Opdr&rOZoG@TQYM0jd`f'dkHu'5MpHA4NP$'\uCf=JsSDn^0J6d&ojsF):Vr*U: + =QLEL(]F,<;5ZlV-o9Z6H5'ch?te'C,nU\4X?3ENbKWOss`Zj`-b6W&)Kfo/nAUe:_aV:qg + 1,&^JZlr6>i9=.!XtGt$.EQCF\>)X.Ic1hpZ4VIe6!["=XI,>bUSlj9BaaV + #,MNdWCQSnbcX6FpYQ4NMS('.(>gEC/>_/FB=t3iONhOB9R#"8^$h_iU$,(&_kXHQ)pWRR< + 63_Bl-ItkrVVC9U$_$h8PW(uR<5@s+:I3)7=]RF6*XZP[mH4p + @>t$$pApLIc,a,KlW1AdgnJA:&E@,NeDgY@tR<5A*+:I1SU,_@Q*3HR0CIMn1]-q#-Z2Mmc_#qHf4>HQ?KRpU7 + C.eX8I;6f/LsDX3&o@VhLOD&U]Y@IA_n9SiURjOGdRt(HZ+'q3P4fF[A`i-/HsghHQ;;XNhAA87Vk<8-E-7/gG1n)P4%Oq"[Nu7*CfX'aEk7!_7aba\g?1 + [@I@qkh>G7D\:#R-TMCVk%o&Oh4$&N\X%c07IXsD2g(]7^Zd:d4D*OX`:`#79V`#>`%]"9S + Sp-ql%9\#KmIt:7n*2!1ZK;th*Z+YJ**XE.`41>ClF4"B+[EMeS;W + 4OEtkAV,O(3uq)2-:,s*GS95MOD1AI6nfmkiV)r!eXQQ\qEF@[FfP0-/gYA@p)\ + r94lUXOT*@qXU.,]G[d18q8$0VV+LVknUc*M)=QGp[PY"a-[#T^E9^REsctj5OO.QbmA;=d + 4lEZ\&S@ons+@^/3*D8CALsAEf_.8#PJ%'(Ok$=h0CsD7We\D"g+dde&3Pa:)OCIr2`5-9Z%Tfsi*=3?3b(K9$Fk$j*,> + cVRG8Fu)9((h81HjM^aI1EV +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/flip-rotate-180.png b/Documentation/rotation/flip-rotate-180.png new file mode 100644 index 0000000000000000000000000000000000000000..d58c6b67f47610439693b60e3cfeb825ca2e9f6f GIT binary patch literal 22198 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≪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 iulEAW&T^F0t^O|&+iRV>Zxc5F0000> +cairo_image + Gb"/lH#sa#^;glg64ADR"@Ca-84#WY[]gG=7:hsD$beoOb$e-e";)Ms_m$*bQiS9PZA1$5& + J?4>IGYVJPpbTSAVS1!+rnP*a:]W!n#a`'dXA06ec"=YQ/q]8_fNDiqU_#/*:%RUqtmMnI" + u`(3S;Bko7-f-W@Pm-1S\i6n":4ZG./`K)Q\5N.ieX/Dm=h0$B+F(Z!$WfS]cqXHR<,o + %1PEj6pJm@=d@#(/e!de'=BY9AFQQ\S*(cH.raRPsh13e@b(F9uM42`1gpWk3Vt/Ls`(\8= + HZ!'7R7#)e7$_G60E9LL'0:1_fo:iUVHZ0!6>+U)gqYZt07d&>Gh@br*6I#>FD9>'F&*b&R + 3O`AShA:9+*uXscCDu;d1oneb)^RIRShG""*p8/QY&eo4E!]%%cg;j\hon!a7Enbjud[^/&(Dm0a5j'b[ + .5(3;>H5$-sNi?/;ZE]][PPHM2s..N27BqSaeDUa,EJJ+E)A^r@4sY^AYf) + g'O>?0ZDOE68ln(D:+Y]lOA&)B0;PCMogWsT1_QM>dFLO1RD\fFN+E*k$,i$_j=OV;mh(!I + 6n58GuV0@ru-:?Roc(QmXE#t2g!%AFV[2b3oRu51_JkKiT6$KCKtD_)%,KlBI>RFc@Yr5]: + h#%W3[;cBb,ZAPr]:HeMh*Z!'.YLcJLLYm-mXpqk5eeW3b[dTfpatR8:d9IH10;(h\mbLjY + g143_q:B07S^G4mpO[`Ys]Ail_C*`P,222s03$AI:RTJIWg38-lsN(tN@N1C9(%W]]jfUY^Hu$'&j + 2MO2=db]Df7!3]7`O.>CK@WB[;tAd,m+3sgr&RD9WGFL7bt\!mF%hPVbS6oG%fbs.B-V-2J + lX,DUl%(Mrr7t':Ujrg8$J!eglj7qY_j5nN + ZPh`p#k")'`CpokCRX1bML'5)2kG@P8qY$NQV>g#g*lR]@cN&(.3]+dm_F9C2(,'""A + EgD]bL9Oo=LiJ&lIB\$Y0G&_ADR+TR@.1s2Jh0U.=:[KS;fn8ZS(ZSG6[8i#BON4)f-&bU* + gfpP01*fHi*ljR3@9S?$jhK1]*esBOUY@T#0n(cl!@JSDADle.^YWDr/`l#/=;OhU$9=';2(12gAGaMf'ZfOmL+g^k-@s#_C-YMP(oo4-b>oH&HmX]jG%_FM^B0:EZju6 + T'BZ$5ZG40_1f$TjHM])Bb=R3U_Y[.W[JB7$^@e&1SqrbD%< + cl!@JSDAH`bSbo_SH1e3JNA-Y5KOGm&TbCe"aN+(fUW%(j+08WF%1M<-g&W>fUW%(j+08WW + IN=Wd93#^c;=aRpJ:/u%6EOcg_oj6rQahP\J#_GTJIY5SQ/n82sK&k!$CX53s0TE".Z]?1_ + eYKkW:89`WMU7s8,U_;VnW>"*DNbPdB,d_;qH*@N!CbDoV5!MLfGY>K$O,kEq]ItFD8 + `8G%Z?NG^se"QPN%sa<,SfC$?Lp)c8=GXGhY0873@i\eU:N!FE: + AV+[IW`(jX??ekK<.jChZ#T:?NLD\@QIri]X4D.A[S(Am0qNc+AM*8o!1iXfmYhfp@N + !CbD(;oPKcl!?jcB:H\Ckp;\0Q_K2^$AP+naBi,G + ]YY9&sX&QG`,!cl!@KcAm'k4UN+6B?0^_>B2W7Dq^:A)PT%=Y$SMV7Ja>ol`/lu"'7c2aF*5b7Qtpt//^XpoEUr24dn@f$\LXM^?@0+&g"TQ[S + H1e3JNBj\DqNF16\c+t23FIchl*H!&>!W*+qsuo0dqoMfUW%(j+06IK]u/Um*5U%nR17B:t + V<>3oe&bZb(:dYWL@_N.T?"pqU0uDhTPFrr2m3>a,cuf]*@#FMu43#7/)YF + $%U]*@NIp@B^@]#&$ZTZl/>T61[aR"Z;)5&c,npY_$>D(^bpZB_ipGcJ[&9cqYo%rf-1Ppp + Bh&2kAH"^W1hu:(%mL7I14LD>>_fa=Id?uhuY^=/IO@qA:3g57=G4-ahG%Z?NA9">*?(*>V + 9iSWTc6T*=h1o?h+-"PkZ&UH]`5:pNd$Yl\Y^;WG`"NmRTJJ%\@<_T3A4E4J3U]PWmK,O^7 + \DOTk[F4pmIu\[J^,N;&9^8jB085=J/3=33b=:!mQs'I7\DP^Z=qlRELX'*kR + %$GZ66,W+!cl!tQ@$kPS + g^/Wt;N.T@5!"Z[t5\FIe!Y;n!5\FJpq)p`DeRl[Ph&2kA-uu3iq#H3+)5&c6Ep1p[2!iKf + SH3_=0O:,A!)HS(A+"/`]s#LQ5@(:Zh+J2WYr&5C46r#Oija,+/8JOkSEXJV1siHg"*8*4g + 3'_hbGqD\fp/ft_X=Ka1Nb$2BlWi[<>>7MTu6:,8qF=^`*'$otSUk$Y'k["V_p + pD)PK;qY'$0m=#C>)2F5sHE_X7g@S\=ngJ/H,HL:kR[df4$<4O\n`FoA2,+,=^A2C7N?G.k + i'GT9(`7mEFg`lB.TBo4Z!8G)pp%OOQ7[DH/e8p\P[`[b/[;%0!E@X_;\cDF,or-S$KfY.. + gC%"k$F=%F0-\@Se3s3M_o.=$M&nQKf3kP)5Iih6jG6X(I(B40S^I_kr^gO.e+R\T6%ECHo + E(&:PohdK8l!a=#[j95mJ7G+W#J&*D-Sckl3g1J*B7S:Gf\M]!QP=UUJBiiCIKU+lO-:6#B + 7S8qd)59W-&(.mTJI0Tp)p-,L#!W>1BD$Ah&2kA!VEVnFpXq'5\KdN2h2;HH;@_sSH1dXN? + 393pD*I6'@<.aoW\3bnA/_01V7=/GQ0B1_sRr[R8"`9@JA'fJELs'c>951h.Q?7K*3$5Ae- + K[me=$:YWDr/Ae-K[hK0.l<'JZs/[Va/i051R;`R-VG0n.p]i?=-gd,Rr37ONPc-dnnh&2k + A)sC`);TFnWjsY)3n-hA,L + DkY20pgo8/Xip#gA3A5K$E?XNDO5N3?4Pc2p$D-CF?g7S[Z#o\\E`cT(R.(g(EsLl%s"S8P + *.V/n'ME(#RO)No]s^ok^2Jo1^PfWb2Lo$Q?h3X8Yuj&V&Np"hre%3#Aom>Kq*"DMVs2`O] + '=Tu653(*;lcb*r]@#-?^E^IZNn\ZZ*%V@kcEN(o5%5SS_[W-Y]e2nnLOB`r<2HQrZYPGf5_ + \S4<"u-BDFc)^@BY8NLY4\#6)=8>iT;p)q*i!s@bKnN5NdG1BSVtnloKuR,gsF(D`RU@ + [TUjo26W4c&pOGuF#Wf<;`SjV&#*p4nXfJ4@F\KIV37@qhERlQ"^cj1e + S6QHUR@Z^.GA/bN1!V8f[qdLJG0q%tS`O2q7]qd5s7eb<:i7959K'-28c.5)R<9 + \o,Ip]otTfa*M+^^iEV>q_1mD%'+W-4>I$SXJ6E$h"OD-VQukS!*ah[Ui3`sSS7B8HZO5i_O'D9:Gr6Eg#eTD]=K'+,D>:)52Qhq;-h."5KcQ06>T:?k:SMqn^S5B$#oJ<]!?_ + KUkID*TJI1oIZ`F_3oEeKYE%g?LeWlMfo'%-[':%1$'@;,Ln)1l5*Iam!BLnSX67UTZ/UH& + ElNG/SI)SFJXes$O^3&Ua=l8tnb6B_RdU7ZB=YY:c4a^U2D7!V;<0d]s6;UbFf[Dkh:9ogg + %ceVX,7M]#Nb]koRLIbq3gmC\T-r#>oaBESa14n9qhs-'OEM]aED`T+tYYHO8kL=%Ri'lp7 + edthPJ%krYL"(hcb<2WiI@*'1X]4:j-t[gW9sh[6)(7E + "e@rRVX=VYJYJt."eEK(U@&2U_/_KB-95j>lX%pU0Gij&]q@/pjO_)<1MGk$]q@0#Ut<;Q1 + O*H^]q@0+$L1r.2,^/)#tV4G6"_s7>PE`pA0AAL"eA4NC>B7YPCq)j(N_!ZRig(ZUQi>+F= + )i_#"YeA6"dKb=8.;+GTJQ%F\*aEjGnHNg0BgWLfW0?bBAUR5h$Z:8. + ^nVKd$]*_;tkmh]Si>l(NeeNCt-.k1N-d:mKK/,)s_W"kfi?pY'WHIhWJPgH?J;OHU2<$kP + kD5_uY)<$T`>/hi/b4#2F>Skfa@sFY>1f\FrC):-c"0BsX.ADfk+I[(;TEYB*-Ud?uep;YQ + nIRje6.]Z7bGi(U>$l+g6lU-%\-;.;h[Ui-,*'7$dc)f'9uUf_K=C8;F&o\W>fe>$;jNTq/d-+KMrq,8RZ/V`m2)%X + FtkuB?8Q;i!F"@mEVSg*1hWS6mdc$e_,pA_c5[!hh$Z8b(-H^mkfd3!e@hM2LN1nXmKK.A% + J..IFQPF(lX%r+j"RT^6"eK\XR67_3=iI-(Nee)9^5s2R0,1CHU2:>`454=SN.>#\efJN8G + 'K[7[lMW6tag+l9"(lkdf%?SN2q`]ndMdFYDt&Tbu:mTJNL_Y'WHINeLX1K$G?/6/B_MU)V + IIF4';[#+[:84?@O;>2;imbT_0_kfgjWe@k3"r%pHU17mfS+V]N~> +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/flip-rotate-270.png b/Documentation/rotation/flip-rotate-270.png new file mode 100644 index 0000000000000000000000000000000000000000..d3094279a99d200ca9b773e168765552030911f1 GIT binary patch literal 21367 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 I&MBb@0CYqZ^Z)<= literal 0 HcmV?d00001 diff --git a/Documentation/rotation/flip-rotate-90.eps b/Documentation/rotation/flip-rotate-90.eps new file mode 100644 index 000000000000..c39bf2c4fb05 --- /dev/null +++ b/Documentation/rotation/flip-rotate-90.eps @@ -0,0 +1,195 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.17.8 (https://cairographics.org) +%%CreationDate: Mon Jun 19 14:15:37 2023 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 1 349 301 +%%EndComments +%%BeginProlog +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +/cairo_data_source { + CairoDataIndex CairoData length lt + { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def } + { () } ifelse +} def +/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def +/cairo_image { image cairo_flush_ascii85_file } def +/cairo_imagemask { imagemask cairo_flush_ascii85_file } def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 1 349 301 +%%EndPageSetup +q 0 1 349 300 rectclip +1 0 0 -1 0 301 cm q +Q q +0 0 348.801 300 re W n +q +0 0 349 300 re W n +[ 348.800011 0 0 -300 0 300 ] concat +/cairo_ascii85_file currentfile /ASCII85Decode filter def +/DeviceGray setcolorspace +<< + /ImageType 1 + /Width 436 + /Height 375 + /Interpolate true + /BitsPerComponent 8 + /Decode [ 0 1 ] + /DataSource cairo_ascii85_file /FlateDecode filter + /ImageMatrix [ 436 0 0 -375 0 375 ] +>> +cairo_image + Gb"/lH$!"S^;gO'!YUfMYV/Qj+b:p*KJi,S_D2WtHO3S4FoDe$Z@HTbB'OloM1Z,@$jC^@4h=PG[La>O9Y,,,E5On^#:86RB\;MZX-c?pGKL6L + 0X\\H7U'Olp41Z'QUBrg:/V+h<%KYc@/jg!m8#.`//Kil4Mb]dJh.K;7oqgL,4;MZVMc@![ + )+;[JZImqe]&5/C\h9(Ns=#Je`Bi9a5f1%MTo3HV4EW9%4rVfUYWCogW1OXVe>pCGlrJEX\ZXUD.;q9al1?LQ_2k]Shtbkrpob(mYQ!gsW/B3qVB"rnq + $qNi(Ih*10&^[1!hJ0-`WE_4[b;tbDS2.e60u.?;CZbna+P=bcaIcL0jmW-^gC&+BkS]qD\:GQd;icQp:-kbpuRC[Mol + 8\\,o-MR' + VmA/tLhF,oXXgU3/,H3=GfanKVp24p])pRWU9@3@gE\o$rphSDC5m;/15Qc.VtH?TeG0R?D + \Gkfaq[lX%r+%1:\"TJJ[ZX*[-FG,SL:K$J10Y3lIafqVa,$TbUa[CR/r`dh+a;G<@e(NdZ + K>'2L^N!6WS?I0Q'>2;i=)Kd^sN/[r,aXCoR]q@/><2t:2B8h64HWl0#6JW#1@qC,s)+TCl + (Nd[>ca-TMHU2;gBQYuI]jDf-)*;$X9@_^%(E/r&G4`A4NaC>NTJHg$;YPdgS=i@-$T`?\) + Kd^sbRmIs]q@/oW)35?cCCRph$Z8bL]V]PkfbL4f=dh5Vg)SCK$G@rH//ihF,njp0BgV??I + ul`1Db:@pO^[qi,RQ\3cfq_FYDt&'n>n^mKK/l6=1bHWI$pDmdROM"eE3B_n$Y+jq83j?I5 + *E]W6BFBUKt_RUcOGY9;T"oe\ei + >UKg_cEF[NcEMDu!n]g/`\ME0]a!G?tpQ_&_M0Bc(dJ\%1@@!>Gg=a+arI8k0_YDrqB@!>G + ffb_CT=+QF>/oI49Q]F-gN@G(,3s2[5;9'Ognt"TB>G'[`XR67_!H;`m + B\a%WKA]\T\efGm!GpR"3Wh[OH[4R#Lr%IV$sMI[q=c#s?I0PuOEE5?$jaY[(N]ib>hocKK + *&4D"eC2F&"#@[7;fR!6>"K?OEC3,J8(%7B-l + QkZj*3u@[Y+#9WrfB.^\Vt3ibGas'?9-dM`g?B+T2=e62-AJKs$l_3@:S%&30D3fD)o2rOZ + $0D*Nil<_gT1udh-*'1]ZcIl8=cl#+)M^)k!XWRAuCYA`.0K_Dfh5bm*-u*mHip?O4`9PH% + l7I&GR3t&erDNB17*p0RS/pot5:peK__qbQLIZ!1ZNES:l8\&60uH"k2Qt9UCVC`$/#BK]O + 3T.XRZKPZ??TPoBMP'lXYAN0ht2eifnW(1'YWqra\RSKk/>rsMN_uUmS8b/`]cLGe'RAd8r + XTapYs-E^(rY2%gB(GlH@pR25CIQ9F_lZOs5P*_;>S:$_>B_Mseh.D\b&C3g7E^I7!jq./W^L&VHc5) + -ft6T/H='-"JiS-A-`KaW0ROq2Ha_PJXk=,gfTNF[68STJLh1VphbNHO&F_Zilr9F-8F5Mp + %ce1N4t,,JhKr"4)cA&=nB96apZe2@1<6SO%>.5PakF=b3-CkRi%^Rc2sQQEFU?ORQ^>Ci,R-^*(T5eL2/FWPG8$[F9Y56W07-! + LCO8ioYBZ!N"pGMeoJ7hJ^G>L?hC4"Zg"2g^X3o9"n.[#p['JSCIUU&5\t4.DOZ^i0JkhC5 + qA-,*sZdX2*(iuk3QjDY2,+*%$&Uu380eU1c#"F`8Khf!q#K`Y[QF?N/l1+=C%9K1E#Dd.s + (uGeg_8o.Xl/&6"f2f15.&)Ie1<>j&9Tq=[8bZ%^dg?cF,YVGH;$mBE<5kd;Skg5a_OcFQ% + ;,<%D8UAT3r>(ph95h$8D)aO\R[4Q2#$(/ + J:,Yl=?*tsn"8c-)3-5tfsUS=f'F:B*\o5]O^g+LmX`"S,9N-Y!bZjaOdj=mjR+1t6Ci2UK + >H6O=!$tjX2J](RjmL$6?3l$[&KdQZU!1A&F=6JF4PBrZ(oT)QIAP7B7[9Kgt%FYR'S0rSJ + cCTY6rPV@<\CM)]PH;ZR=P!K(G&\Wo,FtDTs)W$bMmYc@k_1?a;O>-SXn)!]h"6p$&h-qUY + edmO"S_;<5,.pSj\a\i$7U1I7NQ/jAW>!]h"4SL%.o2XQ0Ph+^.I@aMPqK#@"'TJIbh1kBP + h"Gbf-5\EF9O@6QiK#@"'TJI0n4_2FImO"S_!W5%^-L>UO3YT;['Y6/+$Bh?4(j*bnr^a=P + !slN.JBk[8ZQ(I]D?;lZk-LY$CBb>n2Z]K>;D=O2O;3%Cd$\Z5mQq,\0jj(oN.T@1Eq(^oFq5 + N!(j7h=S[isd$ZufYktc"@eX.6,=: + #=#I/ViVIa+3cfurFrt5(2*3O6g2oP$q"Z!rWW,+j`(3+rCQ.g?Rd7R1kfaLF(KuOK5E%!s + _GA::,p+M!#V#\@6m^&5KSM$iOLI#BA`&Y=g/r]4iknrP#I#7hm(]-]S689K*()@a=Q2VjhH,$ + D;8926HkIf.jg'>m3%"NF^CnHV8pG'?5b'WK@Z@<^1ah<.f-5Mt_(r[>/kS\QNLiFguo)+C + DYqlor!o&m5UTE00"rQaUk3RO6oB6P+]On#Nimc]T5M9ZsTmY9!gP=&tDnsnrQp\n3M$:AH + 9p!\!0R>sCB>1gO1.eB[`psip=09UBBPgdncFOIq + )`MWj\o%?4;<0"KNp+\*=jF0c@JA,(Pq#e:;RK^$R^F?7U?fb9er?_359Vb\6,U]:RPmg!% + eF%kP,H&!SJ`Zqg&AEK=D8NFFUL5d7ZoPZm#KBZTt[ip)0M=3Teedk37Gb4V%VO\Zu+:'EHPc$l9n-2euDldHF]d6bT84Y['4mJYB:*EkO%$9B@kELgUD%UZ>! + h:L@mR[=_g7E>dJ2,MWG^K1L;PjcKp\QCeGEs:r59J$Puf0BD0DcG'X,t]Dou:lqTbM6"`) + HE-?:)q" + JFK)$SBTMm0geZOrP3LZhD:d+KHF@HaUa^qLC7bkamN1mA6*6[Teem&41dV3Hk]qpT2cD + i($LSmkK^H=Hc'*tG;OF8g4+S?$Ct>[fU3e(TAX.&CiMWN#;Q7Z=PAF\YJMp`Co> + d.W8]QnS]baCWk_cabd#_)^H^V-If5+Y?lT]>i"&bR$]qBUS + FTY,&>`/=eeIZC=T=bX\u]MV+MII.T@g'r`A4(Pq>q3FEi&0ihSXb.Ibq4PV]IPJeZ8!ZP< + sraK2>,XUb]uXD.CI++ogdUDu;C_X7J]bCXk;WVak+Js;rr)`r&:LYX$QB8$=TBA8l'c@l('j\FHSXA'^\om&mj6P7!T9,/%Pgl?l_a]V)2eh!Q=gR84aXp])Ct5P.S$m04;VJNs + hkHq$''/*a@s+Z&h33'R]Uo=?B>I + B[#Y&IP_sSkE1L=1S?'uo%A9W.8$`gTSc,k*g_X8bD1L:ohI63[0c('LD9q]ek""BdD>5mm + MIq]G.GoiO0_WL4IHl$48'<&7;Y@k$3ZRU#]$0j'er;0D!UD)%C/Sr^mFer:uB45utW3`_N + [0b6g.hni*6:*PeL7g>,R%.G%90OR/*R),QUL_F"DXl,B,tuUi['9F>bDTKE9gWK?YW2N[N + tumt:5V)D;Zg6:'85-hBOPk'4dBp0*/E?Ef`,2C')AX=TqS*GC=V<*p?Y*/8a+^rl.'82'W + `uJEuT9]+b/C(>k2)+F@"B-!&;dp)q\l%_ErN=?,=M]-BRC387+_1[`0K#S?.D:(JJt + pDdUc":.q=2eLL?fi+Mh0IapQ;eJT]d]M3NgE'#qZ,Fjhr[:\.+#a%D0.)BT@cg>l]*EKVs + ,k:=R20tL4It_IG=4('c3iF%@J@LG2,b)sB3NqN_>*4%`+'4HBjpc*EL/eV'Olo]ZU!06oj + i87/k4-nY^9nAB@n4*_SDQ\Fs$FKB9PY50lX"Fh1N74n'U9+B3NqN,$!I$g&D.GRZ"`~> +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/flip-rotate-90.png b/Documentation/rotation/flip-rotate-90.png new file mode 100644 index 0000000000000000000000000000000000000000..69f797dfa8a176b8e83a1ebb5f2550b068cc1fc3 GIT binary patch literal 21020 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 +cairo_image + Gb"/lH&r`j*QJDLL^VAaJUla#WXo=G%m[8tU-M+G1e-)Ai$Oa%,LNUTE/bdBRVOclV7+N7\ + '.'>F-Ie:@MI0U'Gh?-M2Gi-#bjln2$1A1:3^^?okSkdB&C8sFnbcUIm6pIF8Y/@o@`!bl2 + L,:Ct=o-1I^Q]Vc;NX*XXU^U#O?iB1q#98j;=]hMuqPabPYXh-i._QLg+JLj3DhuIa7hm46rN + 7:%RJ5in`fmdaUq^c5s1]IoIIm^R)6G[ZEQqg_dJ)&DY*ircbs)q;SQ`cgEkOB<'.lLCVYd + m!1fR2+hN+Us@P`XuH*ZHL-U*;"VSj#D4,ijjI'+R. + S,5;2tRqT/\1lE4;93bO:-,tcWFP:$]7#gq[HLV/F + I6S:Qs>'+lMoO[ad9'I]]YA5 + ?9Sh4dub&3@F!1j*o^05I[OaP6G;mFU,7n!3hn/%Jm(>SX`SQ"hBp1\%l9]A.Y2HLZUeQMb + 4#&3@F11c;MEf=^Pm60rG'*8"1sOaI%(^UJGJ:Sb>-,YaQlXKD#3D``6jZIcR_GYS+VZ3bD + >BDiYA\Z@hV2qI'Qm^dT(M5CKAd.aRSeD!-.\burj)LCOL3O6c@'i%RI]/"T-@rU7=b0+sH + rdsE`maeZ^@R=nVQ;srO9J64LF'F8XjjlL&+`V70rQVp%a33Q9--6D$bZ*u++=&"dZb6fS% + 'JmQ6ka;"RqjeT+n:>gX"X/5J&nC0(%&JCcH+1n;`+'o^L-m*'BJ]`dgc/$`J_PAs"iJ)hO + 19F9j($bVddrl)OI'FaqpDq`QerJ3%C@,b;GfmOSDViPUha:AX_\7P'Y1cK;7G^o2XP/hP> + &D?%+%G4P7/kW[PWrK_Dl]W8?("MOfX5`]HI_;4!_Gm9VO)TuQ3C7JV)Gjo-*%8B1s`+`[( + tfMV&KZQ3X_0))TR26C3J*RR%7H)o=1Oh-X!S_T\j/tXH4X3GDX0t:%i^hF15s%lC3KQ6fJ + U3rY3WC[MYMKFQjIir?L]Q*aP;1=crToQt^%qXWC5cR01GDUU:?sJ/`.)2M*ZIX>Eke1d)L + ZJrjSE5B$Z`2b0VE*)7r&dh_eQJ.j#5;S0UFV&jKZ*.eI&(PD#cm>bFT6K + 5J43M'nh^-Ioi;RE7a88mCS=84c@bjYQX\Cn#Y"Z&_fiW(fhmM;KT@1u>b?3`/)ss%$@hb,j"0i/$$d6fO0H4VgZ(.A + er<\GUYM51TDC.qbe&k2?g<==5mM^0"'BU2d_KH"jR.G@td%gj@J?3!Mm+%Z)QH-1MqnI*O + Q$?bBbA'"+r@Au`1q/@KeQ#Fq0Cp^R+=31Y&QmoSaSDr7B.6#"M,16K0#/.Z,G]Ru"9+01QY-UEWhanZRk=9J\nOEef!>XadQ + DGFN4U1p#U/`@.uQ3;o[jaiC/`oZcu[e_,)-3ct/E^Jbm'9eg:H!QI!B/Gaii2B1=86d5.4 + j1A5:9A?V$R$!1*./q"^W&F&16Ah%gU):IGW"`A@rPC0T`XK7C@\O'bCTdC`:DrH_/]FJUI + 4%9fnRH,P%A7K3PKX%1,eX2+ce*HSn&oU2dZL+++rli-!J@:+n64QML-mTaJC6mQG6T\;Jf + rSGtuj"o8r_^@d&)i<.8otc>Y(5a3c(#Oo4p%gB3B*MV#3mlBQ%HE^!tjj,gc53)C`.RcDZ + Wb1Me?7Pq+N?lTfo9T4:HOTJkuD@sLQaJ,mJM9>nu"biT#0t9"u7Q7>\n:edeQZNQVq1gR= + (4+OJK1j(lG>n7dFQqt2g*/.ia3C0oG/J%i^Ge/`Sd\&&e^Ohqd%m(HVa: + 7_79c.OSBeM^oQSAAp*Sp1Rd9Z5U*Wk#`3m9TBatb.X8tkW,OsH/seB-B&C=Xb1Q9E_,6mn + iY1,VM75,FrRNMWbQ/[n"GG%J!UB!2PJ;-KB(>Mh`8IS54!a5G[jW)_n3pbY@$q@YGHZ-A, + X,KQ91B>M$?nksD-k^K3AEKC*"@b>koF7Q;T]0r;hBoNn_Lnr*3Z_O<&b[,?f>:P4aAbA.W + e4/PQSs\hY"TC`k)kclaRT@pW)3.0?B^tHm/"pEK7pQKDST;j5@`]C?IXtO>u&"fi*J4M%> + Uq,lW%bg;kU&G[SNc2N7;e[2@1?VCVpA7>rD['ZT(0n:eg%6t7#/^-L\2B@apYMQ"4,d^D^**:Qm!I(k@S"/>?L=7,#"M="+`ZBCfb&k3V + Fb&%P;4Dth2C29"r@IeKZ'APC2d$WO?G0HTaciso"IO$7LUn+-q!!rhW^WA0$'V"a?nl:]b + oPCf8.EN$:#7;GNFGCBqbHd\F5%9LquNtLPs:_M8));)&p/WH>K5ccOO$g&#G'"&VGuJ?V( + +6dU'Jc;Jfs.S[fki>-JBk,6er7H;bco_XJlN(gKC/U33"a-&0?FnR?IT=Y4*R-qXi'mmIT + 0%=B>h:/VWP'FBU@ + #3RN@6K1$1QcbS,*N-#*XZELMiiQ=>eo>e&Hqo#Zg_YSnnN\jc$@bT/Rr)K5:.=oeH#5?VQ + ,gSERBter!,bJhHN9^<%U9tI#XBh!1[c]N!qZR!,!30,6Q3m^mPDPaFLSsE2J1B1>j\`S8$o?$ + oeUpB,W`S"3pt`R0LsXJ?o5pVL^NYi%+kuC#FpY3"#_!)E8rDc2teL#0t;?ZN+sAJMT(>/- + )2Si/A(($NOfX3$SON!l13.cH(OB!-"fd1G[l>!1[c]N!qZR!,!30,6Q3m^mPDPaFLSsE2J + 1B1>j\`S8$o?$oeUpB,W`S"3pt`R0LsXJ?o7RS_a6c.cuNMm,5U"<3UR9%'F)+!M&6Rc89K + 0!M&8(WO(`<+Y]L8r-rrF%%?b\jh*Cr!BB*ESFH^,p]5%*J2;Yi)*d&<+)o4139(76nH7)3 + !GD=\1Od+W5N%JBE5iDJis2+E"4$ZBBDd99I_Zgci/Aas`Xb&h#Ft;dcM.EQr.$SP^_oApN + $!#Y%liSSSFH^,p]5%*8>WZMN$dJGBZ?Kr<'#@K6bq>f`gR,lK/6`ibT&Tp1L$Stet^fb8T + 6#4hH<)?f7+ab"E7r_S65i)&i_ZPc7FK%$(RCcB,8:N"O>5B1CN,7!b^Z2R0@OVJMVB*bQ9 + bf^mR3%Ac\Dni630#ZN/8rE+TTM=TE(I3&:fb/:]M_S='Il(;Q=@cHLhq$fF\[BBI!t"`Pf + >1NVKu!]ZCZR5o4u!Lua>bT&UK!6uj/Ae(>6!+up(1C)2VJ27M%R0.(;^mP>Nb^hPXi(O2b + k.mB>HeQt$30Q>jm*TeXopiJ%rAL0;>^(?qVYb(;\oqeNGMl0S\?h0#LMb=KfCV+GVmltE' + $$P+OEj7lG=uP%p^bXqN][,,jrs9P9poY5IrH`SgtCuu%bd;p51QFs/o_EI,`Xt0hO?N5jN + u*O9B@0RPIU$3qrH8`rQ\^+IN-QXc9(V"B+d0[#L4lN1C9S>"(rCbR0:gZJMR\l9EJkh^mP + @F-@msoi626^PJESHE+T-@8`7f433rV1,]I?*S65i)&i_ZPc7FK%$(RCcB,8:N"O>5B1CN, + 7!b^Z2R0@OVJMVB*bQ9bf^mR3%Ac\Dni630#ZN/8rE+TTM=TE(I3&:fb/:]M_S='Il(;Q=@ + cHL:Og#Y.__@4iD60DBlS9,gs=S"5j.;-F539(76nH7)3iIJ7Oj!/(g`LGF'aq8jYNj@O0r + rY(G(N'~> +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/rotate-0.png b/Documentation/rotation/rotate-0.png new file mode 100644 index 0000000000000000000000000000000000000000..e7e95a299cf23c0e757dbfec1907d2b075523a98 GIT binary patch literal 9086 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 literal 0 HcmV?d00001 diff --git a/Documentation/rotation/rotate-180.eps b/Documentation/rotation/rotate-180.eps new file mode 100644 index 000000000000..3ace1c22db9e --- /dev/null +++ b/Documentation/rotation/rotate-180.eps @@ -0,0 +1,189 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.17.8 (https://cairographics.org) +%%CreationDate: Mon Jun 19 14:18:15 2023 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 1 349 301 +%%EndComments +%%BeginProlog +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +/cairo_data_source { + CairoDataIndex CairoData length lt + { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def } + { () } ifelse +} def +/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def +/cairo_image { image cairo_flush_ascii85_file } def +/cairo_imagemask { imagemask cairo_flush_ascii85_file } def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 1 349 301 +%%EndPageSetup +q 0 1 349 300 rectclip +1 0 0 -1 0 301 cm q +Q q +0 0 348.801 300 re W n +q +0 0 349 300 re W n +[ 348.800011 0 0 -300 0 300 ] concat +/cairo_ascii85_file currentfile /ASCII85Decode filter def +/DeviceGray setcolorspace +<< + /ImageType 1 + /Width 436 + /Height 375 + /Interpolate true + /BitsPerComponent 8 + /Decode [ 0 1 ] + /DataSource cairo_ascii85_file /FlateDecode filter + /ImageMatrix [ 436 0 0 -375 0 375 ] +>> +cairo_image + Gb"/lH(7g`TuSOeAL4`-8N[J=[KqdsKl?`#\B2Y-bK;aiL\sj:3Fq4i3Q^rB\)o%"n;RVm3Qi=is1]h7qtbT7AWL*)Js4/BhTmp#cMBp + Kl[p_ZFQ=usl'[:eE-b]27Y^/YC'Q+6L3fC,Cp$FLYr[&pkfB1^#"Oj5hDU!GqagnYlRg#2 + Z_n^1*`FoLhCjShFu\L`cBs/=$Cl)9B?\./"jT)X1M5R(!bWLg))H5$JMReoN#=UM^_mAr` + XJA7i/@at@g:4,E5hpK0`u&&39("aR"7%#S8eOAbeP)"c8^>1B&JULB,n])1N5g71Ci?%)* + "D,)$b-#%%L2QMuu%L#0nW9`W;Sa"(r<-irIAlJMRY'EM+[lX\MN[UIEYti@OMtS13XqXVs + !)d8#IkiUq/UGZ;tW?6%>(EmfXX546kgH8nP[6"e?>Yle=8WVo3GJ:eb('KA`J6"dbYgR-VdX5L-pVdN#YP[Uq,6i%,2mg(aj3`XJA7i/@at@ + g:4,E5hpK0`u&&39("aR"7%#S8eOAbeP)"c8^>1B&JULB,n])1N5g71Ci?%)*"D,)$b-#%% + L2QMuu%L#0nW9`W;Sa"(r<-irIAlJMRY'E<'Xq^_m=$3.Nesi/@_M*5EFJE(5C7%cE9`32= + 8,#B7ZkS5J4'"#scpc7!YO!LtkHB,!>c!7$s_1CBXlTF5BsWbp\Te1`jT1d5P4di[;bab/[ + Z3(kqhB,N]V1FFO<0S?^M6Cl(%S0\k/ium%#B'3aG:!#:Q9B=j2SN/9>k3d%\`3I/s7<.#? + a0'9M:0ujP52]*ui(Q>m9KqB.52]*ui(Q>m9KqB.52]*ui(Q>m9KqB.52]*ui(Q>m9KqB.5 + 2]*ui(Q>m9KqB.52]*ui(Q>m9KqB.52]*ui(Q>m9KqB.52]*ui(Q>m9KqB.52]*ui(Q=FE2 + GHNFU'Lm++@61(@bL242$[`cC/r@qi#d.mh3=TJ7I9";8Tm1_m](/OhmH&>"PE49'=n2rs7 + 2uS4qo6f\:,5al(BHR2,`?3M"6_-JFl!>W3X8ah)NC!M%,'9P4Q^YjWN`U&1>tN!5q0)'jE + l=[$N'-jGrJG+1;JJgZ!nL0ngP9CC%%n>SHGS:&-%D9gA?YVqB4iG]=LSJ=89?J'T^4DaFD + B*D(e3_n!ci%,/(M#ko=JMT0&-3cF;#L:i7R2Fj5*&pk!B4?CtE8XD!S;@9l_LXL#E$bcK$ + O=u,^mQ%t/0$WJ"(u(nZZ+hr%@i7UcGG,g2/jlH3"#u:eA.Ihi%,j-;ZgZAJ?s4Q9F[MK!R + AQ51Gs+u"ultqcIBXt(uQqb3)]ol@Xte(i(OTMM#ko=JMT0&-3cF;#L:i7R2Fj5*&pk!B4? + CtE8XD!S;@9l_LXL#E$bcK$O=u,^mQ%t/0$WJ"(u(nZZ+hr%@i7UcGG,g2/jms<,lN!bhaO + uVIQnn1J?^YDtT#M`UN/r$70n.qIrrh-r+mE>4%'W@Smi^^*eNK>[AS2EjGdnNsGa_`C'pU + <5;YlUjt8UXBrcX^,m1E?d:h#/h[t5HTapQg04`OV2!EDF&PYl_ANU[cK#)Qj9*]g"4#s0cK#)Qj9*]g"4#s0cK#)Qj9*]g"4#s0cK + #)Qj9*]g"4#spGKpm6McSf^'K6j%gUtgP(OUN9`1lPI@^!,D6`ka.F=?!SgYtDDoFMN<(?K + .=(lUVrf4HI%Gqk/mMg'Qmog+@R]Y3FBCT!cf=2mV,dEi=7@gZ]ok5(Uc(ogQ[k^C@;r+,g + aJ=R%f:C7QNP0@GY#@OH=:LESb)nti&%J?YQ<;P7)`9S'B66iQ#=/'@(JZ6qj/p3rZ1 + p?oGeKT<2$hWsmGcYXVmkPJcWOJgD][/p6R;YRp^$[j6MZZtW%p==D`iGU72:s1CoqGDkhl + pMkM6#$75m0,MaY=7L0/Z7i3-JkG>#p!d#+^8_C4ZWb0MS"'/34$q+d`2Bl1>eIQKQ<9TpC&qVJi;Z3%oDN)ZROK(S,p6%G;B + ILskp>s%kKc?bIOK/]kAjgHO1Vk8r_D+-&D(n6#[fP"nkpqdZQN'ub<'Z%)1=0_#<>(Um#% + VU*lfb,.Pnb!0@6-&q&*2I:3q(i"mqEPB2\1mQ`W$RVh'-$f0qW8j0(Mu:^XDJ + U&o$)p'rh27CpN?tQK]';OEZ)OoSQ.^hT2Y?ZXuQ.!ndi,9epZD#d4HIZV;^&Y'm/kP)YIn + UfBI;@aUK'7Tk9nkM@DqTRq]"]17ZWQZ?tF!Bd;fOZ/XCtVhbi5?>IG3.KcAh*;epJqTVhn + I9/NUV"N6Wrji#t2`n)XC>FTlr8mdhFRESMGZ1-!1)/?4XtBA3cg#f%5;C[!#Iifkao8h@f + hqi0_V3:O)W2]Pj1Ds)#rkd#5$hAek8rd5cddo_iN0O!bkDXUMD`G"IlDsm[%>r+1bUOKs/ + 2gA\#ju*5W[Ec7m0q/TdCD5IErYI_$j)oPX0;;Y^fJ`Z?iT9MP2@*V=BK:r_"'I6(:Z.^#7 + C@m2s,ur/hh2U2\_%+!2YY'8=m(fB$TCTsj7UGmq+Ukot`n77SV@aLgNdF3*V*V<(Ym)4W+ + >L;0kSLr9gu>`B,PmHm.CSTa5-gVsTOn_!J%(.^->@.7WP8Oa%Uq>'*^]>lI:>$r + .M]?`rdU83A59_$mL0RUaIR.=t)Q2BKp_5'18l8,_N_UT>C3XW0? + *]l:?NDAYW[Ir9KJILrJP/4\VcBd\B)'X'Pa + 8XAS5_;5p?#l@LomPh9R6I1h8DKSp`fW5`M7.V1#3T/WS6`="B>-pL1jpTgeOm3b%*j!N^7 + BN[]4UB51l]Egf1.=m);KmQ#3Yh(flLu?Nh*"b,i3Q^irH[X;.p/(SZU8FZS[Z[h6se)"]h + A2qE=L'%O]pWcFD;j]OPFpr??6E_>+cBr*`g16Z,=SD^E]CX)hpf$NXbc-kbu(K6,lnLU4@ + F`"hI-(Ns>.SM/bYDt]e%(iRp=ZS[QX6Sc.W/($CZ'5'8Gi/F`qSd(=egU]11#3WXU3*Rtg + ZZM#AQ%nNKk%Nl6jZGV>=+n`I%))-lgpbdilr]1jVbhP'Xh+;4.43g$r,o(&$\C2cg0E-2c/3* + $T'\%<8sCa(!aG]l\JikZ&K?lC'G;Rk`kip;#T3?pHaB;AENY$)8ep.D]Pjkaq&]K9YFQV!S=5"H%B5:Y*V*:"q&m&!POCtQB@d`.pWDks^.;Lo_=^t*H1_U*m&/(Qk' + =^=oC%muR:MG)aG0'M3BX`Q`7[N3SD>j3Zd;8@Ln5i2eV_n0CmFP$7>uiI/?p^f`TIDaC!8 + #T+]EpLr@D-[/LK:?SI,-",C"\*L=p,oo;'G?_Y/'ghkk-23>X[X30?W:+E3K#?/TE80gAe + ?]hjE6hV*8)4\\[0)Lp&If2i'BI#3XV]0O-C:7C\-%hs/UR3]NfWNRXc'3ff,]4U3=XW=2H + :.C$)4\^)^:)^ok=gYnG]6%D8/[r;)e/FRHp_X/o0q[!ob31_2InIF*$Ks0JHp6IT^f=E2! + ?>#u[[ER::J-:H,4X7L/]2%.E&9=]%MioJCUsrt'mb\S4cXaL"u< + ^3ULeB_"+8kqe9.)T86h_%Fg3+%`eTaoe%EuM&#Z;2A4PYE$uT2acP+b42jk`hUs>?GCJ0H + '[d-"HMSteVO#pBplT0Zn%nNm5F_71:S3<%@cJ%#WWfe$P#;`lW)mX6a4MlC^EV:ernfoB: + @s?oWEK>N,qhFI?gGLRaA"AeRc:EAGi(0AKE#8:.A08H1k(`6:7E=$sYd.$tIcHms/[_.38 + :5R^,B6]fa0[#%lV:.^`DL84:N:%.H&RbSHpTb^in?>%f=:=LFWth6.HR+_$gWY+`*5uOhN + 6Q9GJ9A3TreuaZc>u$)0qN'!KhUt#04:u]5'!<[ZK1qV.ns@!KjlAK@@+LHi:XrflaBc**= + `)c3bUg$YS9:M5rRG^\KR1NDb7U^6[#3XQ,/DInp_jh&;.ADoc8"N]=Y*eX9tgEOIl5S98< + e*jQr9K[o!I;&iUY2T"^*LpK*A[LVYdEB"8)UGL"s^W%/09GZMCK5\anQ-_% + +H.7gP5'\;)qd4C`iZDQ@e2Y7`OYE?ALBAaic2sq6<^2e<0M]!Kf@^L?t3Bst?c9;O:?VXGE'nf + t-qtYd>=N1eo4#mg8jd.S?'0-,3P@u?V3J?^Nl9VS1^.S&Y!a4U27QJ]ZX5V*Ia?<\]_iKL + ECJk.a8Yo6Q"Z)Qn'ZG2eO%Q>$iU7R3$=?nM'io`)m]52-hptXE7#6b9[Y61\58Xn&NCf^& + rF4P022p%pe*WUeY(3ZKJPeS<'=04k0.t`b787tSl?5enA9p + )s+^5"k(MhYdO\MjKOl+0u!XKe_8/hNW.Lr>Ru5_EL'`kE)6rI%j,-rK+64QN"V;$^>&;b2Ki1f-n=t]14YRgF_+gk,d]4Z: + )M79#'SA@Y1ICP&?B32"/1\IL@"d:u9iZ?k/JIJ]K3J36AE+c`Qe('j9'$h&G`0J>WLg1ZMT#'MAW!o>4$V5_l/&PWNlHQ3s#W]!duucg:H/a?5.@Zbc==`# + =J3qJq1VZp@`EU5JoRYSBft\qs6MUc-4l-B&A$n14?/N8cR7f_pS^H1ZfL-AHpXnI,b4is/ + %T-(n+[^iqL>;(251~> +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/rotate-180.png b/Documentation/rotation/rotate-180.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa69340497ed87e137804a963b8d9f40047ba2d GIT binary patch literal 22182 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 IzWmSs1JOTWE&u=k literal 0 HcmV?d00001 diff --git a/Documentation/rotation/rotate-270.eps b/Documentation/rotation/rotate-270.eps new file mode 100644 index 000000000000..426f877a14a5 --- /dev/null +++ b/Documentation/rotation/rotate-270.eps @@ -0,0 +1,196 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.17.8 (https://cairographics.org) +%%CreationDate: Mon Jun 19 14:18:44 2023 +%%Pages: 1 +%%DocumentData: Clean7Bit +%%LanguageLevel: 3 +%%BoundingBox: 0 1 349 301 +%%EndComments +%%BeginProlog +50 dict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +/cairo_data_source { + CairoDataIndex CairoData length lt + { CairoData CairoDataIndex get /CairoDataIndex CairoDataIndex 1 add def } + { () } ifelse +} def +/cairo_flush_ascii85_file { cairo_ascii85_file status { cairo_ascii85_file flushfile } if } def +/cairo_image { image cairo_flush_ascii85_file } def +/cairo_imagemask { imagemask cairo_flush_ascii85_file } def +%%EndProlog +%%BeginSetup +%%EndSetup +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 0 1 349 301 +%%EndPageSetup +q 0 1 349 300 rectclip +1 0 0 -1 0 301 cm q +Q q +0 0 348.801 300 re W n +q +0 0 349 300 re W n +[ 348.800011 0 0 -300 0 300 ] concat +/cairo_ascii85_file currentfile /ASCII85Decode filter def +/DeviceGray setcolorspace +<< + /ImageType 1 + /Width 436 + /Height 375 + /Interpolate true + /BitsPerComponent 8 + /Decode [ 0 1 ] + /DataSource cairo_ascii85_file /FlateDecode filter + /ImageMatrix [ 436 0 0 -375 0 375 ] +>> +cairo_image + Gb"/lH#sa#^;i;oDIK#UTP-4e,Fa]WmDURE\3LspUh8 + mVV%S)4]kC<6>bJRWCEf@`sZ]d]umOkG.r3Y5Wqer2bV)d7hkQsu\p%R?3B.EMjkQ$s?njC + _>qCXg-R(MTk`(lemKtiVm']sXa+t$o56/caW1NiL:Krg6p#+mL;p[j`Uq3I`cTJL0 + TZmS]a4M@+$FJ^OShL(ipN!$gDp'<]XPQr]W&Mq[PMa)m?']i;4D.T5\U\I4?9MM\&*U%'G + 6t_DJ@!*1RP.92oKBQ!#54:kG<.FqZV[(V;MHh#p<^t,Ns7#e33`D+FCUB?]DSni&oaq + 4\sn;Jkt^cOZd,p%W*m[PIj&BePOB1\JhLf2foaSl\C'VBB5/lfV/DFcr)V&Y5oA02mLZP! + =E[oa#Z:)B0?GOdL:J<^q2.*+tif.q=k7=1o]-cICjb^+qlp&i^)dWC9Q+nI`2"5&^ok;i5 + JtQ?2;h4RNPu&39=%_*DbaK8"h`(f[c5b#mp$+3Y5E + SX"XjdUc[,(4MaHXc-PGQl]C2SCLpiiNb8E[llatYXNb0O$mW'f_:C,_W&n7WgOK;ZKV4/HG"YpNS6,!C1;3a(')s!'9 + ^3Sr6eQd$_(W(Urb*IKhk)20s78kc=jW6OhD1O"lMrL/>(4kfhYgMd*VnGRce+/RF?>!77- + 0nQsuPJBiNK:tu,&c@!a5VmVf;;fN0F3qFLrhQC=9AOL1F`$fM;RUbl5kfe7$`@V)Rb\+`1 + /HG"Y=-s]2!!(;nfet@?NEJ7gB`TY2lHH'6"TWN8n!=*UYS$C&s0BBuB%1p7bgu*I:-MTel/)(UjC33ZFN;bR + XGup.&b%q9$@["i/X@'Uu"c=rs5[K;Q-^^sq$_S*0Gf3qE\QE=2b-P7LZ5$NN5O%UF&^!'6 + ;R?#^5P3g1"aE=2b-P72;J$NN5O$uKtl!'6=e[tDeFTdXdZ5\Eug05^eUB2YEVD?3"81-%S + 3JqLA="TY)b`$fNf9N0^JJBfELV76[/S]O5PDQ3Eomht;]1MI]F/]e6##GEqf(r\(JDR0g> + BQ3YROeiYDN9-5rAm/HG!.0Qr@Y!7 + 7-Alk[&1TJNk*/oC\TB0rk1g]E#OKOV^+"TY*M`*M08\(V%WM8Uf[iOUe=1SM#e[fE'WEA/ + -:!2),f0GV%sTJL#\'t4191JohA[fE'W;/BhpD?3"8K(rq#=W&ai76jd&3YTD*f&@GFF=%4 + SiYDN9-3U*R`HJ'm#W`WM;;BUcKTPH^9E]Z]9DC7S.jI(gJl1nfd$,hcl#V=(:O::1QLrUD?3"8r8:c6!eASk_6pcV!1 + e+^DfH-b3o^D,iYDN9`XC)2/HG!n'1QubMu;iH]RnH(i%Aoh'DjO'k_p&-Md$2.)&N&a[fE + 'W*XF03!C19[&5_-`JG0c@J;E2#!)mM`+$!_a,Hps1)/$t3aLe%Z/#LT1F@ri+E^RSsj6V] + /#%F.f`@\@\V6,]LZdOG%B1?ma"F2LB3b-*6h"$kpl!?Vf9 + Sb3:!C19KI/SZ$iYDN9`k]h0Wfr>gUppR.SM;7m\-2l'fgf^q$NN5oNS*5+!-DflZ,J9pkf + bZ2Md$2.R8)JU/OqeHV4\5VgY^l\#"+_tSgq=]"[E6(s&cOFOZ4,;+eKMZ9]LKF_M_Uu<,f + 8i3k2%PW`:21n6N2p/AAUt5Qtd.Wgj"XPb#p$:K`'b$\/l8C.N;UpG7:?3A8+V"TY+Hi:\. + -AJA>'!hbLYWpq)k#bbaM-/QpX'Xn&jj")qP^cin]S6VDe1F^9p!6R8o(=ao">T^r:R@N7P + !-Oe!8M;'!p3fhZ,!b31Lm\-8Nn3]l-%l+@+4Z!HVn6Hmp3ID)5FL%sXCJ. + h)tXk)PpcCh8BtiYI%Wl"iiYoS: + `h;es[U3gu\I#9!)i>6%9kZQ1W\ZG'Ys[dAODU\Qp6=kj'T,+\\&)A^pX-9R:Ug2V0\[C?C + 56ooC<2u!+h0.`jq]07l\Ef4-%8u=E-SU[1m8,G5S?I%UI[fDXhB3*sO9QG+\!'6ldSMirP + #hKIJN0a:nB2H2]j`*n/TJKcs4A3]D9YJF*ScNmn![3T;6KI5)c7EF8c[()dBq>d\R8qNA.H_UNFb9'?C$KhagD51E0Rkd5G^6jk#]1TJJYL8gYc-1*5p) + 8e!hf_sLSMA7cq@Csp[u/^=hMS$]s[55F8'3jV=O;_k`U(;<`35\Kf#5)J>Pr*T$6-4QO!j + Kkbk:"nqhg::?1S_[YUD:6!:j#iY0FCpj]8!,FMJ2(WA6b6ehF7*b?D:2I)+)D-BZVA80D3 + NOXqRmTjR=3?j,_La+P?g;%c5=XRm[2aL]7A9?k_t(.'?DLpHGpjb@j/T')-pmXgscKgA)U + b*8GfZi;3E:2=2_UZEBNlEU0/GuoDIi#uG6,>mY)1DApU[cJdo;b\b + &EWl/3g1VE=2pYA`&X#&NCRV$fIAfu%lufKd4@1>5"0N&o7J;JS':K((#d0iaINtB#"[IDJ + ^3,#X>1a2F(ij-bCCrDnl0Dq:Vra,,MXVYSfnoTqM0*/qZAm+L\2a5V3s1'E959h"S2Bd"E + HZgF1lBYGc96N[biJ'733W'=hmO*h?;&/o!s`Vme;8c`9"6LFn++b;PN\m^mUSe^_bsc`+Z + foZe?FHfV)$!1?Ik_`+ZfoZX2<4Na(\bnoeTeRIe)(BY:m^JbD:pE9bQNjij-jV(Q5`7)'4 + kZTnECf&2`fPVHh&Vij2sT7jg]TJLJUrZesY2.m8W`hP>-4Og.r*JI#Dd2>0-B`':$qq0O* + ST3^e-Z[$A/e]4a7qWerU@Fs:C$:L'H8NA$,g*_QgB='e7?>G9C_ljkk_q$<1gY-N)*6f9& + WNE*>Ms:i1VVYnU[cH]"MP($j,>%=YF$Lf)NW0g@mo?YMVFr#1YrtrpqC)@HNeN2S[0u4b8 + *';=>V(in]-I*D\FuMSaf3l1`i1o5^VtZU@IG@!(JfZS"OFW3YT@(YA)DZ\&:\pd@$BRCeH + COTP-GK'8"SE4?=..&WQfU`$Pqa$"CSkf6AIdG]Y9gX5b]l"@_@uR4(i&,Zdc01`i3Eind! + R)W0RRmZZ%d0J8A.S$^=VF&-)71NDbt9s.ieot9I^1ND3=-70Xlc3/1M=`'AB3uX1*BXmf; + MZTGR/oKOY8TW4?LRHjCNH[3#S^FZSlkgOWkbP^*4o2ols2W)K/nV\^1#$1Ob11JUU@IH+L + (>9Cn>l1@+Wqo#P)G46++&C0&WL/A2&_P$BUE,?\?s+P8b;_qg[hdHg=';*([-e^gWl<*LQ + _YB^q]HqUnKR_loT:G24eG;*hC]O3NM%epon2EL(Ad1V09uYU7UR;GbT%taP$7\[7qRcBKS + >N6$(Uec]t,->eW*k]4Co9:?A+hcd+h`N;U8^Wn0/;1]>GC2.uE:`hP=.1hXMXT+%)K^tWoPE0=E&)_O+-j[S@RAXNtQ(_(O:EapLlZMUOgOT3uYku=6]jXd88KK + 3u4CWNlIhM)@AL:5Mi+jkLm[VU[dQ,L-j2R^$WpE3qW>e/]]_m7H;c5%BqX/:P>AqHZj5_[ + O!RcBCj.0X:=J[a]u;eor=8pbEjedP.io`'C#;T'ob^r1k'hCu#srOR,7t,XB&WK:n1mgA*ANkU= + (6*7;Q/tCjcl!;TcG8=ikZiI)MoNNM]LbJ'1iRGH7,pYsYbj&")%Ct`\YJ]8=AHhlcKO3Hb + T2Zb_mi9*B/FRJAjkZ(0&q!JRC>./E1KLi,[,T;TF^0HL+W?EeBE4T?CMD=eo4Spq_/;*dgt@4- + hRRKo]>o5`EbGAhB3Ug-G'7N4*f]nr:go6lZ^>0>NO@&9K,U%rB,03i5o\,%U@IBk==DG>* + kaKocBt?rk_o^Ac2uh$G?`?pU@IH+##EOE0KF3GH%la4'o`HhrKYo9Kc/IfLc]?4Hal+o9^ + /e=qUpDEZN"\G)m>'r]s`fecCC6YeG@@)7,pRG2h#/qa'4j*Ld-bXEuro,nR:"DnY!5:JZ@ + "5cNtn=X@MC?7H5b%ZhQY)7`2TR,+LZ7ot/4^ZM67u7`0Q_+jR5dXlar0T@IU + ;3hp,h(h_.CrQ$7bdD^N;g+.C].i.N!B$K%PlS;&pbD*+"m#;rCD;LeHS"$m$=B.,;4rTL-BE4Ub,e1 + Q<=0Ze2.Y1U#jG%bQ[3d'c=X5BR9=MomPiJf$*,GUtO7n:TVBbD@ + ((E]92fX,A!B[%EC1`i48!'8lu0?tUFQq)G.0`Z$9Zk/uf6b13SZ-,^[< + 1u:3Cjs*>(0;Z>0]9WS4PnSNiGOC]cS])877B[61^\0R0J':k#l1m'UZHYLc:U6oSV9d&H2RHB@n2S"5()S@_# + jr9n)(Tun"/@IGO=+pA&n<1gU;"QP*_Z-PI#P`VN'9^=eoX*PK_6nCY,^l]mA5/PtM>d3iJ + hDk_tS/BZ?NQS^aG)F(mOHk_t6FA-D8Cp?t:hgsPoW'ZZLSB>KL/Y36QT6Du[jdU@I>8>VnGNS^F)jM]Y$OnDQe&LBU2EQ + SR0oFclJh-mrZqB`(2\9c?'f6$)0icWFPhOq$%3 + )-]>i@"'A:l(U..I96JQWemRHB"``Gri;A\PUL7_3[I&V+-_m3jA\TrJ23]T2\S+lNa)4cs + D)NW/Xj76=>Y43`fr\ASm)L=6SI_,:Q13BB3k0\EqVB"cRB[QS]?8lT^9Ke@6Z>=H?UGMSi + U[d40)NW/X`$?7^c4n2B)NW0CjALlD8K7&BUQ3WajA7VZi[#M(cBQ8'`qT#58OI-*!_).sR + A/ompuYdC4G:uo7?>IcH]#h<1KF8;.;b8,qbFCdd$^oh?`n7o\e^@HUGHKWE>846=$Z:h4? + ?CW/I:bf)NW1nV-p1/8LkR97qW0MFs)n\oNi+kkY,Qnj+s8#d +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/rotate-270.png b/Documentation/rotation/rotate-270.png new file mode 100644 index 0000000000000000000000000000000000000000..632f62e5ee7a8855d78f80692b2fa175ba6e5efe GIT binary patch literal 21016 zcmeEubyU^e*6yaeq(QoyO?M-qh;(E4n`NT;Nz2uMly{cU{D zIq&(td&eE$82A2ne1}6>d#$+0N<6YP!C^VyztzRQEql*4t+0oca$3f*g;u7&hdI=1%qg?@{JrDuZyA!D*( zPkOGm1}C4cis|C^#E$+{? z7-)>|n-}vwaz&?5{p9k3XH<-zr>(^jtpnOBVocRH^n9CYVC37N zQ4VqUoAWHq^`G}`ntdnTeX+U0S7=YC<;|uo!Qb^D-rqZ{C5kjhsV^=l7%l9!%0L_dSaSe!sBzae%=Up z<*%RUO_ex0<~(20d#BbRH9fEa6EYC9^v_Sn3ryVl(J2<3wRmW5Q@m_uk}nf>TlVpH z=jY4W{^vok$$H(O*tquZ?b44%>X`SI9Jv(p{6@t6+Ge5;RR)>#SuA-mzNcmL^ma7A z$uwZ>TYp+4s*;{0Q1Q9lmD*qqnIwInkCN-yg?HA$N5&4jXVzuZn3z((+^Ty9u`KqK-V}9nz@REFiXJ8^ln>Zty?kv^UZn{S(i`8bvE*=4sCYPo? z^#r37NDDpHx^UC4&3NNxpY%wG#Bo*ojXBH%+Nd`=4xSd%2V-h1fkk@F?}Y&;rsgMXCC{m%K{JT1`QJL0~919%F~SY zhrH;|CBFH7*WlD8ubTE^-md=EdSI6nXRuooH5~s5X3i}R7T`=IY2{4X_`(=Qufc6I zWjl%I_&iohw}^|vZH+rq?Bw%Oo;rQyNnZfwMk~6%zm-EoqJ&p4dI_Un1aju=1M`$G zKg1s`S$^XbR)V?Yl-+U~F}E^3e@!Xot5Ma|ss8h|*&`e>E#Fh*h<-p(+&{}}Au;VfFA^Y)Ld0hi%QWw`Yg7*nC97O*}Y%hHic|#a?&+L;iLmp^e7~+))kcS=8YIg>X-H>aV1Z4d>DyXHJe+s zdY!eZ;QMLPa`+Gn$j;mBhZSLij1;@Rch?r4b2^<#1{n!o7ja|5E;nQ>N%%Ooa}~R= zhx{UBAn*5dRqQz-wK_?9V|uM(OK#LRo0W{3aPjk;*sSs#NX6IGq&QE(T%7AUR+Z6sA#Au3YoO{JWRZrLl=-++eNgV0TQFUR=!=t109W zQs1-Ydr%zb`=o^?W@N1);D(BMoP(f4161m?70Y3aUBAD@vZW4tr{Cfn0ASE==ZO5EeKvKO<&ui0yp-X^|Jg*7v! z2$8UE;&5D?V4t-;*4Xueqi8c_j#{u|ye1L`Z2X|1ZhXxuDHkL#}qH5Pvq%}#>WMIO5CIk@wraV?QPvF z=eAL+?#UAq8AuDjh1*_7$CB2zpYx}1OC~8eawpnb;-jNKw>}ia2Vqle zo=MW<6eyHG@|`Y`X2fth<*N0zeSU5p)9ZXX%GM=28*&e<$T^&E`a1#sIZO#pYBtH+ zVkj_%9O>Dpug=>V=lD{?J^w)x=o?jcZUt3m!{-k<*)5+0{_vuueOb@yhEZ;g+`xiU z^W?R^y~SBS&2`iRc`9{_h++1Z_n-C~R*(;Uu4%~fbVfwcvYZy<`;v5%9of{B}aRrp}`e{ zqS3;I4+Ops=qAlyRu;>UOw|^a7QYK2O;uMPm0a=Y;?u?1Z17a!A3>*IQd6zc?&CbK zHtGwJ=ezCY{J{o2chGm*S9I@-w`JXW*+u6{WHFE25%88CPTFU!LQ|(}#@v<&b{iI3 zLve=F(GUO9-fy%WF3U0U7}WjDasPNrSBy!NXeChgfNoZK23X+I<>5AA_N2WY#1)kH+=X z*i$P}2%i+P{7Cv3CxS9f#>|?&K9BtN$0zoTnvJ2Tp?T!6SKeNq?q3hmj#kUQe{uej z=;oQmuz%W_vF*z)J>Kpi#_yRttcwh2pG0?uyo>637{ul2TRxzz;_<46cp`lZ)F$wL)m`>h4L^`>ioKTRJO{^k z?yHH&qNWq+Wt6j7yn^L)`3u$ZWZF=etk`shlT}hd`M_r`Qe8oa!6wb_7XJlU2vohyC0>7JR6zFR=QML)$-Zp)6L#?r%(Y%^VQce4bGUu) zj%SdQ?Rl^znqHG@rBMwViX@kRLmj@bqshC+jNFcvN;(>qBBw8oBo9VIeShC4uyXRl zPQZq)IkjO9C0IzKLOrn1h35(O^_0<+P1IAWjPE&ETO59bd}g3Eq}aT!$%lMjquHxB zKj-FriP?G=CZAuk(qH2D1MA1T8^RSaE@ze8`Amf{nd=?b!-2`^cQl7C?}Bkk1>bwj z4JjG3z{y$4?^|HKPZjHpl8jO*m@~$ER)(L&8<_yjw`6Aydr?2_FDOHF> zn@aBOV5g4K+2yXZ-Fx}EfVa;+oR0ADI5~-{o8imFefiZ!Q=$?S$avVt#G>S~fh_!V zRB?!v#BdOIVp^PG!Z3axcG{VMHk5oqtO^l%{wdH~q^+0o}g5^lDPOBAzNLU@g`$o)O z!|b#g^s?2QuIMxa&7g?yI%bSF*nMIO*;6Hl;$YAtM`si(;@+f41@4}QXS`0ZJu;$? zB0A{z*LSN1Um-u$8;F2vX>>d8)16WqX`+%rS>61IC z98(6^W!-b&H#BU9Nah=u0Whp*Cxu~8m>WNT(1j~upaRLb%bJi=c*aZ>4xuzoN_+=8 zvv#7~H6WY5>bJk?FU*q79o_-+q5arTMPa@rQV=Xhp}c^5fYd*tt*eZi*M1Bs$di6b z4Nmxx!1vp2u$HOSOQOJ(JM*bu9$0qfu^jvR%M2UcaLK|*s#TO!jmY6FJsOGrSxOBEYZc2gqM*=ogL6|>}Qp*EsC^? z3AMV;ndv=ZTYuVgVV+{VU2!oyuZ{LSBKn>FPI{*1q;iBn`AeW?bIGrqU!R_~Y03Vo zEbthK$n99l;ml$_#;!lT1BS?I=StdtP6FM-H;}7kG=i4tY%O%thn*+!ZeCxly%Nme{KbDMa>! zJ$mAcMSxAR=2|N}C9=_N=I}nIdN^_BkokvXUtNZ=6`u;hv79xXLm=+{UW4^Gr|DX- zmdgDIxv_6}v-b^PcmCm~b!}Kazwm@EF@l0zofFMFb^7YT z&`0`jB|bKUY%l1W(Y>aaqjczqzmrZ(n<3|-i^X;ip`*0+;v57jt3X~=>+jLJ_)Tx8|wDY<~SVo2PD8pPjuY;MfhP1WA(kqOjmE2^!T+r!b!#5W) zL4zR6V|j(Kqa_l8_prkr`GW~9~1+|DdA7r zg1UuA8Huy7wOsi>qIDvn+35OK4B9?te<#$YU&lxUQ$=DWaUGF9SL2tPe=5U;b1>Dy zrPHHJDoj4LlxclTe8Kx%VJ4!K!&{7KVoMs^7W8F*y;xzKgTcWAd`ZMYe9w9>>_B(olKvvDPGw*!4kv+@OpLb0B?kBr^15){Dujw3Y zvqNpqikmGp_!?t)LAA1KD7AmbWFWOP#pl+`hn3)cuZ(RJwIOR#S)qHV6{E|8cU68T zP5SOFY*Noa>k7v8uQHEemZhzf54k={(Y%nl@OaBqSZt|=m4RK0Gg9I6A>%1m2uHOfBwhfcvxUVLhi=*DDZY4}z>vv+*^`(0%S z2?eyZG}xFp_e3{=D<>f=^+=H{_e!4@wsPL;d^)*MaDM%Db<`#D$7yV&Y&Bk%=CvSL zQ+M{A)c_G8hJFL4M8i4#>Y3YBbmrdM=@|ivq6Q|hCXra_@p|K^T+N_IO>GyypZ)%( zttogzyG72LPgysk?W4?^ z91qG9(P>(Ax*Ys46yY!CgI8*LXR(=A2kC3*;USBopQm!9dddCID7`x->TrZQ}O z%CWdJRgo6w_kOAXk~-HN)u%d_Y*8vXIT;0OhY|*7q9v;4nu{PGiQ@Cd7*GHi_)p&VHn|sg`7vnFe$MzX)IgILpNhd zzA0pmqLVQ#PrsX6!{6i4RaqJKSnf(_V=>&Mj@|Rqk1Ocdbf*O4o|Ai$bLdyEryeQC zNS%F@upe{w53C$X$C58Uz;P?7E7Rlp`k2eH%#l1rf~9}CQsR><#CyZ~dhW%U;kOqP zQcMlMV@C1%YL}~&S*7W&#nMt<8x3A$MXM~o922sBPut_NiV11#iWB#p^YNF?sQl zxc6#W)GyBNYn7m<++>%2T5#9Q-W~C%T$YBgvFAx=o*34cDz;H@EGw5hL|U~PRC;x` z+wi-HPliLK-VKysD_N_hJNzjpgf)0Yw8h=iO%4>qDZA7aS-bO{YD4UB1ggB!*&Xr7 z*UoifmSn=TmaQV9(^$Jt*jmy<>YOUl=uzCLW1QYonlD_B9?iuyk+ij*h?Z5xvAN_q zWgDn}U?Agr5XmvwsW#C&C-M1|CRsH;X!?CplXU*GiU^LxH@J)I^m(t=yQP2EGALuPwGiJ96J8? zh)licG8Uc*d)B60*;c?K&)*=kPgeTS5B_FR&YsHp$eg<5i9@@I)TWzx9Jja>UGqlN zE6qsjoEx{Y%z=;Q7_7%3(I*rXSGPN3a&KopWL`M(Nna%Jp@h&ZQ!bXi3C#l^dJf)% z_74wmT%J-2(v|*NaTpHCc|S`zMEK^=KT(>A72XvOi1#97M>AC zvyKpNP9ML}(B~~jnzui%9(~(wl?-32NY(KjqQ5nsvGF^byO=gCh)dp5qft7poF>TNZxycX!X9-PYWka||=u`4`#!d1Uz>9rX%R?Oh!=}BUWgCEANPh*+3;^`hkGZfSgU4 zoZ}!|?TvCA#=v!e|DNY5J|UG|iIJJ7+$79iB9pMLg%rI1k~WH{7u0WOPg$4z`sv15 zYfNIbKREAu=8_pMlrSY+5}1vj7eCYl+Hkrs(+Kdl~=b0HcP}V z`Ij3CB;+=^I=3$?1C2{kNLQoq)a4TcD)=zl=5ZsLH1b6gG$F2wFz>u5w~TOmBE$@kN^Zg?0l@~10b$$-Vy=Q zjCXP+fWIS#`55W%rueu>Ga70EmSoFJ=AP*$|)HUFYuy0ha$$?!V3c z$KCHH1G6+VB$V83d=bY}Q<7#x>@Q*KZsTMtaraj-F%f=2>=;k-_O95E3wYinyUYaS7MTQHB1t+*JE zn7FktkBzmMy{#ZHCL|{QHxZg%PJmZhx&HlB2vN3xC|esV5iub<0Uoe`upp0+n6)5} zwVkLCkG+Vsu!tx>zm2V(?VTuF8;J+*UJxt5oK6rc2Rl9wH;20q5DJ%&f1)PMD8S4A zuaPINRzCK?0%^uaPHw&d|N21J31X+?V};NrSVT+|ED9D86b17O@r(RzwZ5H~H{gi~ znP7fi!9NN?m_-7(44_ymgr5Qe?!*Fjkx=xqv+{BG(sg%tm1aa7i5{`?pC4-g;bd#& zW2I!}V+RQ37Z8--7m)yq>w*O&ghVC4B3%3e68wLg?{4d4ANYTpjR+oksXr!Hb@B%G z54;=t6Hz*Lo_~J&^P{WNT`1Ah-vxz)mCc_kcw71XrC~tUpO0)Dt=t^!0QC6FUH>ue z^uKWh8*6(j8!;g(z!mK5d4$9T0dEo)vg5G@jA|`zZzF6iZgr=He@gduxA*b4^0Je6 z0Q3mx3UJRmUD31O8H(fIXZt(aA*=u>jE7%@=U)mF{Yznde_falff@g}u@v8b(}~pG zguj6dup$xHA8Fu!H2FW?_5Vy=*#9c0?A!nrT+V*{NSn~x}5fe0A{q6eud$?FCz>?|3*Hk-~}IoOjq zorzFK<{r{gqPSmk-zF{t)t;ZsIw?~a8FI<6)REjEv6Q&kel(~kL14rcsQzBSXF@IK zjl8O=J?*fgk;s_By%caSg=;iDtWrPn36|b;hr@9t#XNffk?}mz~j<@GcyN;l{;@VLd}+nub^y zJ9-3lM0Ui7g?*9L$E!SCET80bW(MDz;w~C5z4cu{s=#BAf}}E2Iu0%&ulh$kbRIB) zE5bX#{fXQu%qSY?=DKCm0n#=1#i~TwX$)g3AE=>cc^RaAKZiGM=Iz%K8C73;6d3^4;6b&~6738_`~llnAKSul?{hxDkc35>mND4!0XUaIUj z112U`Bm>*DWLrF&w>!>ZYM|<(vsrY>L>x%JZk{{B{grWiopTQ#k_&XU@-;Bk$fdz} zBZ=%uzBzT4tFYU9^<-S3?{2hZ(`O?K2cPuU`zh9A($tcnC9Zh5xFm1^OH%$)kt>}E zWM`9j#8e1S?+`hS%y%!0xmku{uEpphCRaQoWHpI@7=$aUmNnfxaCgkg4<9}-_6OkA zWbNv&bHQ_&n3$@KIDq@V7m<+(6LDg@4uTz^SSn(!y%--KcYJ$yX3Vvyt&!)<_HcasMVFxSquKL2uV zHHpuL;uYu0-&w#q?xAXa?zBmKHHyCwRXq70b(^Rf%bB?gCnOukC)R)2X|zKa(1an1 zXdbSh;{2e|E=$!Nn4*8JL* z26-ZpzT{8f&eWrBktk5S09T<_p;0xg<%9fRIlvC$DAv7JnMMnR>`qXsk=>~svo5~m zP;|-f>93o>TOSnFN>2vTr-K|oZymIr{98tN`c2WWXJua7TAT zMR(~5$Eqj_H;$KOZg{{#W5!bRygp@20hsd~97fZOXZVCVh`PCh{UwjxyeKh7xcb5e zrHSz-oMzTixkJJF%pKiTN%*sdbz(RQ{5o{P`6wtYp(C0PG^l`Sg(>y~=E=2L%m3N= z^*2f5@0EbnwIPle9uAmmlrV(db|15bW&~^PoT2X1d$`AWcHLQMh1i?~1&#;T0IuBh z${wrJ?#}6qjnZP(f`#);ssBBm0qZ0$9FXl3mQDY3J4Se7NTCkwAZQ{ieqcJf$p)qc zcz)OuAef7HDj&n}c0ju|)9k?RvW8Ed&A&a)L7_$3eF5IBdxQv_;HR;LYRwswCVEsWX1JX8K!Ue14MzjFo**u)(u-T_G?IyySGC1nkEh8cBO zW_`qhei0xvFgqi|P|4U^Km6q{w^iP|2(sgg;-7amov=Amo2clQ)>ohKnW{&f>{(s4 z1OrivS3{MdLmh_J>}_lNtzmpzEB1JEg+7PSrXBSRLoVmjThKBPkHj{M-%}Y-G*qU~ z&d%nGbC0$w`w1fO7^2u7sHhaBUL0A+dBd`nvFjZ?IH=$#;C_o_`%miVSqWRYz0Q{Z z3jUZ1dI-5+&Ra{eFr_y#XV3I*SJX_gDvJGK2PbQ5Yx%}+d-$qZYVZZdd|Y$TLYgjI zN~Pibgx%|xr+cS;suT4NL$!&%^;Ff2p&ly$wv8V?T#cs{&gb>Fwm|)yQ6ifU*z|mm zcwO5P&%+w>Q`mB6Y;0@@fCRFwkHPoO>YOevCy~R*&rl|82|vkAYKhJ}Um5S5nXl5W z*4Ea7P2yDsB;hkoSBE@(qr+1%SGbh~&j=IPDn;9}b{og+Em52t2+xDP4bwA94R5Ts zGME&o87!i4oo5X|%SlygY&l3UXsgJUzqCCy~>Yg%Thkv`JG(9=+6$2(v{b?{s`J{OA` zy75eTDNA(;pz(x4_C{kCV4jyh)jq`1bLWi0Lv~-zC~X}`7r6DVdX@dzP--Z2VZRP8 z;VP`23{7jJSf7P{i9l<3(*$HO9w1ZT)-UE_hhQ|<_$>l1Na=XZ5XIl?ZW15au*L&q zvtWH79o1I=Cethj!fED>2lQX;Px?y0QofCPTW2d2=Sp)W|BTo*+>8}zb^Ii z17o@Cv{V4yd0gy_c+qFZq+y;IH6l^_^?Hawe;ifKg3e~Yb~Gu}MQWR?j{-o_N^?K> zFVT!!|KFk+(7=C>X4``ACP#&i0Qz(N1XQXTgxqka!Qc7~RPIG>)6F_h=GrLvzzIyxU<4~sT;yUYNgOk~rJZiqKrhS!C>C@vuIJL`|?*4Nh^Qv4>W zo2X<#B2k2S6f`vPcNTGdM)>&M?r_=(MHu!Rp-sq&IzoR96zi#Q^`IuITkDw$qiVxH z&Ox@nv{jvZ0-{#L)cp0OY4py{=Ua}#=4eq1`#QyF2;>89YZB+lQG+g4D{@3t`gq8HQOaMNJ+6emnp-E8fUOxMD~jMHkYd zdeE{_sRgL%FJB9JAp|>ETsQ~?+_7iJug&hx+4M23qNbeN$sDJmfgGL;ouR{@aK2)x zX&iTya{pr}sB!!y^b$w_h+8ON)@G7O1Cy&z5P2C9oHp&iw>vH6AwMBN7Kr`h)}_cRNMy4Ke~vC2MHn3cgdl>f zk^#9(`cM2?$62sxpo*7?)T0=>->EaqgVPD=SQ(L9BjML}MhQl&zz)B89%TD_AO}Q-AS)gyG%7NbS?7z46bG{tqGbqCVonmyZ;owi)M! z&tR-WFY!u&N93KvLnW->n zXVwj;v&E{2yy$u4ES`rJf^p`&b4F`v1JLcz%aeI$-BOW#hBBI^tPj49x?OA#J}gQ{ zo$DEaC}Qh47!(%NJ{j`zjwx)-j_gvb=fXwoPjpW}R{~KrOb=ELKgnfl|C3&iMs!h7 zQ3VCMx(>tSkGJg!_5+UXq;Uo9+*m`R{mAysR$Us_gQ0DTn2Cw;@#oo`fE79wFb7iX zh0QhmVV;8j)HmSfh1m5#Vc@%(@Sy0RFg*g{ZFM=<@nRfiX7@6DwKomc< zA(pA)e+z1PXW`G4c-P3y9YB&@ElWpa01L(uXQ?K?5ITVSd$cXN1#Tfg=&!g=t8bHM z1Ne_^!Ep>wTygPNiyS?)gcOYjEbH(hJO+Qtd68fdQN98Bk6a-GtpZe46f9Zo06m63 z)@)*?0rRw;ip4)#>nxqL<{O|`|5u>Tyyxz?D&E|9w5nj4k=X$~0*BADNVnLA?VP!` z(v8{`&^*-vlH{TDz(B+$6l3uH{nLw-lD9ZeStJ?v0vhi~c*R1kI2;Ro!Rn4(r=!eH z0yv02x8}>HVKRVZQ4l;*R`S@U{AM8Zn$kG#z#6DS|B-UdO(yC$ax*uI_E2_&Cd}hw zT?PRBn!ue(=NTaEeiC=Uy81wyu4(cPFEp!#n06R^on#7v`3z`U+G+x)$7Ua@>`YtH1G?628hA5vTDQ7uKZWg?E4ktN)@P^vCmZCD}rPAD`fz{lTRmT{*|kL z9J7uX(t*B2ICQmJEzFkmKL>NEss7E*L zyR{`=he^DPBIam7yjt>}wO3Pwkn-)Q+wV@xE!#Nz&#DzMff&22oGNWT-;CTl*h>$nZ1E`m6eTkJCjcvqQuez;u^o8>cc}Yd>o5pz}?YF_t;ofOwqkCfuJ0~shCg`M#Vq3&9L)1u~ zf?DXV(!|lJKWo!AjJ3G~1y^@{>rf6+@qcevXW2(ty#)7nAf~z1W7h}v^z*dmC9BkTp{%(_0VI4SfGM?>YEB643pnk4qCVYQxs}+j^J@#m->fxs z*RKxTnw7h25!ef#0M!Z(!_`Nl_~eqvt;6?{P+8;~mVNYnJ4?*7CWfe;&gEnGf)OT& z)Yae6RENz;;yL&RuWVaLJ*(J2348+q6^a6qw$pi)V<@ZbB`AW~h_)y(LdX zP5T6@&%+y%bhQ834|1k$sfTG*Rr)yjwQqsmGD8FHcH5&wkmvwKde9cL+BKo0F2P)gWrsQH(7iazi4U ztJcyd$*)5T;u8}!Wl(m)EW;sZ$P@PcY{674YRYsWiIT9k`iq5nhSdkFCL{KBYh?hx z<_Ttqs?>Y8^A0Z;xx%%<*ddq`0gdKyp11)K^&*uwQ*A>~;VKQF4z0Af!k$w-U8rA& zrh@xf@*V?lc+o9CQxb}1h?TR;k&2K8?w8gpfNULjbN4hjAs{t2p~1<0Ci(}8i*+1% zpfN)DGFyd48=;}uvup(MUH-OEzu`O(1GL)gfK%-sA&Q3%!fx+kqeMv;MF&t*qj9Bj zo;f0+&(@0UfLmuvc#zU!2!8~;1f*?axP!K#=`I5spdp*M^x(TO9EK0<Gnuk)8XiWUE4& z9emg0X|4dC(&BSDLL)E8d9>3${YP{cOdhS?_piECVHqZ-r) z+DV8)>ndj|D5SwJgtum)!D-?shz_Tor$=kH$~iaw2QKGL3j7(IT6tuzud1P*wP*jNe8AZmSKqG#sxWS1$x$(nR#Rp$_VXFD^buQ`2w_33Aj-oS9KJb0Kswy_ckxpw!n#?W*e3h-12MZ9`an3UnOb{ z{*{glQ^54@;ASqn6>?Y|y~5uQT}9R=2$;b1@Q(B3azcI~w0Uo011#9`Y?=|mavBot zZ-d7-{_FD#sNZloO?RSA9JOjTiU0DeT(zLq z0eUV6<|PBV%sch*k$qZ1wC}4KI1c!a|<+7|< zcPVlHc6Jy;*w{<4l3P}7r}K{4m*=L2%#lvl0)3%YNJ!{tYi@4t!RoIqv;N|i;*Amr zQrJ&luInAi-x*7yr0cw`{zwzG2jZ6Xey+F_`Q`48{Z-=>)YP$X8+a)EW?>%<4haci zEoR@1W8=@xIUyK$UzEO zo~#HHSik%XH1T+byilC#zM|16mV&rUDrZDi(fCNG+flD5_jxB_lUm3YXg6@V6zGh5 zR|nv9*FZv&t>_Rl!>_<%Xs5AR-1%OJ-xjgsBP-`8;fS;s{Bqh~lsyepPX0C?KGd*2 zfWl=HXJE)U9p!X&sl(rw|4bEq!6DEW+e&cru>L}FQcx|MoUb0i-|hJNn=zWH=cd+k z&xGL`3{h5hg~~~EbaWW-Ph>ics4tLfIQs)$-PJh3(+l+~YAH%vE|X*^P5TF#Nr+m* zL=uVzPrJao@4>VWl*35dci|00;w#qYzbf!Ti3|k+;{K5nQKoiKtW)fRoLnj{m=t+2 z^rHzM*JvYPDN;1z_a&YJw{cvoD`a}9ZU zL5!<6O3aWe7(=TNwdwoQ$G+(&3Oi?*fNQ3vsUo15P$3}eC~#qSVay=HeT&tEein-m~fVBBoJ8dR~wWtU|@4Mtmtfp>`|L-pr1j9o*CYKqs- z=si$sD(79ps;8YBI&fLax=<=nja7aIV>YxED1woM68Z@YN%|V!bI&3Se&4%rdLAaUp0a>xnICvz!ee>5@-Of3GT;(mo?m;W)_dc zTA-Vsdc7{*BzC+dKO=xYl-{Lf+B~e16_+bWEuLAvr4MB#lXyy~J+ya!mB8hV_C&D2 zCnA6m>ny!B16BMQmRO~-48~lO?WZ^mR#Tri!mJ0cR&RzO`;?BOd`I6G!N{)^Q_Y&5 zb9%bFd84wpy1MEDw4eM9-UI~=jFCqG^kO4|E)ZC`_Gw439{yqWP3TO1sTe%hEU-Sj z=HLKPy*JanTY1653W;riKh#bxQ7O>ymjqzOy^Mwq*$uS{K*c;_wJZkc%&(27F@$+c z5cBprkt1bGU)Z$qH#-isNvW}yg^owTfVJ6XOQhBPVTWEo!d^q=(@@J=_IJ!b7HmY} zNIV!lK=;5{YKywBnMMD;_n}TQzJ@pY&G50@efpi3;dXk7pT@W)Zf-0Gx~*Thj74V)%(N7%s|3A@8R z?}7s3A~0K8VRz5Kq9uc%;sw|ZLnJs;eS*#VWk4q{GbC1cMH{I0XGU281_aRQeJQmG zHb-M*bxVS-C2bh9#?;TNi~0flKW>q`qz7(w%k#L=L3WJ6ko0H*%t*-4=By8sPQ$_h9L7dQ|5Os}z&FN9%e z4l%!~DSen6bXb?^BRci*D>c?yO!2_*)Lt(cQq#eK*#)9uoCmZdQWo-MH$B-xc|1aa zy6monc*kF$Z4ph*iic2uXPE=dZv@K(7|bgfuHd9yj6`$X#g{IV2-qP;P?)+7zYsDH zL61}x1QPNA90o}Qxy@P8AxVT!X6PT#F0*RBdO+Lr5K77rHGj8L*#6-b@6PnX0Wp;H zUx@T+>oKI>@5&U&;*)oX1lrl+GH3(%usMK8f0(Ks>(4ye{8=^5m*nM7f}2Eq?$xvc zuq1_e_}oil6~+9lZHy8^=;hBv|jq@%eZ<7B9aVAyi!O(uX|bZTuei<&`V zPNg_Nih6u9ktQ@bTz|6U<7BkUDvf!hu=+A#Jra2HYP7FA@6d-$pWKsmrh;2yS|uGN z&21J|$iV#65^?J}j-1SOu>}GpjvYFuxnDx;jH*yNb=#OE(G2IE8yb;DgI~}I$41Cj z(GE)FBJ&`JlN!ThZ4G1d zV|9XLRWbn|bagb2_7YRvAZ%X0H$cr^by?kn*3FYhR>dNHd zx0CP-2VPFGu5X!=D&cAZy_F`G1kvq^o|peb%h9Rj?GYdYp#Z>sfSddB67AuNdp zimQs-mKhxGC%vV!xxM^9s0$Eb!r=bcySM6jYC1YTs0xDQ z!|*IHE6TeOg^ZJR;YC)0Uot>A3?yYx7csdJU_zB-TcANa8I*oQ*iELr?dbsdiMyKi z;>C-)4pbnm51J1w)DIwt3tA0h6#v~Tf5HJChMBA@Rz#tv5z@t#HLN2T`e}A8qyaMz z6#zuc_YXLX*aJ1uK9IYw{_%dL?CE5j|IMK%#=DU|J-jfr(>PUNV*$ajbq8M6?f234 zXAS(YR-GmE#og-YV$Gx_H%&pFvBkC9)z9<*&LQus=STmR%E98Ifk0N31hR`a930C{ z)B)b4ALr?wAG&7%Vxn<3XQrWH@epv@g+kL_X-!B}=3e>bn*0pV!fhb`7)f(k91a|V zZt!-m?xsa?x~<}~-}VdmAmEh~kqVce0;ki9DL=|Zn!#z{>omt=WDGr4=s#cKP9m*3 zud+@sZmVs8nn2Y^?tw2<0e;pKw(2`!`#kd}%f!axA?MjXU-${oI{}I$EIwkj7VoFM z1AE5y%V%p;h2P;wyOdRgzOBME*k3(m+*f{*b%$US(+&Y8E3;9i!J9u7Zbdj#S6(S#>K5^p(( zp$8PD_Aj!aB}X%yQ4ZE|{wNlV5DbycA%G6X!eNxRn8XZG;}q-f9CWfWuW&UsA$r(P zFC$8Wa4oR72^ivlXAR)1Afkv~HQ=1Vl_CHGBeiLt;snejlY7sR#?IMH8rUkh?3Wr>%$gG;ZL;&q9;^Jq06)Fm!wIr0N8DUS<^Rg>%& z4MH_g%WCj{T6$gJhvJU{6r{;p?fO+Hjiky4(syo%zstP}%l9DnEod8*2U;Rt6G!9b z;r*C&`TGUtXuNkQ2o&<-EjB+%EH#YMMo~r)Utn2)`nrw#e5~$)Z@{V*iE8oA4@~CY z-^ZZ+*5ooNkxK1kstxw(Hr}^Dqh*w4=bdPqrobnZtAnD!52kBFiwEE# z6X7PZ<{(*&lK_q*cAq#peSfD76qvJcJJlSO!kHfMZHMV(p%j!IHJS6Wj~Li*i6(xu zcuOEd=(?`CxkCnJy}kBo^Mg5#ME+Tsx>{NdjG0<0$9dw^d{S4-`UE{Om`)b}9^lBJ z1LbY?vdGbrz;`d)00wnc1qe^gAt}^c7cHJyN7P_WWxY+ni)PQ=%QMin(Vs}Tl63y7 z&O}r<&=R1!LGV?TpLwJ~;x(*MtA)OR^)I>+;1^crcNJi17w7qc1%S9RK3$i|UDgr& zog-397LPmFBU$&-f%#SNPQ7pSffzVm+pJlNhnFNT^{Y*E0YUU%e9n;Bn&1r&i? z_};#5^B8Cx>D(YHMtkYq3Os-${jc51+A0i2^(IdWK0H%Qes-(J4qD z47l)MJ#enSQGUWaC%ZuDeKW39l>i%n%)Ye`uP@2nxb146JUgTp23*Gk>V*OG$m^|U zxuylvz^gofAyT`9Q_25}L>%yd8sL&O&`K#_mliZa6l7hev;nyCY9=H+fek07cME}5 zTOQCokO_;9`|FwBzPuG6yrXZ6S?&Swf~~#42^S{d7!|OIrp~w;IAjJ4q46_87ohw> +cairo_image + Gb"/lH!D-*rPq2l-!jR?4ob`e!Du_,n33"[[H90Fd2H@5M5el>A)jcD.nQM0RYo*(00G)AM + YA^Zd6nY;->a[%NNX04?IVqRijlg:B(rPOqom@RcHMo&XrVQ14E]c7KAGnu+?UD+!qnl5n!s"H_#N<]KLRcV))!^2n*f!"g5ab4.+J[>< + %2:+ZeqU?Cn*gfip\mO+Q/'L5(4RRrtW9sJ;A,Vb1IO#/DQ[1'l0ie%P5tD:[%-(Bk?n3P1K/2ehXhM-^l]K]Gh;1odY?PN>8@'"fWC#go&Sr#NBk%I9!(&D`VAs9%/r<_ + ZQd(JU%W';6cekh0A]s6&A]o+SIZ?F`nH58Kr"TQO-0\FV2:)2[c&;n"91VZIC5baX&7)>; + >c6Gl&A8[(HM:ObAgW"]_O9sp^Hg+&_2LCZStUb:f1/6Z%kE>c"U:rj$3Y!rco + J_K&9#uX*b@#MG#n5-m'RncA.L/FSY])/Il_%T+uhB3cC+7jE0Rp>)-:?u7dM\O)[2U-&Nb + @85O+$]4:f^GTld0uC4WOGbI5/W_p2_4[#Zsl"PgbB^HW+O%&%feFW0,44_oP2#0uR%lV*5 + V=.+6^mYnfLh7@d[cablad[<$4^Y@&c'>`GVnVO#1q_oagcoTXMn\aa3dWdiX*,`:do*]6% + C!l]:$Z/AnGro5._mutG8>r&(U[au/q2-Xo/i[>BPqt!1?a9XZQ)drf?G0tT>64*U,H]mJ(s^&.Nj5B*9gi8C:rLCYIeHL0;Sj.B#+#QSKGTQ + ?u!j3(K,(D.5s)-+F;KBS\iL(.YQio1n78k;K@^L9]Od^3_pPa(=T>GS.)Ct5P.lS`V/db; + *Ehkq"VAOfS2+8dErEg7n#j9 + 7b"J?[n`LJ[;+6n=eg<9C=T>=LP8a-nr(lAb*=GVXAGU<=nLI8,]=;-S=.En1Z__Oltkn*/ + Xn]^Dq_R<_hPhZgmjo-+(])g>ISe#RanH>X^%:%@`@nL9:%86P.>i-U.#G+/=8Y?hV>X`cC + $IMA(L"_eH519SMrMaO'-*SkMXiYO3]B'\02?Pfu'mIjm4,F?Y2G>O+.Z1Yd7EZ/A<6`hsia2WM@ + Qi635XS10doUXV_8Mp_mO&NZ/j,01nMS;A1Q\d!GD8!*Jg<][2+b"E;#'6]I**L;Q`c?!bI]%O_m>7WJh;djS&A-6eW&q/)B?Jj)eS)V;:"ht[.Y9I-cBMR,rFHL#e,EV19TZTT5G3 + KO5srkm/fo,#*pi(8+pYb@ei[j\NT9%m3Rn5Ffjlr=6"eZ!r7kGa@lJlqc],^6j5fS#@LLS + .lmu_[ptb/Yj(nQBu@c;+*6B,JA.DU(%^C-;KaJhmN(3n'hnji:;;dM>gdB? + "n6VX/,Z`e[ttG;V@TJ[[Ee)ZT,Q:gFOUB]/8OMoLOM;k4g;c=l/(9Nd?R(G2W#:uI9:rm' + #,I.42o;-XLSB]/>QMoJ7t;Jads)%?Y;C!h0o"bJNK"??!Bj8XAWn4IXhK*Z*n1d5?#iIsq + )JMUeh3%LSX*ps#D-3&=$_1G'M@#<4M)N&*%(& + 'jV5(cYG(VLc)NGoW>gdJ0A,eZ)WQ;6s'^k>qc7hSU)+NY+;aH\7:Nf5j)1rGY%S1kjf + W_&:LCWWS(S"pP3\uZ5C[D`;^mT.S#17[77Y>)]l8O1nFlqq,d_H_0U7H#Gp^Tf95Pnl6fl + A-#6:.8/PRDkk_XlPZMg9%1CR.Aq2[qI+]$Kdd3SED]Wk0Q1aZ\>SGM0Aq2\<'YT3\a0gD + 3]Qq;\ANoO>2edG2NAhA-Zcp[JGa$_G"S7`b!,'mYG.=Mb4>Xd@%Ff'=*+^su);r^C`UDb[ + )J(as);r^KC4@+41nGTCbSFrC)-o(j);r^SKl>C0j-]qnluAOZ)UAh2AriF&EIXCqF^"s98H)F%0Q-4QKuk0?R=NGiCo)% + SNR1]+,upu%:lo:+_?^_m4a[6mmB?S6#U#0n(TZPngQqGWDqg]ofKJJsNO0ZhJ:n`Bjb9Mh + MSan]0hnH."'TLIlG#hc#)1H&&tj-]qnfPkJ+,asH%NFrGT@t\hYSf-IF(#EW:fi-qU"3t" + G1)!1cn9N=N8ER#( + ne9'gF!@g"%*l4S>0T():5q2nABr%i]3:nF%4Rh'c6Pj=R3@tS><)&p)iYr_GHrMPOgBJU( + NRP:H@uk+jEVkQLb2k=u?3rY0m%/W:_^K`R@V&Uu,4AQ-9OfDi + ZYll]*LFR5Z&aV^ibMQu)LM2[,oHBi]9>_cc^.i2H(R@\"r.Ga$^#)ojD)#]LQfJE%`e&Ac + YL`hR3pcqobMG]:Zk'A_#_Flr;MUg[neV9cFBN9j1CrE0fV/Q"4(XC39.peIaNCZ`ei]!d&ET;rAgZ+^ + _nf>k_nTb&WI$.gfVNG)@t-'EG5i-_M(?6*h;c\==5qHrT1L+Nsj8.EFUo!BKS97aOrlC#q + >#aG]:ZdX\I3uXJ>=DN$h](T`-^tduF0#QKBDh9hj&p6 + I^_qX7dJ1V<`WKiT\1du&dU$Rn8HWTL37%l3T`Lo_)E8Br8U;,+Rl#(2KWf>O^@L#PU@I/8 + $sGKZWklLWE$bdTdWIcgYHj9Q + =i(W7u(X\eYr)b:A(RT2#4`%:a^R8*"dLQl60ZDN2Sae.E-Q#"*).s=lN5)ONQs;4qIX#gd + g"$Sh)-=%6_p;u8@'Ef/l&Y1tXU4RGn0X2^EQIHh,#O>U[[,luH`'cbX + hFZiYtl@V=e3gU?'-gVc]:GD?.\^bC+i^s4q"@V=Ts%],Q8$tFV]0f\48NJ7&PjDFTH*EC$ + fPQA\pH?7lmB4_uIrlq-0G3i-F9dL\,8%icaR;s("8H3 + 9.u[Aa!CCJEAq\NssP/1T"Mj4u,+XKR*c)ciE3P7W?A*>?T?eg6CtE`Wg('3;Fj!Bu + 559*6&1q>U]M5W[S4$i@>t%K/4S(?5\ABD7k_KkhqC)T0A7s$t\(NH9^>H".(B75^162^>L + e03+J!b_G/b"Bmb2r'lBR%h]DB4leRK;48\rBlCIGm:?0OXm#0bSL=r?mOE3JC$?pZ=&pg2 + pn6&M17[]cphUC\4VhXim4%i)NZb&4(BYoF-DDOiEXI!d:0?E)6oa8#4O$Y+TTe)TGG#d@TqPR!1_`_>MLFbc3V] + 4^o+\r!'%:oTAgUfi63gDMH^@:1Rmk`DBT#*Ci[$1)P2@s$NY3Y%rT?<"MgEWp_C7L!,&au + =56+BSCrI'E=2edAcnXD/HikW%FjC'nFq2B[h&OPf$T@ZqL?b=BHlBY145!a#_4_SI)<;$K + `F*=9$qmd`@V5.R76PHMaQNF.rHL1c7HiE\:joBZNg0`('?d`(UjqUBBBb+gd2"2R6t(r$NY3Y$?=$:"MgEC";\HX!,#mT=PQ4 + CS=)WQE=2ed7ZYpU('6oa8C=M7/Z@[s<#_4^7";eNY!,&YE/oDg4c7%(t>F`Ga + JhpT;ig."Xlj^i8E(5WPiYDURN!cu&-$\'f>GEkRSC*uE\$Y")B+S[*1E)9q6t:nrOQ"Ijc + D\8JReYkX!oV:i>FG93.(6X>!&udsj)4Y;.(6X>!&ud1n4b9f>6oa8,9/1N+TTfHn.rLSEb + >MfL(oY8`@[p>(UjqUB4SZo/bp16`<1'K`j+M=!jXhMlqDE^MH^?Wjt,_?-]_Ehj:Erh*%Y + tN+ITROkcS3mco$]=1C&hB#Y=+%*itnm=kl=DSGD=8H3]@4#Y=$XVep)FfK)+SA8qtXH(=j + +q2bsW#T<7fST-5CF1/T4J3;*ao4MXeA(Gh:Ih>_P3F(?+5TXRNYj0HkiYDURbQglZ[h&OP + 5&e*CK`F*]a78.)!oQ`gkDNOMJ2:K$05_p5cLd3k\:joBdm8`J('! + '#<.3Jq#HJ?qb-UUZ!X3-uK6MH^@:Z\Qnb><4iOgd2"24bR"o;J1QfG=HQF0PYT#R1U810$ + 4sfliB^6A1;C>!6uWn?Yabg%)je$^tJZkHkkNVALMF>TK:iroJ/B]OkuL"`@V4sZ^?U8Zi- + 3(oZdrS8!h@qgd2!&.p"7TJ,'8U1UX`hN#]eg"L'Zu5iGD>iYDURllL0^[h-W^mdM#k&B<# + Fig(]iMH^AIF_m<#ho(:I3KpSTKttHID"Mf"p7cRS>B,S%\NZJ%R<6D"Y,6FXKerO^>?hW& + 1\lo4>RcZK$&`"m%>?SUMd'EqKejU)>?m/m1N.9Vho%)R+CaP.cJfU@A*?V3iYGU*j@n"]( + 0>#(9\/2==(C/^f&@HH6ZsenEJpk@3g7%_`RPNja]mQ[C.QVq/oGYd,\NSbj#a#p`@\6Ii( + U7#W$l4sMlZC89Ik#F.:mLWX7>RNlJ`R\j3sFO`@\74QSZaA>?m.@B3XIMDK.NtS:*1imc# + !`U[RR'9`38L]YuJ*7c2lOfo''>NNP)5Md'GGT!QJ1\Ad"^3I;0l>?m/J1[0g%rZ@gWMn/~> +Q +Q Q +showpage +%%Trailer +end +%%EOF diff --git a/Documentation/rotation/rotate-90.png b/Documentation/rotation/rotate-90.png new file mode 100644 index 0000000000000000000000000000000000000000..da24302afa88732eed9655515dea2ad0478b35fa GIT binary patch literal 21528 zcmeFYbySsI*Dt*3k`N@MyQDTPjYy}IbZs`U=?3YoAkrm*AR#H;U0Woik(5R$X^;-( zyEb}1@AG`$8RHx88Rz`>-VVo*b*(kmTr+-i{?_7-(9%%E$ECytfk61mN{_WcAe36* zuMajRFfydnZUO>PclhZVcxqev(7U?3*uWg2^q$XLq4ZE+m<&@asAq0##`yLSzBY32xi2|E7B?uZO!kcn}zk8108ox)-Drm z_08{W6I!M#>P>rD-oIxbyzAH~4DS`cy6{LkS}9wZJlfjlRcSWgo!f{bSu}H6F%4+e zx*x}Txxs7SXl{Dp{=QenOu)VMZ5-ZYZ&+(fM`avd?NxobuIg`3hwY%icfslKo9N#= zBI&DFYug=iJ$?fGu|Cevwt0X1(e2^*{@RFfX;r?iYj@9H`?QW0zL_MFZV~^~+wZ1m z(9WUw+nQ`v>(AeNQ4Q;#1lLO%p8HdO@1S_t*3o`F|Mh(KLGQ69Q}|C>)-0)|DM_2- z?#teD|2KhqZ(HmbEVqsui+oBlqIPEPKawN=G(o(m+@D?DxCe4BO!|vcP1l>)Vw4|lW#hlR$@$}qW$8g_QHMz`jbAnGy-qO*Oaqy*}j^Cdv zXbBYz4LP*Ijvc&Ta(~I722<}od()Gr9o!Jd6!AgE6aMSD6DueOil1D9^{_u?*z&eyUj}QSL&Gl zh`~7t1efs389&^A{U#RO$0yovy5h03@BOoQFZUi|&`&0IxJ!WX8e%8EJ zkcc(y95XD~5-e{gD=4bZTWIP?^fGFasH)2C!9ra22c?LnY`5(suK&z^nvEMdIb`?v zNlB>kZ02LeQKq$gh=q-30*e=xxlsIY>Khe9?N$Z6RU=fEjp8CL`nkg|US?Q5bMB_EZ#B9d82)AzrCB>}~Wp5(lWSj@%stwyU*Q{TNU7S5E*gP@qst`2NzQkTD75x}Qc&E%wX_xW zc8fOqd7p|P!8!fHZ%|F5@5AVd-YkV_9FH#I8G&`>cxH8!+e?!Se{!YKHP)bNm zaX>`t(QqcG^?~cV(VMik&Tvp%b;BebqAW`dow#gTKKi1p=3U1;TVJPU*`LQ|p3J(t z;Mo>xYP3i$Dn_u(EaD%%FckmB5N{|El#TN)j_GmwJ_ot@(Ic4&9Gxd+z36Hc5w!Of zMmT?2*!HXIh|o9F-CMZB&U^4hq_-?O^!L3!IKeAOQzZwguvQ7{*A@?yXHV1OtG+PF zGrnC5Ku39y7nK9?Kbn`+^&6o_Y35Ml!Q*{(rN?_dGj0ol)_F^r5^GhjFy%XU%RxHIC{TH~@Og^~ z3@rCZ+a-7K3*uxS0_8`g6C^^=;a5%{U^Dq*BApn-^fpH0I}Vp6PtOq;9br_23RNHD z?^Z<^A=KR;Iqu<8%~&ZKB$qI&P$c`Rv9n<ybd)*_~$hWi?2 zX7^(ug_gwEf)ZwDr5z}kVZBgEghHh06-)Pm65Df6NbXx5Um|Ita3%ec8`J5P$zgTs z#|a|!mLBtLzu(PMdOq-7V4Z&c;b|PI zjIJ=Wl8GukY!ii}{?%hMCv*%{RI@YOLWjzhrf@isVb0Qbc)QGN+7O!ah0o|gabHuZ zPZn9+IdU}w0#NS?^f!M_Xk7nR`&2;Im+7l^xRoi4nk4o!)(lNvGxnSHVTOma6imO0 zecRZ!`akx$-XDFJ!MmK?>ID%9Twk^A&jD-V zT&JgMj1%$|Nk?VL_{QtJRcf79D2Oz#sgu{deev$uh)!pOeHbSa+ANBw@A&3qRXntGOzLaELepI9dN`TGCCd`OiKoCe z>|cFPGqbrJDA<1Uyk(yY8wWn9R=dWJBCz^wayt+BjQHM->BX{ z-4tJseJt;Ja2?Q~UA>|$`exJFw&CT`KvCn|w=j?Itm!4!5<04yT2SZGPWZkZ%bHs* z>ArL2CAV&o|21XQ;=vY{=oNwbI+Z?7+Q4zz(cMY(1=MDr7R;15(AE!~e4D2f+IK-M zi`5A#xvRD^%l9v0lM$?MhY8F5W2F^jP?+v_6eL`{R^+Yu!4&Zs)Fmo{mxfDT)Js?! zH}&`=LkfQ=^=#Sp$IFi;$A;J$sS{oF;5>Zl?PpW#-L=7@Pivg}n+VLLchcy!nY)N5?V?K!hL6;9+T$J&f$68k~o{eL}u0OI!776#XaZ=s_;Aq9aH4d zK3Q$h9BfGpW1Fo1?8YhiBQ5Q9_fKEAL7T!e=K;~Wms32$eCqM=tPBmbh!#$17>>e&fLn%%1jbijo-q zCa9k16mA@BqSM4%9*BLv$g^4_Vjsh^@Is@ML0)q#oGMG#B9C8&>h(~Ja6>EP5mb8l zWvKaz0@ueOb+71y^^j*e17k}sI`Dr{oYNCn_5c2m$SH8SR@;$T;^H!No>v`>Xt4eBytAmB2hlKWiXfI=)ltZJYAQf79 z*7Vpk+34Tun^%KaH%A!h`wHXlsCgfWUik`HP5TOat4X!K<`Se{>Cx&1N^ip}9&(<0 z=pNW57sR}eq!9gSD)$>dy|pPS9%prsu#>uQj^$F6oP zi@i(1g#U`n$0PMHt>5=$;;fr zD&wxN3?1LeH%*BBIQ}-}^z&_-9M5Xrkv4l?~K2OYY1!J}uirSOT z4%GPczz zC)SN`b@S!(_~zH;p^tUb*|jMrvSkFk?JuD_G|kjl*J*RXNj3i%M;JoSH4SuuMx|m zOO~GL!)fDIp#!JdZrl<(4D0c*riH3n9YU2RuhJ{=D{OL&OO;ua<{~mWp*;LEeBt#l zDHHX>ii48oK85HzE^9*P#_sPyXCJ#(vPm_bgjHS>7CX>& z|DG^zsFTI)+vBG6F?mdv0-n05ImdT>V1M;tSa#CY<9;J;>Y1Pj1eo>TE&Fh!X z&kOYnqn(W1(a*)wB=AzWI{-C>;&Z|(3TfO>-PTnk8C0ERa3(XucuwxGDNCECq<*gQ zBp&ZnM~JtE0vEW(O*{ zcKpKW1rUAM0ePVZV=?o3r zzY6HyjW6JjGk~eVLN0!!7R!E^d`-egHLu8|;Ffe2!nefqD5l_fO*!ZHSJY$9Oqy=8 zXK)1%fq7hPZ}Ui|e$1OPn3xJ`Gsq#$fQy+KwTJoO4^czToss8>t=@&g1O{6?3NehK`&-EVt&F5Y`kJ3 zFG2`Y#6PzlSKv~Z;6E$k%L>83g~wBm+V=od(>of-?*Y*;pvVABG87&p3iIDQIT=)ba+wE^(v3tIGpTA;I82W zo6Tb{fA+E04?aK1Rq~FM9Q~p9IC1+W4oK;|FV|q)wHy|nw?xs9-6SvE$00+e;6L;X zt%LQIv`3=Cgm+TfP=&knO^=y!;Jk!fPCR9Q=~xks4T@*^tJ$}5B|pL_;moJyNwpOA zd6jcc#g}2wmAVnS)fZ?T&Wde&n`t+*6TeI~rvn7NcB7^Z3UYdgUp9qGVG9RWPCnsH zuMwr*=P}6M)Sz+BQP_r~zkI{as?kn#$ASNSHngsQTU#zFIFa-Rxby2nx^YqrUhqRS z796a%?_)@4y6)Zw4cvpVCgORCF@BM`B2M>iHrTDJwz&5s#2O^e$JJS({gZLMsdLOG zBTzqaG+ozo!X8i3kYk#f7ZHlULDw&m^_pcX!#b8aVJv8Xvr ziAPRzwbGt`U}3ltJ=&CDFY8Dj4e~mX^`4Hcb*BsJ|I$#kIQ-13rvar}#|1C5ZD(^x zCm`O#sC@KIwPtpD0@D_2$`3jEI`qBKhx9a?gmjcm`X2b->2>f^4JWt0f!oP@ou8S8 z`-^b4{`AiJCH{o!714x=wvh;FoS%=4Jokw`j-ESo7}qg^&7p&N((=mp@uAR!n5e_f zFEawM2=Et`Phi>OwDwT)1fgeBEzoSYk9Hwwgn1KQ-zi0eMy9t1()BE_BzV{2HB&#`J=7TG^;b?1b1hgNo^{q;q13VlT1${^ zI2BV58+}dj+sc@6#@DiV-;(L}yHXzT)vl0YJ~8I6;llRDzNb_ml;qnFe=X5$eii*u z{(>l{j^4$NZNh5mr7U%JzNU&M(Utww$oocmt4Vs0XzgCzCTQKhirq)vMR=P1uqd2ZCEyjm|5Hq1#%%w0xSCrz@9 z8Y;vaemM}Hm!VxR-pEr2J8nyuiX>)To;rhxUbj z!Y92VtWg6B?5(B`O9g?WB2hba++J?HZiL_0o#}|hv|`6yCfsz=O-D65zI|M3*j3mTqY`;Zz7gZ+-4K{?E5nOx0DwQ z%U4dO#I~Nu6vNgSW)I&uS$O+yGu`?z+#XH*Af5=TC+?R}d5^K`Gq1d@ zv(zDlauL+!06l_*wiMa-`8m-^%olv$hVqpd&z`botCK!4d-DAIZ`s8{{$K6@2MU}FK zCc6clgqW5}GL7+m%S%IS5UKe-zm+$HPwGVXxjqcu@G@KyC9qSAEOL!&4meei?00vL!}8jzc3hPGA%GrO z(dV*O#$8u^%#2fie@le8z$vYV`d&a~RvM0WR;&5Z(a()EweFv5k@L9w>2#x)NtR}k zXxVOyw5MN8--g2oRD!_+aRk0XPme^vN1WD!OI?E{_tQHf-aci3{ART=8=AUSA8f_F zkNj-k!xwCR@_71LkZ0qwBIhWmi{Aezf%GE_;M11f#dZc z2H852PNQ81of%p`#rw+zoqHZR?Ec*K&puFhjsT9(_nKx@vYeeY`M`fLu!YIl3)Z39 z;t;W2M|Ul{(G~wv_VM_>(GZCucMjK+Akb%fCi%$D7ov2o3nBPpt!}94YPMY2(fs(N zRweniUm>~I6Yk#r=3YPe=Txzc_Bu6oN9O8LKR?uc%sNQvAurcAkb=;4ewt z^pS+fCZl@sJ^Ls>-osPnJqwLumk99?#*%t9gI)F4gjf%r%%P$LWvOfiS|)v$ae2Cit{YOCfEh^mhKD%`uuxPs}kWpd*;)p9n36r zwryuNQh^Rq!N2@-evOy(dHtR|sxi-M6AJdLuJ6^AB&vB0`ZQD1_&P_~?^HW|s{F?m zi)6&Tig95lSDkQt>teqj`rhsHGu<@>e6U=63T3y&7Xk=9*^y_V((ft~U!gxyvY#nx zniG#LRh)RwuK0Q@>5j$3=w#je)&RQmZsK0Q&e+$dyK2++Wv66ZsY&774|c__#j*mq z*obiCU7%~2PBE9ktn4Xnkl)9yeRC_-(xnG3jpJA-0u>ZrXZDW&w|gdd1VLQ-G$!x7yj)4qKN1o>C1;Z-=Qs>jelH)5)%(lWXW#9N zfQS-WU})+lGhSjN_Liuoi4=SgNgH~%3)BO(xnGm``uWCrb9h{Z4>)rzaBt*G;W{_w z`Qz`R0)w1~Vu!~zlgq7|)RruUEK+Q=0-Mjf;!K{J1g)5O8Z5uPE0C1Q6iXDQ^{~H}NYepY!7#(4wi2KFGY-IsbUG?9-rc>E5Z1%M!9jKKGjf1+_({#(8e3w|+qa z<$45>ym&nsK1r-`m~UT@on!9Rzy2?p|N2+^7P)Is3wZw`Bu$H8F^b z6OW~}ixrf|*U1%ldj^3dq4bf;@seeBAQBFmHZFDO`F9cWWCl?Z*m#MF2lZGTM21x{C4g`uOnwFjr5Qi!(h^rlpmOm!~8n zBk-O6AN`zM)z$wc-r3`?6##qi`dYg3f_eCOot$|8eT9doyf+}^uR{OJ6&||46Fsjs z)WgNg9Rij2hB|vP{ksTj$iLRRdbvB^9>*HO3w4A#0aHDIUBUmcrJ}OB*1uLDO<)Ui za=l#z82dkFdcth}%UJ)R8}iHTasFKqVEMn~{>SWp&VD-?n5C{R_SgmDg;Y=Zu_PmM ze=%zp2+UgS_Mev40zyKsbAZc!Uier{pmhYy8C9|}Mp+JOH}l(Msj zr=>FliWCJ1=Yauog!v#~!G{8Z-28%q{M>@pP(f}>AsYxcgkOZ8Uld{u7J>5pn+Q#J z7!Z|~j{mL|Qj|3y3Je7c^Mk>n+?EhgFt;GYMwr`5L>S5~D#$1L&{6~pu@)4%6=e+( zQ*d#2vIN`-bF#FB^13?P-hMzDTufF=S(1^T=g+RUBU+A@o;JV&Nk%o8vzPCGP1S`t zL3KPWk=6tYi;93nzyc5X1pyTv3jfz6eW<$!5Q#{cU_KrJ!P_rLw}=6U0Ss%2j8j0s z?Kp52F*$drrKgL#u8WJKBqLG*dgRJ~eO3q3$=cG>^0B2S6cEbCFCfMzECzn43+5LS z6c7XRJ>cUP!t>Tv^z65e;`mQpeC(h| zF8~JP<`d@rFN5*_H5l*T1M?y=z!5v@r#w8Gl9;EzOR@ZlScfq()Z?bLUaNodTw=E&&GXpcNBYwn7^jvn7eH@0x zeR3WvD~%Ht)4=`kz4EQS;-Iaq!XWWU!e8#i5A;k6i61{fw1j@>x}uTI#la!X;SMLU zBKlg%>oD|%5aL!%?f*X8WZh)@s%SPp7Nzkl*lFEm%VOu(R4H!HSi|3+pEd_dqTeX#8qKvv1v6) zUn0@e7+%yjsKI}vJvT+PA);o^-?zc0r?*dnj7Ak2wgZV^qRx zm8`ka+fzNcrZ)9eZVf6gCcB#K7=Y{gz;$7HIeVJ*zFlHJZ|DJk<;y+)asBAHxGdX0 z)}&ZrKOidlWnew78j`=Ko`m#JeUb*zGZ89jd;>~|iQ_+}Eb#uYJ5;~}dV^+O_2-b$ zhjL^7uo2HD;e`_WU0#i=SgoV%!OLlx8^jR|tw#p6~Z$)Ces$UMoR=G+9`(&vHb4!3aT7N+ZhRc^b3nr$%M^S8hO9=x>imV|g~o zrGupMuD-|0_$_S;&)wVqmQuhE#isG;u9|U_+E0{xbORfTq(!BzVPckR|7UO z!w|l-FLoooVdO@2w)r^&Nz`~JyZjS3Ad?CnhUi!sQ4~Z8i1IA{T#*`J)N!Yl#764C zCB(4(PNG!z-l^&AqvfsGLzJ?vCW)pyDv*87$uR=ke?3+)9x*a_eyQ=i>FDi)Lb`Z z9dC#zYci)=Wh-lY?SS^s$l`@f>D)Oh-%Z3)i+A#gnlX5^b{;389(x8{6?no=&+=CE z7kjxe#tuDyGFl+ScH3aPS)An^)r{*hwag(q{lN>3Hk1CaidK*- zo?Y|9!!{VmAD)5u80(<&yD{l{>0#tW?nPkMsY6_M)*QW)<&S`pf|+(@zES3)RqupM z=RgKmy_5^vknlP3(-9JhETQAr^^tRlU}sr-swFis$(wlnt4}gXdDSJ8_7$Y^Rb--Z zalF`X3ErVx6ZqB;s<>gnwmVZUFRwm!5GNKFw~6dNS$1Qkn>aAFFvPa>qkEk*Tov3> z;O^s#MAkVCKmMaPjscXe{?Tp`ESGAmkFb;d2!{cbd&UrI3&(;7&P)VYu#|^hbBT$# zQQ0MWJ}Peo?=kJF`!^2=?HMhA%U=M^jIX?c^C_vN7xH2@f%bZ)0L%we10L zs2c>J2V7{^b=y<8(kdX}TB5`=z#J7hAO05nA! zFC0W!$<=dis_JQS4>OIK2Eq`ko|k{^UsH6EhrtNoV=v37#_XaHpqgeRc#nab=vl#l z*S_C;`jiKNh>|5=>>L^DXnm}8YT)9KXmZ1RTE8}Kct2MtA2mcGSt?k=4BImJO7IR% zm`#mgJOPgx_O+@-CFGLW;{JidGNJx}Oj2wK#Y)2*dB#U69y!ULMgoIvpDx?#q}u3U z23Pss^Lt~9wbL(OzSNJ2iIG=@W-IrO2P`Z4;&xtP&Tce+3gqZH2l0`gTlG$uSX_Ml z`qgGRMZb6!zyYX_b_z;LDZ%BA&t-1j_<3;8s-EvsZpT@{$zVniU;}eUCg415R9VVm zt-fw_Q+XPMUR%Ja0+~V&1Ys^l4I2gA7{gmNiN_NhzuLnKI4@}qxDI@dr?z^r2SM#< zgGW#)0*qLoc%UX=Ak=3v`cDugbw<0r@=v1Al$GtD+)VhTjfGSY_ zmLIAzIX8n5ST8mulQfa?2%9&N?A5A|)lo=tZf@?zX=lo_#NZA9`+JR}59xt&rs@5* zow$)ZlyAP5rPyR(3|KX?$grz^< z2bE^uoECUp<{|90s+l$c8~$<@0W8?A8yr&mbhihn8KHVGESLMvAPYF~E21>nTK0g+wns z=-Zgd3D1=HWjKTOCQlRSkyv{gX;bmu&4N$Vm$T|_ei2?@9A6B_IYY7p&kTbCQMgzo z-%ZFQF?&rfrq|OpzB(4%4*o2*Y`^Td9G69`ph#s=mrL=&Gp*0HqeCCCNnj)#4lg4i zAvvqt?;qYwrNkU=c(k_cZ_Q*HDN6B&|(vu=swZ$UTsxSAXf zw5~<3y;09lDr{DClzOdAMMOn?8Ov+xKADU}XvvIzpvApg9)YpCZf>0aikhWM{)V*L9iaAN zPN7^?7hNE)>BXtw^YHNR2zz&HRXgL2!qKno#P2G?i3NGegG@s@wB{mYjx zkf!kMnA2Wc;ztyNoo7d(vyY?MZ2i-K1-%B?-|{I|#Kx*mfj;*S47s>npB2zlQLKo< zI*jr!Xn`7Z6(XwS=RDiP-xwz#v zBnZfE-1YmnPeB9c=PF9bls4K=AmCkm7ekmNY-|pVKrRR9*HPZt_)ncj>nH=tBRT-L zP+lX0%xj9p-1PmwK!!$p`*3>ZoXg@_^r5>d5{>j6nRnI2<70RMXFdExjNAjG1uleS zU?5ikS4f+gj|Tpv#v~cV(OK(wgoqoLO@-+Ld@$SyM--zERc`lT0b+!On`kCQJwtIe-8)wAHW+68$EVOVecpQC?lB1#6>TJK zBtLfovdGmo`jG!mD8Z~^D4kJ(>A5uvJ*uTAyZUYPf zo0tI=VJ=zyFHNlcW6Ef^JHFUoLHA~kt$<>}7wy7~~7{`W;eq!a0T&Yy^nW^TH-wUafngz{PE12*Su17M9iZ)#<~8t9Rr;GU>5 zWXR=L7o#$e z5*GGu|6>oU=v*LArO~W}+d_}$1nUqi-spo! z9_fgZkuajn^#lL$H)tNE#J*qii|sI7Wv{LpQi9kYgb2V5+q*8mYPy1hl#F^hK#dPu zIGRv=+w@C*sRJwtGfkJ<10FoLRyb+qikpf4-kE$`0pd_IV>0*Ka<4SDXa*6P!)}I^ zDKeU8fAQ!_Zi{NjrbZrc;N1fzWTT{Qaewnyz4Wm|jD~kh!JI!v*iv)i#N-viez^`w zjHz6mr1#au-}>0SkO`ul;XA-z)@-y`3%vnRJUXZEX>761dTJM}gbI}ZZi?x;iev%t zg7w7H0w>HMSaya%VV$&C#$glr>v@5tiU57B*u9#961tBn> z8+C86Jb4Li51XNt95Qd4ogrEXI&pNwTz;R<)=RrwL>y!`f^w7bJE)@pv-L;A2eDSP zdAxUo0X2{SR^Zm;9P=O*?u{Bedf;EJYs3<$z6fZw1z;~{&pADeaMrbV0s|;UE-3pa zbDBYkd66(6>_hrgPqqPniA>wq$?lJ8?3o%z0UNA7{zX5IIOE8-zmYGW6egFi!c6V$ zJuAq-Ddmd%uD*dgFHx$-%V_tb(W^Z z&wfQ3e=kQ76-l5^G!dWpDPHBF98Mm*0Mx%^v*>@QBjxfbQKv2t;kp?6wfkd188IV_ zK!KVEX6beJoMz0z9j}dn2)_^H1#s)rus`-Q{}K(Mj)*z&YqQl{00VHA!m|b39p&Lq z-(o^?nZ5%Y$O6u`)5TgvrK|C@nPbwtPf@l2mjxOZ6d(=$b#IidoXGjUO~i?2Q<*Yj z7)?K3;|_oax3EQ6ntug(UtWN98~hV3i>yFdbrKHx0|-ckNvQxr^J3N|&IO)Im6LJIqRRKWvGpNoHJXts37M=nbdm1Zf?9!X9Kh`0*8A2J5%J}`~ zeGyWf`dp9#QZ1<$83N$ycU^|(^Upwmfg#2yR;-ZoZ~!*6t2LLdZVKYU zY6rM;q6%-%Im2dKt!?w_CwyJIKUyPO6Q`y8wiNXtOrV7GA`Sf?cSRheGf4DI1TA9e zqg6mxlK=h)q!M~5n$%#y@OxDMaX?w(gQ_+d6+Bg)7X`?(clN-V;$>5yy6s!9u0+5lXa03=&EpZt+8Z6o2ioUjm~!Lwxq+~d}}-4u!; zw(y2#HC~i*BCP*10l0Ia!Ddn;xC+D2T~&c| zG;m8*=AwS!-dU-HvSL4xa0FBmVha6rjbF>ufRzdw#$|YidQi&8J%qsJ zbT6S-;hoy8rAU_;@NbIq3Pdo$<~@ob!ozR zRU@LO_L#E?OObIeiD&`Fk5=xul-PkTL4yQpUj(Oe@sE>T+%e9*nVAWKgC(4WlXJYPPoch_a7Im)23u_^@siUNWN$-ryY=5zsQ?wUS(T0W* zX+(e*3FaqQ2+h#sGPWFXQ2@%G8>nbjCZ=(rt2vEmL~ zFb(lRGU&<*LJsjs4<%L(rI&k<3{+@{TOSeA_H;4KhLY5mA+*e+c1oU-?(>`j1U7DYxa^pn}? zgt*j7Gb{Hl-p_jx&fC}1t86!yLb+x_q)-p{0E(pMyD$^9$NJjo;9s($mOKF5dN;v|l!qND96lM(ne(uu;_DqHF` z%4IzR)rYJH?3GeIqW0N=!gLA3Y+1A5Q(BnqC2t!<^c!3l7ocrRCMAdX zV0j6eqV&FkP8ksbI#sg+qDx6CIn$71IDB(gId& zmls>yDw&yhufI~$c6{i zLPEkb#M$PeeXDe6rDZ?>(2m{Cq?z?zzM%b0S#bi@7hwq91ouD@dZq;;C?$~Sma8gZ z;Et>RciZWH!R61wCW@4J0=mq%>P~3-_;>C&Zcfjhrzj*ALwJfNMWv~h2qi#{$ji#h zI#J|NfcFF4v7nmmW|Nj+lu}IZGmjV~bqb+a@qxD}jfij8(ikk*2`=uOQ6f9;AP+bl zh}?PwE5r*y0yMlo&KQxyRt%xAyxvZerM0wQ)IgXFs31q}!9Cpo{Oy7Cfi`gZmIy#a z!fPMjbUI$s7fqhqJ-MeofTUWmFrorfACQP=lfE=zDXRDF#g7Vik1vL+2%mWREJ|th zq#ZDibPz~)v(y+m^rdmr_4fi49~4rzT?yTJu)jy^SE zU-$Iy=7lsiQPqcT%M8nw#xcP0ldr5yO7Kw{P({$tW{w9CnjuTZ$V(@cGWJN-kYqJy zp&(Ex0Yj^GGLqZ02q+c8O%h|`(BeRZJruoMw}i3{d)od5f;-Q9MN9Y>=Yfu+5Rh!T z-n;rM3y74Oq6~y2Ln!&*{nIDxTe+xQP~%XyAlHS|if~v4WVTSa}6SlFV8$qZn0q(M;`amKVRD zwC4r|VFz%h|FJfdx_puXj-RK$67?rGdrQ}LY)~JBbkF#r3!|R(Qk)sxs_S59#}1kX{QOVC*CQ!$@+@%o8vtnkY-WPi zLLGR{x}~;7VMI2d0r&#|G_KzPs(-$XC?lOh4SaA<$sAl*GChdu)`xl@kqSP0eZP%BpJtmG%atTt(uCKR%*iD1m)cubr-a~`_$C)_J0oW?`d~Xb9i{z z`DZgA(-8d2#XRHbA(P;qg2uZEKMa}ObC zJA^H5sNmKm{SQLK&-p=;v*J4gr)qbc4QC{S_?47E!0FK9c)a zi@)%s{LC_QE_%RsU=i&$c&o`G9;8edd;XEV2my4w0wmr2C&Q`(W?l=%^M26;;a{puKpb-XU)^d0r1VA&(><(}XY}m&Uox_v~3L?@^VA zu&^-QISL<;M`%F*FF^{a)xu2ke6&B>-m{uNHTJCo_9*o(#Du_PW)16A768F?hDG)_ zc@LB&o%&yMF!cE1S5l{Ds&~X7T_Ohev92b_n)&hL#|02y8&I9AkUF4-mT8~Nxa-c4 zB2bp;Hyzu8^jxM9lW~eyI*4!oN>+{0?jQR=|Bol3xX(LzQ`=Hw9!4bP`K2=fNMZse zCZ?xJZ#J|3mB(UIQqEO(1UJut#ut;en)pVGFv|6wf`Y<&0`2Tf*`#kU_BY#=m6gSl zQ|u+Vq=^!rGvIRSZwZ}~=0gUb_R=$atplW=l<9*6xc-s_`_`!A)*6jD_+*U2iux^(%?z<*O!~?S2Z0Q* zB)&KbJKdHCGi1Tki&-#=8A&jTX}NuZ$R~rCsGaGr5LkGX>H9DI-Tp5vNHmIxBa{D9 ztA>P3eQZn4O?U=SFAF69_v_`0DRa<2^%BUY-ywZvJ-|bhL)~o2-*g1f@^wsH60OMb ztJ`y{0B=lTKnc4~@wvbps8LG|w+L<&efaZq!En+38e{-8;(dQKuYr>y{-3#`o^dCuhV_T$hwAuC|E_A>eEymB(&J0%mESey3Oo;2tL%Ox z^q?JFiEfGRHFS#)WL|4>j_IG}%Rv4~erNb6h8oN+`S4-s&5HEZg;%CucF>-zc|dZX z&LqB-SF@U317T&x#B*795|^e#`v6%v0U^0&w(h5?{I* zun0}PS;1Yw6Oq3iOmDyMNO!SX>BO-dING57 zaJgCc7nWD~&n?+)_}26q_Wj_}$~X6T6<_N0Ev{^DTt0*OqH};OOuYsyEEv|QZk1Y|3M_-d zO#fX1FaF5_E^YY?Z2AFP!nOxy2^iiIzjA?fQZ870Wp7{KJpWq`z$5gw@<&KJRa^qEh{~FOA&aGgE4mkC|J@HC z3V`dUe501tN15&A-H~2UP_P=j!0HNSer^RzYytMj;kg;uAYKdhuvqdRxtAXv&b)cW zEaB>b0|&%bgBEoGbE9qJFJMJ253i_!p#!O?SA7Il)N|t*R(qbeo(vXEj=8kYdiGS` zT=sXlCQ|uPs=!z{m8SFY!QcNuJL2=boFyt=akR{056Sj AivR!s literal 0 HcmV?d00001 diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 5bb065847e04..608774ce7768 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -38,6 +38,17 @@ public: Invalid, }; + enum Orientation { + rotate0, + flipRotate0, + rotate180, + flipRotate180, + flipRotate270, + rotate90, + flipRotate90, + rotate270, + }; + using iterator = std::vector::iterator; using const_iterator = std::vector::const_iterator; @@ -66,6 +77,7 @@ public: std::size_t size() const; Transform transform; + Orientation orientation; protected: CameraConfiguration(); diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 3e252f3b8f8d..5ca05719ebfc 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -145,6 +145,43 @@ LOG_DECLARE_CATEGORY(Camera) * The configuration is invalid and can't be adjusted automatically */ +/** + * \enum CameraConfiguration::Orientation + * \brief The image orientation + * + * The Orientation enumeration defines the possible transformation of the images + * produced by the camera pipeline. Its fields definition follows the ones + * provide by the EXIF Specification, Tag 247 "Orientation". + * + * The naming of the enumeration values reports the rotation in clockwise + * direction and any horizontal mirroring applied to the images. + * + * \var CameraConfiguration::rotate0 + * \image html rotation/rotate-0.png + * \image latex rotation/rotate-0.eps + * \var CameraConfiguration::flipRotate0 + * \image html rotation/flip-rotate-0.png + * \image latex rotation/flip-rotate-0.eps + * \var CameraConfiguration::rotate180 + * \image html rotation/rotate-180.png + * \image latex rotation/rotate-180.eps + * \var CameraConfiguration::flipRotate180 + * \image html rotation/flip-rotate-180.png + * \image latex rotation/flip-rotate-180.eps + * \var CameraConfiguration::flipRotate270 + * \image html rotation/flip-rotate-270.png + * \image latex rotation/flip-rotate-270.eps + * \var CameraConfiguration::rotate90 + * \image html rotation/rotate-90.png + * \image latex rotation/rotate-90.eps + * \var CameraConfiguration::flipRotate90 + * \image html rotation/flip-rotate-90.png + * \image latex rotation/flip-rotate-90.eps + * \var CameraConfiguration::rotate270 + * \image html rotation/rotate-270.png + * \image latex rotation/rotate-270.eps + */ + /** * \typedef CameraConfiguration::iterator * \brief Iterator for the stream configurations in the camera configuration @@ -160,7 +197,7 @@ LOG_DECLARE_CATEGORY(Camera) * \brief Create an empty camera configuration */ CameraConfiguration::CameraConfiguration() - : transform(Transform::Identity), config_({}) + : transform(Transform::Identity), orientation(rotate0), config_({}) { } @@ -404,6 +441,18 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF * may adjust this field at its discretion if the selection is not supported. */ +/** + * \var CameraConfiguration::orientation + * \brief The desired orientation of the video streams produced by the camera + * + * The orientation field is a user-specified 2D plane transform that specifies + * how the application wants the camera images to be rotated. + * + * If the application requested orientation cannot be obtained the validate() + * function will Adjust this field to the actual orientation of the images + * as produced by the camera pipeline. + */ + /** * \var CameraConfiguration::config_ * \brief The vector of stream configurations From patchwork Tue Jun 20 14:29:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 18753 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id A592ABD78E for ; Tue, 20 Jun 2023 14:29:23 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 4C065628CC; Tue, 20 Jun 2023 16:29:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1687271362; bh=ybjACyq3vQ4lsNMBp29sW93fC5ZrCQ/CfKJ76mC74aE=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=fsfXkODHQL1du4hm8tvSp8watsRseTchckpiwy8GxPFCnsngLuKq4haIqYM68XaVj wfFmfwsZ66Jta+4iancIGEUlyGA8OUUg7QVVP2kaITyvyCGyLc2dyz7FHde1jXfT1S 9A2IHmCbCMEzN9RKyCwjbWydU3ejiSo1HUvEufapetYJH2zWA0HcHVjnrKZVJ30ZyU 6KQFq9wzsMf/iklrR8ZPIE8T0CxEvTq0D9kR9GuVxhZJHtBhjVYUOWFLZUkgelOs7+ 7X7aoqgkFtgYdEmPtbP0DoVVlHLCzHcWchPAg9wn+jJIsIa50B+9ofC7yq7GCxW+Z5 l85HVsTpWjRSw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 7495B628BF for ; Tue, 20 Jun 2023 16:29:19 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="klnvIo2r"; dkim-atps=neutral Received: from uno.lan (unknown [IPv6:2001:b07:5d2e:52c9:72c3:346:a663:c82d]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 6FE0D2B3; Tue, 20 Jun 2023 16:28:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687271324; bh=ybjACyq3vQ4lsNMBp29sW93fC5ZrCQ/CfKJ76mC74aE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=klnvIo2rTOdzjmDs+tfHUj+hkXdx64iGoNoXANoCUy3jr82tooGWY68gQVEcWYRMu Jd77C36aUGZrzYWZwa8cVdc9/3p79/YzyQYgNPkLVZ7n9YaLdZJTVC57aUcc1oYPwG ExlvauFPIoI1dYrYwjSajYhE3DZGhlSfYY/2tUUA= To: libcamera-devel@lists.libcamera.org Date: Tue, 20 Jun 2023 16:29:03 +0200 Message-Id: <20230620142904.72600-4-jacopo.mondi@ideasonboard.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> References: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC 3/4] libcamera: Move to use CameraConfiguration::orientation X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Replace the usage of CameraConfiguration::transform with the newly introduced CameraConfiguration::orientation. Rework the CameraSensor::validateTransform(transform) to CameraSensor::computeTransform(orientation), that given the desired image orientation computes the Transform that pipeline handlers should apply to the sensor to obtain it. Introduce in transform.cpp two functions to convert from Transform to Orientation and vice-versa. Port all pipeline handlers to use the newly introduced function. This commit breaks existing applications as it removes the public CameraConfiguration::transform in faviour of CameraConfiguration::orientation. Signed-off-by: Jacopo Mondi --- include/libcamera/camera.h | 2 - include/libcamera/internal/camera_sensor.h | 3 +- include/libcamera/transform.h | 4 + src/libcamera/camera.cpp | 15 +-- src/libcamera/camera_sensor.cpp | 95 +++++++++---------- src/libcamera/pipeline/ipu3/ipu3.cpp | 6 +- src/libcamera/pipeline/rkisp1/rkisp1.cpp | 8 +- .../pipeline/rpi/common/pipeline_base.cpp | 9 +- src/libcamera/pipeline/simple/simple.cpp | 6 +- src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 4 +- src/libcamera/pipeline/vimc/vimc.cpp | 4 +- src/libcamera/transform.cpp | 58 +++++++++++ 12 files changed, 129 insertions(+), 85 deletions(-) diff --git a/include/libcamera/camera.h b/include/libcamera/camera.h index 608774ce7768..bffac6bc8922 100644 --- a/include/libcamera/camera.h +++ b/include/libcamera/camera.h @@ -20,7 +20,6 @@ #include #include #include -#include namespace libcamera { @@ -76,7 +75,6 @@ public: bool empty() const; std::size_t size() const; - Transform transform; Orientation orientation; protected: diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h index 02b4b4d25e6d..1d47a2b1a500 100644 --- a/include/libcamera/internal/camera_sensor.h +++ b/include/libcamera/internal/camera_sensor.h @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -71,7 +72,7 @@ public: CameraLens *focusLens() { return focusLens_.get(); } - Transform validateTransform(Transform *transform) const; + Transform computeTransform(CameraConfiguration::Orientation *orientation) const; protected: std::string logPrefix() const override; diff --git a/include/libcamera/transform.h b/include/libcamera/transform.h index 2a6838c78369..573adf18715d 100644 --- a/include/libcamera/transform.h +++ b/include/libcamera/transform.h @@ -9,6 +9,8 @@ #include +#include + namespace libcamera { enum class Transform : int { @@ -69,6 +71,8 @@ constexpr Transform operator~(Transform t) } Transform transformFromRotation(int angle, bool *success = nullptr); +Transform transformFromOrientation(const CameraConfiguration::Orientation &orientation); +CameraConfiguration::Orientation transformToOrientation(const Transform &transform); const char *transformToString(Transform t); diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp index 5ca05719ebfc..bc1409b5c960 100644 --- a/src/libcamera/camera.cpp +++ b/src/libcamera/camera.cpp @@ -197,7 +197,7 @@ LOG_DECLARE_CATEGORY(Camera) * \brief Create an empty camera configuration */ CameraConfiguration::CameraConfiguration() - : transform(Transform::Identity), orientation(rotate0), config_({}) + : orientation(rotate0), config_({}) { } @@ -428,19 +428,6 @@ CameraConfiguration::Status CameraConfiguration::validateColorSpaces(ColorSpaceF return status; } -/** - * \var CameraConfiguration::transform - * \brief User-specified transform to be applied to the image - * - * The transform is a user-specified 2D plane transform that will be applied - * to the camera images by the processing pipeline before being handed to - * the application. - * - * The usual 2D plane transforms are allowed here (horizontal/vertical - * flips, multiple of 90-degree rotations etc.), but the validate() function - * may adjust this field at its discretion if the selection is not supported. - */ - /** * \var CameraConfiguration::orientation * \brief The desired orientation of the video streams produced by the camera diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp index a15a6c89c5c8..5c9f30a62527 100644 --- a/src/libcamera/camera_sensor.cpp +++ b/src/libcamera/camera_sensor.cpp @@ -465,7 +465,7 @@ int CameraSensor::initProperties() /* * Cache the Transform associated with the camera mounting - * rotation for later use in validateTransform(). + * rotation for later use in computeTransform(). */ bool success; rotationTransform_ = transformFromRotation(propertyValue, &success); @@ -477,7 +477,7 @@ int CameraSensor::initProperties() } /* - * Adjust property::Rotation as validateTransform() compensates + * Adjust property::Rotation as computeTransform() compensates * for the mounting rotation. However, as a camera sensor can * only compensate rotations by applying H/VFlips, only rotation * of 180 degrees are automatically compensated. The other valid @@ -1033,69 +1033,66 @@ void CameraSensor::updateControlInfo() */ /** - * \brief Validate a transform request against the sensor capabilities - * \param[inout] transform The requested transformation, updated to match - * the sensor capabilities + * \brief Compute the Transform that gives the requested \a orientation + * \param[inout] orientation The desired image orientation * - * The input \a transform is the transform that the caller wants, and it is - * adjusted according to the capabilities of the sensor to represent the - * "nearest" transform that can actually be delivered. + * This function computes the Transform that the pipeline handler should apply + * to the CameraSensor to obtain the requested \a orientation. * - * The returned Transform is the transform applied to the sensor in order to - * produce the input \a transform, It is also validated against the sensor's - * ability to perform horizontal and vertical flips. + * The intended caller of this function is the validate() implementation of + * pipeline handlers, that pass in the application requested + * CameraConfiguration::orientation and obtain a Transform to apply to the + * camera sensor, likely at configure() time. * - * For example, if the requested \a transform is Transform::Identity and the - * sensor rotation is 180 degrees, the output transform will be - * Transform::Rot180 to correct the images so that they appear to have - * Transform::Identity, but only if the sensor can apply horizontal and vertical - * flips. + * If the requested \a orientation cannot be obtained, the \a orientation + * parameter is adjusted to report what the current image orientation is and + * Transform::Identity is returned. * - * \return A Transform instance that represents which transformation has been - * applied to the camera sensor + * If the requested \a orientation can be obtained, the function computes a + * Transform and does not adjust \a orientation. + * + * Pipeline handlers are expected to verify if \a orientation has been + * adjusted by this function and set the CameraConfiguration::status to + * Adjusted accordingly. + * + * \return A Transform instance that applied to the CameraSensor produces images + * with \a orientation */ -Transform CameraSensor::validateTransform(Transform *transform) const +Transform CameraSensor::computeTransform(CameraConfiguration::Orientation *orientation) const { /* - * Combine the requested transform to compensate the sensor mounting - * rotation. + * We cannot do any flips, we cannot change the native camera mounting + * orientation. */ - Transform combined = *transform * rotationTransform_; + if (!supportFlips_) { + *orientation = transformToOrientation(rotationTransform_); + return Transform::Identity; + } /* - * We combine the platform and user transform, but must "adjust away" - * any combined result that includes a transposition, as we can't do - * those. In this case, flipping only the transpose bit is helpful to - * applications - they either get the transform they requested, or have - * to do a simple transpose themselves (they don't have to worry about - * the other possible cases). + * If the camera is mounted 90 or 270 degrees rotated, there is no + * way we can correct it and there's no point in continuing as the + * user request cannot be satisfied in full. */ - if (!!(combined & Transform::Transpose)) { - /* - * Flipping the transpose bit in "transform" flips it in the - * combined result too (as it's the last thing that happens), - * which is of course clearing it. - */ - *transform ^= Transform::Transpose; - combined &= ~Transform::Transpose; + if (!!(rotationTransform_ & Transform::Transpose)) { + *orientation = transformToOrientation(rotationTransform_); + return Transform::Identity; } /* - * We also check if the sensor doesn't do h/vflips at all, in which - * case we clear them, and the application will have to do everything. + * If the user request contains a transform there's no way we can + * satisfy it, default it to Identity. We cannot return early as the + * camera mounting rotation has to be corrected, and if we get here we + * know we can do that (we adjusted property::Rotation already because + * of this). */ - if (!supportFlips_ && !!combined) { - /* - * If the sensor can do no transforms, then combined must be - * changed to the identity. The only user transform that gives - * rise to this is the inverse of the rotation. (Recall that - * combined = transform * rotationTransform.) - */ - *transform = -rotationTransform_; - combined = Transform::Identity; - } + Transform request = transformFromOrientation(*orientation); + if (!!(request & Transform::Transpose)) + request = Transform::Identity; + + *orientation = transformToOrientation(request); - return combined; + return request * rotationTransform_; } std::string CameraSensor::logPrefix() const diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp index 355cb0cb76b8..ded41e011be2 100644 --- a/src/libcamera/pipeline/ipu3/ipu3.cpp +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp @@ -187,9 +187,9 @@ CameraConfiguration::Status IPU3CameraConfiguration::validate() * rotation and store the final combined transform that configure() will * need to apply to the sensor to save us working it out again. */ - Transform requestedTransform = transform; - combinedTransform_ = data_->cio2_.sensor()->validateTransform(&transform); - if (transform != requestedTransform) + Orientation requestedOrientation = orientation; + combinedTransform_ = data_->cio2_.sensor()->computeTransform(&orientation); + if (orientation != requestedOrientation) status = Adjusted; /* Cap the number of entries to the available streams. */ diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp index 91a3c60757e1..81ae84b13a62 100644 --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp @@ -481,9 +481,9 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate() status = Adjusted; } - Transform requestedTransform = transform; - Transform combined = sensor->validateTransform(&transform); - if (transform != requestedTransform) + Orientation requestedOrientation = orientation; + combinedTransform_ = data_->sensor_->computeTransform(&orientation); + if (orientation != requestedOrientation) status = Adjusted; /* @@ -595,8 +595,6 @@ CameraConfiguration::Status RkISP1CameraConfiguration::validate() if (sensorFormat_.size.isNull()) sensorFormat_.size = sensor->resolution(); - combinedTransform_ = combined; - return status; } diff --git a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp index df7482920e75..9d6d816f637a 100644 --- a/src/libcamera/pipeline/rpi/common/pipeline_base.cpp +++ b/src/libcamera/pipeline/rpi/common/pipeline_base.cpp @@ -254,9 +254,9 @@ CameraConfiguration::Status RPiCameraConfiguration::validate() * rotation and store the final combined transform that configure() will * need to apply to the sensor to save us working it out again. */ - Transform requestedTransform = transform; - combinedTransform_ = data_->sensor_->validateTransform(&transform); - if (transform != requestedTransform) + Orientation requestedOrientation = orientation; + combinedTransform_ = data_->sensor_->computeTransform(&orientation); + if (orientation != requestedOrientation) status = Adjusted; std::vector rawStreams, outStreams; @@ -1193,7 +1193,8 @@ int CameraData::configureIPA(const CameraConfiguration *config, ipa::RPi::Config } /* Always send the user transform to the IPA. */ - params.transform = static_cast(config->transform); + params.transform = + static_cast(transformFromOrientation(config->orientation)); /* Ready the IPA - it must know about the sensor resolution. */ ret = ipa_->configure(sensorInfo_, params, result); diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp index 050285fd389e..cae67c90bd20 100644 --- a/src/libcamera/pipeline/simple/simple.cpp +++ b/src/libcamera/pipeline/simple/simple.cpp @@ -888,9 +888,9 @@ CameraConfiguration::Status SimpleCameraConfiguration::validate() if (config_.empty()) return Invalid; - Transform requestedTransform = transform; - combinedTransform_ = sensor->validateTransform(&transform); - if (transform != requestedTransform) + Orientation requestedOrientation = orientation; + combinedTransform_ = sensor->computeTransform(&orientation); + if (orientation != requestedOrientation) status = Adjusted; /* Cap the number of entries to the available streams. */ diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp index 277465b72164..e1f215f06db2 100644 --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp @@ -111,8 +111,8 @@ CameraConfiguration::Status UVCCameraConfiguration::validate() if (config_.empty()) return Invalid; - if (transform != Transform::Identity) { - transform = Transform::Identity; + if (orientation != CameraConfiguration::rotate0) { + orientation = CameraConfiguration::rotate0; status = Adjusted; } diff --git a/src/libcamera/pipeline/vimc/vimc.cpp b/src/libcamera/pipeline/vimc/vimc.cpp index 204f5ad73f6d..33c165d0cee2 100644 --- a/src/libcamera/pipeline/vimc/vimc.cpp +++ b/src/libcamera/pipeline/vimc/vimc.cpp @@ -128,8 +128,8 @@ CameraConfiguration::Status VimcCameraConfiguration::validate() if (config_.empty()) return Invalid; - if (transform != Transform::Identity) { - transform = Transform::Identity; + if (orientation != CameraConfiguration::rotate0) { + orientation = CameraConfiguration::rotate0; status = Adjusted; } diff --git a/src/libcamera/transform.cpp b/src/libcamera/transform.cpp index 4668303d0676..930155b60ff4 100644 --- a/src/libcamera/transform.cpp +++ b/src/libcamera/transform.cpp @@ -299,6 +299,64 @@ Transform transformFromRotation(int angle, bool *success) return Transform::Identity; } +/** + * \brief Return the transform representing \a orientation + * \param[in] orientation The orientation to convert + * \return The transform corresponding to \a orientation + */ +Transform transformFromOrientation(const CameraConfiguration::Orientation &orientation) +{ + switch (orientation) { + case CameraConfiguration::rotate0: + return Transform::Identity; + case CameraConfiguration::flipRotate0: + return Transform::HFlip; + case CameraConfiguration::rotate180: + return Transform::Rot180; + case CameraConfiguration::flipRotate180: + return Transform::VFlip; + case CameraConfiguration::flipRotate270: + return Transform::Transpose; + case CameraConfiguration::rotate90: + return Transform::Rot90; + case CameraConfiguration::flipRotate90: + return Transform::Rot180Transpose; + case CameraConfiguration::rotate270: + return Transform::Rot270; + } + + return Transform::Identity; +} + +/** + * \brief Return the CameraConfiguration::Orientation representing \a transform + * \param[in] transform The transform to convert + * \return The Orientation corresponding to \a transform + */ +CameraConfiguration::Orientation transformToOrientation(const Transform &transform) +{ + switch (transform) { + case Transform::Identity: + return CameraConfiguration::rotate0; + case Transform::HFlip: + return CameraConfiguration::flipRotate0; + case Transform::VFlip: + return CameraConfiguration::flipRotate180; + case Transform::Rot180: + return CameraConfiguration::rotate180; + case Transform::Transpose: + return CameraConfiguration::flipRotate270; + case Transform::Rot270: + return CameraConfiguration::rotate270; + case Transform::Rot90: + return CameraConfiguration::rotate90; + case Transform::Rot180Transpose: + return CameraConfiguration::flipRotate90; + } + + return CameraConfiguration::rotate0; +} + /** * \brief Return a character string describing the transform * \param[in] t The transform to be described. From patchwork Tue Jun 20 14:29:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jacopo Mondi X-Patchwork-Id: 18754 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 7EB0EC32AA for ; Tue, 20 Jun 2023 14:29:24 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 39F27628C3; Tue, 20 Jun 2023 16:29:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1687271364; bh=oYhF7hyz9pKMIn/KeZkRwGYNadMjT4MXJrnrXqTEcBU=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=SGfXIaACgHPKYXJxdg+v1zC3NPPI3DvBQHN6CAlkSN49SPQx65hyBLUXiWzG5ioWL T2IlT002yYQsVd7e3RY3914tn5gLSsKM/Zw/FG+1dJDNeYCu27UOEjZfK7kBaVVOkQ OIgxHD3dXsEO+cF1TLe94sAKUqYkbxK3baZBqnxl/ToJi6MnzZbMJqFHJzLOYqln+g AjmiRmYAmsSlX9vjZHUPK4Gf0NKzxsfJpHsOJYyZxhnB9vAmypl1vRU3RaPFy4h550 Du8kz0U2cfYtENlW7SHTECS8I78mQ9pc7CTmqJvFfibcaEBmtXaTSg8SA8TWMy1BGN XrQw1n0P2Yoaw== Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 00401628C7 for ; Tue, 20 Jun 2023 16:29:19 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (1024-bit key; unprotected) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="viDAeOYQ"; dkim-atps=neutral Received: from uno.lan (unknown [IPv6:2001:b07:5d2e:52c9:72c3:346:a663:c82d]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 004B810FE; Tue, 20 Jun 2023 16:28:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1687271325; bh=oYhF7hyz9pKMIn/KeZkRwGYNadMjT4MXJrnrXqTEcBU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=viDAeOYQi4So6cuB/f12OXwHeihvDRrapjfuikxDX6167pVpgRZH3t2MzIGGgD4tQ /cXvtNnGgBLTRi3LC3fDxGlL8emAAsvaL2AMuGCBt3WcmjcqE+MrUpq5D9BtdOzzLS ZwFt55sOVJ5cgqeGt33nR7EyDb1rs1gAAqtYBujc= To: libcamera-devel@lists.libcamera.org Date: Tue, 20 Jun 2023 16:29:04 +0200 Message-Id: <20230620142904.72600-5-jacopo.mondi@ideasonboard.com> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> References: <20230620142904.72600-1-jacopo.mondi@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [RFC 4/4] apps: cam: Add option to set stream orientation X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jacopo Mondi via libcamera-devel From: Jacopo Mondi Reply-To: Jacopo Mondi Cc: Jacopo Mondi Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" Add a '--orientation|-o' option to the cam test application to set an orientation to the image stream. Supported values are the ones obtained by applying flips to the camera sensor: - rot180: Rotate 180 degrees - flip: vertical flip - mirror: horizontal flip Signed-off-by: Jacopo Mondi --- src/apps/cam/camera_session.cpp | 17 +++++++++++++++++ src/apps/cam/main.cpp | 5 +++++ src/apps/cam/main.h | 1 + 3 files changed, 23 insertions(+) -- 2.40.1 diff --git a/src/apps/cam/camera_session.cpp b/src/apps/cam/camera_session.cpp index 8fcec6304d66..2d6a1440cde2 100644 --- a/src/apps/cam/camera_session.cpp +++ b/src/apps/cam/camera_session.cpp @@ -65,6 +65,23 @@ CameraSession::CameraSession(CameraManager *cm, return; } + if (options_.isSet(OptOrientation)) { + std::string orient = options_[OptOrientation].toString(); + if (orient == "rot180") { + config->orientation = + libcamera::CameraConfiguration::rotate180; + } else if (orient == "mirror") { + config->orientation = + libcamera::CameraConfiguration::flipRotate0; + } else if (orient == "flip") { + config->orientation = + libcamera::CameraConfiguration::flipRotate180; + } else { + std::cerr << "Invalid orientation " << orient << std::endl; + return; + } + } + /* Apply configuration if explicitly requested. */ if (StreamKeyValueParser::updateConfiguration(config.get(), options_[OptStream])) { diff --git a/src/apps/cam/main.cpp b/src/apps/cam/main.cpp index 5d8a57bc14e5..8698d5eedcf8 100644 --- a/src/apps/cam/main.cpp +++ b/src/apps/cam/main.cpp @@ -133,6 +133,11 @@ int CamApp::parseOptions(int argc, char *argv[]) "Capture until interrupted by user or until frames captured", "capture", ArgumentOptional, "count", false, OptCamera); + + parser.addOption(OptOrientation, OptionString, + "The camera stream image orientation (rot180, mirror, flip)", + "orientation", ArgumentRequired, "orientation", false, + OptCamera); #ifdef HAVE_KMS parser.addOption(OptDisplay, OptionString, "Display viewfinder through DRM/KMS on specified connector", diff --git a/src/apps/cam/main.h b/src/apps/cam/main.h index 526aecece3f3..4aa959b32e13 100644 --- a/src/apps/cam/main.h +++ b/src/apps/cam/main.h @@ -17,6 +17,7 @@ enum { OptList = 'l', OptListProperties = 'p', OptMonitor = 'm', + OptOrientation = 'o', OptSDL = 'S', OptStream = 's', OptListControls = 256,