diff --git a/packages/kbot/cpp/branding/logo/print/eps/Black logo - no background.eps b/packages/kbot/cpp/branding/logo/print/eps/Black logo - no background.eps new file mode 100644 index 00000000..cd188d8a --- /dev/null +++ b/packages/kbot/cpp/branding/logo/print/eps/Black logo - no background.eps @@ -0,0 +1,805 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/kbot/cpp/branding/logo/print/eps/Color logo - no background.eps b/packages/kbot/cpp/branding/logo/print/eps/Color logo - no background.eps new file mode 100644 index 00000000..94a449f7 --- /dev/null +++ b/packages/kbot/cpp/branding/logo/print/eps/Color logo - no background.eps @@ -0,0 +1,809 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +/DeviceRGB {} CS +[0.2235 0.2431 0.2745] SC +/DeviceRGB {} cs +[0.2235 0.2431 0.2745] sc +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/kbot/cpp/branding/logo/print/eps/Color logo with background.eps b/packages/kbot/cpp/branding/logo/print/eps/Color logo with background.eps new file mode 100644 index 00000000..f030b3c6 --- /dev/null +++ b/packages/kbot/cpp/branding/logo/print/eps/Color logo with background.eps @@ -0,0 +1,818 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[3.125494 0 0 3.12478 0.0072969 0] cm +/DeviceRGB {} CS +[1 1 1] SC +/DeviceRGB {} cs +[1 1 1] sc +0 0 3162.1621 843.23718 re +f +Q +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +/DeviceRGB {} CS +[0.2235 0.2431 0.2745] SC +/DeviceRGB {} cs +[0.2235 0.2431 0.2745] sc +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/kbot/cpp/branding/logo/print/eps/White logo - no background.eps b/packages/kbot/cpp/branding/logo/print/eps/White logo - no background.eps new file mode 100644 index 00000000..fa5ec39b --- /dev/null +++ b/packages/kbot/cpp/branding/logo/print/eps/White logo - no background.eps @@ -0,0 +1,809 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +/DeviceRGB {} CS +[1 1 1] SC +/DeviceRGB {} cs +[1 1 1] sc +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/kbot/cpp/branding/logo/print/pdf/Black logo - no background.pdf b/packages/kbot/cpp/branding/logo/print/pdf/Black logo - no background.pdf new file mode 100644 index 00000000..5d4f515f Binary files /dev/null and b/packages/kbot/cpp/branding/logo/print/pdf/Black logo - no background.pdf differ diff --git a/packages/kbot/cpp/branding/logo/print/pdf/Color logo - no background.pdf b/packages/kbot/cpp/branding/logo/print/pdf/Color logo - no background.pdf new file mode 100644 index 00000000..50b30ae7 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/print/pdf/Color logo - no background.pdf differ diff --git a/packages/kbot/cpp/branding/logo/print/pdf/Color logo with background.pdf b/packages/kbot/cpp/branding/logo/print/pdf/Color logo with background.pdf new file mode 100644 index 00000000..89a6ab1f Binary files /dev/null and b/packages/kbot/cpp/branding/logo/print/pdf/Color logo with background.pdf differ diff --git a/packages/kbot/cpp/branding/logo/print/pdf/White logo - no background.pdf b/packages/kbot/cpp/branding/logo/print/pdf/White logo - no background.pdf new file mode 100644 index 00000000..9ac4e8d2 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/print/pdf/White logo - no background.pdf differ diff --git a/packages/kbot/cpp/branding/logo/web/Favicons/Android.png b/packages/kbot/cpp/branding/logo/web/Favicons/Android.png new file mode 100644 index 00000000..f1a0c96a Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/Favicons/Android.png differ diff --git a/packages/kbot/cpp/branding/logo/web/Favicons/browser.png b/packages/kbot/cpp/branding/logo/web/Favicons/browser.png new file mode 100644 index 00000000..ddb43c82 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/Favicons/browser.png differ diff --git a/packages/kbot/cpp/branding/logo/web/Favicons/iPhone.png b/packages/kbot/cpp/branding/logo/web/Favicons/iPhone.png new file mode 100644 index 00000000..483d38b0 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/Favicons/iPhone.png differ diff --git a/packages/kbot/cpp/branding/logo/web/Favicons/iphone_512.png b/packages/kbot/cpp/branding/logo/web/Favicons/iphone_512.png new file mode 100644 index 00000000..b92990a4 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/Favicons/iphone_512.png differ diff --git a/packages/kbot/cpp/branding/logo/web/png/Black logo - no background.png b/packages/kbot/cpp/branding/logo/web/png/Black logo - no background.png new file mode 100644 index 00000000..f564d365 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/png/Black logo - no background.png differ diff --git a/packages/kbot/cpp/branding/logo/web/png/Color logo - no background.png b/packages/kbot/cpp/branding/logo/web/png/Color logo - no background.png new file mode 100644 index 00000000..c62298f4 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/png/Color logo - no background.png differ diff --git a/packages/kbot/cpp/branding/logo/web/png/Color logo with background.png b/packages/kbot/cpp/branding/logo/web/png/Color logo with background.png new file mode 100644 index 00000000..e60158b3 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/png/Color logo with background.png differ diff --git a/packages/kbot/cpp/branding/logo/web/png/White logo - no background.png b/packages/kbot/cpp/branding/logo/web/png/White logo - no background.png new file mode 100644 index 00000000..fd0788e7 Binary files /dev/null and b/packages/kbot/cpp/branding/logo/web/png/White logo - no background.png differ diff --git a/packages/kbot/cpp/branding/logo/web/svg/Black logo - no background.svg b/packages/kbot/cpp/branding/logo/web/svg/Black logo - no background.svg new file mode 100644 index 00000000..bafa9305 --- /dev/null +++ b/packages/kbot/cpp/branding/logo/web/svg/Black logo - no background.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/kbot/cpp/branding/logo/web/svg/Color logo - no background.svg b/packages/kbot/cpp/branding/logo/web/svg/Color logo - no background.svg new file mode 100644 index 00000000..97421ce3 --- /dev/null +++ b/packages/kbot/cpp/branding/logo/web/svg/Color logo - no background.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/kbot/cpp/branding/logo/web/svg/Color logo with background.svg b/packages/kbot/cpp/branding/logo/web/svg/Color logo with background.svg new file mode 100644 index 00000000..a902dee5 --- /dev/null +++ b/packages/kbot/cpp/branding/logo/web/svg/Color logo with background.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/kbot/cpp/branding/logo/web/svg/White logo - no background.svg b/packages/kbot/cpp/branding/logo/web/svg/White logo - no background.svg new file mode 100644 index 00000000..c4c84e43 --- /dev/null +++ b/packages/kbot/cpp/branding/logo/web/svg/White logo - no background.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/kbot/dev-kbot.code-workspace b/packages/kbot/dev-kbot.code-workspace index 06032005..cbb4f9ca 100644 --- a/packages/kbot/dev-kbot.code-workspace +++ b/packages/kbot/dev-kbot.code-workspace @@ -17,6 +17,9 @@ }, { "path": "../media" + }, + { + "path": "../acl" } ], "settings": {} diff --git a/packages/media/cpp/CMakeLists.txt b/packages/media/cpp/CMakeLists.txt index b11be26f..8f60085c 100644 --- a/packages/media/cpp/CMakeLists.txt +++ b/packages/media/cpp/CMakeLists.txt @@ -1,229 +1,229 @@ -cmake_minimum_required(VERSION 3.20) - -project(media-image-service - VERSION 0.1.0 - DESCRIPTION "Polymech image resize service (CLI, REST, IPC) — libvips" - LANGUAGES CXX -) - -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/dist") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/dist") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/dist") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_SOURCE_DIR}/dist") -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_SOURCE_DIR}/dist") - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) - -# MSVC: UTF-8 source/execution charset so wide string literals (L"...") match UTF-8 in .cpp files. -if(MSVC) - add_compile_options(/utf-8) -endif() - -list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -# Windows: official libvips dev tree (see scripts/fetch-vips-windows.ps1) — vips-dev-* under third_party/ -if(WIN32) - file(GLOB _MEDIA_VIPS_SDK "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vips-dev-*") - if(_MEDIA_VIPS_SDK) - list(APPEND CMAKE_PREFIX_PATH ${_MEDIA_VIPS_SDK}) - endif() -endif() - -include(FetchContent) - -set(JSON_BuildTests OFF CACHE BOOL "" FORCE) - -FetchContent_Declare( - cli11 - GIT_REPOSITORY https://github.com/CLIUtils/CLI11.git - GIT_TAG v2.4.2 - GIT_SHALLOW TRUE -) - -FetchContent_Declare( - asio - GIT_REPOSITORY https://github.com/chriskohlhoff/asio.git - GIT_TAG asio-1-28-0 - GIT_SHALLOW TRUE -) - -FetchContent_Declare( - nlohmann_json - GIT_REPOSITORY https://github.com/nlohmann/json.git - GIT_TAG v3.11.3 - GIT_SHALLOW TRUE -) - -FetchContent_Declare( - cpp_httplib - GIT_REPOSITORY https://github.com/yhirose/cpp-httplib.git - GIT_TAG v0.16.3 - GIT_SHALLOW TRUE -) - -FetchContent_MakeAvailable(cli11 asio nlohmann_json cpp_httplib) - -# libcurl — HTTP(S) URL inputs (minimal static build; SChannel on Windows, OpenSSL on Linux). -set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE) -FetchContent_Declare( - CURL - URL https://github.com/curl/curl/releases/download/curl-8_12_1/curl-8.12.1.tar.xz - DOWNLOAD_EXTRACT_TIMESTAMP TRUE -) -set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE) -set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) -set(BUILD_TESTING OFF CACHE BOOL "" FORCE) -if(WIN32) - set(CURL_USE_OPENSSL OFF CACHE BOOL "" FORCE) - set(CURL_USE_SCHANNEL ON CACHE BOOL "" FORCE) -else() - set(CURL_USE_SCHANNEL OFF CACHE BOOL "" FORCE) - set(CURL_USE_OPENSSL ON CACHE BOOL "" FORCE) -endif() -set(CURL_ZLIB OFF CACHE BOOL "" FORCE) -set(CURL_BROTLI OFF CACHE BOOL "" FORCE) -set(CURL_ZSTD OFF CACHE BOOL "" FORCE) -set(USE_NGHTTP2 OFF CACHE BOOL "" FORCE) -set(CURL_USE_LIBSSH2 OFF CACHE BOOL "" FORCE) -set(CURL_USE_LIBPSL OFF CACHE BOOL "" FORCE) -set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE) -set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE) -FetchContent_MakeAvailable(CURL) - -# PicoSHA2 — header-only SHA256 for cache keys. -FetchContent_Declare( - picosha2 - GIT_REPOSITORY https://github.com/okdshin/PicoSHA2.git - GIT_TAG master - GIT_SHALLOW TRUE -) -FetchContent_GetProperties(picosha2) -if(NOT picosha2_POPULATED) - FetchContent_Populate(picosha2) -endif() - -# p-ranav/glob — same as packages/kbot/cpp (glob / rglob for **). -FetchContent_Declare( - pranav_glob - GIT_REPOSITORY https://github.com/p-ranav/glob.git - GIT_TAG master - GIT_SHALLOW TRUE -) -FetchContent_GetProperties(pranav_glob) -if(NOT pranav_glob_POPULATED) - FetchContent_Populate(pranav_glob) -endif() -add_library(pranav_glob STATIC ${pranav_glob_SOURCE_DIR}/source/glob.cpp) -target_include_directories(pranav_glob PUBLIC ${pranav_glob_SOURCE_DIR}/include) -target_compile_features(pranav_glob PUBLIC cxx_std_17) -if(MSVC) - target_compile_options(pranav_glob PRIVATE /permissive-) -endif() - -# laserpants/dotenv-cpp — load .env (same pattern as packages/kbot/cpp). -FetchContent_Declare( - laserpants_dotenv - GIT_REPOSITORY https://github.com/laserpants/dotenv-cpp.git - GIT_TAG master - GIT_SHALLOW TRUE -) -FetchContent_GetProperties(laserpants_dotenv) -if(NOT laserpants_dotenv_POPULATED) - FetchContent_Populate(laserpants_dotenv) -endif() -add_library(laserpants_dotenv INTERFACE) -target_include_directories(laserpants_dotenv INTERFACE ${laserpants_dotenv_SOURCE_DIR}/include) -add_library(laserpants::dotenv ALIAS laserpants_dotenv) - -find_package(Vips REQUIRED) - -add_executable(media-img - src/main.cpp - src/core/cache.cpp - src/core/glob_paths.cpp - src/core/output_path.cpp - src/core/resize.cpp - src/core/url_fetch.cpp - src/http/serve.cpp - src/ipc/ipc_serve.cpp -) -if(WIN32) - target_sources(media-img PRIVATE - "${CMAKE_CURRENT_SOURCE_DIR}/src/win/register_explorer.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/win/resize_ui.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/win/resize_progress_ui.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/win/ui_singleton.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/src/win/media-img-win.manifest" - ) -endif() - -target_include_directories(media-img PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/src - ${asio_SOURCE_DIR}/asio/include - ${picosha2_SOURCE_DIR} -) - -target_compile_definitions(media-img PRIVATE - ASIO_STANDALONE - ASIO_NO_DEPRECATED - CPPHTTPLIB_NO_EXCEPTIONS=0 -) - -if(WIN32) - target_compile_definitions(media-img PRIVATE - _WIN32_WINNT=0x0A00 - NOMINMAX - ) -endif() - -target_link_libraries(media-img PRIVATE - CLI11::CLI11 - nlohmann_json::nlohmann_json - httplib::httplib - laserpants::dotenv - pranav_glob - CURL::libcurl - Vips::vips -) - -# GObject (g_object_ref / g_object_unref) — not re-exported through libvips import lib on MSVC. -if(WIN32) - file(GLOB _MEDIA_VIPS_SDK_LIST "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vips-dev-*") - if(_MEDIA_VIPS_SDK_LIST) - list(GET _MEDIA_VIPS_SDK_LIST 0 _MEDIA_VIPS_SDK) - if(EXISTS "${_MEDIA_VIPS_SDK}/lib/libgobject-2.0.lib") - target_link_libraries(media-img PRIVATE - "${_MEDIA_VIPS_SDK}/lib/libgobject-2.0.lib" - "${_MEDIA_VIPS_SDK}/lib/libglib-2.0.lib" - ) - endif() - endif() -endif() - -if(UNIX AND NOT APPLE) - target_link_libraries(media-img PRIVATE pthread) -endif() - -target_compile_definitions(media-img PRIVATE - "MEDIA_IMG_VERSION=\"${PROJECT_VERSION}\"" -) - -# Runtime: libvips and deps are DLLs next to media-img.exe (Windows dev bundle bin/). -if(WIN32) - file(GLOB _MEDIA_VIPS_SDK_LIST "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vips-dev-*") - if(_MEDIA_VIPS_SDK_LIST) - list(GET _MEDIA_VIPS_SDK_LIST 0 _MEDIA_VIPS_SDK) - if(EXISTS "${_MEDIA_VIPS_SDK}/bin") - add_custom_command( - TARGET media-img - POST_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_directory - "${_MEDIA_VIPS_SDK}/bin" - "${CMAKE_SOURCE_DIR}/dist" - COMMENT "Copy libvips DLLs to dist/" - ) - endif() - endif() -endif() +cmake_minimum_required(VERSION 3.20) + +project(media-image-service + VERSION 0.1.0 + DESCRIPTION "Polymech image resize service (CLI, REST, IPC) — libvips" + LANGUAGES CXX +) + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/dist") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_SOURCE_DIR}/dist") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_SOURCE_DIR}/dist") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_SOURCE_DIR}/dist") +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_SOURCE_DIR}/dist") + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# MSVC: UTF-8 source/execution charset so wide string literals (L"...") match UTF-8 in .cpp files. +if(MSVC) + add_compile_options(/utf-8) +endif() + +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +# Windows: official libvips dev tree (see scripts/fetch-vips-windows.ps1) — vips-dev-* under third_party/ +if(WIN32) + file(GLOB _MEDIA_VIPS_SDK "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vips-dev-*") + if(_MEDIA_VIPS_SDK) + list(APPEND CMAKE_PREFIX_PATH ${_MEDIA_VIPS_SDK}) + endif() +endif() + +include(FetchContent) + +set(JSON_BuildTests OFF CACHE BOOL "" FORCE) + +FetchContent_Declare( + cli11 + GIT_REPOSITORY https://github.com/CLIUtils/CLI11.git + GIT_TAG v2.4.2 + GIT_SHALLOW TRUE +) + +FetchContent_Declare( + asio + GIT_REPOSITORY https://github.com/chriskohlhoff/asio.git + GIT_TAG asio-1-28-0 + GIT_SHALLOW TRUE +) + +FetchContent_Declare( + nlohmann_json + GIT_REPOSITORY https://github.com/nlohmann/json.git + GIT_TAG v3.11.3 + GIT_SHALLOW TRUE +) + +FetchContent_Declare( + cpp_httplib + GIT_REPOSITORY https://github.com/yhirose/cpp-httplib.git + GIT_TAG v0.16.3 + GIT_SHALLOW TRUE +) + +FetchContent_MakeAvailable(cli11 asio nlohmann_json cpp_httplib) + +# libcurl — HTTP(S) URL inputs (minimal static build; SChannel on Windows, OpenSSL on Linux). +set(CMAKE_POLICY_VERSION_MINIMUM 3.5 CACHE STRING "" FORCE) +FetchContent_Declare( + CURL + URL https://github.com/curl/curl/releases/download/curl-8_12_1/curl-8.12.1.tar.xz + DOWNLOAD_EXTRACT_TIMESTAMP TRUE +) +set(BUILD_CURL_EXE OFF CACHE BOOL "" FORCE) +set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) +set(BUILD_TESTING OFF CACHE BOOL "" FORCE) +if(WIN32) + set(CURL_USE_OPENSSL OFF CACHE BOOL "" FORCE) + set(CURL_USE_SCHANNEL ON CACHE BOOL "" FORCE) +else() + set(CURL_USE_SCHANNEL OFF CACHE BOOL "" FORCE) + set(CURL_USE_OPENSSL ON CACHE BOOL "" FORCE) +endif() +set(CURL_ZLIB OFF CACHE BOOL "" FORCE) +set(CURL_BROTLI OFF CACHE BOOL "" FORCE) +set(CURL_ZSTD OFF CACHE BOOL "" FORCE) +set(USE_NGHTTP2 OFF CACHE BOOL "" FORCE) +set(CURL_USE_LIBSSH2 OFF CACHE BOOL "" FORCE) +set(CURL_USE_LIBPSL OFF CACHE BOOL "" FORCE) +set(CURL_DISABLE_LDAP ON CACHE BOOL "" FORCE) +set(CURL_DISABLE_LDAPS ON CACHE BOOL "" FORCE) +FetchContent_MakeAvailable(CURL) + +# PicoSHA2 — header-only SHA256 for cache keys. +FetchContent_Declare( + picosha2 + GIT_REPOSITORY https://github.com/okdshin/PicoSHA2.git + GIT_TAG master + GIT_SHALLOW TRUE +) +FetchContent_GetProperties(picosha2) +if(NOT picosha2_POPULATED) + FetchContent_Populate(picosha2) +endif() + +# p-ranav/glob — same as packages/kbot/cpp (glob / rglob for **). +FetchContent_Declare( + pranav_glob + GIT_REPOSITORY https://github.com/p-ranav/glob.git + GIT_TAG master + GIT_SHALLOW TRUE +) +FetchContent_GetProperties(pranav_glob) +if(NOT pranav_glob_POPULATED) + FetchContent_Populate(pranav_glob) +endif() +add_library(pranav_glob STATIC ${pranav_glob_SOURCE_DIR}/source/glob.cpp) +target_include_directories(pranav_glob PUBLIC ${pranav_glob_SOURCE_DIR}/include) +target_compile_features(pranav_glob PUBLIC cxx_std_17) +if(MSVC) + target_compile_options(pranav_glob PRIVATE /permissive-) +endif() + +# laserpants/dotenv-cpp — load .env (same pattern as packages/kbot/cpp). +FetchContent_Declare( + laserpants_dotenv + GIT_REPOSITORY https://github.com/laserpants/dotenv-cpp.git + GIT_TAG master + GIT_SHALLOW TRUE +) +FetchContent_GetProperties(laserpants_dotenv) +if(NOT laserpants_dotenv_POPULATED) + FetchContent_Populate(laserpants_dotenv) +endif() +add_library(laserpants_dotenv INTERFACE) +target_include_directories(laserpants_dotenv INTERFACE ${laserpants_dotenv_SOURCE_DIR}/include) +add_library(laserpants::dotenv ALIAS laserpants_dotenv) + +find_package(Vips REQUIRED) + +add_executable(pm-image + src/main.cpp + src/core/cache.cpp + src/core/glob_paths.cpp + src/core/output_path.cpp + src/core/resize.cpp + src/core/url_fetch.cpp + src/http/serve.cpp + src/ipc/ipc_serve.cpp +) +if(WIN32) + target_sources(pm-image PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}/src/win/register_explorer.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/win/resize_ui.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/win/resize_progress_ui.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/win/ui_singleton.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/src/win/media-img-win.manifest" + ) +endif() + +target_include_directories(pm-image PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${asio_SOURCE_DIR}/asio/include + ${picosha2_SOURCE_DIR} +) + +target_compile_definitions(pm-image PRIVATE + ASIO_STANDALONE + ASIO_NO_DEPRECATED + CPPHTTPLIB_NO_EXCEPTIONS=0 +) + +if(WIN32) + target_compile_definitions(pm-image PRIVATE + _WIN32_WINNT=0x0A00 + NOMINMAX + ) +endif() + +target_link_libraries(pm-image PRIVATE + CLI11::CLI11 + nlohmann_json::nlohmann_json + httplib::httplib + laserpants::dotenv + pranav_glob + CURL::libcurl + Vips::vips +) + +# GObject (g_object_ref / g_object_unref) — not re-exported through libvips import lib on MSVC. +if(WIN32) + file(GLOB _MEDIA_VIPS_SDK_LIST "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vips-dev-*") + if(_MEDIA_VIPS_SDK_LIST) + list(GET _MEDIA_VIPS_SDK_LIST 0 _MEDIA_VIPS_SDK) + if(EXISTS "${_MEDIA_VIPS_SDK}/lib/libgobject-2.0.lib") + target_link_libraries(pm-image PRIVATE + "${_MEDIA_VIPS_SDK}/lib/libgobject-2.0.lib" + "${_MEDIA_VIPS_SDK}/lib/libglib-2.0.lib" + ) + endif() + endif() +endif() + +if(UNIX AND NOT APPLE) + target_link_libraries(pm-image PRIVATE pthread) +endif() + +target_compile_definitions(pm-image PRIVATE + "MEDIA_IMG_VERSION=\"${PROJECT_VERSION}\"" +) + +# Runtime: libvips and deps are DLLs next to pm-image.exe (Windows dev bundle bin/). +if(WIN32) + file(GLOB _MEDIA_VIPS_SDK_LIST "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vips-dev-*") + if(_MEDIA_VIPS_SDK_LIST) + list(GET _MEDIA_VIPS_SDK_LIST 0 _MEDIA_VIPS_SDK) + if(EXISTS "${_MEDIA_VIPS_SDK}/bin") + add_custom_command( + TARGET pm-image + POST_BUILD + COMMAND "${CMAKE_COMMAND}" -E copy_directory + "${_MEDIA_VIPS_SDK}/bin" + "${CMAKE_SOURCE_DIR}/dist" + COMMENT "Copy libvips DLLs to dist/" + ) + endif() + endif() +endif() diff --git a/packages/media/cpp/README.md b/packages/media/cpp/README.md index ea0a3e82..1c046c4f 100644 --- a/packages/media/cpp/README.md +++ b/packages/media/cpp/README.md @@ -1,6 +1,6 @@ -# media-img (C++) +# pm-image (C++) -CMake-based **`media-img`** binary: **CLI**, **HTTP REST** (`serve`), and **line-delimited JSON IPC** (`ipc`). Image processing uses **libvips** — the same engine as **[Sharp](https://sharp.pixelplumbing.com/)** (Node.js), exposed with a similar option model. Optional **`.env`** is loaded from the working directory ([laserpants/dotenv-cpp](https://github.com/laserpants/dotenv-cpp)). +CMake-based **`pm-image`** binary: **CLI**, **HTTP REST** (`serve`), and **line-delimited JSON IPC** (`ipc`). Image processing uses **libvips** — the same engine as **[Sharp](https://sharp.pixelplumbing.com/)** (Node.js), exposed with a similar option model. Optional **`.env`** is loaded from the working directory ([laserpants/dotenv-cpp](https://github.com/laserpants/dotenv-cpp)). - **API reference (underlying library):** [libvips `VipsImage`](https://www.libvips.org/API/current/class.Image.html) @@ -48,7 +48,7 @@ cmake --preset release cmake --build --preset release ``` -Binary: **`dist/media-img`** (`.exe` on Windows). +Binary: **`dist/pm-image`** (`.exe` on Windows). ### Windows installer (NSIS) @@ -58,16 +58,16 @@ From `packages/media/cpp`, after a release build: npm run build:installer ``` -Produces **`dist/media-img-Setup.exe`**, installs `media-img.exe`, libvips DLLs, `vips-modules-8.18`, and `scripts/explorer-resize.ps1`, and prepends the install directory to the **user** `PATH`. Uninstaller is registered under Add/Remove Programs. +Produces **`dist/pm-image-Setup.exe`**, installs `pm-image.exe`, libvips DLLs, `vips-modules-8.18`, and `scripts/explorer-resize.ps1`, and prepends the install directory to the **user** `PATH`. Uninstaller is registered under Add/Remove Programs. -### Explorer context menu (`media-img register-explorer`) +### Explorer context menu (`pm-image register-explorer`) -Implemented in **C++** (Windows registry). The NSIS installer runs `media-img.exe register-explorer` after copying files; uninstall runs `register-explorer --unregister --no-refresh-shell`. +Implemented in **C++** (Windows registry). The NSIS installer runs `pm-image.exe register-explorer` after copying files; uninstall runs `register-explorer --unregister --no-refresh-shell`. ```bash -media-img register-explorer -media-img register-explorer --dry -media-img register-explorer --unregister +pm-image register-explorer +pm-image register-explorer --dry +pm-image register-explorer --unregister ``` Registers a **PM-Media** cascading menu on image extensions (including **`.avif`**, **`.arw`**, **`.webp`**, TIFF, etc.), on **folders**, and on the **folder background** (empty area). **Resize** presets (default widths **1980, 1200, 800, 400**): **in place** or **copy** as `${SRC_NAME}_${width}${SRC_EXT}`. **Convert to JPG** writes `${SRC_NAME}_converted.jpg` via `explorer-convert.ps1`. Override widths with `--widths 1920,800`. @@ -76,9 +76,9 @@ Under `SystemFileAssociations`, each extension is registered as **`.ext`**, **`. Defaults: **`--media-bin`** = this executable; **`--explorer-script`** / **`--explorer-convert-script`** = `\\scripts\\explorer-*.ps1`, or `packages/media/scripts\\…` from a dev `cpp\\dist` build. -`pm-media register-explorer` forwards argv to `media-img.exe` for convenience. +`pm-media register-explorer` forwards argv to `pm-image.exe` for convenience. -Context menus run `powershell.exe -WindowStyle Hidden`; re-run `media-img register-explorer` after updates so registry command lines refresh. +Context menus run `powershell.exe -WindowStyle Hidden`; re-run `pm-image register-explorer` after updates so registry command lines refresh. ## Formats — same idea as Sharp / libvips @@ -95,7 +95,7 @@ Sharp wraps libvips: **decode → process → encode**. We do the same with `vip ## Sharp-like options (`resize` / JSON) -| Sharp concept | `media-img` / JSON field | Notes | +| Sharp concept | `pm-image` / JSON field | Notes | |---------------|---------------------------|--------| | `resize.fit` | `fit` | `inside`, `cover`, `contain`, `fill`, `outside` | | `resize.position` | `position` | `centre`, `attention`, `entropy`, … → libvips *interesting* | @@ -109,7 +109,7 @@ Sharp wraps libvips: **decode → process → encode**. We do the same with `vip | `flip` / `flop` | `flip` / `flop` | | | Letterbox | `background` | `#rrggbb` for `contain` | -**Windows:** `media-img resize --ui` opens a **native Win32** dialog to choose input/output paths, max dimensions, fit mode, quality, and enlargement / autorotate / strip options. Other CLI flags seed the dialog; **`--src` / `--dst` are not allowed** with `--ui`. If you cancel, the command exits without processing. +**Windows:** `pm-image resize --ui` opens a **native Win32** dialog to choose input/output paths, max dimensions, fit mode, quality, and enlargement / autorotate / strip options. Other CLI flags seed the dialog; **`--src` / `--dst` are not allowed** with `--ui`. If you cancel, the command exits without processing. **REST** `POST /v1/resize` and **IPC** use the same JSON keys as the table, plus the fields in the **“Batch paths & cache”** section below. @@ -141,10 +141,10 @@ Use this when **one** `resize` invocation (CLI, or a single REST/IPC request) sh **CLI:** use positional `input`/`output` or `--src` / `--dst` together. You can omit `output` only when `input` is a single path or URL (not a multi-match glob). ```bash -./dist/media-img resize './photos/**/*.jpg' ./out/ -./dist/media-img resize --src './shots/*.png' --dst ./thumbs/ +pm-image resize './photos/**/*.jpg' ./out/ +pm-image resize --src './shots/*.png' --dst ./thumbs/ # URL → ./200.jpg under cwd (picsum path segment "200", default extension .jpg) -./dist/media-img resize 'https://picsum.photos/200' --max-width 400 --url-timeout 30 +pm-image resize 'https://picsum.photos/200' --max-width 400 --url-timeout 30 ``` **JSON:** same strings in `"input"` and `"output"`. When `expand_glob` is true (default), glob expansion runs when the pattern contains `*`, `?`, or `**`. @@ -162,8 +162,8 @@ Placeholders are expanded **after** inputs are resolved (glob or single file). E Use cases: write beside each source (`${SRC_DIR}/out/${SRC_NAME}.webp`), suffix stems (`${SRC_NAME}_thumb.jpg`), or change extension via `format` / path. ```bash -./dist/media-img resize --src ./photo.jpg --dst '${SRC_DIR}/${SRC_NAME}_medium.jpg' --max-width 800 -./dist/media-img resize --src './shots/*.jpg' --dst '${SRC_DIR}/${SRC_NAME}.webp' --max-width 1920 +pm-image resize --src ./photo.jpg --dst '${SRC_DIR}/${SRC_NAME}_medium.jpg' --max-width 800 +pm-image resize --src './shots/*.jpg' --dst '${SRC_DIR}/${SRC_NAME}.webp' --max-width 1920 ``` **REST / IPC** — same strings in JSON (escape quotes in shell as needed): @@ -209,13 +209,13 @@ All **resize** options (`max_width`, `fit`, …) participate in the same JSON bo ### `serve` example with cache and glob ```bash -./dist/media-img serve --host 127.0.0.1 -p 8080 --cache-dir /var/cache/media-img +pm-image serve --host 127.0.0.1 -p 8080 --cache-dir /var/cache/pm-image ``` ```bash curl -s -X POST http://127.0.0.1:8080/v1/resize \ -H 'Content-Type: application/json' \ - -d '{"input":"/data/in/*.jpg","output":"/data/out/","max_width":400,"cache":true,"cache_dir":"/var/cache/media-img"}' + -d '{"input":"/data/in/*.jpg","output":"/data/out/","max_width":400,"cache":true,"cache_dir":"/var/cache/pm-image"}' ``` ## Concurrency @@ -225,33 +225,33 @@ curl -s -X POST http://127.0.0.1:8080/v1/resize \ ## CLI examples -Paths below use Unix style; on Windows run `dist\media-img.exe` and use `.\` or full paths as needed. +Paths below use Unix style; on Windows run `pm-image.exe` and use `.\` or full paths as needed. ### Help and version ```bash -./dist/media-img --help -./dist/media-img resize --help -./dist/media-img -v +pm-image --help +pm-image resize --help +pm-image -v ``` ### `resize` — fit inside a box (default), write WebP / AVIF by extension ```bash # Max 800×600, stay inside the box, Lanczos3 (default), write JPEG quality 85 (default) -./dist/media-img resize photo.jpg out.jpg --max-width 800 --max-height 600 +pm-image resize photo.jpg out.jpg --max-width 800 --max-height 600 # Same, explicit quality -./dist/media-img resize photo.jpg out.jpg --max-width 800 --max-height 600 -q 90 +pm-image resize photo.jpg out.jpg --max-width 800 --max-height 600 -q 90 # WebP output (quality applies) -./dist/media-img resize photo.jpg thumb.webp --max-width 400 --max-height 400 -q 82 +pm-image resize photo.jpg thumb.webp --max-width 400 --max-height 400 -q 82 # AVIF output (quality applies; needs HEIF/AVIF support in your libvips build) -./dist/media-img resize photo.png out.avif --max-width 1200 --max-height 1200 -q 50 +pm-image resize photo.png out.avif --max-width 1200 --max-height 1200 -q 50 # Force output format when the path has no extension you trust -./dist/media-img resize in.tif /tmp/out --format webp --max-width 512 +pm-image resize in.tif /tmp/out --format webp --max-width 512 ``` ### `resize` — square images (1:1) @@ -266,16 +266,16 @@ Use the **same** `--max-width` and `--max-height` (that value is the square side ```bash # 512×512 crop-to-square (avatars, thumbnails) -./dist/media-img resize portrait.jpg avatar.jpg --fit cover --max-width 512 --max-height 512 +pm-image resize portrait.jpg avatar.jpg --fit cover --max-width 512 --max-height 512 # 1080×1080 WebP, smart crop on subject -./dist/media-img resize product.png grid.webp --fit cover --max-width 1080 --max-height 1080 --position attention -q 85 +pm-image resize product.png grid.webp --fit cover --max-width 1080 --max-height 1080 --position attention -q 85 # Square canvas, no crop — padded bands with a colour -./dist/media-img resize panoramic.jpg square.jpg --fit contain --max-width 800 --max-height 800 --background '#111111' +pm-image resize panoramic.jpg square.jpg --fit contain --max-width 800 --max-height 800 --background '#111111' # Exact square by stretching (rare) -./dist/media-img resize any.jpg out.jpg --fit fill --max-width 256 --max-height 256 +pm-image resize any.jpg out.jpg --fit fill --max-width 256 --max-height 256 ``` **REST / IPC JSON:** e.g. `"max_width": 512, "max_height": 512, "fit": "cover", "position": "attention"`. @@ -284,20 +284,20 @@ Use the **same** `--max-width` and `--max-height` (that value is the square side ```bash # Cover: fill 1200×630, crop centre (use --position attention for smart crop) -./dist/media-img resize wide.jpg social.jpg --fit cover --max-width 1200 --max-height 630 +pm-image resize wide.jpg social.jpg --fit cover --max-width 1200 --max-height 630 # Contain: fit inside 800×600 canvas, letterbox with a background -./dist/media-img resize logo.png padded.png --fit contain --max-width 800 --max-height 600 --background '#1a1a1a' +pm-image resize logo.png padded.png --fit contain --max-width 800 --max-height 600 --background '#1a1a1a' # EXIF autorotate (default), then rotate 90° CCW, vertical flip -./dist/media-img resize img.jpg rotated.jpg --max-width 1024 --rotate 90 --flip +pm-image resize img.jpg rotated.jpg --max-width 1024 --rotate 90 --flip ``` ### `serve` — HTTP REST ```bash # Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize with JSON body -./dist/media-img serve --host 127.0.0.1 -p 8080 +pm-image serve --host 127.0.0.1 -p 8080 ``` Example resize request (paths must be readable/writable by the server process): @@ -314,7 +314,7 @@ Optional: `"cache":false`, `"expand_glob":false`, `"cache_dir":"..."` — see ** ### `ipc` — one JSON line per connection (TCP; Unix socket on Linux/macOS) ```bash -./dist/media-img ipc --host 127.0.0.1 -p 9333 --cache-dir ./cache/images +pm-image ipc --host 127.0.0.1 -p 9333 --cache-dir ./cache/images # elsewhere: send a single line, read one line back, e.g. # {"input":"/tmp/a.jpg","output":"/tmp/b.webp","max_width":320,"format":"webp","cache":true} ``` @@ -327,7 +327,7 @@ Requires **`KBOT_EXE`** pointing at the kbot executable; remaining args are pass ```bash export KBOT_EXE=/path/to/kbot # Windows: set KBOT_EXE=C:\path\to\kbot.exe -./dist/media-img kbot ai --prompt "hello" +pm-image kbot ai --prompt "hello" ``` ## Tests @@ -336,7 +336,7 @@ export KBOT_EXE=/path/to/kbot # Windows: set KBOT_EXE=C:\path\to\kbot.exe npm run test:media ``` -Requires a built `dist/media-img` **linked against libvips** and fixture PNGs (`npm run generate:assets` if missing). +Requires a built `dist/pm-image` **linked against libvips** and fixture PNGs (`npm run generate:assets` if missing). The suite covers **REST**, **IPC (TCP)**, optional **Unix socket** on non-Windows, **destination templates** (`npm run test:media:templates`), and **recursive glob + `${SRC_DIR}` / `${SRC_NAME}`** (`npm run test:media:glob` — outputs under `tests/assets/glob-in/**/out/`, gitignored, for manual inspection). diff --git a/packages/media/cpp/branding/app-config.json b/packages/media/cpp/branding/app-config.json new file mode 100644 index 00000000..c967c21b --- /dev/null +++ b/packages/media/cpp/branding/app-config.json @@ -0,0 +1,290 @@ +{ + "app": { + "name": "Polymech Image Resizer", + "context_menu": "PM-Media", + "description": "Command line tool to resize images", + "url": "https://service.polymech.info/user/cgo/pages/polymech-media-tools", + "trailing_slash": false, + "favicon": "/branding/logo/web/Favicons/iphone_512.png" + }, + "site": { + "title": "Polymech", + "base_url": "https://service.polymech.info/", + "canonical_url": "https://service.polymech.info/", + "description": "Polymech Media Platform", + "base_path": "/", + "trailing_slash": false, + "favicon": "/images/favicon.png", + "logo": "/branding/logo/web/Favicons/iphone_512.png", + "logo_darkmode": "/images/logo-darkmode.png", + "logo_width": "150", + "logo_height": "33", + "logo_text": "Astrofront", + "image": { + "default": "/images/default-image.png", + "error": "/images/error-image.png", + "alt": "Astrofront" + } + }, + "i18n": { + "store": "${OSR_ROOT}/i18n-store/store-${LANG}.json", + "cache": true, + "source_language": "en", + "asset_path": "${SRC_DIR}/${SRC_NAME}-${DST_LANG}${SRC_EXT}" + }, + "core": { + "logging_namespace": "polymech-site", + "translate_content": true, + "languages": [ + "en", + "de", + "es", + "it", + "fr" + ], + "languages_prod": [ + "en", + "es", + "fr", + "it", + "de" + ], + "rtl_languages": [ + "ar" + ], + "osr_root": "${OSR_ROOT}" + }, + "footer_left": [ + { + "href": "/user/cgo/pages/about-contact", + "text": "Contact" + }, + { + "href": "https://forum.polymech.info/", + "text": "Forum" + }, + { + "href": "https://service.polymech.info/app/filebrowser/machines?mode=thumb", + "text": "Files" + }, + { + "href": "https://git.polymech.info/explore/repos", + "text": "Github" + }, + { + "href": "https://discord.gg/A68ChG9hnN", + "text": "Discord" + }, + { + "href": "https://service.polymech.info/support-chat", + "text": "Support Chat (Instant Quotes)" + } + ], + "footer_email": [ + { + "href": "https://service.polymech.info/user/3bb4cfbf-318b-44d3-a9d3-35680e738421/pages/about-contact", + "text": "Contact" + }, + { + "href": "https://forum.polymech.info/", + "text": "Forum" + }, + { + "href": "https://service.polymech.info/app/filebrowser/machines?mode=thumb", + "text": "Files" + }, + { + "href": "https://git.polymech.info/explore/repos", + "text": "Github" + }, + { + "href": "https://discord.gg/A68ChG9hnN", + "text": "Discord" + }, + { + "href": "https://service.polymech.info/support-chat", + "text": "Support Chat (Instant Quotes)" + } + ], + "email": { + "languages": [ + "en", + "de", + "es", + "it", + "fr" + ] + }, + "footer_right": [], + "settings": { + "search": true, + "account": true, + "sticky_header": true, + "theme_switcher": true, + "default_theme": "system" + }, + "params": { + "contact_form_action": "#", + "copyright": "Designed And Developed by [Themefisher](https://themefisher.com/)" + }, + "navigation": { + "top": [ + { + "href": "/${LANG}", + "text": "Home" + }, + { + "href": "https://service.polymech.info/", + "text": "Media" + }, + { + "href": "https://forum.polymech.info/", + "text": "Forum" + }, + { + "href": "https://polymech.info/${LANG}/resources", + "text": "Resources" + } + ] + }, + "navigation_button": { + "enable": true, + "label": "Get Started", + "link": "https://github.com/themefisher/astrofront" + }, + "ecommerce": { + "brand": "Polymech", + "currencySymbol": "E", + "currencyCode": "EUR" + }, + "impressum": { + "company": "Polymech S.L.", + "representative": "Guenter Volkmar Baumgart", + "address": "Poligono Can Clapers, Carrer Can Peric 11, 1B, 08181 Sentmenat, Barcelona, Spain", + "email": "info@polymech.info", + "phone": "+34 691 952 287", + "vat_id": "ES-Y0100830N", + "register": "Registro Mercantil de Barcelona", + "responsible_content": "Guenter Volkmar Baumgart (§ 18 Abs. 2 MStV)" + }, + "metadata": { + "country": "Spain", + "city": "Barcelona", + "author": "Polymech", + "author_bio": "I am in, if its true", + "author_url": "https://service.polymech.info/", + "image": "/branding/logo/web/Favicons/iphone_512.png", + "description": "Polymech is a plastic prototyping company that offers product design services.", + "keywords": "Plastic, Prototyping, Product Design, Opensource" + }, + "shopify": { + "currencySymbol": "", + "currencyCode": "EU", + "collections": { + "hero_slider": "hidden-homepage-carousel", + "featured_products": "featured-products" + } + }, + "pages": { + "home": { + "hero": "https://assets.polymech.info/machines//assets/newsletter/common/products/extruders/overview-3.jpg", + "_blog": { + "store": "resources" + } + } + }, + "dev": { + "file_server": "localhost:5000" + }, + "features": { + "show_description": false, + "show_license": true, + "show_renderings": true, + "show_tabs": false, + "show_gallery": true, + "show_files": true, + "show_specs": true, + "show_checkout": true, + "show_contact": true, + "show_3d_preview": true, + "show_resources": true, + "show_debug": false, + "show_samples": true, + "show_readme": false, + "show_related": true, + "show_showcase": true, + "show_screenshots": true + }, + "retail": { + "products": "site-prod", + "library_branch": "site-prod", + "projects_branch": "projects", + "compile_cache": false, + "media_cache": true, + "log_level_i18n_product_assets": "info", + "convert_product_media": true, + "translate_product_assets": false, + "populate_product_defaults": true + }, + "osrl": { + "env": "astro-release", + "env_dev": "astro-debug", + "module_name": "polymech.io", + "lang_flavor": "osr", + "product_profile": "./src/app/profile.json" + }, + "products": { + "root": "${OSR_ROOT}/products", + "howto_migration": "./data/last.json", + "glob": "**/config.json", + "enabled": "${OSR_ROOT}/products/config/machines.json" + }, + "defaults": { + "image_url": "https://picsum.photos/640/640", + "license": "CERN Open Source Hardware License", + "contact": "sales@plastic-hub.com" + }, + "assets": { + "local": false, + "glob": "*.+(JPG|jpg|jpeg|png|PNG|gif)", + "cad_url": "${OSR_MACHINES_ASSETS_URL}/${file}", + "url": "${OSR_MACHINES_ASSETS_URL}/products/${product_rel_min}/${file}", + "item_url_r": "${OSR_MACHINES_ASSETS_URL}/${ITEM_REL}/${assetPath}/${filePath}", + "item_url": "http://${FILE_SERVER_DEV}/${ITEM_REL}/${assetPath}/${filePath}" + }, + "optimization": { + "image_settings": { + "gallery": { + "show_title": true, + "show_description": false, + "sizes_thumb": "(min-width: 120px) 120px, 120vw", + "sizes_large": "(min-width: 1024px) 1024px, 1024vw", + "sizes_regular": "(min-width: 400px) 400px, 400vw" + }, + "lightbox": { + "show_title": true, + "show_description": true, + "sizes_thumb": "(min-width: 120px) 120px, 120vw", + "sizes_large": "(min-width: 1024px) 1024px, 1024vw", + "sizes_regular": "(min-width: 400px) 400px, 400vw" + } + }, + "presets": { + "slow": { + "sizes_medium": "(min-width: 100px) 100px, 100vw", + "sizes_thumbs": "(min-width: 80px) 80px, 80vw", + "sizes_large": "(min-width: 320px) 320px, 320vw" + }, + "medium": { + "sizes_medium": "(min-width: 400px) 400px, 400vw", + "sizes_thumbs": "(min-width: 120px) 120px, 120vw", + "sizes_large": "(min-width: 1024px) 1024px, 1024vw" + }, + "fast": { + "sizes_medium": "(min-width: 1024px) 1024px, 1024vw", + "sizes_thumbs": "(min-width: 180px) 180px, 180vw", + "sizes_large": "(min-width: 1200px) 1200px, 1200vw" + } + } + } +} \ No newline at end of file diff --git a/packages/media/cpp/branding/logo/print/eps/Black logo - no background.eps b/packages/media/cpp/branding/logo/print/eps/Black logo - no background.eps new file mode 100644 index 00000000..cd188d8a --- /dev/null +++ b/packages/media/cpp/branding/logo/print/eps/Black logo - no background.eps @@ -0,0 +1,805 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/media/cpp/branding/logo/print/eps/Color logo - no background.eps b/packages/media/cpp/branding/logo/print/eps/Color logo - no background.eps new file mode 100644 index 00000000..94a449f7 --- /dev/null +++ b/packages/media/cpp/branding/logo/print/eps/Color logo - no background.eps @@ -0,0 +1,809 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +/DeviceRGB {} CS +[0.2235 0.2431 0.2745] SC +/DeviceRGB {} cs +[0.2235 0.2431 0.2745] sc +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/media/cpp/branding/logo/print/eps/Color logo with background.eps b/packages/media/cpp/branding/logo/print/eps/Color logo with background.eps new file mode 100644 index 00000000..f030b3c6 --- /dev/null +++ b/packages/media/cpp/branding/logo/print/eps/Color logo with background.eps @@ -0,0 +1,818 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[3.125494 0 0 3.12478 0.0072969 0] cm +/DeviceRGB {} CS +[1 1 1] SC +/DeviceRGB {} cs +[1 1 1] sc +0 0 3162.1621 843.23718 re +f +Q +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +/DeviceRGB {} CS +[0.2235 0.2431 0.2745] SC +/DeviceRGB {} cs +[0.2235 0.2431 0.2745] sc +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/media/cpp/branding/logo/print/eps/White logo - no background.eps b/packages/media/cpp/branding/logo/print/eps/White logo - no background.eps new file mode 100644 index 00000000..fa5ec39b --- /dev/null +++ b/packages/media/cpp/branding/logo/print/eps/White logo - no background.eps @@ -0,0 +1,809 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%Produced by poppler pdftops version: 22.05.0 (http://poppler.freedesktop.org) +%%Creator: Chromium +%%LanguageLevel: 3 +%%DocumentSuppliedResources: (atend) +%%BoundingBox: 0 0 2372 634 +%%HiResBoundingBox: 0 0 2371.9199 633.12 +%%DocumentSuppliedResources: (atend) +%%EndComments +%%BeginProlog +%%BeginResource: procset xpdf 3.00 0 +%%Copyright: Copyright 1996-2011, 2022 Glyph & Cog, LLC +/xpdf 75 dict def xpdf begin +% PDF special state +/pdfDictSize 15 def +/pdfSetup { + /setpagedevice where { + pop 2 dict begin + /Policies 1 dict dup begin /PageSize 6 def end def + { /Duplex true def } if + currentdict end setpagedevice + } { + pop + } ifelse +} def +/pdfSetupPaper { + % Change paper size, but only if different from previous paper size otherwise + % duplex fails. PLRM specifies a tolerance of 5 pts when matching paper size + % so we use the same when checking if the size changes. + /setpagedevice where { + pop currentpagedevice + /PageSize known { + 2 copy + currentpagedevice /PageSize get aload pop + exch 4 1 roll + sub abs 5 gt + 3 1 roll + sub abs 5 gt + or + } { + true + } ifelse + { + 2 array astore + 2 dict begin + /PageSize exch def + /ImagingBBox null def + currentdict end + setpagedevice + } { + pop pop + } ifelse + } { + pop + } ifelse +} def +/pdfStartPage { + pdfDictSize dict begin + /pdfFillCS [] def + /pdfFillXform {} def + /pdfStrokeCS [] def + /pdfStrokeXform {} def + /pdfFill [0] def + /pdfStroke [0] def + /pdfFillOP false def + /pdfStrokeOP false def + /pdfOPM false def + /pdfLastFill false def + /pdfLastStroke false def + /pdfTextMat [1 0 0 1 0 0] def + /pdfFontSize 0 def + /pdfCharSpacing 0 def + /pdfTextRender 0 def + /pdfPatternCS false def + /pdfTextRise 0 def + /pdfWordSpacing 0 def + /pdfHorizScaling 1 def + /pdfTextClipPath [] def +} def +/pdfEndPage { end } def +% PDF color state +/opm { dup /pdfOPM exch def + /setoverprintmode where{pop setoverprintmode}{pop}ifelse } def +/cs { /pdfFillXform exch def dup /pdfFillCS exch def + setcolorspace } def +/CS { /pdfStrokeXform exch def dup /pdfStrokeCS exch def + setcolorspace } def +/sc { pdfLastFill not { pdfFillCS setcolorspace } if + dup /pdfFill exch def aload pop pdfFillXform setcolor + /pdfLastFill true def /pdfLastStroke false def } def +/SC { pdfLastStroke not { pdfStrokeCS setcolorspace } if + dup /pdfStroke exch def aload pop pdfStrokeXform setcolor + /pdfLastStroke true def /pdfLastFill false def } def +/op { /pdfFillOP exch def + pdfLastFill { pdfFillOP setoverprint } if } def +/OP { /pdfStrokeOP exch def + pdfLastStroke { pdfStrokeOP setoverprint } if } def +/fCol { + pdfLastFill not { + pdfFillCS setcolorspace + pdfFill aload pop pdfFillXform setcolor + pdfFillOP setoverprint + /pdfLastFill true def /pdfLastStroke false def + } if +} def +/sCol { + pdfLastStroke not { + pdfStrokeCS setcolorspace + pdfStroke aload pop pdfStrokeXform setcolor + pdfStrokeOP setoverprint + /pdfLastStroke true def /pdfLastFill false def + } if +} def +% build a font +/pdfMakeFont { + 4 3 roll findfont + 4 2 roll matrix scale makefont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /Encoding exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16 { + exch findfont + dup length dict begin + { 1 index /FID ne { def } { pop pop } ifelse } forall + /WMode exch def + currentdict + end + definefont pop +} def +/pdfMakeFont16L3 { + 1 index /CIDFont resourcestatus { + pop pop 1 index /CIDFont findresource /CIDFontType known + } { + false + } ifelse + { + 0 eq { /Identity-H } { /Identity-V } ifelse + exch 1 array astore composefont pop + } { + pdfMakeFont16 + } ifelse +} def +% graphics state operators +/q { gsave pdfDictSize dict begin } def +/Q { + end grestore + /pdfLastFill where { + pop + pdfLastFill { + pdfFillOP setoverprint + } { + pdfStrokeOP setoverprint + } ifelse + } if + /pdfOPM where { + pop + pdfOPM /setoverprintmode where{pop setoverprintmode}{pop}ifelse + } if +} def +/cm { concat } def +/d { setdash } def +/i { setflat } def +/j { setlinejoin } def +/J { setlinecap } def +/M { setmiterlimit } def +/w { setlinewidth } def +% path segment operators +/m { moveto } def +/l { lineto } def +/c { curveto } def +/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto + neg 0 rlineto closepath } def +/h { closepath } def +% path painting operators +/S { sCol stroke } def +/Sf { fCol stroke } def +/f { fCol fill } def +/f* { fCol eofill } def +% clipping operators +/W { clip newpath } def +/W* { eoclip newpath } def +/Ws { strokepath clip newpath } def +% text state operators +/Tc { /pdfCharSpacing exch def } def +/Tf { dup /pdfFontSize exch def + dup pdfHorizScaling mul exch matrix scale + pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put + exch findfont exch makefont setfont } def +/Tr { /pdfTextRender exch def } def +/Tp { /pdfPatternCS exch def } def +/Ts { /pdfTextRise exch def } def +/Tw { /pdfWordSpacing exch def } def +/Tz { /pdfHorizScaling exch def } def +% text positioning operators +/Td { pdfTextMat transform moveto } def +/Tm { /pdfTextMat exch def } def +% text string operators +/xyshow where { + pop + /xyshow2 { + dup length array + 0 2 2 index length 1 sub { + 2 index 1 index 2 copy get 3 1 roll 1 add get + pdfTextMat dtransform + 4 2 roll 2 copy 6 5 roll put 1 add 3 1 roll dup 4 2 roll put + } for + exch pop + xyshow + } def +}{ + /xyshow2 { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval show moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval show moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/cshow where { + pop + /xycp { + 0 3 2 roll + { + pop pop currentpoint 3 2 roll + 1 string dup 0 4 3 roll put false charpath moveto + 2 copy get 2 index 2 index 1 add get + pdfTextMat dtransform rmoveto + 2 add + } exch cshow + pop pop + } def +}{ + /xycp { + currentfont /FontType get 0 eq { + 0 2 3 index length 1 sub { + currentpoint 4 index 3 index 2 getinterval false charpath moveto + 2 copy get 2 index 3 2 roll 1 add get + pdfTextMat dtransform rmoveto + } for + } { + 0 1 3 index length 1 sub { + currentpoint 4 index 3 index 1 getinterval false charpath moveto + 2 copy 2 mul get 2 index 3 2 roll 2 mul 1 add get + pdfTextMat dtransform rmoveto + } for + } ifelse + pop pop + } def +} ifelse +/Tj { + fCol + 0 pdfTextRise pdfTextMat dtransform rmoveto + currentpoint 4 2 roll + pdfTextRender 1 and 0 eq { + 2 copy xyshow2 + } if + pdfTextRender 3 and dup 1 eq exch 2 eq or { + 3 index 3 index moveto + 2 copy + currentfont /FontType get 3 eq { fCol } { sCol } ifelse + xycp currentpoint stroke moveto + } if + pdfTextRender 4 and 0 ne { + 4 2 roll moveto xycp + /pdfTextClipPath [ pdfTextClipPath aload pop + {/moveto cvx} + {/lineto cvx} + {/curveto cvx} + {/closepath cvx} + pathforall ] def + currentpoint newpath moveto + } { + pop pop pop pop + } ifelse + 0 pdfTextRise neg pdfTextMat dtransform rmoveto +} def +/TJm { 0.001 mul pdfFontSize mul pdfHorizScaling mul neg 0 + pdfTextMat dtransform rmoveto } def +/TJmV { 0.001 mul pdfFontSize mul neg 0 exch + pdfTextMat dtransform rmoveto } def +/Tclip { pdfTextClipPath cvx exec clip newpath + /pdfTextClipPath [] def } def +/Tclip* { pdfTextClipPath cvx exec eoclip newpath + /pdfTextClipPath [] def } def +% Level 2/3 image operators +/pdfImBuf 100 string def +/pdfImStr { + 2 copy exch length lt { + 2 copy get exch 1 add exch + } { + () + } ifelse +} def +/skipEOD { + { currentfile pdfImBuf readline + not { pop exit } if + (%-EOD-) eq { exit } if } loop +} def +/pdfIm { image skipEOD } def +/pdfMask { + /ReusableStreamDecode filter + skipEOD + /maskStream exch def +} def +/pdfMaskEnd { maskStream closefile } def +/pdfMaskInit { + /maskArray exch def + /maskIdx 0 def +} def +/pdfMaskSrc { + maskIdx maskArray length lt { + maskArray maskIdx get + /maskIdx maskIdx 1 add def + } { + () + } ifelse +} def +/pdfImM { fCol imagemask skipEOD } def +/pr { 2 index 2 index 3 2 roll putinterval 4 add } def +/pdfImClip { + gsave + 0 2 4 index length 1 sub { + dup 4 index exch 2 copy + get 5 index div put + 1 add 3 index exch 2 copy + get 3 index div put + } for + pop pop rectclip +} def +/pdfImClipEnd { grestore } def +% shading operators +/colordelta { + false 0 1 3 index length 1 sub { + dup 4 index exch get 3 index 3 2 roll get sub abs 0.004 gt { + pop true + } if + } for + exch pop exch pop +} def +/funcCol { func n array astore } def +/funcSH { + dup 0 eq { + true + } { + dup 6 eq { + false + } { + 4 index 4 index funcCol dup + 6 index 4 index funcCol dup + 3 1 roll colordelta 3 1 roll + 5 index 5 index funcCol dup + 3 1 roll colordelta 3 1 roll + 6 index 8 index funcCol dup + 3 1 roll colordelta 3 1 roll + colordelta or or or + } ifelse + } ifelse + { + 1 add + 4 index 3 index add 0.5 mul exch 4 index 3 index add 0.5 mul exch + 6 index 6 index 4 index 4 index 4 index funcSH + 2 index 6 index 6 index 4 index 4 index funcSH + 6 index 2 index 4 index 6 index 4 index funcSH + 5 3 roll 3 2 roll funcSH pop pop + } { + pop 3 index 2 index add 0.5 mul 3 index 2 index add 0.5 mul + funcCol sc + dup 4 index exch mat transform m + 3 index 3 index mat transform l + 1 index 3 index mat transform l + mat transform l pop pop h f* + } ifelse +} def +/axialCol { + dup 0 lt { + pop t0 + } { + dup 1 gt { + pop t1 + } { + dt mul t0 add + } ifelse + } ifelse + func n array astore +} def +/axialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index axialCol 2 index axialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index axialSH + exch 3 2 roll axialSH + } { + pop 2 copy add 0.5 mul + axialCol sc + exch dup dx mul x0 add exch dy mul y0 add + 3 2 roll dup dx mul x0 add exch dy mul y0 add + dx abs dy abs ge { + 2 copy yMin sub dy mul dx div add yMin m + yMax sub dy mul dx div add yMax l + 2 copy yMax sub dy mul dx div add yMax l + yMin sub dy mul dx div add yMin l + h f* + } { + exch 2 copy xMin sub dx mul dy div add xMin exch m + xMax sub dx mul dy div add xMax exch l + exch 2 copy xMax sub dx mul dy div add xMax exch l + xMin sub dx mul dy div add xMin exch l + h f* + } ifelse + } ifelse +} def +/radialCol { + dup t0 lt { + pop t0 + } { + dup t1 gt { + pop t1 + } if + } ifelse + func n array astore +} def +/radialSH { + dup 0 eq { + true + } { + dup 8 eq { + false + } { + 2 index dt mul t0 add radialCol + 2 index dt mul t0 add radialCol colordelta + } ifelse + } ifelse + { + 1 add 3 1 roll 2 copy add 0.5 mul + dup 4 3 roll exch 4 index radialSH + exch 3 2 roll radialSH + } { + pop 2 copy add 0.5 mul dt mul t0 add + radialCol sc + encl { + exch dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 0 360 arc h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + 360 0 arcn h f + } { + 2 copy + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arcn + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arcn h + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a1 a2 arc + dup dx mul x0 add exch dup dy mul y0 add exch dr mul r0 add + a2 a1 arc h f + } ifelse + } ifelse +} def +end +%%EndResource +/CIDInit /ProcSet findresource begin +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-H def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +10 dict begin + begincmap + /CMapType 1 def + /CMapName /Identity-V def + /CIDSystemInfo 3 dict dup begin + /Registry (Adobe) def + /Ordering (Identity) def + /Supplement 0 def + end def + /WMode 1 def + 1 begincodespacerange + <0000> + endcodespacerange + 0 usefont + 1 begincidrange + <0000> 0 + endcidrange + endcmap + currentdict CMapName exch /CMap defineresource pop +end +end +%%EndProlog +%%BeginSetup +xpdf begin +%%EndSetup +pdfStartPage +%%EndPageSetup +[] 0 d +1 i +0 j +0 J +10 M +1 w +/DeviceGray {} cs +[0] sc +/DeviceGray {} CS +[0] SC +false op +false OP +{} settransfer +0 0 2371.9199 633.12 re +W +q +[0.24 0 0 -0.24 0 633.12] cm +q +0 0 9883.333 2634.9304 re +W* +q +[2.223526 0 0 2.223018 -1981.0341 -1821.9349] cm +/DeviceRGB {} CS +[0.9725 0.7098 0] SC +/DeviceRGB {} cs +[0.9725 0.7098 0] sc +1313.30005 1890.9 m +1169.90002 1831.7001 1073.30005 1691.4 1073.30005 1526.30005 c +1073.30005 1451.5 1092 1379.80005 1129.40002 1320.6001 c +1163.70007 1311.20007 1201.09998 1308.1001 1238.5 1308.1001 c +1378.69995 1308.1001 1503.40002 1364.20007 1593.80005 1454.6001 c +1678 1538.80005 1730.9 1647.80005 1740.3 1772.5001 c +1715.4 1688.3002 1671.70007 1616.70007 1612.5 1557.50012 c +1522.09998 1467.1001 1397.5 1411.00012 1257.19995 1411.00012 c +1247.79993 1411.00012 1238.5 1411.00012 1229.19995 1411.00012 c +1210.5 1464.00012 1201.19995 1520.1001 1201.19995 1576.20007 c +1201.19995 1579.30005 l +1201.09998 1697.7 1244.69995 1806.7 1313.30005 1890.9 c +h +f +1472.19995 1127.30005 m +1690.3999 1127.30005 1871.1 1304.90002 1871.1 1526.20007 c +1871.1 1632.20007 1827.5 1728.8 1762 1800.4001 c +1758.9 1660.2002 1699.7 1535.50012 1609.30005 1442.00012 c +1512.70007 1348.50012 1381.80005 1289.30017 1238.40002 1289.30017 c +1207.20007 1289.30017 1173 1292.40015 1144.90002 1298.7002 c +1216.59998 1195.90002 1335.09998 1127.30005 1472.19995 1127.30005 c +h +1241.59998 1248.90002 m +1275.09998 1251.70007 l +1279 1252.00012 l +1413 1261.40015 1540.80005 1317.40015 1637.40002 1414.1001 c +1715.3 1492.00012 1765.2001 1588.6001 1790.1 1694.6001 c +1815 1641.6001 1830.6 1585.50012 1830.6 1526.30005 c +1830.6 1326.80005 1668.5 1167.90002 1472.19995 1167.90002 c +1388.09998 1167.80005 1307 1195.90002 1241.59998 1248.90002 c +h +f +Q +q +[76.117943 0 0 76.100548 2395.657 642.07141] cm +/DeviceRGB {} CS +[1 1 1] SC +/DeviceRGB {} cs +[1 1 1] sc +6.9 5.84 m +8.2733 5.84 9.3566 6.18 10.15 6.86 c +10.943399 7.54 11.34 8.520001 11.34 9.8 c +11.34 11.04 10.94666 12.01 10.16 12.71 c +9.37334 13.41 8.286699 13.76 6.9 13.76 c +3.74 13.76 l +3.74 20 l +1.819999 20 l +1.819999 5.84 l +6.9 5.84 l +6.9 5.84 l +h +6.34 12.08 m +7.34 12.08 8.0833 11.89664 8.57 11.52998 c +9.0567 11.16332 9.299999 10.586659 9.299999 9.79998 c +9.299999 8.27998 8.313339 7.51998 6.339999 7.51998 c +3.739999 7.51998 l +3.739999 12.079981 l +6.339999 12.079981 l +6.34 12.08 l +h +15.16 4.88 m +15.16 20 l +13.36 20 l +13.36 4.88 l +15.16 4.88 l +h +21.82 10.28 m +23.02 10.28 23.969999 10.55328 24.67 11.099939 c +25.370001 11.646599 25.74 12.406639 25.780001 13.379939 c +25.780001 18.459938 l +25.780001 18.939938 25.806662 19.453278 25.860001 19.999939 c +24.26 19.999939 l +24.219999 19.573278 24.200001 19.093279 24.200001 18.559938 c +24.16 18.559938 l +23.74666 19.173279 23.27 19.606638 22.73 19.859938 c +22.189999 20.113237 21.559999 20.239937 20.84 20.239937 c +19.866661 20.239937 19.0767 19.979937 18.470001 19.459936 c +17.863302 18.939936 17.560001 18.253237 17.560001 17.399937 c +17.560001 16.319937 18.013342 15.503237 18.920002 14.949937 c +19.826662 14.396637 21.106602 14.119937 22.760002 14.119937 c +24.100002 14.119937 l +24.100002 13.779937 l +24.100002 13.139936 23.890003 12.636637 23.470003 12.269937 c +23.050003 11.903236 22.500004 11.719936 21.820004 11.719936 c +21.313343 11.719936 20.870003 11.796597 20.490004 11.949936 c +20.110004 12.103275 19.660004 12.386616 19.140003 12.799956 c +18.060003 11.679956 l +19.086704 10.773296 20.340004 10.306657 21.820004 10.279957 c +21.82 10.28 l +h +19.360001 17.26 m +19.360001 18.286701 20.04002 18.799999 21.400002 18.799999 c +22.213341 18.799999 22.863302 18.55666 23.350002 18.07 c +23.836702 17.58334 24.086662 16.879999 24.100002 15.96 c +24.100002 15.440001 l +23.080002 15.440001 l +21.906702 15.440001 20.993402 15.59 20.340002 15.89 c +19.686602 16.190001 19.360003 16.64666 19.360003 17.26 c +19.360001 17.26 l +h +31.6 10.28 m +32.32 10.28 32.963299 10.41338 33.529999 10.680039 c +34.096699 10.946699 34.533298 11.33336 34.84 11.840039 c +33.439999 12.90004 l +32.906658 12.273379 32.259998 11.960039 31.499998 11.960039 c +31.046658 11.960039 30.669998 12.06004 30.369999 12.260039 c +30.07 12.460039 29.919998 12.713379 29.919998 13.02004 c +29.919998 13.6867 30.539999 14.140039 31.779999 14.380039 c +32.993298 14.606699 33.849998 14.94004 34.349998 15.380039 c +34.849998 15.820039 35.099998 16.446739 35.099998 17.260038 c +35.099998 18.180038 34.75 18.903339 34.049999 19.430038 c +33.349998 19.956738 32.4133 20.226698 31.24 20.240038 c +30.360001 20.240038 29.6367 20.103378 29.07 19.830038 c +28.5033 19.556698 28.0133 19.133358 27.6 18.560038 c +28.960001 17.440037 l +29.68 18.186697 30.446701 18.560038 31.26 18.560038 c +31.793341 18.560038 32.246681 18.453377 32.619999 18.240038 c +32.993317 18.026699 33.18 17.733358 33.18 17.360018 c +33.18 16.706678 32.580002 16.253319 31.380001 16.000017 c +30.046701 15.733357 29.150002 15.376698 28.690001 14.930018 c +28.23 14.483337 28 13.906717 28 13.200018 c +28 12.320018 28.34 11.616718 29.02 11.090018 c +29.700001 10.563318 30.560001 10.293358 31.6 10.280018 c +31.6 10.28 l +h +39.779999 7.86 m +39.77998 10.520001 l +42.359978 10.520001 l +42.359978 12.08 l +39.779976 12.08 l +39.779976 16.639999 l +39.779976 17.25334 39.866634 17.7267 40.039974 18.059999 c +40.213314 18.393299 40.579975 18.559999 41.139973 18.559999 c +41.673313 18.559999 42.099972 18.46666 42.419971 18.279999 c +42.419971 19.919998 l +42.073311 20.106659 41.526653 20.213318 40.779972 20.239979 c +40.059971 20.239979 39.503273 20.129978 39.10997 19.909979 c +38.716667 19.68998 38.42997 19.38332 38.249969 18.989979 c +38.069969 18.596638 37.979969 17.979979 37.979969 17.139978 c +37.979969 12.079979 l +35.899971 12.079979 l +35.899971 10.51998 l +37.979973 10.51998 l +37.979973 7.85998 l +39.779972 7.85998 l +39.779999 7.86 l +h +45.740002 5.8 m +46.100002 5.8 46.410023 5.93002 46.670021 6.19002 c +46.930019 6.45002 47.06002 6.76002 47.06002 7.12002 c +47.06002 7.49336 46.926682 7.8067 46.660019 8.06004 c +46.393356 8.313379 46.0867 8.44004 45.74004 8.44004 c +45.366699 8.44004 45.05336 8.313379 44.800018 8.06004 c +44.546677 7.8067 44.420017 7.49336 44.420017 7.120019 c +44.420017 6.746679 44.553356 6.43334 44.820019 6.179999 c +45.086681 5.926659 45.393337 5.799999 45.739998 5.799999 c +45.740002 5.8 l +h +46.639999 10.520001 m +46.639999 20 l +44.84 20 l +44.84 10.520001 l +46.639999 10.520001 l +h +54 10.3 m +55.506699 10.3 56.720001 10.8 57.639999 11.8 c +56.279999 13.04 l +55.626659 12.33334 54.84 11.98 53.919998 11.98 c +53.039997 11.98 52.326698 12.29334 51.779999 12.92 c +51.233299 13.54666 50.959999 14.3533 50.959999 15.34 c +50.959999 16.27334 51.246658 17.040001 51.82 17.639999 c +52.393341 18.239998 53.126701 18.546659 54.02 18.559999 c +54.96666 18.559999 55.733299 18.206659 56.32 17.5 c +57.599998 18.780001 l +56.746658 19.753342 55.5466 20.240002 54 20.240002 c +52.5467 20.240002 51.3634 19.786661 50.450001 18.880001 c +49.536602 17.973341 49.0667 16.780001 49.040001 15.300001 c +49.053341 13.793301 49.523342 12.586601 50.450001 11.680001 c +51.376659 10.773401 52.560001 10.313301 54 10.300001 c +54 10.3 l +h +61.52 5.84 m +61.52 11.72 l +68.860001 11.72 l +68.860001 5.84 l +70.779999 5.84 l +70.779999 20 l +68.860001 20 l +68.860001 13.520001 l +61.52 13.520001 l +61.52 20 l +59.599998 20 l +59.599998 5.84 l +61.519997 5.84 l +61.52 5.84 l +h +75.760002 10.520001 m +75.760002 16.200001 l +75.760002 16.946661 75.956665 17.526701 76.349998 17.940001 c +76.743332 18.3533 77.266678 18.560001 77.919998 18.560001 c +78.759995 18.560001 79.409996 18.28334 79.869995 17.730001 c +80.329994 17.176662 80.559998 16.426701 80.559998 15.480001 c +80.559998 10.520001 l +82.360001 10.520001 l +82.360001 20 l +80.559998 20 l +80.559998 18.540001 l +80.519997 18.540001 l +80.266655 19.073341 79.853317 19.490002 79.279999 19.790001 c +78.70668 20.09 78.080002 20.240002 77.400002 20.240002 c +76.346703 20.240002 75.510002 19.913342 74.889999 19.260002 c +74.269997 18.606663 73.959999 17.753302 73.959999 16.700003 c +73.959999 10.520002 l +75.760002 10.520002 l +75.760002 10.520001 l +h +86.879997 4.88 m +86.88002 11.88 l +86.920021 11.88 l +87.240021 11.386661 87.703362 10.99666 88.31002 10.71 c +88.916679 10.42334 89.553322 10.28 90.220024 10.28 c +91.646721 10.28 92.806625 10.75 93.700027 11.69 c +94.59343 12.629999 95.040024 13.82 95.040024 15.259999 c +95.040024 16.686699 94.603363 17.8666 93.730026 18.799999 c +92.856689 19.733398 91.693428 20.213299 90.240028 20.24 c +89.586685 20.24 88.956726 20.1 88.350029 19.82 c +87.743332 19.539999 87.266731 19.14666 86.920029 18.639999 c +86.880028 18.639999 l +86.880028 20 l +85.080025 20 l +85.080025 4.88 l +86.880028 4.88 l +86.879997 4.88 l +h +86.879997 15.26 m +86.879997 16.24666 87.163376 17.036701 87.730034 17.630001 c +88.296692 18.223301 89.053337 18.53334 90.000031 18.560001 c +90.946693 18.560001 91.703331 18.253342 92.270027 17.640001 c +92.836723 17.026661 93.120026 16.233301 93.120026 15.260001 c +93.120026 14.286701 92.840027 13.496701 92.280029 12.890001 c +91.720032 12.283301 90.953331 11.973341 89.980026 11.960001 c +89.033363 11.960001 88.280029 12.270001 87.720024 12.890001 c +87.160019 13.510001 86.880028 14.300001 86.880028 15.260001 c +86.879997 15.26 l +h +f +Q +Q +Q +showpage +%%PageTrailer +pdfEndPage +%%Trailer +end +%%DocumentSuppliedResources: +%%EOF diff --git a/packages/media/cpp/branding/logo/print/pdf/Black logo - no background.pdf b/packages/media/cpp/branding/logo/print/pdf/Black logo - no background.pdf new file mode 100644 index 00000000..5d4f515f Binary files /dev/null and b/packages/media/cpp/branding/logo/print/pdf/Black logo - no background.pdf differ diff --git a/packages/media/cpp/branding/logo/print/pdf/Color logo - no background.pdf b/packages/media/cpp/branding/logo/print/pdf/Color logo - no background.pdf new file mode 100644 index 00000000..50b30ae7 Binary files /dev/null and b/packages/media/cpp/branding/logo/print/pdf/Color logo - no background.pdf differ diff --git a/packages/media/cpp/branding/logo/print/pdf/Color logo with background.pdf b/packages/media/cpp/branding/logo/print/pdf/Color logo with background.pdf new file mode 100644 index 00000000..89a6ab1f Binary files /dev/null and b/packages/media/cpp/branding/logo/print/pdf/Color logo with background.pdf differ diff --git a/packages/media/cpp/branding/logo/print/pdf/White logo - no background.pdf b/packages/media/cpp/branding/logo/print/pdf/White logo - no background.pdf new file mode 100644 index 00000000..9ac4e8d2 Binary files /dev/null and b/packages/media/cpp/branding/logo/print/pdf/White logo - no background.pdf differ diff --git a/packages/media/cpp/branding/logo/web/Favicons/Android.png b/packages/media/cpp/branding/logo/web/Favicons/Android.png new file mode 100644 index 00000000..f1a0c96a Binary files /dev/null and b/packages/media/cpp/branding/logo/web/Favicons/Android.png differ diff --git a/packages/media/cpp/branding/logo/web/Favicons/browser.png b/packages/media/cpp/branding/logo/web/Favicons/browser.png new file mode 100644 index 00000000..ddb43c82 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/Favicons/browser.png differ diff --git a/packages/media/cpp/branding/logo/web/Favicons/iPhone.png b/packages/media/cpp/branding/logo/web/Favicons/iPhone.png new file mode 100644 index 00000000..483d38b0 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/Favicons/iPhone.png differ diff --git a/packages/media/cpp/branding/logo/web/Favicons/iphone_512.png b/packages/media/cpp/branding/logo/web/Favicons/iphone_512.png new file mode 100644 index 00000000..b92990a4 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/Favicons/iphone_512.png differ diff --git a/packages/media/cpp/branding/logo/web/png/Black logo - no background.png b/packages/media/cpp/branding/logo/web/png/Black logo - no background.png new file mode 100644 index 00000000..f564d365 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/png/Black logo - no background.png differ diff --git a/packages/media/cpp/branding/logo/web/png/Color logo - no background.png b/packages/media/cpp/branding/logo/web/png/Color logo - no background.png new file mode 100644 index 00000000..c62298f4 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/png/Color logo - no background.png differ diff --git a/packages/media/cpp/branding/logo/web/png/Color logo with background.png b/packages/media/cpp/branding/logo/web/png/Color logo with background.png new file mode 100644 index 00000000..e60158b3 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/png/Color logo with background.png differ diff --git a/packages/media/cpp/branding/logo/web/png/White logo - no background.png b/packages/media/cpp/branding/logo/web/png/White logo - no background.png new file mode 100644 index 00000000..fd0788e7 Binary files /dev/null and b/packages/media/cpp/branding/logo/web/png/White logo - no background.png differ diff --git a/packages/media/cpp/branding/logo/web/svg/Black logo - no background.svg b/packages/media/cpp/branding/logo/web/svg/Black logo - no background.svg new file mode 100644 index 00000000..bafa9305 --- /dev/null +++ b/packages/media/cpp/branding/logo/web/svg/Black logo - no background.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/media/cpp/branding/logo/web/svg/Color logo - no background.svg b/packages/media/cpp/branding/logo/web/svg/Color logo - no background.svg new file mode 100644 index 00000000..97421ce3 --- /dev/null +++ b/packages/media/cpp/branding/logo/web/svg/Color logo - no background.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/media/cpp/branding/logo/web/svg/Color logo with background.svg b/packages/media/cpp/branding/logo/web/svg/Color logo with background.svg new file mode 100644 index 00000000..a902dee5 --- /dev/null +++ b/packages/media/cpp/branding/logo/web/svg/Color logo with background.svg @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/media/cpp/branding/logo/web/svg/White logo - no background.svg b/packages/media/cpp/branding/logo/web/svg/White logo - no background.svg new file mode 100644 index 00000000..c4c84e43 --- /dev/null +++ b/packages/media/cpp/branding/logo/web/svg/White logo - no background.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/packages/media/cpp/dist/media-img b/packages/media/cpp/dist/media-img deleted file mode 100644 index ec6eb0cc..00000000 Binary files a/packages/media/cpp/dist/media-img and /dev/null differ diff --git a/packages/media/cpp/dist/media-img.exe b/packages/media/cpp/dist/media-img.exe deleted file mode 100644 index 7bf96619..00000000 Binary files a/packages/media/cpp/dist/media-img.exe and /dev/null differ diff --git a/packages/media/cpp/dist/pm-image.exe b/packages/media/cpp/dist/pm-image.exe new file mode 100644 index 00000000..2b8d7564 Binary files /dev/null and b/packages/media/cpp/dist/pm-image.exe differ diff --git a/packages/media/cpp/dist/pm-image.pdb b/packages/media/cpp/dist/pm-image.pdb new file mode 100644 index 00000000..79969b13 Binary files /dev/null and b/packages/media/cpp/dist/pm-image.pdb differ diff --git a/packages/media/cpp/dist/media-img-Setup.exe b/packages/media/cpp/dist/pm-images-setup.exe similarity index 94% rename from packages/media/cpp/dist/media-img-Setup.exe rename to packages/media/cpp/dist/pm-images-setup.exe index 6a9fd3db..3a8bcee9 100644 Binary files a/packages/media/cpp/dist/media-img-Setup.exe and b/packages/media/cpp/dist/pm-images-setup.exe differ diff --git a/packages/media/cpp/dist/url-redirect.png b/packages/media/cpp/dist/url-redirect.png deleted file mode 100644 index 8ff1486a..00000000 Binary files a/packages/media/cpp/dist/url-redirect.png and /dev/null differ diff --git a/packages/media/cpp/dist/url-test.png b/packages/media/cpp/dist/url-test.png deleted file mode 100644 index 8ff1486a..00000000 Binary files a/packages/media/cpp/dist/url-test.png and /dev/null differ diff --git a/packages/media/cpp/dist/url-test_400.png b/packages/media/cpp/dist/url-test_400.png deleted file mode 100644 index 8ff1486a..00000000 Binary files a/packages/media/cpp/dist/url-test_400.png and /dev/null differ diff --git a/packages/media/cpp/docs/integration.md b/packages/media/cpp/docs/integration.md index 42326aa9..f2741012 100644 --- a/packages/media/cpp/docs/integration.md +++ b/packages/media/cpp/docs/integration.md @@ -98,17 +98,17 @@ If you bind beyond `127.0.0.1`, open the port in `firewalld` / `ufw` as usual. ## Windows: running as a service -`media-img.exe` does **not** register with the Windows Service Control Manager by itself. Use a **service wrapper** that runs your command line as a service. +`pm-image.exe` does **not** register with the Windows Service Control Manager by itself. Use a **service wrapper** that runs your command line as a service. ### Option A — NSSM (Non-Sucking Service Manager) 1. Install [NSSM](https://nssm.cc/). -2. Either run **`media-img.exe` directly** or use **[`scripts/run-media-img.ps1`](../scripts/run-media-img.ps1)** with `MEDIA_IMG_*` env vars (see [Wrapper scripts](#wrapper-scripts-ports-via-environment)). +2. Either run **`pm-image.exe` directly** or use **[`scripts/run-media-img.ps1`](../scripts/run-media-img.ps1)** with `MEDIA_IMG_*` env vars (see [Wrapper scripts](#wrapper-scripts-ports-via-environment)). **Direct executable:** ```powershell -nssm install MediaImgServe "C:\Apps\media\media-img.exe" +nssm install MediaImgServe "C:\Apps\media\pm-image.exe" nssm set MediaImgServe AppDirectory "C:\Apps\media" nssm set MediaImgServe AppParameters "serve --host 127.0.0.1 --port 8080 --cache-dir C:\Apps\media\cache\images" nssm set MediaImgServe AppStdout "C:\Apps\media\logs\serve.log" @@ -121,11 +121,11 @@ nssm start MediaImgServe ### Option B — WinSW -Use [WinSW](https://github.com/winsw/winsw) with an XML that points `executable` to `media-img.exe` and passes `serve` arguments in `arguments`. +Use [WinSW](https://github.com/winsw/winsw) with an XML that points `executable` to `pm-image.exe` and passes `serve` arguments in `arguments`. ### Option C — Task Scheduler -Not a true service, but often enough: run `media-img.exe serve ...` at logon or startup with “Run whether user is logged on or not”. No SCM integration; fewer recovery options than NSSM. +Not a true service, but often enough: run `pm-image.exe serve ...` at logon or startup with “Run whether user is logged on or not”. No SCM integration; fewer recovery options than NSSM. ### Firewall @@ -147,7 +147,7 @@ The repo includes small wrappers so you can set **bind address, port, and cache | Variable | Meaning | |----------|---------| | `MEDIA_IMG_CMD` | `serve` (default) or `ipc` | -| `MEDIA_IMG_BIN` | Path to `media-img` / `media-img.exe` (optional; scripts default to `PATH` or `dist/` next to the script) | +| `MEDIA_IMG_BIN` | Path to `media-img` / `pm-image.exe` (optional; scripts default to `PATH` or `dist/` next to the script) | | `MEDIA_IMG_HOST` | Bind address (default `127.0.0.1`) | | `MEDIA_IMG_PORT` | TCP port — default **8080** for `serve`, **9333** for `ipc` | | `MEDIA_IMG_CACHE_DIR` | Passed as `--cache-dir` if set | diff --git a/packages/media/cpp/docs/product.md b/packages/media/cpp/docs/product.md new file mode 100644 index 00000000..deaea336 --- /dev/null +++ b/packages/media/cpp/docs/product.md @@ -0,0 +1,237 @@ +# pm-image: Fast image resizing for CLI, servers, and Windows Explorer + +**pm-image** is a native **C++** image toolkit built on **libvips** — the same high-performance engine behind tools like **Sharp** (Node.js). One binary gives you a **command-line interface**, an **HTTP REST** server, and **line-delimited JSON IPC** for automation. On Windows, optional **Explorer** integration adds right-click **resize** and **convert** workflows without opening another app. + +Whether you batch photos for the web, power a local resize API, or shrink folders of RAW and HEIC files from the desktop, pm-image keeps pipelines predictable: **decode → process → encode**, with **Sharp-like** options (fit modes, quality, metadata stripping, smart crop) and optional **disk caching** so repeat jobs stay instant. + +--- + + +[Download - Windows - AMD 64](https://service.polymech.info/api/vfs/get/software/pm-image-resize/v1.zip?t=1776153671416&download=1) | [Source Code](https://git.polymech.info/polymech/mono/src/branch/master/packages/media) + + +## Who is this for? + +- **Developers** who want a **single native binary** (no Node runtime) for resize jobs in scripts, CI, or sidecar services. +- **Windows power users** who want **context-menu** resize presets and JPG conversion from File Explorer. +- **Integrators** who need **REST** (`POST /v1/resize`) or **IPC** (one JSON line per request) with the same JSON schema as the CLI. + +--- + +## How to resize images (quick start) + +### 1. Command line — one file + +Install or build **pm-image**, then run `resize` with input and output paths. By default, the image **fits inside** your max width and height **without enlarging** (unless you allow enlargement). + +```bash +pm-image resize photo.jpg out.jpg --max-width 1920 --max-height 1080 +``` + +- **Quality** (JPEG, WebP, AVIF): use `-q` / `quality` (for example `-q 85`). +- **Output format**: use the **destination extension** (`.webp`, `.avif`, `.jpg`) or `--format` when the path is ambiguous. + +### 2. Fit modes — not every resize is “shrink to fit” + +| Goal | What to use | +|------|-------------| +| **Fit inside a box** (keep aspect ratio, no crop) | Default behavior with `--max-width` / `--max-height`; optional `--fit inside` style semantics via `fit` in JSON. | +| **Square avatar or thumbnail (crop)** | Same `--max-width` and `--max-height` (e.g. 512), `--fit cover`, optional `--position attention` or `entropy` for smarter crops. | +| **Square with padding (no crop)** | `--fit contain` plus `--background '#rrggbb'` for letterboxing. | +| **Exact dimensions by stretching** | `--fit fill` (distorts if aspect ratios differ). | + +Examples (see the package README for full flag lists): + +```bash +# Thumbnail: 400×400 cover crop +pm-image resize in.jpg thumb.jpg --fit cover --max-width 400 --max-height 400 + +# Padded square on a dark canvas +pm-image resize wide.jpg square.jpg --fit contain --max-width 800 --max-height 800 --background '#111111' +``` + +### 3. Batch paths and folders + +- Use **globs** (`*`, `?`, `**`) in the input to process many files in one invocation. +- Point output to a **directory** (often with a trailing `/` or `\`) or use **templates** like `${SRC_DIR}`, `${SRC_NAME}`, `${SRC_FILE_EXT}` to mirror or rename outputs per file. + +```bash +pm-image resize './photos/**/*.jpg' ./out/ +pm-image resize --src './shots/*.jpg' --dst '${SRC_DIR}/${SRC_NAME}_medium.jpg' --max-width 800 +``` + +### 4. HTTP API + +Start the server (`serve`), then `POST` JSON to `/v1/resize` with `input`, `output`, and the same resize fields as the CLI (`max_width`, `max_height`, `fit`, `quality`, etc.). Paths must be readable and writable by the server process. + +### 5. Windows — resize from Explorer + +After **`pm-image register-explorer`** (or the NSIS installer), use the **PM-Media** menu on images or folders for preset widths, **in place** or **copy**, plus **convert to JPG**. Override preset widths with `--widths` when registering. + +### 6. Optional: Windows GUI + +On Windows, `pm-image resize --ui` opens a **native** dialog to pick files and options (no `--src` / `--dst` with `--ui`). + +--- + +## Features at a glance + +- **libvips-backed** resizing, rotation, flip/flop, EXIF **autorotate**, metadata **strip** (defaults match common web workflows). +- **Formats**: JPEG, PNG, WebP, TIFF; **AVIF / HEIC** when your libvips build includes HEIF; other formats depend on libvips loaders/savers. +- **HTTP(S) URLs** as `input` (fetched via libcurl) for download-and-resize pipelines. +- **Output cache**: SHA-256 keyed by path, size, mtime, and options — cache hits skip re-encoding. + +For prerequisites, build steps, installer, and the full option tables, see the **[C++ README](../README.md)**. + +--- + +## FAQ (questions and answers) + +### What is pm-image? + +**pm-image** is a CMake-built executable that exposes image resizing and related operations through **CLI**, **`serve` (REST)**, and **`ipc` (JSON lines)**. Processing uses **libvips**, aligned with a **Sharp-like** option model for familiarity. + +### Is pm-image the same as Sharp? + +No — **Sharp** is a **Node.js** library; **pm-image** is a **standalone native** program. Both lean on **libvips**, so concepts like `fit`, `position`, `kernel`, and quality map closely. See the README’s “Sharp-like options” table for field names (`without_enlargement`, `strip_metadata`, etc.). + +### How do I resize an image to an exact width? + +Use **`--max-width`** (and optionally **`--max-height`**). The image scales **down** (or up if you allow enlargement) to respect those bounds and the chosen **`fit`** mode. For a fixed **width-only** workflow, set a large `max_height` or use JSON/`resize` options that match your desired behavior. + +### How do I resize without losing quality? + +**Resizing always re-encodes** for raster formats; “lossless” depends on format: + +- For **JPEG**, use a high **`-q`** (e.g. 90–95) and avoid repeated saves. +- For **PNG**, resizing may still recompress; use **PNG compression** settings as needed. +- Prefer **WebP** or **AVIF** with tuned **quality** for smaller files at a given visual fidelity. + +**without enlargement** defaults to **true**, so small images are not upscaled unless you opt in. + +### How do I batch resize images in a folder? + +Use a **glob** for `input` and a **directory** or **template** for `output`. Multiple matches are processed in one command; see **Batch paths & cache** in the README for rules on trailing slashes and `${SRC_*}` variables. + +### Can I resize images from URLs? + +Yes. Pass an **`http://` or `https://`** URL as `input`. Redirects are followed; timeouts and redirect limits are configurable (`--url-timeout`, `--url-max-redirects`). + +### Does pm-image work on Windows? + +Yes. Use the **vips dev bundle** (`npm run setup:vips` from the package), build **pm-image**, and optionally install **NSIS** output for **`pm-image-setup.exe`**, PATH, DLLs, and Explorer scripts. **register-explorer** adds context menus for resize and convert. + +### How does caching work? + +When enabled, outputs are stored under a **cache directory** (default under the process working directory), keyed by a **SHA-256** hash of input identity, file metadata, and **all** resize options. Identical jobs reuse cached bytes without running libvips again. + +### What is IPC for? + +**ipc** accepts **one JSON object per line** over TCP (or a Unix socket on non-Windows), ideal for **local daemons** or tools that want a simple request/response channel without HTTP overhead. + +### Where is the full API reference? + +- **CLI**: `pm-image --help`, `pm-image resize --help`. +- **Library-level image API** (underlying engine): [libvips `VipsImage`](https://www.libvips.org/API/current/class.Image.html). +--- + +## Related documentation + +## CLI examples + +Paths below use Unix style; on Windows run `pm-image.exe` and use `.\` or full paths as needed. + +### Help and version + +```bash +pm-image --help +pm-image resize --help +pm-image -v +``` + +### `resize` — fit inside a box (default), write WebP / AVIF by extension + +```bash +# Max 800×600, stay inside the box, Lanczos3 (default), write JPEG quality 85 (default) +pm-image resize photo.jpg out.jpg --max-width 800 --max-height 600 + +# Same, explicit quality +pm-image resize photo.jpg out.jpg --max-width 800 --max-height 600 -q 90 + +# WebP output (quality applies) +pm-image resize photo.jpg thumb.webp --max-width 400 --max-height 400 -q 82 + +# AVIF output (quality applies; needs HEIF/AVIF support in your libvips build) +pm-image resize photo.png out.avif --max-width 1200 --max-height 1200 -q 50 + +# Force output format when the path has no extension you trust +pm-image resize in.tif /tmp/out --format webp --max-width 512 +``` + +### `resize` — square images (1:1) + +Use the **same** `--max-width` and `--max-height` (that value is the square side in pixels). Pick **`--fit`**: + +| `fit` | Result | +|-------|--------| +| **`cover`** | Fills the square; crops overflow (default crop: `--position centre`, or `attention` / `entropy` for smart crop). | +| **`contain`** | Full image inside the square; **letterboxing** on two sides if needed (`--background`). | +| **`fill`** | Stretches to the square (ignores aspect ratio). | + +```bash +# 512×512 crop-to-square (avatars, thumbnails) +pm-image resize portrait.jpg avatar.jpg --fit cover --max-width 512 --max-height 512 + +# 1080×1080 WebP, smart crop on subject +pm-image resize product.png grid.webp --fit cover --max-width 1080 --max-height 1080 --position attention -q 85 + +# Square canvas, no crop — padded bands with a colour +pm-image resize panoramic.jpg square.jpg --fit contain --max-width 800 --max-height 800 --background '#111111' + +# Exact square by stretching (rare) +pm-image resize any.jpg out.jpg --fit fill --max-width 256 --max-height 256 +``` + +**REST / IPC JSON:** e.g. `"max_width": 512, "max_height": 512, "fit": "cover", "position": "attention"`. + +### `resize` — cover (crop), contain (letterbox), rotate / flip + +```bash +# Cover: fill 1200×630, crop centre (use --position attention for smart crop) +pm-image resize wide.jpg social.jpg --fit cover --max-width 1200 --max-height 630 + +# Contain: fit inside 800×600 canvas, letterbox with a background +pm-image resize logo.png padded.png --fit contain --max-width 800 --max-height 600 --background '#1a1a1a' + +# EXIF autorotate (default), then rotate 90° CCW, vertical flip +pm-image resize img.jpg rotated.jpg --max-width 1024 --rotate 90 --flip +``` + +### `serve` — HTTP REST + +```bash +# Default: http://127.0.0.1:8080 — GET /health, POST /v1/resize with JSON body +pm-image serve --host 127.0.0.1 -p 8080 +``` + +Example resize request (paths must be readable/writable by the server process): + +```bash +curl -s http://127.0.0.1:8080/health +curl -s -X POST http://127.0.0.1:8080/v1/resize \ + -H 'Content-Type: application/json' \ + -d '{"input":"/path/in.png","output":"/path/out.webp","max_width":400,"quality":80}' +``` + +Optional: `"cache":false`, `"expand_glob":false`, `"cache_dir":"..."` — see **Batch paths & cache** above. + +### `ipc` — one JSON line per connection (TCP; Unix socket on Linux/macOS) + +```bash +pm-image ipc --host 127.0.0.1 -p 9333 --cache-dir ./cache/images +# elsewhere: send a single line, read one line back, e.g. +# {"input":"/tmp/a.jpg","output":"/tmp/b.webp","max_width":320,"format":"webp","cache":true} +``` + +Same JSON fields as REST (`input`, `output`, globs, `expand_glob`, `cache`, `cache_dir`, resize options). + diff --git a/packages/media/cpp/installer.nsi b/packages/media/cpp/installer.nsi index 440af7eb..c26a5890 100644 --- a/packages/media/cpp/installer.nsi +++ b/packages/media/cpp/installer.nsi @@ -4,7 +4,7 @@ ; From packages/media/cpp: ; npm run build:installer ; Output: dist\media-img-Setup.exe -; Requires: NSIS 3+, CMake release build (dist\media-img.exe + vips DLLs) +; Requires: NSIS 3+, CMake release build (dist\pm-image.exe + vips DLLs) ; ============================================================================ !include "MUI2.nsh" @@ -121,16 +121,16 @@ ; --------------------------------------------------------------------------- ; Metadata ; --------------------------------------------------------------------------- -!define PRODUCT_NAME "PolyMech media-img" +!define PRODUCT_NAME "PolyMech Image Resizer" !define PRODUCT_VERSION "0.1.0" !define PRODUCT_PUBLISHER "PolyMech" -!define PRODUCT_WEB_SITE "https://git.polymech.info/mono" -!define PRODUCT_EXE "media-img.exe" +!define PRODUCT_WEB_SITE "https://service.polymech.info/user/cgo/pages/polymech-media-tools" +!define PRODUCT_EXE "pm-image.exe" !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !define ENV_KEY "Environment" Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -OutFile "dist\media-img-Setup.exe" +OutFile "dist\pm-images-setup.exe" InstallDir "" RequestExecutionLevel user @@ -214,7 +214,7 @@ Section "Install" WriteRegStr HKCU "${PRODUCT_UNINST_KEY}" "InstallMode" "CurrentUser" reg_done: - Call AddToPath +;Call AddToPath DetailPrint "Registering Explorer context menu (media-img register-explorer)..." ExecWait '"$INSTDIR\${PRODUCT_EXE}" register-explorer' $0 diff --git a/packages/media/cpp/orchestrator/media-presets.js b/packages/media/cpp/orchestrator/media-presets.js index 354ff884..b5415592 100644 --- a/packages/media/cpp/orchestrator/media-presets.js +++ b/packages/media/cpp/orchestrator/media-presets.js @@ -12,7 +12,7 @@ export const platform = { /** Path to media-img binary next to orchestrator/ → ../dist/ */ export function mediaExePath(orchestratorDir = __dirname) { - const name = platform.isWin ? 'media-img.exe' : 'media-img'; + const name = platform.isWin ? 'pm-image.exe' : 'media-img'; return resolve(orchestratorDir, '..', 'dist', name); } diff --git a/packages/media/cpp/scripts/invoke-media-img.mjs b/packages/media/cpp/scripts/invoke-media-img.mjs index 63b4c48c..863aa06f 100644 --- a/packages/media/cpp/scripts/invoke-media-img.mjs +++ b/packages/media/cpp/scripts/invoke-media-img.mjs @@ -1,6 +1,6 @@ #!/usr/bin/env node /** - * Cross-platform launcher: runs dist/media-img or dist/media-img.exe from package root. + * Cross-platform launcher: runs dist/media-img or dist/pm-image.exe from package root. * Used by package.json convenience scripts on Linux, macOS, and Windows. */ import { spawnSync } from 'node:child_process'; @@ -8,7 +8,7 @@ import { resolve, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); -const exe = process.platform === 'win32' ? 'media-img.exe' : 'media-img'; +const exe = process.platform === 'win32' ? 'pm-image.exe' : 'media-img'; const bin = resolve(root, 'dist', exe); const args = process.argv.slice(2); const r = spawnSync(bin, args, { stdio: 'inherit' }); diff --git a/packages/media/cpp/scripts/run-media-img.ps1 b/packages/media/cpp/scripts/run-media-img.ps1 index 78da342a..33418129 100644 --- a/packages/media/cpp/scripts/run-media-img.ps1 +++ b/packages/media/cpp/scripts/run-media-img.ps1 @@ -1,15 +1,15 @@ # Wrapper for NSSM, WinSW, Task Scheduler, or manual runs. Configure via environment variables. # # $env:MEDIA_IMG_CMD = serve | ipc (default: serve) -# $env:MEDIA_IMG_BIN = path to media-img.exe (optional) +# $env:MEDIA_IMG_BIN = path to pm-image.exe (optional) # $env:MEDIA_IMG_HOST = bind address (default: 127.0.0.1) # $env:MEDIA_IMG_PORT = TCP port — default 8080 for serve, 9333 for ipc # $env:MEDIA_IMG_CACHE_DIR = optional — passed as --cache-dir # $env:MEDIA_IMG_NO_CACHE = "1" to add --no-cache # $env:MEDIA_IMG_IPC_UNIX = not used on Windows (IPC TCP only here) # -# If MEDIA_IMG_BIN is unset, uses ..\dist\media-img.exe next to this script when present, -# otherwise "media-img.exe" on PATH. +# If MEDIA_IMG_BIN is unset, uses ..\dist\pm-image.exe next to this script when present, +# otherwise "pm-image.exe" on PATH. # # Example: # $env:MEDIA_IMG_CMD = "serve"; $env:MEDIA_IMG_PORT = "8080" @@ -23,7 +23,7 @@ param( $ErrorActionPreference = "Stop" $here = Split-Path -Parent $MyInvocation.MyCommand.Path -$candidate = Join-Path $here "..\dist\media-img.exe" +$candidate = Join-Path $here "..\dist\pm-image.exe" if ($env:MEDIA_IMG_BIN) { $bin = $env:MEDIA_IMG_BIN @@ -32,7 +32,7 @@ elseif (Test-Path -LiteralPath $candidate) { $bin = (Resolve-Path $candidate).Path } else { - $bin = "media-img.exe" + $bin = "pm-image.exe" } $cmd = if ($env:MEDIA_IMG_CMD) { $env:MEDIA_IMG_CMD } else { "serve" } diff --git a/packages/media/cpp/src/main.cpp b/packages/media/cpp/src/main.cpp index d8f67e4f..bbbd049d 100644 --- a/packages/media/cpp/src/main.cpp +++ b/packages/media/cpp/src/main.cpp @@ -184,7 +184,7 @@ int main(int argc, char **argv) { reg_cmd->add_flag("--unregister", reg_unregister); reg_cmd->add_flag("--dry", reg_dry); reg_cmd->add_flag("--no-refresh-shell", reg_no_refresh); - reg_cmd->add_option("--media-bin", reg_media_bin, "Path to media-img.exe (default: this executable)"); + reg_cmd->add_option("--media-bin", reg_media_bin, "Path to pm-image.exe (default: this executable)"); reg_cmd->add_option("--explorer-script", reg_explorer_script, "Path to explorer-resize.ps1 (default: \\scripts\\explorer-resize.ps1)"); reg_cmd->add_option("--explorer-convert-script", reg_explorer_convert_script, diff --git a/packages/media/cpp/src/win/register_explorer.cpp b/packages/media/cpp/src/win/register_explorer.cpp index 60755cdd..f070e673 100644 --- a/packages/media/cpp/src/win/register_explorer.cpp +++ b/packages/media/cpp/src/win/register_explorer.cpp @@ -52,7 +52,7 @@ std::wstring default_media_bin() { wchar_t buf[MAX_PATH]{}; DWORD n = GetModuleFileNameW(nullptr, buf, MAX_PATH); if (n == 0 || n >= MAX_PATH) - return L"media-img.exe"; + return L"pm-image.exe"; return std::wstring(buf, n); } diff --git a/packages/media/cpp/src/win/register_explorer.hpp b/packages/media/cpp/src/win/register_explorer.hpp index d33fe4ba..1da87f7c 100644 --- a/packages/media/cpp/src/win/register_explorer.hpp +++ b/packages/media/cpp/src/win/register_explorer.hpp @@ -9,7 +9,7 @@ struct RegisterExplorerOptions { bool unregister{false}; bool dry{false}; bool refresh_shell{true}; - /** Empty = use path of running media-img.exe */ + /** Empty = use path of running pm-image.exe */ std::string media_bin; /** Empty = \\scripts\\explorer-resize.ps1 */ std::string explorer_script; diff --git a/packages/media/cpp/src/win/ui_singleton.cpp b/packages/media/cpp/src/win/ui_singleton.cpp index 8e5f5819..3a1c652c 100644 --- a/packages/media/cpp/src/win/ui_singleton.cpp +++ b/packages/media/cpp/src/win/ui_singleton.cpp @@ -1,156 +1,156 @@ -#include "win/ui_singleton.hpp" - -#include -#include - -#pragma comment(lib, "User32.lib") - -namespace media::win { -namespace { - -HWND g_merge_input_edit{}; -HWND g_bridge_hwnd{}; -HANDLE g_mutex{}; - -static const wchar_t kBridgeClass[] = L"MediaImgUiBridge"; -static const wchar_t kBridgeTitle[] = L"media-img"; - -std::wstring utf8_to_wide(const std::string &s) { - if (s.empty()) - return L""; - int n = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), static_cast(s.size()), nullptr, 0); - if (n <= 0) - return L""; - std::wstring w(static_cast(n), L'\0'); - MultiByteToWideChar(CP_UTF8, 0, s.c_str(), static_cast(s.size()), w.data(), n); - return w; -} - -LRESULT CALLBACK bridge_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { - (void)wp; - if (msg == WM_COPYDATA) { - auto *cds = reinterpret_cast(lp); - if (!cds || cds->dwData != 1 || !cds->lpData || cds->cbData == 0) - return FALSE; - const char *bytes = static_cast(cds->lpData); - size_t len = cds->cbData; - while (len > 0 && bytes[len - 1] == '\0') - --len; - if (len == 0) - return TRUE; - std::string payload(bytes, bytes + len); - - if (g_merge_input_edit && IsWindow(g_merge_input_edit)) { - const int n = GetWindowTextLengthW(g_merge_input_edit); - std::wstring cur; - if (n > 0) { - cur.assign(static_cast(n) + 1, L'\0'); - GetWindowTextW(g_merge_input_edit, cur.data(), n + 1); - cur.resize(static_cast(n)); - } - std::wstring add = utf8_to_wide(payload); - if (!cur.empty() && !add.empty()) - cur += L';'; - cur += add; - SetWindowTextW(g_merge_input_edit, cur.c_str()); - } - return TRUE; - } - return DefWindowProcW(hwnd, msg, wp, lp); -} - -bool register_bridge_class_once() { - static bool tried = false; - if (tried) - return true; - tried = true; - WNDCLASSEXW wc{}; - wc.cbSize = sizeof(wc); - wc.lpfnWndProc = bridge_wnd_proc; - wc.hInstance = GetModuleHandleW(nullptr); - wc.lpszClassName = kBridgeClass; - if (!RegisterClassExW(&wc)) { - if (GetLastError() != ERROR_CLASS_ALREADY_EXISTS) - return false; - } - return true; -} - -} // namespace - -bool try_acquire_ui_singleton_mutex() { - g_mutex = CreateMutexW(nullptr, TRUE, L"Local\\MediaImgResizeUi_v1"); - if (!g_mutex) - return false; - if (GetLastError() == ERROR_ALREADY_EXISTS) { - CloseHandle(g_mutex); - g_mutex = nullptr; - return false; - } - return true; -} - -void release_ui_singleton_mutex() { - if (!g_mutex) - return; - ReleaseMutex(g_mutex); - CloseHandle(g_mutex); - g_mutex = nullptr; -} - -bool create_ui_singleton_bridge() { - if (g_bridge_hwnd) - return true; - if (!register_bridge_class_once()) - return false; -#ifndef HWND_MESSAGE -#define HWND_MESSAGE ((HWND)(-3)) -#endif - g_bridge_hwnd = - CreateWindowExW(0, kBridgeClass, kBridgeTitle, 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, GetModuleHandleW(nullptr), - nullptr); - return g_bridge_hwnd != nullptr; -} - -void destroy_ui_singleton_bridge() { - if (g_bridge_hwnd) { - DestroyWindow(g_bridge_hwnd); - g_bridge_hwnd = nullptr; - } -} - -void set_ui_merge_input_edit(HWND h) { - g_merge_input_edit = h; -} - -void clear_ui_merge_input_edit() { - g_merge_input_edit = nullptr; -} - -bool forward_resize_ui_paths_to_primary(const std::string &utf8_paths) { - HWND bridge = nullptr; - for (int i = 0; i < 80 && !bridge; ++i) { - bridge = FindWindowW(kBridgeClass, kBridgeTitle); - if (!bridge) - Sleep(25); - } - if (!bridge) - return false; - - std::vector buf; - buf.reserve(utf8_paths.size() + 1); - buf.assign(utf8_paths.begin(), utf8_paths.end()); - buf.push_back('\0'); - - COPYDATASTRUCT cds{}; - cds.dwData = 1; - cds.cbData = static_cast(buf.size()); - cds.lpData = buf.data(); - - DWORD_PTR result = 0; - const LRESULT r = - SendMessageTimeoutW(bridge, WM_COPYDATA, 0, reinterpret_cast(&cds), SMTO_ABORTIFHUNG, 15000, &result); - return r != 0; -} - -} // namespace media::win +#include "win/ui_singleton.hpp" + +#include +#include + +#pragma comment(lib, "User32.lib") + +namespace media::win { +namespace { + +HWND g_merge_input_edit{}; +HWND g_bridge_hwnd{}; +HANDLE g_mutex{}; + +static const wchar_t kBridgeClass[] = L"MediaImgUiBridge"; +static const wchar_t kBridgeTitle[] = L"media-img"; + +std::wstring utf8_to_wide(const std::string &s) { + if (s.empty()) + return L""; + int n = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), static_cast(s.size()), nullptr, 0); + if (n <= 0) + return L""; + std::wstring w(static_cast(n), L'\0'); + MultiByteToWideChar(CP_UTF8, 0, s.c_str(), static_cast(s.size()), w.data(), n); + return w; +} + +LRESULT CALLBACK bridge_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { + (void)wp; + if (msg == WM_COPYDATA) { + auto *cds = reinterpret_cast(lp); + if (!cds || cds->dwData != 1 || !cds->lpData || cds->cbData == 0) + return FALSE; + const char *bytes = static_cast(cds->lpData); + size_t len = cds->cbData; + while (len > 0 && bytes[len - 1] == '\0') + --len; + if (len == 0) + return TRUE; + std::string payload(bytes, bytes + len); + + if (g_merge_input_edit && IsWindow(g_merge_input_edit)) { + const int n = GetWindowTextLengthW(g_merge_input_edit); + std::wstring cur; + if (n > 0) { + cur.assign(static_cast(n) + 1, L'\0'); + GetWindowTextW(g_merge_input_edit, cur.data(), n + 1); + cur.resize(static_cast(n)); + } + std::wstring add = utf8_to_wide(payload); + if (!cur.empty() && !add.empty()) + cur += L';'; + cur += add; + SetWindowTextW(g_merge_input_edit, cur.c_str()); + } + return TRUE; + } + return DefWindowProcW(hwnd, msg, wp, lp); +} + +bool register_bridge_class_once() { + static bool tried = false; + if (tried) + return true; + tried = true; + WNDCLASSEXW wc{}; + wc.cbSize = sizeof(wc); + wc.lpfnWndProc = bridge_wnd_proc; + wc.hInstance = GetModuleHandleW(nullptr); + wc.lpszClassName = kBridgeClass; + if (!RegisterClassExW(&wc)) { + if (GetLastError() != ERROR_CLASS_ALREADY_EXISTS) + return false; + } + return true; +} + +} // namespace + +bool try_acquire_ui_singleton_mutex() { + g_mutex = CreateMutexW(nullptr, TRUE, L"Local\\MediaImgResizeUi_v1"); + if (!g_mutex) + return false; + if (GetLastError() == ERROR_ALREADY_EXISTS) { + CloseHandle(g_mutex); + g_mutex = nullptr; + return false; + } + return true; +} + +void release_ui_singleton_mutex() { + if (!g_mutex) + return; + ReleaseMutex(g_mutex); + CloseHandle(g_mutex); + g_mutex = nullptr; +} + +bool create_ui_singleton_bridge() { + if (g_bridge_hwnd) + return true; + if (!register_bridge_class_once()) + return false; +#ifndef HWND_MESSAGE +#define HWND_MESSAGE ((HWND)(-3)) +#endif + g_bridge_hwnd = + CreateWindowExW(0, kBridgeClass, kBridgeTitle, 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, GetModuleHandleW(nullptr), + nullptr); + return g_bridge_hwnd != nullptr; +} + +void destroy_ui_singleton_bridge() { + if (g_bridge_hwnd) { + DestroyWindow(g_bridge_hwnd); + g_bridge_hwnd = nullptr; + } +} + +void set_ui_merge_input_edit(HWND h) { + g_merge_input_edit = h; +} + +void clear_ui_merge_input_edit() { + g_merge_input_edit = nullptr; +} + +bool forward_resize_ui_paths_to_primary(const std::string &utf8_paths) { + HWND bridge = nullptr; + for (int i = 0; i < 80 && !bridge; ++i) { + bridge = FindWindowW(kBridgeClass, kBridgeTitle); + if (!bridge) + Sleep(25); + } + if (!bridge) + return false; + + std::vector buf; + buf.reserve(utf8_paths.size() + 1); + buf.assign(utf8_paths.begin(), utf8_paths.end()); + buf.push_back('\0'); + + COPYDATASTRUCT cds{}; + cds.dwData = 1; + cds.cbData = static_cast(buf.size()); + cds.lpData = buf.data(); + + DWORD_PTR result = 0; + const LRESULT r = + SendMessageTimeoutW(bridge, WM_COPYDATA, 0, reinterpret_cast(&cds), SMTO_ABORTIFHUNG, 15000, &result); + return r != 0; +} + +} // namespace media::win diff --git a/packages/media/cpp/src/win/ui_singleton.hpp b/packages/media/cpp/src/win/ui_singleton.hpp index 3bfcbfdd..e8f5b7e6 100644 --- a/packages/media/cpp/src/win/ui_singleton.hpp +++ b/packages/media/cpp/src/win/ui_singleton.hpp @@ -1,32 +1,32 @@ -#pragma once - -#include - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include - -namespace media::win { - -/** Create named mutex; returns true if this process is the primary UI instance. */ -bool try_acquire_ui_singleton_mutex(); - -/** Release mutex from try_acquire_ui_singleton_mutex (primary only). */ -void release_ui_singleton_mutex(); - -/** Message-only window that receives WM_COPYDATA from secondary instances. */ -bool create_ui_singleton_bridge(); -void destroy_ui_singleton_bridge(); - -/** Target edit control for merging forwarded paths (resize dialog input row). */ -void set_ui_merge_input_edit(HWND h); -void clear_ui_merge_input_edit(); - -/** - * Find the bridge window and send UTF-8 paths (semicolon-separated) to the primary instance. - * Retries briefly to avoid races right after mutex creation. - */ -bool forward_resize_ui_paths_to_primary(const std::string &utf8_paths); - -} // namespace media::win +#pragma once + +#include + +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#include + +namespace media::win { + +/** Create named mutex; returns true if this process is the primary UI instance. */ +bool try_acquire_ui_singleton_mutex(); + +/** Release mutex from try_acquire_ui_singleton_mutex (primary only). */ +void release_ui_singleton_mutex(); + +/** Message-only window that receives WM_COPYDATA from secondary instances. */ +bool create_ui_singleton_bridge(); +void destroy_ui_singleton_bridge(); + +/** Target edit control for merging forwarded paths (resize dialog input row). */ +void set_ui_merge_input_edit(HWND h); +void clear_ui_merge_input_edit(); + +/** + * Find the bridge window and send UTF-8 paths (semicolon-separated) to the primary instance. + * Retries briefly to avoid races right after mutex creation. + */ +bool forward_resize_ui_paths_to_primary(const std::string &utf8_paths); + +} // namespace media::win diff --git a/packages/media/cpp/dist/media-img.pdb b/packages/media/cpp/v1.zip similarity index 58% rename from packages/media/cpp/dist/media-img.pdb rename to packages/media/cpp/v1.zip index b2358a49..9dbfb7ff 100644 Binary files a/packages/media/cpp/dist/media-img.pdb and b/packages/media/cpp/v1.zip differ diff --git a/packages/media/dist-in/commands/register-explorer.d.ts b/packages/media/dist-in/commands/register-explorer.d.ts index d3bb969f..95dd7872 100644 --- a/packages/media/dist-in/commands/register-explorer.d.ts +++ b/packages/media/dist-in/commands/register-explorer.d.ts @@ -1,6 +1,5 @@ import * as CLI from 'yargs'; -export declare const defaultOptions: (yargs: CLI.Argv) => any; export declare const command = "register-explorer"; -export declare const desc = "Register pm-media commands in Windows Explorer context menu for image files"; +export declare const desc = "Forward to media-img.exe register-explorer (Windows; implementation is in C++)"; export declare const builder: (yargs: CLI.Argv) => any; -export declare function handler(argv: CLI.Arguments): Promise; +export declare function handler(): Promise; diff --git a/packages/media/dist-in/commands/register-explorer.js b/packages/media/dist-in/commands/register-explorer.js index 8b237ef0..ae19f935 100644 --- a/packages/media/dist-in/commands/register-explorer.js +++ b/packages/media/dist-in/commands/register-explorer.js @@ -1,277 +1,31 @@ -import { logger } from '../index.js'; +import { spawnSync } from 'child_process'; +import { existsSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; import { cli } from '../cli.js'; import { defaults } from '../_cli.js'; -import regedit from 'regedit'; -import { exec } from 'child_process'; -import { promisify } from 'util'; -const execAsync = promisify(exec); -export const defaultOptions = (yargs) => { - return yargs.option('group', { - describe: 'Group name for the context menu items', - type: 'string', - default: 'PM-Media' - }).option('unregister', { - default: false, - describe: 'Remove the shell extensions from Explorer', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Show what would be registered without actually doing it', - type: 'boolean' - }).option('refresh-shell', { - default: true, - describe: 'Refresh Windows Shell to apply changes immediately', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }); -}; +function findMediaImg() { + if (process.env.MEDIA_IMG && process.env.MEDIA_IMG.length > 0) + return process.env.MEDIA_IMG; + const pkg = join(dirname(fileURLToPath(import.meta.url)), '..', '..'); + const p = join(pkg, 'cpp', 'dist', 'media-img.exe'); + if (existsSync(p)) + return p; + return 'media-img.exe'; +} export const command = 'register-explorer'; -export const desc = 'Register pm-media commands in Windows Explorer context menu for image files'; -export const builder = defaultOptions; -// Image file extensions to register with -//const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp', '.svg'] -const IMAGE_EXTENSIONS = ['.jpg']; -// Command mappings for Explorer context menu -const EXPLORER_COMMANDS = [ - { - name: 'Convert to JPG', - command: 'pm-media', - args: 'convert --logLevel=info --src="%1" --dst="%~dpn1_converted.jpg"' - }, - { - name: 'Resize Image', - command: 'pm-media', - args: 'resize --logLevel=info --src="%1" --dst="%~dpn1_resized%~x1"' - }, - { - name: 'Add Watermark', - command: 'pm-media', - args: 'watermark --logLevel=info --src="%1" --watermark="${POLYMECH-ROOT}/nordin-ex/branding/logos/polymech-saw-ex.svg" --dst="${SRC_DIR}/${SRC_NAME}_watermarked.${SRC_EXT}"' - }, - { - name: 'Remove Background', - command: 'pm-media', - args: 'background:remove --logLevel=info --src="%1" --dst="%~dpn1_bg_removed%~x1"' - } -]; -/** - * Generate registry entries for Windows Explorer shell extensions - */ -function generateExplorerRegistryEntries(groupName) { - const entries = []; - for (const ext of IMAGE_EXTENSIONS) { - const extKey = `HKCU\\Software\\Classes\\SystemFileAssociations\\${ext}`; - // Create the main group entry with MUIVerb and subCommands - entries.push({ - keyPath: `${extKey}\\shell\\${groupName}`, - valueName: 'MUIVerb', - value: groupName, - type: 'REG_SZ' - }); - entries.push({ - keyPath: `${extKey}\\shell\\${groupName}`, - valueName: 'subCommands', - value: '', - type: 'REG_SZ' - }); - // For each command, create the shell extension entries - for (let i = 0; i < EXPLORER_COMMANDS.length; i++) { - const cmd = EXPLORER_COMMANDS[i]; - const cmdId = cmd.name.replace(/\s+/g, '').toLowerCase(); - const cmdKey = `${extKey}\\shell\\${groupName}\\shell\\${cmdId}`; - // Command display name using MUIVerb - entries.push({ - keyPath: cmdKey, - valueName: 'MUIVerb', - value: cmd.name, - type: 'REG_SZ' - }); - // Direct command execution - pm-media is a global npm command - const commandLine = `${cmd.command} ${cmd.args}`; - entries.push({ - keyPath: `${cmdKey}\\command`, - valueName: '', - value: commandLine, - type: 'REG_DEFAULT' - }); - logger.debug(`Will create command entry: ${cmdKey}\\command = ${commandLine}`); - logger.debug(` Command parts: cmd="${cmd.command}", args="${cmd.args}"`); - } - } - return entries; -} -/** - * Write registry entries for Explorer shell extensions - */ -async function writeExplorerRegistryEntries(entries) { - return new Promise((resolve, reject) => { - // Try a different approach - batch all values for each key together - const keyGroups = {}; - // Group entries by keyPath - for (const entry of entries) { - if (!keyGroups[entry.keyPath]) { - keyGroups[entry.keyPath] = []; - } - keyGroups[entry.keyPath].push(entry); - } - const allKeys = Object.keys(keyGroups); - // Create all keys first - regedit.createKey(allKeys, (err) => { - if (err) { - logger.error('Failed to create registry keys:', err); - reject(err); - return; - } - logger.debug(`✓ Created ${allKeys.length} registry keys`); - // Wait for keys to be created - setTimeout(() => { - let completed = 0; - let hasError = false; - // Process each key group - for (const [keyPath, keyEntries] of Object.entries(keyGroups)) { - const valuesToWrite = { - [keyPath]: {} - }; - // Add all values for this key - for (const entry of keyEntries) { - const isDefault = entry.type === 'REG_DEFAULT'; - const valueName = isDefault ? '___default___' : entry.valueName || ''; // name is ignored for REG_DEFAULT - valuesToWrite[keyPath][valueName] = { - value: entry.value, - // IMPORTANT: use REG_DEFAULT for unnamed default - type: (isDefault ? 'REG_DEFAULT' : entry.type) - }; - } - // Write all values for this key at once - regedit.putValue(valuesToWrite, (err) => { - completed++; - if (err) { - hasError = true; - logger.error(`Failed to set values for ${keyPath}:`, err); - } - else { - logger.debug(`✓ Set ${keyEntries.length} values for key: ${keyPath}`); - for (const entry of keyEntries) { - const displayName = entry.type === 'REG_DEFAULT' ? '(Default)' : entry.valueName; - logger.debug(` - ${displayName} = ${entry.value}`); - } - } - if (completed === allKeys.length) { - if (hasError) { - reject(new Error('Some registry values failed to set')); - } - else { - resolve(); - } - } - }); - } - }, 500); - }); - }); -} -/** - * Remove registry entries for Explorer shell extensions - */ -async function removeExplorerRegistryEntries(groupName) { - const promisified = regedit.promisified; - for (const ext of IMAGE_EXTENSIONS) { - const extKey = `HKCU\\Software\\Classes\\SystemFileAssociations\\${ext}`; - const groupKey = `${extKey}\\shell\\${groupName}`; - try { - // Check if the key exists - const result = await promisified.list([groupKey]); - if (result[groupKey].exists) { - await promisified.deleteKey([groupKey]); - logger.info(`✓ Removed shell extension for ${ext}`); - } - } - catch (error) { - logger.debug(`Could not remove key ${groupKey}:`, error); - } - } -} -/** - * Refresh Windows Shell to apply registry changes without restarting Explorer - */ -async function refreshShell() { - try { - logger.info('Refreshing Windows Shell to apply changes...'); - // Use SHChangeNotify to refresh the shell - // This is much safer than killing explorer.exe - await execAsync('powershell -Command "Add-Type -TypeDefinition \'using System; using System.Runtime.InteropServices; public class Shell32 { [DllImport(\\\"shell32.dll\\\")] public static extern void SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2); }\'; [Shell32]::SHChangeNotify(0x8000000, 0, [IntPtr]::Zero, [IntPtr]::Zero)"'); - logger.info('✓ Windows Shell refreshed successfully'); - logger.info('Context menu changes should now be visible'); - } - catch (error) { - logger.warn('Failed to refresh shell automatically:', error); - logger.warn('You may need to log out and log back in, or restart Windows to see the context menu changes'); - } -} -export async function handler(argv) { +export const desc = 'Forward to media-img.exe register-explorer (Windows; implementation is in C++)'; +export const builder = (yargs) => yargs.strict(false); +export async function handler() { defaults(); - logger.settings.minLevel = argv.logLevel; - const options = { - group: argv.group, - unregister: argv.unregister, - dry: argv.dry, - refreshShell: argv['refresh-shell'] - }; if (process.platform !== 'win32') { - logger.error('Windows Explorer shell extensions are only supported on Windows'); - process.exit(1); - } - try { - if (options.unregister) { - logger.info(`Removing Explorer shell extensions for group: ${options.group}`); - if (options.dry) { - logger.info('\n=== DRY RUN - Extensions that would be removed ==='); - for (const ext of IMAGE_EXTENSIONS) { - logger.info(` ${ext} files: Remove "${options.group}" context menu`); - } - return; - } - await removeExplorerRegistryEntries(options.group); - logger.info(`✓ Successfully removed Explorer shell extensions for: ${options.group}`); - if (options.refreshShell) { - await refreshShell(); - } - } - else { - logger.info(`Registering Explorer shell extensions for group: ${options.group}`); - logger.info(`Target file types: ${IMAGE_EXTENSIONS.join(', ')}`); - const entries = generateExplorerRegistryEntries(options.group); - if (options.dry) { - logger.info('\n=== DRY RUN - Extensions that would be registered ==='); - for (const ext of IMAGE_EXTENSIONS) { - logger.info(`\n${ext} files:`); - for (const cmd of EXPLORER_COMMANDS) { - logger.info(` → ${cmd.name}: ${cmd.command} ${cmd.args}`); - } - } - logger.info(`\nTotal registry entries: ${entries.length}`); - return; - } - await writeExplorerRegistryEntries(entries); - logger.info(`\n=== Registration Complete ===`); - logger.info(`Registered ${EXPLORER_COMMANDS.length} commands for ${IMAGE_EXTENSIONS.length} file types`); - logger.info(`Total registry entries created: ${entries.length}`); - logger.info('\nExplorer context menu entries have been registered.'); - if (options.refreshShell) { - await refreshShell(); - } - else { - logger.info('You may need to log out and log back in to see the changes.'); - } - } - } - catch (error) { - logger.error('Failed to register/unregister Explorer shell extensions:', error); + console.error('register-explorer is only supported on Windows.'); process.exit(1); } + const exe = findMediaImg(); + const args = process.argv.slice(2); + const r = spawnSync(exe, args, { stdio: 'inherit', shell: false, windowsHide: true }); + process.exit(r.status === null ? 1 : r.status); } cli.command(command, desc, builder, handler); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItZXhwbG9yZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcmVnaXN0ZXItZXhwbG9yZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGFBQWEsQ0FBQTtBQUNwQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQy9CLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxPQUFvRCxNQUFNLFNBQVMsQ0FBQTtBQUMxRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFFaEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFBO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQzlDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsUUFBUSxFQUFFLHVDQUF1QztRQUNqRCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxVQUFVO0tBQ3RCLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1FBQ3BCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLDJDQUEyQztRQUNyRCxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRTtRQUNiLE9BQU8sRUFBRSxLQUFLO1FBQ2QsUUFBUSxFQUFFLHlEQUF5RDtRQUNuRSxJQUFJLEVBQUUsU0FBUztLQUNsQixDQUFDLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRTtRQUN2QixPQUFPLEVBQUUsSUFBSTtRQUNiLFFBQVEsRUFBRSxvREFBb0Q7UUFDOUQsSUFBSSxFQUFFLFNBQVM7S0FDbEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7UUFDbEIsUUFBUSxFQUFFLHNDQUFzQztRQUNoRCxJQUFJLEVBQUUsUUFBUTtRQUNkLE9BQU8sRUFBRSxNQUFNO0tBQ2xCLENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQTtBQUMxQyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsNkVBQTZFLENBQUE7QUFDakcsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQTtBQUVyQyx5Q0FBeUM7QUFDekMsOEZBQThGO0FBQzlGLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQVdqQyw2Q0FBNkM7QUFDN0MsTUFBTSxpQkFBaUIsR0FBRztJQUN0QjtRQUNJLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsT0FBTyxFQUFFLFVBQVU7UUFDbkIsSUFBSSxFQUFFLGlFQUFpRTtLQUMxRTtJQUNEO1FBQ0ksSUFBSSxFQUFFLGNBQWM7UUFDcEIsT0FBTyxFQUFFLFVBQVU7UUFDbkIsSUFBSSxFQUFFLDhEQUE4RDtLQUN2RTtJQUNEO1FBQ0ksSUFBSSxFQUFFLGVBQWU7UUFDckIsT0FBTyxFQUFFLFVBQVU7UUFDbkIsSUFBSSxFQUFFLHdLQUF3SztLQUNqTDtJQUNEO1FBQ0ksSUFBSSxFQUFFLG1CQUFtQjtRQUN6QixPQUFPLEVBQUUsVUFBVTtRQUNuQixJQUFJLEVBQUUsNEVBQTRFO0tBQ3JGO0NBQ0osQ0FBQTtBQUdEOztHQUVHO0FBQ0gsU0FBUywrQkFBK0IsQ0FBQyxTQUFpQjtJQUN0RCxNQUFNLE9BQU8sR0FBNEIsRUFBRSxDQUFBO0lBRTNDLEtBQUssTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxvREFBb0QsR0FBRyxFQUFFLENBQUE7UUFFeEUsMkRBQTJEO1FBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDVCxPQUFPLEVBQUUsR0FBRyxNQUFNLFlBQVksU0FBUyxFQUFFO1lBQ3pDLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEtBQUssRUFBRSxTQUFTO1lBQ2hCLElBQUksRUFBRSxRQUFRO1NBQ2pCLENBQUMsQ0FBQTtRQUVGLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDVCxPQUFPLEVBQUUsR0FBRyxNQUFNLFlBQVksU0FBUyxFQUFFO1lBQ3pDLFNBQVMsRUFBRSxhQUFhO1lBQ3hCLEtBQUssRUFBRSxFQUFFO1lBQ1QsSUFBSSxFQUFFLFFBQVE7U0FDakIsQ0FBQyxDQUFBO1FBRUYsdURBQXVEO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNoQyxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7WUFDeEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxNQUFNLFlBQVksU0FBUyxZQUFZLEtBQUssRUFBRSxDQUFBO1lBRWhFLHFDQUFxQztZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNULE9BQU8sRUFBRSxNQUFNO2dCQUNmLFNBQVMsRUFBRSxTQUFTO2dCQUNwQixLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUk7Z0JBQ2YsSUFBSSxFQUFFLFFBQVE7YUFDakIsQ0FBQyxDQUFBO1lBRUYsOERBQThEO1lBQzlELE1BQU0sV0FBVyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDaEQsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDVCxPQUFPLEVBQUUsR0FBRyxNQUFNLFdBQVc7Z0JBQzdCLFNBQVMsRUFBRSxFQUFFO2dCQUNiLEtBQUssRUFBRSxXQUFXO2dCQUNsQixJQUFJLEVBQUUsYUFBYTthQUN0QixDQUFDLENBQUE7WUFFRixNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixNQUFNLGVBQWUsV0FBVyxFQUFFLENBQUMsQ0FBQTtZQUM5RSxNQUFNLENBQUMsS0FBSyxDQUFDLHlCQUF5QixHQUFHLENBQUMsT0FBTyxZQUFZLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1FBQzdFLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUE7QUFDbEIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLDRCQUE0QixDQUFDLE9BQWdDO0lBQ3hFLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDbkMsb0VBQW9FO1FBQ3BFLE1BQU0sU0FBUyxHQUFtRCxFQUFFLENBQUE7UUFFcEUsMkJBQTJCO1FBQzNCLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsQ0FBQztZQUNELFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3hDLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBRXRDLHdCQUF3QjtRQUN4QixPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQy9CLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ04sTUFBTSxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtnQkFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUNYLE9BQU07WUFDVixDQUFDO1lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLE9BQU8sQ0FBQyxNQUFNLGdCQUFnQixDQUFDLENBQUE7WUFFekQsOEJBQThCO1lBQzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1osSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFBO2dCQUNqQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUE7Z0JBRXBCLHlCQUF5QjtnQkFDekIsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDNUQsTUFBTSxhQUFhLEdBQThCO3dCQUM3QyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7cUJBQ2hCLENBQUE7b0JBRUQsOEJBQThCO29CQUM5QixLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUM3QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQTt3QkFDOUMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFBLENBQUMsa0NBQWtDO3dCQUV4RyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUc7NEJBQ2hDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSzs0QkFDbEIsaURBQWlEOzRCQUNqRCxJQUFJLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBUTt5QkFDeEQsQ0FBQTtvQkFDTCxDQUFDO29CQUVELHdDQUF3QztvQkFDeEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTt3QkFDcEMsU0FBUyxFQUFFLENBQUE7d0JBRVgsSUFBSSxHQUFHLEVBQUUsQ0FBQzs0QkFDTixRQUFRLEdBQUcsSUFBSSxDQUFBOzRCQUNmLE1BQU0sQ0FBQyxLQUFLLENBQUMsNEJBQTRCLE9BQU8sR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFBO3dCQUM3RCxDQUFDOzZCQUFNLENBQUM7NEJBQ0osTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLFVBQVUsQ0FBQyxNQUFNLG9CQUFvQixPQUFPLEVBQUUsQ0FBQyxDQUFBOzRCQUNyRSxLQUFLLE1BQU0sS0FBSyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dDQUM3QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFBO2dDQUNoRixNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sV0FBVyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBOzRCQUN2RCxDQUFDO3dCQUNMLENBQUM7d0JBRUQsSUFBSSxTQUFTLEtBQUssT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDOzRCQUMvQixJQUFJLFFBQVEsRUFBRSxDQUFDO2dDQUNYLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQUE7NEJBQzNELENBQUM7aUNBQU0sQ0FBQztnQ0FDSixPQUFPLEVBQUUsQ0FBQTs0QkFDYixDQUFDO3dCQUNMLENBQUM7b0JBQ0wsQ0FBQyxDQUFDLENBQUE7Z0JBQ04sQ0FBQztZQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQTtRQUNYLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsNkJBQTZCLENBQUMsU0FBaUI7SUFDMUQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQTtJQUV2QyxLQUFLLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsb0RBQW9ELEdBQUcsRUFBRSxDQUFBO1FBQ3hFLE1BQU0sUUFBUSxHQUFHLEdBQUcsTUFBTSxZQUFZLFNBQVMsRUFBRSxDQUFBO1FBRWpELElBQUksQ0FBQztZQUNELDBCQUEwQjtZQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1lBQ2pELElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUMxQixNQUFNLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO2dCQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLGlDQUFpQyxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQ3ZELENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLFFBQVEsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzVELENBQUM7SUFDTCxDQUFDO0FBQ0wsQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLFlBQVk7SUFDdkIsSUFBSSxDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFBO1FBRTNELDBDQUEwQztRQUMxQywrQ0FBK0M7UUFDL0MsTUFBTSxTQUFTLENBQUMsK1VBQStVLENBQUMsQ0FBQTtRQUVoVyxNQUFNLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDckQsTUFBTSxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLDZGQUE2RixDQUFDLENBQUE7SUFDOUcsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFtQjtJQUM3QyxRQUFRLEVBQUUsQ0FBQTtJQUNWLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFlLENBQUE7SUFFL0MsTUFBTSxPQUFPLEdBQUc7UUFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQWU7UUFDM0IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFxQjtRQUN0QyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQWM7UUFDeEIsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQVk7S0FDakQsQ0FBQTtJQUVELElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLEVBQUUsQ0FBQztRQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLGlFQUFpRSxDQUFDLENBQUE7UUFDL0UsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQixDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsTUFBTSxDQUFDLElBQUksQ0FBQyxpREFBaUQsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFFN0UsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyxzREFBc0QsQ0FBQyxDQUFBO2dCQUNuRSxLQUFLLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLG1CQUFtQixPQUFPLENBQUMsS0FBSyxnQkFBZ0IsQ0FBQyxDQUFBO2dCQUN6RSxDQUFDO2dCQUNELE9BQU07WUFDVixDQUFDO1lBRUQsTUFBTSw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyx5REFBeUQsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFFckYsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sWUFBWSxFQUFFLENBQUE7WUFDeEIsQ0FBQztRQUVMLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxvREFBb0QsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7WUFDaEYsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUVoRSxNQUFNLE9BQU8sR0FBRywrQkFBK0IsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7WUFFOUQsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2QsTUFBTSxDQUFDLElBQUksQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO2dCQUN0RSxLQUFLLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixFQUFFLENBQUM7b0JBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFBO29CQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLGlCQUFpQixFQUFFLENBQUM7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7b0JBQzlELENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtnQkFDMUQsT0FBTTtZQUNWLENBQUM7WUFFRCxNQUFNLDRCQUE0QixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBRTNDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtZQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsaUJBQWlCLENBQUMsTUFBTSxpQkFBaUIsZ0JBQWdCLENBQUMsTUFBTSxhQUFhLENBQUMsQ0FBQTtZQUN4RyxNQUFNLENBQUMsSUFBSSxDQUFDLG1DQUFtQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtZQUNoRSxNQUFNLENBQUMsSUFBSSxDQUFDLHVEQUF1RCxDQUFDLENBQUE7WUFFcEUsSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sWUFBWSxFQUFFLENBQUE7WUFDeEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQTtZQUM5RSxDQUFDO1FBQ0wsQ0FBQztJQUVMLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2IsTUFBTSxDQUFDLEtBQUssQ0FBQywwREFBMEQsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUMvRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25CLENBQUM7QUFDTCxDQUFDO0FBRUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQSJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXItZXhwbG9yZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvcmVnaXN0ZXItZXhwbG9yZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQy9CLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUE7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRXJDLFNBQVMsWUFBWTtJQUNqQixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQ3pELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUE7SUFDaEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtJQUNyRSxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUE7SUFDbkQsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ2IsT0FBTyxDQUFDLENBQUE7SUFDWixPQUFPLGVBQWUsQ0FBQTtBQUMxQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLG1CQUFtQixDQUFBO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxnRkFBZ0YsQ0FBQTtBQUNwRyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxLQUFlLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFFL0QsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPO0lBQ3pCLFFBQVEsRUFBRSxDQUFBO0lBQ1YsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sRUFBRSxDQUFDO1FBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsaURBQWlELENBQUMsQ0FBQTtRQUNoRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ25CLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxZQUFZLEVBQUUsQ0FBQTtJQUMxQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNsQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUNyRixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNsRCxDQUFDO0FBRUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQSJ9 \ No newline at end of file diff --git a/packages/media/scripts/explorer-convert.ps1 b/packages/media/scripts/explorer-convert.ps1 new file mode 100644 index 00000000..de1a6723 --- /dev/null +++ b/packages/media/scripts/explorer-convert.ps1 @@ -0,0 +1,83 @@ +# Explorer context menu: convert images to JPEG (re-encode; no resize) via media-img resize --format jpg +# Multi-select: one invocation with all paths (Player + %*). +# Keep extensions in sync with register_explorer.cpp (canonical list; matching is case-insensitive). +param( + [Parameter(Mandatory)][string]$MediaImg, + [Parameter(Mandatory, ValueFromRemainingArguments = $true)][string[]]$InputPaths +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$InputPaths = @($InputPaths | Where-Object { $_ -and $_.Trim() -ne '' }) +if ($InputPaths.Length -eq 0) { + exit 1 +} + +$imageExtLower = @( + '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.tiff', '.tif', '.jpe', '.jfif', + '.avif', '.arw' +) + +function Test-ImageExt([string]$ext) { + $e = $ext.ToLowerInvariant() + return $script:imageExtLower -contains $e +} + +function Invoke-MediaImg([string[]]$ArgList) { + $outF = [System.IO.Path]::GetTempFileName() + $errF = [System.IO.Path]::GetTempFileName() + try { + $p = Start-Process -FilePath $MediaImg -ArgumentList $ArgList -Wait -PassThru ` + -WindowStyle Hidden -RedirectStandardOutput $outF -RedirectStandardError $errF + if ($p.ExitCode -ne 0) { + $e = if (Test-Path -LiteralPath $errF) { Get-Content -Raw -LiteralPath $errF } else { '' } + throw "media-img failed (exit $($p.ExitCode)): $e" + } + } + finally { + Remove-Item -LiteralPath $outF, $errF -ErrorAction SilentlyContinue + } +} + +function Convert-OneFile([string]$File) { + $dst = '${SRC_DIR}/${SRC_NAME}_converted.jpg' + Invoke-MediaImg @( + 'resize', '--src', $File, '--dst', $dst, + '--format', 'jpg', '-q', '88', + '--fit', 'inside', '--no-cache' + ) +} + +function Process-OnePath([string]$Path) { + if (-not (Test-Path -LiteralPath $Path)) { + exit 1 + } + $item = Get-Item -LiteralPath $Path + if ($item.PSIsContainer) { + $files = Get-ChildItem -LiteralPath $Path -Recurse -File -ErrorAction Stop | + Where-Object { Test-ImageExt $_.Extension } + if (-not $files) { + exit 0 + } + foreach ($f in $files) { + Convert-OneFile $f.FullName + } + } + else { + if (-not (Test-ImageExt $item.Extension)) { + exit 0 + } + Convert-OneFile $item.FullName + } +} + +if ($InputPaths.Length -gt 1) { + foreach ($p in $InputPaths) { + Process-OnePath $p + } + exit 0 +} + +Process-OnePath $InputPaths[0] +exit 0 diff --git a/packages/media/scripts/explorer-resize.ps1 b/packages/media/scripts/explorer-resize.ps1 new file mode 100644 index 00000000..eb73fde7 --- /dev/null +++ b/packages/media/scripts/explorer-resize.ps1 @@ -0,0 +1,98 @@ +# Explorer context-menu helper: resize images (single file, multiple files, or folder tree) via media-img.exe +# Multi-select: Explorer uses MultiSelectModel Player + %* — this script receives all paths in one invocation. +# Uses Start-Process -WindowStyle Hidden so no console window (VIPS stderr is redirected to a temp file). +param( + [Parameter(Mandatory)][string]$MediaImg, + [Parameter(Mandatory)][int]$MaxWidth, + [Parameter(Mandatory)][ValidateSet('InPlace', 'Copy')][string]$Mode, + [Parameter(Mandatory, ValueFromRemainingArguments = $true)][string[]]$InputPaths +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +$InputPaths = @($InputPaths | Where-Object { $_ -and $_.Trim() -ne '' }) +if ($InputPaths.Length -eq 0) { + exit 1 +} + +# Canonical list — keep in sync with register_explorer.cpp (k_canonical_ext + case-insensitive match) +$imageExt = @( + '.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp', '.tiff', '.tif', '.jpe', '.jfif', + '.avif', '.arw' +) + +function Test-ImageExt([string]$ext) { + $e = $ext.ToLowerInvariant() + return $script:imageExt -contains $e +} + +function Invoke-MediaImgResize([string[]]$ArgList) { + $outF = [System.IO.Path]::GetTempFileName() + $errF = [System.IO.Path]::GetTempFileName() + try { + $p = Start-Process -FilePath $MediaImg -ArgumentList $ArgList -Wait -PassThru ` + -WindowStyle Hidden -RedirectStandardOutput $outF -RedirectStandardError $errF + if ($p.ExitCode -ne 0) { + $e = if (Test-Path -LiteralPath $errF) { Get-Content -Raw -LiteralPath $errF } else { '' } + throw "media-img failed (exit $($p.ExitCode)): $e" + } + } + finally { + Remove-Item -LiteralPath $outF, $errF -ErrorAction SilentlyContinue + } +} + +function Resize-SingleFile([string]$File) { + $w = $MaxWidth + if ($Mode -eq 'Copy') { + $dst = '${SRC_DIR}/${SRC_NAME}_' + $w + '${SRC_FILE_EXT}' + Invoke-MediaImgResize @('resize', '--src', $File, '--dst', $dst, '--max-width', "$w", '--fit', 'inside', '--no-cache') + } + else { + $ext = [System.IO.Path]::GetExtension($File) + $tmp = Join-Path $env:TEMP ('media-img-' + [Guid]::NewGuid().ToString('n') + $ext) + try { + Invoke-MediaImgResize @('resize', '--src', $File, '--dst', $tmp, '--max-width', "$w", '--fit', 'inside', '--no-cache') + Move-Item -LiteralPath $tmp -Destination $File -Force + } + finally { + if (Test-Path -LiteralPath $tmp) { + Remove-Item -LiteralPath $tmp -Force -ErrorAction SilentlyContinue + } + } + } +} + +function Process-OnePath([string]$Path) { + if (-not (Test-Path -LiteralPath $Path)) { + exit 1 + } + $item = Get-Item -LiteralPath $Path + if ($item.PSIsContainer) { + $files = Get-ChildItem -LiteralPath $Path -Recurse -File -ErrorAction Stop | + Where-Object { Test-ImageExt $_.Extension } + if (-not $files) { + exit 0 + } + foreach ($f in $files) { + Resize-SingleFile $f.FullName + } + } + else { + if (-not (Test-ImageExt $item.Extension)) { + exit 0 + } + Resize-SingleFile $item.FullName + } +} + +if ($InputPaths.Length -gt 1) { + foreach ($p in $InputPaths) { + Process-OnePath $p + } + exit 0 +} + +Process-OnePath $InputPaths[0] +exit 0 diff --git a/packages/media/scripts/explorer-ui.ps1 b/packages/media/scripts/explorer-ui.ps1 new file mode 100644 index 00000000..0bfa9b9e --- /dev/null +++ b/packages/media/scripts/explorer-ui.ps1 @@ -0,0 +1,31 @@ +# Launch media-img resize --ui once for Explorer multi-select (Player model + %*). +# Semicolon-joins paths ( ';' is invalid in Windows filenames ). Uses CreateNoWindow — no console flash. +param( + [Parameter(Mandatory)][string]$MediaImg, + [Parameter(ValueFromRemainingArguments = $true)][string[]]$Paths +) + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +if ($null -eq $Paths -or $Paths.Length -eq 0) { + exit 1 +} + +$clean = @($Paths | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }) +if ($clean.Length -eq 0) { + exit 1 +} + +$joined = $clean -join ';' + +$p = New-Object System.Diagnostics.Process +$p.StartInfo.FileName = $MediaImg +$p.StartInfo.Arguments = "resize --ui --src `"$joined`"" +$p.StartInfo.UseShellExecute = $false +$p.StartInfo.CreateNoWindow = $true +$p.StartInfo.RedirectStandardOutput = $false +$p.StartInfo.RedirectStandardError = $false +[void]$p.Start() +$p.WaitForExit() +exit $p.ExitCode diff --git a/packages/media/src/commands/register-explorer.ts b/packages/media/src/commands/register-explorer.ts index 6b83cd43..92dd74aa 100644 --- a/packages/media/src/commands/register-explorer.ts +++ b/packages/media/src/commands/register-explorer.ts @@ -1,327 +1,35 @@ import * as CLI from 'yargs' -import { logger } from '../index.js' +import { spawnSync } from 'child_process' +import { existsSync } from 'fs' +import { dirname, join } from 'path' +import { fileURLToPath } from 'url' import { cli } from '../cli.js' import { defaults } from '../_cli.js' -import regedit, { RegistryItemPutCollection, REG_SZ_Value } from 'regedit' -import { exec } from 'child_process' -import { promisify } from 'util' -const execAsync = promisify(exec) - -export const defaultOptions = (yargs: CLI.Argv) => { - return yargs.option('group', { - describe: 'Group name for the context menu items', - type: 'string', - default: 'PM-Media' - }).option('unregister', { - default: false, - describe: 'Remove the shell extensions from Explorer', - type: 'boolean' - }).option('dry', { - default: false, - describe: 'Show what would be registered without actually doing it', - type: 'boolean' - }).option('refresh-shell', { - default: true, - describe: 'Refresh Windows Shell to apply changes immediately', - type: 'boolean' - }).option('logLevel', { - describe: 'Log level : warn, info, debug, error', - type: 'string', - default: 'info' - }) +function findMediaImg(): string { + if (process.env.MEDIA_IMG && process.env.MEDIA_IMG.length > 0) + return process.env.MEDIA_IMG + const pkg = join(dirname(fileURLToPath(import.meta.url)), '..', '..') + const p = join(pkg, 'cpp', 'dist', 'media-img.exe') + if (existsSync(p)) + return p + return 'media-img.exe' } export const command = 'register-explorer' -export const desc = 'Register pm-media commands in Windows Explorer context menu for image files' -export const builder = defaultOptions +export const desc = 'Forward to media-img.exe register-explorer (Windows; implementation is in C++)' +export const builder = (yargs: CLI.Argv) => yargs.strict(false) -// Image file extensions to register with -//const IMAGE_EXTENSIONS = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp', '.svg'] -const IMAGE_EXTENSIONS = ['.jpg'] - -type RegType = 'REG_SZ' | 'REG_DWORD' | 'REG_DEFAULT' - -interface ExplorerRegistryEntry { - keyPath: string - valueName: string - value: string - type: RegType -} - -// Command mappings for Explorer context menu -const EXPLORER_COMMANDS = [ - { - name: 'Convert to JPG', - command: 'pm-media', - args: 'convert --logLevel=info --src="%1" --dst="%~dpn1_converted.jpg"' - }, - { - name: 'Resize Image', - command: 'pm-media', - args: 'resize --logLevel=info --src="%1" --dst="%~dpn1_resized%~x1"' - }, - { - name: 'Add Watermark', - command: 'pm-media', - args: 'watermark --logLevel=info --src="%1" --watermark="${POLYMECH-ROOT}/nordin-ex/branding/logos/polymech-saw-ex.svg" --dst="${SRC_DIR}/${SRC_NAME}_watermarked.${SRC_EXT}"' - }, - { - name: 'Remove Background', - command: 'pm-media', - args: 'background:remove --logLevel=info --src="%1" --dst="%~dpn1_bg_removed%~x1"' - } -] - - -/** - * Generate registry entries for Windows Explorer shell extensions - */ -function generateExplorerRegistryEntries(groupName: string): ExplorerRegistryEntry[] { - const entries: ExplorerRegistryEntry[] = [] - - for (const ext of IMAGE_EXTENSIONS) { - const extKey = `HKCU\\Software\\Classes\\SystemFileAssociations\\${ext}` - - // Create the main group entry with MUIVerb and subCommands - entries.push({ - keyPath: `${extKey}\\shell\\${groupName}`, - valueName: 'MUIVerb', - value: groupName, - type: 'REG_SZ' - }) - - entries.push({ - keyPath: `${extKey}\\shell\\${groupName}`, - valueName: 'subCommands', - value: '', - type: 'REG_SZ' - }) - - // For each command, create the shell extension entries - for (let i = 0; i < EXPLORER_COMMANDS.length; i++) { - const cmd = EXPLORER_COMMANDS[i] - const cmdId = cmd.name.replace(/\s+/g, '').toLowerCase() - const cmdKey = `${extKey}\\shell\\${groupName}\\shell\\${cmdId}` - - // Command display name using MUIVerb - entries.push({ - keyPath: cmdKey, - valueName: 'MUIVerb', - value: cmd.name, - type: 'REG_SZ' - }) - - // Direct command execution - pm-media is a global npm command - const commandLine = `${cmd.command} ${cmd.args}` - entries.push({ - keyPath: `${cmdKey}\\command`, - valueName: '', - value: commandLine, - type: 'REG_DEFAULT' - }) - - logger.debug(`Will create command entry: ${cmdKey}\\command = ${commandLine}`) - logger.debug(` Command parts: cmd="${cmd.command}", args="${cmd.args}"`) - } - } - - return entries -} - -/** - * Write registry entries for Explorer shell extensions - */ -async function writeExplorerRegistryEntries(entries: ExplorerRegistryEntry[]): Promise { - return new Promise((resolve, reject) => { - // Try a different approach - batch all values for each key together - const keyGroups: { [keyPath: string]: ExplorerRegistryEntry[] } = {} - - // Group entries by keyPath - for (const entry of entries) { - if (!keyGroups[entry.keyPath]) { - keyGroups[entry.keyPath] = [] - } - keyGroups[entry.keyPath].push(entry) - } - - const allKeys = Object.keys(keyGroups) - - // Create all keys first - regedit.createKey(allKeys, (err) => { - if (err) { - logger.error('Failed to create registry keys:', err) - reject(err) - return - } - - logger.debug(`✓ Created ${allKeys.length} registry keys`) - - // Wait for keys to be created - setTimeout(() => { - let completed = 0 - let hasError = false - - // Process each key group - for (const [keyPath, keyEntries] of Object.entries(keyGroups)) { - const valuesToWrite: RegistryItemPutCollection = { - [keyPath]: {} - } - - // Add all values for this key - for (const entry of keyEntries) { - const isDefault = entry.type === 'REG_DEFAULT' - const valueName = isDefault ? '___default___' : entry.valueName || '' // name is ignored for REG_DEFAULT - - valuesToWrite[keyPath][valueName] = { - value: entry.value, - // IMPORTANT: use REG_DEFAULT for unnamed default - type: (isDefault ? 'REG_DEFAULT' : entry.type) as any - } - } - - // Write all values for this key at once - regedit.putValue(valuesToWrite, (err) => { - completed++ - - if (err) { - hasError = true - logger.error(`Failed to set values for ${keyPath}:`, err) - } else { - logger.debug(`✓ Set ${keyEntries.length} values for key: ${keyPath}`) - for (const entry of keyEntries) { - const displayName = entry.type === 'REG_DEFAULT' ? '(Default)' : entry.valueName - logger.debug(` - ${displayName} = ${entry.value}`) - } - } - - if (completed === allKeys.length) { - if (hasError) { - reject(new Error('Some registry values failed to set')) - } else { - resolve() - } - } - }) - } - }, 500) - }) - }) -} - -/** - * Remove registry entries for Explorer shell extensions - */ -async function removeExplorerRegistryEntries(groupName: string): Promise { - const promisified = regedit.promisified - - for (const ext of IMAGE_EXTENSIONS) { - const extKey = `HKCU\\Software\\Classes\\SystemFileAssociations\\${ext}` - const groupKey = `${extKey}\\shell\\${groupName}` - - try { - // Check if the key exists - const result = await promisified.list([groupKey]) - if (result[groupKey].exists) { - await promisified.deleteKey([groupKey]) - logger.info(`✓ Removed shell extension for ${ext}`) - } - } catch (error) { - logger.debug(`Could not remove key ${groupKey}:`, error) - } - } -} - -/** - * Refresh Windows Shell to apply registry changes without restarting Explorer - */ -async function refreshShell(): Promise { - try { - logger.info('Refreshing Windows Shell to apply changes...') - - // Use SHChangeNotify to refresh the shell - // This is much safer than killing explorer.exe - await execAsync('powershell -Command "Add-Type -TypeDefinition \'using System; using System.Runtime.InteropServices; public class Shell32 { [DllImport(\\\"shell32.dll\\\")] public static extern void SHChangeNotify(int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2); }\'; [Shell32]::SHChangeNotify(0x8000000, 0, [IntPtr]::Zero, [IntPtr]::Zero)"') - - logger.info('✓ Windows Shell refreshed successfully') - logger.info('Context menu changes should now be visible') - } catch (error) { - logger.warn('Failed to refresh shell automatically:', error) - logger.warn('You may need to log out and log back in, or restart Windows to see the context menu changes') - } -} - -export async function handler(argv: CLI.Arguments) { +export async function handler() { defaults() - logger.settings.minLevel = argv.logLevel as any - - const options = { - group: argv.group as string, - unregister: argv.unregister as boolean, - dry: argv.dry as boolean, - refreshShell: argv['refresh-shell'] as boolean - } - if (process.platform !== 'win32') { - logger.error('Windows Explorer shell extensions are only supported on Windows') - process.exit(1) - } - - try { - if (options.unregister) { - logger.info(`Removing Explorer shell extensions for group: ${options.group}`) - - if (options.dry) { - logger.info('\n=== DRY RUN - Extensions that would be removed ===') - for (const ext of IMAGE_EXTENSIONS) { - logger.info(` ${ext} files: Remove "${options.group}" context menu`) - } - return - } - - await removeExplorerRegistryEntries(options.group) - logger.info(`✓ Successfully removed Explorer shell extensions for: ${options.group}`) - - if (options.refreshShell) { - await refreshShell() - } - - } else { - logger.info(`Registering Explorer shell extensions for group: ${options.group}`) - logger.info(`Target file types: ${IMAGE_EXTENSIONS.join(', ')}`) - - const entries = generateExplorerRegistryEntries(options.group) - - if (options.dry) { - logger.info('\n=== DRY RUN - Extensions that would be registered ===') - for (const ext of IMAGE_EXTENSIONS) { - logger.info(`\n${ext} files:`) - for (const cmd of EXPLORER_COMMANDS) { - logger.info(` → ${cmd.name}: ${cmd.command} ${cmd.args}`) - } - } - logger.info(`\nTotal registry entries: ${entries.length}`) - return - } - - await writeExplorerRegistryEntries(entries) - - logger.info(`\n=== Registration Complete ===`) - logger.info(`Registered ${EXPLORER_COMMANDS.length} commands for ${IMAGE_EXTENSIONS.length} file types`) - logger.info(`Total registry entries created: ${entries.length}`) - logger.info('\nExplorer context menu entries have been registered.') - - if (options.refreshShell) { - await refreshShell() - } else { - logger.info('You may need to log out and log back in to see the changes.') - } - } - - } catch (error) { - logger.error('Failed to register/unregister Explorer shell extensions:', error) + console.error('register-explorer is only supported on Windows.') process.exit(1) } + const exe = findMediaImg() + const args = process.argv.slice(2) + const r = spawnSync(exe, args, { stdio: 'inherit', shell: false, windowsHide: true }) + process.exit(r.status === null ? 1 : r.status) } cli.command(command, desc, builder, handler)