[ic] Use of Image::Magick (was interchange and external perl packages)

Jonathan Clark interchange-users@icdevgroup.org
Tue Dec 3 09:20:01 2002


> I'm trying to build a UserTag that has to use an external
> library.  I'm not
> all that familiar with interchange as of yet being that I just got moved
> into this project, but here's what I've written so far:

[snip]

Whilst we are on the subject of Image::Magick, I wrote a usertag which uses
it. Here's what it does:

  * Takes an image. (file or blob)

  * Generates an image of specified width, height, or both (maintaining
aspect ratio).

  * Allows a logo to be placed over this image (again file or blob) for
branding.

  * If you want, it generates a thumbnail (without logo) of defined width,
or height, or both (maintaining aspect ratio again).

  * Allows a border of specified color and width to be put around both the
image and/or the thumb.

  * Allows specification of output file type, according to the filename.

  * accepts the inputs from the CGI inputs, without having to pass them
directly to the tag.

I'm not that clever really - Image::Magick does all the _real_ work. The
trickyest bit is making sure the image is right when you set both the width
and height.

There is a demo at http://ic.webmaint.net/cgi-bin/ic/test/image-store.html
for you to play with.

The tag, and the demo page are attached.

have fun!

Jonathan.





begin 666 image-store.tag
M57-E<E1A9R!I;6%G92US=&]R92!/<F1E<@T*57-E<E1A9R!I;6%G92US=&]R
M92!A9&1!='1R#0I5<V5R5&%G(&EM86=E+7-T;W)E($1O8W5M96YT871I;VX@
M/#Q%3T0-"B,]:&5A9#$@3D%-10T*(PT*(UMI;6%G92US=&]R95T-"B,-"B,]
M:&5A9#$@4UE.3U!325,-"B,-"B,@(%MI;6%G92US=&]R90T*(R @"0EO=71F
M:6QE/2)F:6QE<&%T:"(-"B,)"6-G:3TQ*@T*(PD)8F=C;VQO<CTH(G=H:71E
M(GPB(V9F9F9F9B(I#0HC"0EA;&EG;CTH(DYO<G1H5V5S=")\(DYO<G1H(GPB
M3F]R=&A%87-T(GPB5V5S=")\(D-E;G1E<B)\(D5A<W0B?")3;W5T:%=E<W0B
M?")3;W5T:")\(E-O=71H16%S="(I*@T*(PT*(PD):6UG8FQO8CU"3$]"#0HC
M"0EI;6=F:6QE/2)F:6QE<&%T:"(J#0HC"0EI;6=W:61T:#U.*@T*(PD):6UG
M:&5I9VAT/4XJ#0HC"0EI;6=B;W)D97)C;VQO<CTH(F)L86-K(GPB(S P,# P
M,"(I*@T*(PD):6UG8F]R9&5R=VED=&@]3BH-"B,)"6EM9V)O<F1E<FAE:6=H
M=#U.*@T*(PT*(PD);&]G;V9I;&4](F9I;&5P871H(BH-"B,)"6QO9V]B;&]B
M/4),3T(J#0HC"0EL;V=O86QI9VX]*").;W)T:%=E<W0B?").;W)T:")\(DYO
M<G1H16%S=")\(E=E<W0B?")#96YT97(B?")%87-T(GPB4V]U=&A797-T(GPB
M4V]U=&@B?")3;W5T:$5A<W0B*2H-"B,)"6QO9V]C;VUP;W-E/2@B3W9E<B)\
M(DEN(GPB3W5T(GPB071O<")\(EAO<B)\(E!L=7,B?")-:6YU<R)\(D%D9")\
M(E-U8G1R86-T(GPB1&EF9F5R96YC92)\(DUU;'1I<&QY(GPB0G5M<&UA<")\
M(D-O<'DB?")#;W!Y4F5D(GPB0V]P>4=R965N(GPB0V]P>4)L=64B?")#;W!Y
M36%T=&4B?")$:7-S;VQV92)\(D-L96%R(GPB1&ES<&QA8V4B?")-;V1U;&%T
M92)\(E1H<F5S:&]L9"(I*@T*(PT*(PD)=&UB9FEL93TB9FEL97!A=&@B*@T*
M(PD)=&UB=VED=&@]3BH-"B,)"71M8FAE:6=H=#U.*@T*(PD)=&UB8F]R9&5R
M8V]L;W(]*")B;&%C:R)\(B,P,# P,# B*2H-"B,)"71M8F)O<F1E<G=I9'1H
M/4XJ#0HC"0ET;6)B;W)D97)H96EG:'0]3BH-"B,-"B,)"75M87-K/2<P,C(G
M*@T*(PE=#0HC#0HC/6AE860Q($1%4T-225!424].#0HC#0HC(%1H92!;:6UA
M9V4M<W1O<F5=('1A9R!T86ME<R!A;B!I;6%G92 H9FEL92!O<B!B;&]B*2!A
M;F0@#0HC(&UA;FEP=6QA=&5S(&ET('1O(&=E;F5R871E(&%N(&EM86=E(&]F
M('-P96-I9FEE9"!W:61T:"P@:&5I9VAT+" -"B,@;W(@8F]T:" H;6%I;G1A
M:6YI;F<@87-P96-T(')A=&EO*2X@270@86QS;R!A;&QO=W,@82!L;V=O('1O
M(&)E( T*(R!P;&%C960@;W9E<B!T:&ES(&EM86=E("AA9V%I;B!F:6QE(&]R
M(&)L;V(I+B!);B!A;&P@8V%S97,L(&$-"B,@<W5P<&QI960@8FQO8B!I;G!U
M="!T86ME<R!P<F5C:61E;F-E(&]V97(@82!S=7!P;&EE9"!F:6QE('!A=&@N
M#0HC( T*(R!)9B!T:&4@:6YP=70@:6UA9V4@:7,@82!D:69F97)E;G0@<VAA
M<&4@=&\@=&AE(&]U='!U="!O;F4L#0HC(%MI;6%G92US=&]R95T@8W)E871E
M<R!A(&YE=R!I;6%G92!O9B!T:&4@87!P<F]P<FEA=&4@<VEZ92P@86YD( T*
M(R!B86-K9W)O=6YD(&-O;&]R+"!A;F0@=&AE;B!P;&%C97,@=&AE(&EN<'5T
M(&EM86=E(&]N(&ET('=I=&@-"B,@86QI9VYM96YT(&%C8V]R9&EN9R!T;R G
M86QI9VXG+@T*(R -"B,@268@<F5Q=6ER960L(&ET(&=E;F5R871E<R!A('1H
M=6UB;F%I;" H=VET:&]U="!L;V=O*2!O9B!D969I;F5D( T*(R!W:61T:"P@
M;W(@:&5I9VAT+"!O<B!B;W1H("AM86EN=&%I;FEN9R!A<W!E8W0@<F%T:6\I
M+B!4:&4@<V%M92 -"B,@86QI9VYM96YT(')U;&5S(&%S('1H92!I;6%G92!A
M<F4@87!P;&EE9"!T;R!T:&4@=&AU;6)N86EL+@T*(PT*(R!)="!I<R!A;'-O
M('!O<W-I8FQE('1O('-P96-I9GD@82!B;W)D97(@8V]L;W(@86YD('=I9'1H
M('1O(&)E( T*(R!P;&%C960@87)O=6YD(&)O=&@@=&AE(&EM86=E(&%N9"]O
M<B!T:&4@=&AU;6(N(%EO=2!C86X@<W!E8VEF>0T*(R!T:&4@=VED=&@@*&%N
M9"]O<B!H96EG:'0I(&EN('!I>&5L<RP@86YD('1H92!C;VQO<B H9&5F875L
M=',@=&\@#0HC(&)L86-K*2X-"B,-"B,@5&AE(&]U='!U="!F:6QE(&YA;64G
M<R!F:6QE(&5X=&5N<VEO;B!W:6QL(&1E9FEN92!T:&4@:6UA9V4@='EP92X-
M"B,-"B,@06QL(&9I;&4@<&%T:',@87)E(')E;&%T:79E('1O('1H92!);G1E
M<F-H86YG92!C871A;&]G(')O;W0N#0HC#0I%3T0-"@T*57-E<E1A9R!I;6%G
M92US=&]R92!2;W5T:6YE(#P\14]2#0IS=6(@>PT*"75S92!);6%G93HZ36%G
M:6-K.PT*#0H);7D@*"1O<'0I(#T@0%\[#0H-"@EM>2 H)'=I9'1H+" D:&5I
M9VAT+" D:6YW:61T:"P@)&EN:&5I9VAT+" D97)R+" D=&UB*3L-"@T*"6UY
M($!M87!D:7)E8W0@/2!Q=R\-"@D)"6)G8V]L;W(-"@D)"6=R879I='D-"@D)
M"6EM9V)L;V(-"@D)"6EM9V9I;&4-"@D)"6EM9W=I9'1H#0H)"0EI;6=H96EG
M:'0-"@D)"6EM9V)O<F1E<F-O;&]R#0H)"0EI;6=B;W)D97)W:61T: T*"0D)
M:6UG8F]R9&5R:&5I9VAT#0H)"0EL;V=O9FEL90T*"0D);&]G;V)L;V(-"@D)
M"6QO9V]A;&EG;@T*"0D);&]G;V-O;7!O<V4-"@D)"71M8F9I;&4-"@D)"71M
M8G=I9'1H#0H)"0ET;6)H96EG:'0-"@D)"71M8F)O<F1E<F-O;&]R#0H)"0ET
M;6)B;W)D97)W:61T: T*"0D)=&UB8F]R9&5R:&5I9VAT#0H)"0EU;6%S:PT*
M"0D)>65S#0H)"0EN;PT*"2\[#0H-"@EI9B@D;W!T+3Y[8V=I?2D@>PT*"0EF
M;W(H0&UA<&1I<F5C="D@>PT*"0D);F5X="!I9B A(&1E9FEN960@)$-'22T^
M>R1??3L-"@D)"21O<'0M/GLD7WT@/2 D0T=)+3Y[)%]].PT*"0E]#0H)?0T*
M#0H))&]P="T^>WEE<WT@/2 D;W!T+3Y[>65S?2!\?" Q.PT*"21O<'0M/GMN
M;WT@/2 D;W!T+3Y[;F]]('Q\("<G.PT*"21O<'0M/GMB9V-O;&]R?2 ]("1O
M<'0M/GMB9V-O;&]R?2!\?" G=VAI=&4G.PT*"21O<'0M/GMA;&EG;GT@/2 D
M;W!T+3Y[86QI9VY]('Q\("=C96YT97(G.PT*"21O<'0M/GMU;6%S:WT@/2 D
M;W!T+3Y[=6UA<VM]('Q\("<P,C(G.PT*"0T*#0H):68@*"@D;W!T+3Y[:6UG
M:&5I9VAT?2 \(#$I('Q\("@D;W!T+3Y[:6UG=VED=&A](#P@,2DI('L-"@D)
M;&]G17)R;W(H(EMI;6%G92US=&]R95T@97)R;W(Z('-I;&QY(&EM9W=I9'1H
M(&]R(&EM9VAE:6=H=#H@*"5S('@@)7,I(BP@)&]P="T^>VEM9W=I9'1H?2P@
M)&]P="T^>VEM9VAE:6=H='TI.PT*"0ER971U<FX@)&]P="T^>VYO?3L-"@E]
M#0H-"@EM>2 D:6UA9V5?:6X@/2!);6%G93HZ36%G:6-K+3YN97<[#0H);7D@
M)&EM86=E7V]U=" ]($EM86=E.CI-86=I8VLM/FYE=SL-"@T*"2,@86-C97!T
M(&EN<'5T(&]F(&EM86=E(&1A=&$N#0H):68@*"1O<'0M/GMI;6=B;&]B?2D@
M>PT*"0DD97)R(#T@)&EM86=E7VEN+3Y";&]B5&]);6%G92@D;W!T+3Y[:6UG
M8FQO8GTI.PT*"0EI9B H)&5R<BD@>PT*"0D);&]G17)R;W(H(EMI;6%G92US
M=&]R95T@26UA9V4Z.DUA9VEC:R!E<G)O<CH@)7,B+" D97)R*3L-"@D)"7)E
M='5R;B D;W!T+3Y[;F]].PT*"0E]#0H)?2!E;'-I9B H)&]P="T^>VEM9V9I
M;&5]*2![#0H)"6UY("1F;B ]("1O<'0M/GMI;6=F:6QE?3L-"@D))&9N(#U^
M(',O7"Y<+B\O9SL-"@D))&9N(#T@(B1#;VYF:6<M/GM696YD4F]O='TO)&9N
M(CL-"@D))&5R<B ]("1I;6%G95]I;BT^4F5A9"@D9FXI.PT*"0EI9B H)&5R
M<BD@>PT*"0D);&]G17)R;W(H(EMI;6%G92US=&]R95T@26UA9V4Z.DUA9VEC
M:R!E<G)O<CH@)7,B+" D97)R*3L-"@D)"7)E='5R;B D;W!T+3Y[;F]].PT*
M"0E]#0H)?2!E;'-E('L-"@D);&]G17)R;W(H(EMI;6%G92US=&]R95T@97)R
M;W(Z(&YO(&EN<'5T(&9I;&4@;W(@8FQO8BXB*3L-"@D)<F5T=7)N("1O<'0M
M/GMN;WT[#0H)?0T*#0H)*"1I;G=I9'1H+" D:6YH96EG:'0I(#T@)&EM86=E
M7VEN+3Y'970H)W=I9'1H)RP@)VAE:6=H="<I.PT*"6EF("@H)&EN=VED=&@@
M/" Q*2!\?" H)&EN:&5I9VAT(#P@,2DI('L-"@D);&]G17)R;W(H(F5R<F]R
M(&%C8V5P=&EN9R!I;6%G93H@=VED=&@])7,L(&AE:6=H=#TE<R(L("1W:61T
M:"P@)&AE:6=H="D[#0H)"7)E='5R;B D;W!T+3Y[;F]].PT*"7T-"@T*"2,@
M;6%K92!A(&-O<'D@:6X@8V%S92!W92!M87D@;F5E9"!I="!F;W(@=&AE('1H
M=6UB+BX-"@EM>2 D:6UG7V-O<'D@/2 D:6UA9V5?:6XM/D-L;VYE*"D[#0H-
M"@DC(&EF(&%N(&EM9W=I9'1H(&%N9"!I;6=H96EG:'0@87)E(&)O=&@@<W!E
M8VEF:65D+"!W92!C<F5A=&4@=&AE(&EM86=E(&5X86-T;'D@=&AA="!S:7IE
M+BX-"@EI9B H*"1O<'0M/GMI;6=H96EG:'1](#X@,"D@)B8@*"1O<'0M/GMI
M;6=W:61T:'T@/B P*2D@>PT*"0DD97)R(#T@)&EM86=E7V]U="T^4V5T*'-I
M>F4]/B(D;W!T+3Y[:6UG=VED=&A]>"1O<'0M/GMI;6=H96EG:'1](BD[#0H)
M"6EF("@D97)R*2![#0H)"0EL;V=%<G)O<B@B6VEM86=E+7-T;W)E72!);6%G
M93HZ36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)<F5T=7)N("1O<'0M
M/GMN;WT[#0H)"7T-"@D))&5R<B ]("1I;6%G95]O=70M/E)E860H(GAC.B1O
M<'0M/GMB9V-O;&]R?2(I.PT*"0EI9B H)&5R<BD@>PT*"0D);&]G17)R;W(H
M(EMI;6%G92US=&]R95T@26UA9V4Z.DUA9VEC:R!E<G)O<CH@)7,B+" D97)R
M*3L-"@D)"7)E='5R;B D;W!T+3Y[;F]].PT*"0E]#0H)"21E<G(@/2 D:6UA
M9V5?:6XM/E-E="AB86-K9W)O=6YD/3XB)&]P="T^>V)G8V]L;W)](BD[#0H)
M"6EF("@D97)R*2![#0H)"0EL;V=%<G)O<B@B6VEM86=E+7-T;W)E72!);6%G
M93HZ36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)<F5T=7)N("1O<'0M
M/GMN;WT[#0H)"7T-"@T*"0EM>2 D>')A=&EO(#T@)&EN=VED=&@@+R D;W!T
M+3Y[:6UG=VED=&A].PT*"0EM>2 D>7)A=&EO(#T@)&EN:&5I9VAT("\@)&]P
M="T^>VEM9VAE:6=H='T[#0H-"@D):68@*"@D>')A=&EO(#X@,2D@)B8@*"1X
M<F%T:6\@/B D>7)A=&EO*2E[#0H)"0DC('-C86QE('=I9'1H('1O(&9I="XN
M#0H)"0DD:&5I9VAT(#T@)&EN:&5I9VAT("\@)'AR871I;SL-"@D)"21E<G(@
M/2 D:6UA9V5?:6XM/E-C86QE* EW:61T:#T^(B1O<'0M/GMI;6=W:61T:'TB
M+ T*"0D)"0D)"6AE:6=H=#T^(B1H96EG:'0B*3L-"@D)"6EF("@D97)R*2![
M#0H)"0D);&]G17)R;W(H(EMI;6%G92US=&]R95T@26UA9V4Z.DUA9VEC:R!E
M<G)O<CH@)7,B+" D97)R*3L-"@D)"0ER971U<FX@)&]P="T^>VYO?3L-"@D)
M"7T-"@D)?2!E;'-I9B H*"1Y<F%T:6\@/B Q*2 F)B H)'ER871I;R ^("1X
M<F%T:6\I*7L-"@D)"2,@<V-A;&4@:&5I9VAT('1O(&9I="XN#0H)"0DD=VED
M=&@@/2 D:6YW:61T:" O("1Y<F%T:6\[#0H)"0DD97)R(#T@)&EM86=E7VEN
M+3Y38V%L92@):&5I9VAT/3XB)&]P="T^>VEM9VAE:6=H='TB+ T*"0D)"0D)
M"7=I9'1H/3XB)'=I9'1H(BD[#0H)"0EI9B H)&5R<BD@>PT*"0D)"6QO9T5R
M<F]R*");:6UA9V4M<W1O<F5=($EM86=E.CI-86=I8VL@97)R;W(Z("5S(BP@
M)&5R<BD[#0H)"0D)<F5T=7)N("1O<'0M/GMN;WT[#0H)"0E]#0H)"7T-"@T*
M"0DD97)R(#T@)&EM86=E7V]U="T^0V]M<&]S:71E* EI;6%G93T^)&EM86=E
M7VEN+" -"@D)"0D)"6=R879I='D]/B(D;W!T+3Y[86QI9VY](BD[#0H)"6EF
M("@D97)R*2![#0H)"0EL;V=%<G)O<B@B6VEM86=E+7-T;W)E72!);6%G93HZ
M36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)<F5T=7)N("1O<'0M/GMN
M;WT[#0H)"7T-"@T*"7T@96QS92![#0H-"@D):68@*"1O<'0M/GMI;6=W:61T
M:'T@/B P*2![#0H)"0EM>2 D>')A=&EO(#T@)&EN=VED=&@@+R D;W!T+3Y[
M:6UG=VED=&A].PT*"0D))&AE:6=H=" ]("1I;FAE:6=H=" O("1X<F%T:6\[
M#0H)"0DD97)R(#T@)&EM86=E7VEN+3Y38V%L92@)=VED=&@]/B(D;W!T+3Y[
M:6UG=VED=&A](BP-"@D)"0D)"0EH96EG:'0]/B(D:&5I9VAT(BD[#0H)"0EI
M9B H)&5R<BD@>PT*"0D)"6QO9T5R<F]R*");:6UA9V4M<W1O<F5=($EM86=E
M.CI-86=I8VL@97)R;W(Z("5S(BP@)&5R<BD[#0H)"0D)<F5T=7)N("1O<'0M
M/GMN;WT[#0H)"0E]#0H)"7T@96QS:68@*"1O<'0M/GMI;6=H96EG:'1](#X@
M,"D@>PT*"0D);7D@)'ER871I;R ]("1I;FAE:6=H=" O("1O<'0M/GMI;6=H
M96EG:'1].PT*"0D))'=I9'1H(#T@)&EN=VED=&@@+R D>7)A=&EO.PT*"0D)
M)&5R<B ]("1I;6%G95]I;BT^4V-A;&4H"6AE:6=H=#T^(B1O<'0M/GMI;6=H
M96EG:'1](BP-"@D)"0D)"0EW:61T:#T^(B1W:61T:"(I.PT*"0D):68@*"1E
M<G(I('L-"@D)"0EL;V=%<G)O<B@B6VEM86=E+7-T;W)E72!);6%G93HZ36%G
M:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)"7)E='5R;B D;W!T+3Y[;F]]
M.PT*"0D)?0T*"0E]#0H)"21E<G(@/2 D:6UA9V5?;W5T+3Y3970H)VUA9VEC
M:R<@/3X@)&EM86=E7VEN+3Y'970H)VUA9VEC:R<I*3L-"@D):68@*"1E<G(I
M('L-"@D)"6QO9T5R<F]R*");:6UA9V4M<W1O<F5=($EM86=E.CI-86=I8VL@
M97)R;W(Z("5S(BP@)&5R<BD[#0H)"0ER971U<FX@)&]P="T^>VYO?3L-"@D)
M?0T*"7T-"@T*"2,@;F]W('=E(&-R96%T92!A('1H=6UB;F%I;"!I9B!W92!W
M97)E(&%S:V5D('1O+BX-"@EI9B H)&]P="T^>W1M8F9I;&5]*2![#0H)"21O
M<'0M/GMT;6)W:61T:'T@/2 D;W!T+3Y[=&UB=VED=&A]('Q\(#DV.PT*"0DD
M;W!T+3Y[=&UB:&5I9VAT?2 ]("1O<'0M/GMT;6)H96EG:'1]('Q\("@H)&]P
M="T^>VEM9VAE:6=H='T@+R D;W!T+3Y[:6UG=VED=&A]*2 J("1O<'0M/GMT
M;6)W:61T:'TI.PT*#0H)"2@D=VED=&@L("1H96EG:'0I(#T@)&EM86=E7V]U
M="T^1V5T*"=W:61T:"<L("=H96EG:'0G*3L-"@T*"0DC(&EF('1H92!I;G!U
M="!I;6%G92!I<R!S;6%L;&5R('1H86X@=&AE(&]U='!U="!O;F4L( T*"0DC
M('=E('5S92!T:&4@:6YP=70@;VYE('-O('1H92!C;VYT96YT(&]F('1H92!T
M:'5M8B!I<R!B:6=G97(N+@T*#0H)"21T;6(@/2!);6%G93HZ36%G:6-K+3YN
M97<[#0H-"@D))&5R<B ]("1T;6(M/E-E="AS:7IE/3XB)&]P="T^>W1M8G=I
M9'1H?7@D;W!T+3Y[=&UB:&5I9VAT?2(I.PT*"0EI9B H)&5R<BD@>PT*"0D)
M;&]G17)R;W(H(EMI;6%G92US=&]R95T@26UA9V4Z.DUA9VEC:R!E<G)O<CH@
M)7,B+" D97)R*3L-"@D)"7)E='5R;B D;W!T+3Y[;F]].PT*"0E]#0H)"21E
M<G(@/2 D=&UB+3Y296%D*")X8SHD;W!T+3Y[8F=C;VQO<GTB*3L-"@D):68@
M*"1E<G(I('L-"@D)"6QO9T5R<F]R*");:6UA9V4M<W1O<F5=($EM86=E.CI-
M86=I8VL@97)R;W(Z("5S(BP@)&5R<BD[#0H)"0ER971U<FX@)&]P="T^>VYO
M?3L-"@D)?0T*"0DD97)R(#T@)'1M8BT^4V5T*&)A8VMG<F]U;F0]/B(D;W!T
M+3Y[8F=C;VQO<GTB*3L-"@D):68@*"1E<G(I('L-"@D)"6QO9T5R<F]R*");
M:6UA9V4M<W1O<F5=($EM86=E.CI-86=I8VL@97)R;W(Z("5S(BP@)&5R<BD[
M#0H)"0ER971U<FX@)&]P="T^>VYO?3L-"@D)?0T*#0H)"6UY("1X<F%T:6\@
M/2 D:6YW:61T:" O("1O<'0M/GMT;6)W:61T:'T[#0H)"6UY("1Y<F%T:6\@
M/2 D:6YH96EG:'0@+R D;W!T+3Y[=&UB:&5I9VAT?3L-"@T*"0EI9B H*"1X
M<F%T:6\@/CT@,2D@)B8@*"1X<F%T:6\@/CT@)'ER871I;RDI>PT*"0D)(R!S
M8V%L92!W:61T:"!T;R!F:70N+@T*"0D))&AE:6=H=" ]("1I;FAE:6=H=" O
M("1X<F%T:6\[#0H)"0DD97)R(#T@)&EM9U]C;W!Y+3Y38V%L92@):&5I9VAT
M/3XB)&AE:6=H="(L#0H)"0D)"0D)=VED=&@]/B(D;W!T+3Y[=&UB=VED=&A]
M(BD[#0H)"0EI9B H)&5R<BD@>PT*"0D)"6QO9T5R<F]R*");:6UA9V4M<W1O
M<F5=($EM86=E.CI-86=I8VL@97)R;W(Z("5S(BP@)&5R<BD[#0H)"0D)<F5T
M=7)N("1O<'0M/GMN;WT[#0H)"0E]#0H)"7T@96QS:68@*"@D>7)A=&EO(#X@
M,2D@)B8@*"1Y<F%T:6\@/B D>')A=&EO*2E[#0H)"0DC('-C86QE(&AE:6=H
M="!T;R!F:70N+@T*"0D))'=I9'1H(#T@)&EN=VED=&@@+R D>7)A=&EO.PT*
M"0D))&5R<B ]("1I;6=?8V]P>2T^4V-A;&4H"6AE:6=H=#T^(B1O<'0M/GMT
M;6)H96EG:'1](BP-"@D)"0D)"0EW:61T:#T^(B1W:61T:"(I.PT*"0D):68@
M*"1E<G(I('L-"@D)"0EL;V=%<G)O<B@B6VEM86=E+7-T;W)E72!);6%G93HZ
M36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)"7)E='5R;B D;W!T+3Y[
M;F]].PT*"0D)?0T*"0E]#0H-"@D))&5R<B ]("1T;6(M/D-O;7!O<VET92@)
M:6UA9V4]/B1I;6=?8V]P>2P@#0H)"0D)"6=R879I='D]/B(D;W!T+3Y[86QI
M9VY](BD[#0H)"6EF("@D97)R*2![#0H)"0EL;V=%<G)O<B@B6VEM86=E+7-T
M;W)E72!);6%G93HZ36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)<F5T
M=7)N("1O<'0M/GMN;WT[#0H)"7T-"@T*"0DC(&%D9"!A(&)O<F1E<BXN#0H)
M"6EF("@D;W!T+3Y[=&UB8F]R9&5R=VED=&A]*7L-"@D)"21O<'0M/GMT;6)B
M;W)D97)C;VQO<GT@/2 D;W!T+3Y[=&UB8F]R9&5R8V]L;W)]('Q\("<C,# P
M,# P)SL-"@D)"21O<'0M/GMT;6)B;W)D97)H96EG:'1](#T@)&]P="T^>W1M
M8F)O<F1E<FAE:6=H='T@?'P@)&]P="T^>W1M8F)O<F1E<G=I9'1H?3L-"@D)
M"21E<G(@/2 D=&UB+3Y";W)D97(H"7=I9'1H/3XB)&]P="T^>W1M8F)O<F1E
M<G=I9'1H?2(L#0H)"0D)"0EH96EG:'0]/B(D;W!T+3Y[=&UB8F]R9&5R:&5I
M9VAT?2(L#0H)"0D)"0EF:6QL/3XB)&]P="T^>W1M8F)O<F1E<F-O;&]R?2(L
M#0H)"0D)"0DI.PT*"0D):68@*"1E<G(I('L-"@D)"0EL;V=%<G)O<B@B6VEM
M86=E+7-T;W)E72!);6%G93HZ36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*
M"0D)"7)E='5R;B D;W!T+3Y[;F]].PT*"0D)?0T*"0E]#0H)"6UY("1F;B ]
M("1O<'0M/GMT;6)F:6QE?3L-"@D))&9N(#U^(',O7"Y<+B\O9SL-"@D))&9N
M(#T@(B1#;VYF:6<M/GM696YD4F]O='TO)&9N(CL-"@D))&]P="T^>W5M87-K
M?2 ]('5M87-K(&]C="@D;W!T+3Y[=6UA<VM]*3L-"@D))&5R<B ]("1T;6(M
M/E=R:71E*"1F;BD[#0H)"21O<'0M/GMU;6%S:WT@/2!U;6%S:R!O8W0H)&]P
M="T^>W5M87-K?2D[#0H)"6EF("@D97)R*2![#0H)"0EL;V=%<G)O<B@B6VEM
M86=E+7-T;W)E72!);6%G93HZ36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*
M"0D)<F5T=7)N("1O<'0M/GMN;WT[#0H)"7T-"@E]#0H-"@DC(&YO=R!S=7!E
M<FEM<&]S92!A(&QO9V\@;VX@=&AE(&UA:6X@:6UA9V4@:68@=V4@=V5R92!A
M<VME9"!T;RXN#0H):68@*"1O<'0M/GML;V=O9FEL97T@?'P@)&]P="T^>VQO
M9V]B;&]B?2E[#0H)"21O<'0M/GML;V=O8V]M<&]S97T@/2 D;W!T+3Y[;&]G
M;V-O;7!O<V5]('Q\("=O=F5R)SL-"@D))&]P="T^>VQO9V]A;&EG;GT@/2 D
M;W!T+3Y[;&]G;V%L:6=N?2!\?" G4V]U=&A%87-T)SL-"@D);7D@)&QO9V\@
M/2!);6%G93HZ36%G:6-K+3YN97<[#0H-"@D):68@*"1O<'0M/GML;V=O8FQO
M8GTI('L-"@D)"21E<G(@/2 D;&]G;RT^0FQO8E1O26UA9V4H)&]P="T^>VQO
M9V]B;&]B?2D[#0H)"0EI9B H)&5R<BD@>PT*"0D)"6QO9T5R<F]R*");:6UA
M9V4M<W1O<F5=($EM86=E.CI-86=I8VL@97)R;W(Z("5S(BP@)&5R<BD[#0H)
M"0D)<F5T=7)N("1O<'0M/GMN;WT[#0H)"0E]#0H)"7T@96QS:68@*"1O<'0M
M/GML;V=O9FEL97TI('L-"@D)"6UY("1F;B ]("1O<'0M/GML;V=O9FEL97T[
M#0H)"0DD9FX@/7X@<R]<+EPN+R]G.PT*"0D))&9N(#T@(B1#;VYF:6<M/GM6
M96YD4F]O='TO)&9N(CL-"@D)"21E<G(@/2 D;&]G;RT^4F5A9"@D9FXI.PT*
M"0D):68@*"1E<G(I('L-"@D)"0EL;V=%<G)O<B@B6VEM86=E+7-T;W)E72!)
M;6%G93HZ36%G:6-K(&5R<F]R.B E<R(L("1E<G(I.PT*"0D)"7)E='5R;B D
M;W!T+3Y[;F]].PT*"0D)?0T*"0E]#0H-"@D)(R!S=7!E<FEM<&]S92!O;B!T
M:&4@;6%I;B!I;6%G92XN#0H)"21E<G(@/2 D:6UA9V5?;W5T+3Y#;VUP;W-I
M=&4H"6EM86=E/3XD;&]G;RP-"@D)"0D)"6-O;7!O<V4]/B(D;W!T+3Y[;&]G
M;V-O;7!O<V5](BP-"@D)"0D)"6=R879I='D]/B(D;W!T+3Y[;&]G;V%L:6=N
M?2(L#0H)"0D)"0DI.PT*"0EI9B H)&5R<BD@>PT*"0D);&]G17)R;W(H(EMI
M;6%G92US=&]R95T@26UA9V4Z.DUA9VEC:R!E<G)O<CH@)7,B+" D97)R*3L-
M"@D)"7)E='5R;B D;W!T+3Y[;F]].PT*"0E]#0H)?0T*#0H)(R!A9&0@82!B
M;W)D97(N+@T*"6EF("@D;W!T+3Y[:6UG8F]R9&5R=VED=&A]*7L-"@D))&]P
M="T^>VEM9V)O<F1E<F-O;&]R?2 ]("1O<'0M/GMI;6=B;W)D97)C;VQO<GT@
M?'P@)R,P,# P,# G.PT*"0DD;W!T+3Y[:6UG8F]R9&5R:&5I9VAT?2 ]("1O
M<'0M/GMI;6=B;W)D97)H96EG:'1]('Q\("1O<'0M/GMI;6=B;W)D97)W:61T
M:'T[#0H)"21E<G(@/2 D:6UA9V5?;W5T+3Y";W)D97(H"7=I9'1H/3XB)&]P
M="T^>VEM9V)O<F1E<G=I9'1H?2(L#0H)"0D)"0EH96EG:'0]/B(D;W!T+3Y[
M:6UG8F]R9&5R:&5I9VAT?2(L#0H)"0D)"0EF:6QL/3XB)&]P="T^>VEM9V)O
M<F1E<F-O;&]R?2(L#0H)"0D)"0DI.PT*"0EI9B H)&5R<BD@>PT*"0D);&]G
M17)R;W(H(EMI;6%G92US=&]R95T@26UA9V4Z.DUA9VEC:R!E<G)O<CH@)7,B
M+" D97)R*3L-"@D)"7)E='5R;B D;W!T+3Y[;F]].PT*"0E]#0H)?0T*#0H)
M(R!F:6YA;&QY+"!W<FET92!T:&4@;6%I;B!I;6%G92!T;R!F:6QE+BX-"@EM
M>2 D9FX@/2 D;W!T+3Y[;W5T9FEL97T[#0H))&9N(#U^(',O7"Y<+B\O9SL-
M"@DD9FX@/2 B)$-O;F9I9RT^>U9E;F12;V]T?2\D9FXB.PT*"21O<'0M/GMU
M;6%S:WT@/2!U;6%S:R!O8W0H)&]P="T^>W5M87-K?2D[#0H))&5R<B ]("1I
M;6%G95]O=70M/E=R:71E*"1F;BD[#0H))&]P="T^>W5M87-K?2 ]('5M87-K
M(&]C="@D;W!T+3Y[=6UA<VM]*3L-"@EI9B H)&5R<BD@>PT*"0EL;V=%<G)O
M<B@B6VEM86=E+7-T;W)E72!);6%G93HZ36%G:6-K(&5R<F]R.B E<R(L("1E
M<G(I.PT*"0ER971U<FX@)&]P="T^>VYO?3L-"@E]#0H-"@ER971U<FX@)&]P
1="T^>WEE<WT[#0I]#0I%3U(`
`
end
end

begin 666 image-store.html
M/&AT;6P^#0H\:&5A9#X\=&ET;&4^26UA9V4@<W1O<F4@=&5S=#PO=&ET;&4^
M/"]H96%D/@T*/&)O9'D^#0H-"EMT;7 @9FYA;65=6V1A=&$@<V5S<VEO;B!I
M9%TN6V-G:2!I;6=F:6QE97AT75LO=&UP70T*6W1M<"!T;6)N86UE75MD871A
M('-E<W-I;VX@:61==&UB+EMC9VD@=&UB9FEL965X=%U;+W1M<%T-"EMP97)L
M70T*:68@*"1#1TDM/GMC<F5A=&5]*7L-"@EM>2 H)&QO9V]B;&]B*3L-"@EI
M9B H)%1A9RT^=F%L=65?97AT96YD960H>PEN86UE(#T^("=I;6%G93$G+ T*
M"0D)"0ET97-T(#T^"2=I<V9I;&4G+ T*"0D)"7TI*2![#0H)"6UY("1F;F%M
M92 ]("138W)A=&-H+3Y[9FYA;65].PT*"0EM>2 D=&UB;F%M92 ]("138W)A
M=&-H+3Y[=&UB;F%M97T[#0H)"6UY("1I;6=B;&]B(#T@)%1A9RT^=F%L=65?
M97AT96YD960H>PEN86UE(#T^("=I;6%G93$G+ T*"0D)"0D)"0EF:6QE7V-O
M;G1E;G1S(#T^(#$L?2D[#0H-"@D):68@*"1486<M/G9A;'5E7V5X=&5N9&5D
M*'L);F%M92 ]/B G:6UA9V4R)RP-"@D)"0D)"71E<W0@/3X))VES9FEL92<L
M#0H)"0D)"7TI*7L-"@D)"21L;V=O8FQO8B ]("1486<M/G9A;'5E7V5X=&5N
M9&5D*'L);F%M92 ]/B G:6UA9V4R)RP-"@D)"0D)"0D)9FEL95]C;VYT96YT
M<R ]/B Q+'TI.PT*"0E]#0H)"0EM>2 D<G1N=F%L(#T@)%1A9RT^:6UA9V5?
M<W1O<F4H>V]U=&9I;&4@"3T^"2=H=&1O8W,O=&5S="\G("X@)&9N86UE+ T*
M"0D)"0D)"6-G:0D]/B Q+ T*#0HC"0D)"0D):6UG=VED=&@)/3X))$-'22T^
M>VEM9W=I9'1H?2P-"B,)"0D)"0EI;6=H96EG:'0)/3X))$-'22T^>VEM9VAE
M:6=H='TL#0H)"0D)"0EI;6=B;&]B"0D]/@DB)&EM9V)L;V(B+ T*(PD)"0D)
M"6)G8V]L;W()"3T^"21#1TDM/GMB9V-O;&]R?2P-"@D)"0D)"71M8F9I;&4)
M"3T^"2=H=&1O8W,O=&5S="\G("X@)'1M8FYA;64L#0H)"0D)"0EL;V=O8FQO
M8@D]/@DB)&QO9V]B;&]B(BP-"@D)"0D)"6QO9V]F:6QE"3T^"2=H=&1O8W,O
M=&5S="]I;6=L;V=O+G!N9R<L#0HC"0D)"0D);&]G;V%L:6=N"3T^"21#1TDM
M/GML;V=O86QI9VY]+ T*(PD)"0D)"6QO9V]C;VUP;W-E"3T^"21#1TDM/GML
M;V=O8V]M<&]S97TL#0HC"0D)"0D):6UG8F]R9&5R=VED=&@)/3X))$-'22T^
M>VEM9V)O<F1E<G=I9'1H?2P-"B,)"0D)"0EI;6=B;W)D97)H96EG:'0)/3X)
M)$-'22T^>VEM9V)O<F1E<FAE:6=H='TL#0HC"0D)"0D):6UG8F]R9&5R8V]L
M;W()/3X))$-'22T^>VEM9V)O<F1E<F-O;&]R?2P-"B,)"0D)"0ET;6)W:61T
M: D]/@DD0T=)+3Y[=&UB=VED=&A]+ T*(PD)"0D)"71M8FAE:6=H= D]/@DD
M0T=)+3Y[=&UB:&5I9VAT?2P-"B,)"0D)"0ET;6)B;W)D97)W:61T: D]/@DD
M0T=)+3Y[=&UB8F]R9&5R=VED=&A]+ T*(PD)"0D)"71M8F)O<F1E<FAE:6=H
M= D]/@DD0T=)+3Y[=&UB8F]R9&5R:&5I9VAT?2P-"B,)"0D)"0ET;6)B;W)D
M97)C;VQO<@D]/@DD0T=)+3Y[=&UB8F]R9&5R8V]L;W)]+ T*#0H-"@D)"0E]
M*3L-"@T*"0ER971U<FX@)W1A9R!F86EL960@+2!C:&5C:R!E<G)O<B!L;V<A
M)R!U;FQE<W,@)')T;G9A;#L-"@E](&5L<V4@>PT*"0ER971U<FX@)TY/5"!!
M($9)3$4A)SL-"@E]#0I]#0H)<F5T=7)N.PT*6R]P97)L70T*#0I;:68@0T=)
M(&-R96%T95T-"CQT86)L92!C96QL<&%D9&EN9STB-"(^/'1R/CQT9"!B9V-O
M;&]R/2(C9F9C8V-C(CX-"@D\:6UG('-R8STB+W1E<W0O6W-C<F%T8V@@9FYA
M;65=/UMD871A('-E<W-I;VX@=&EM95TB/@T*/"]T9#X\+W1R/@T*/'1R/CQT
M9"!B9V-O;&]R/2(C9F9C8V-C(B!A;&EG;CTB8V5N=&5R(CX-"@D\:6UG('-R
M8STB+W1E<W0O6W-C<F%T8V@@=&UB;F%M95T_6V1A=&$@<V5S<VEO;B!T:6UE
M72(^#0H\+W1D/CPO='(^#0H\+W1A8FQE/@T*6R]I9ET-"CQT86)L93X-"CQF
M;W)M(&%C=&EO;CTB6V%R96$@0$!-5E]004=%0$!=(B!M971H;V0](G!O<W0B
M(&YA;64](F9O<FUU<&1A=&4B(&5N8W1Y<&4](FUU;'1I<&%R="]F;W)M+61A
M=&$B/@T*/'1R/CQT9"!C;VQS<&%N/2(R(CX\8CY);6%G93H\+V(^/"]T9#X\
M+W1R/@T*/'1R/CQT9#X-"@D\:6YP=70@='EP93TB:&ED9&5N(B!N86UE/2)M
M=E]S97-S:6]N7VED(B!V86QU93TB6V1A=&$@<V5S<VEO;B!I9%TB/@T*"3QI
M;G!U="!T>7!E/2)H:61D96XB(&YA;64](F-R96%T92(@=F%L=64](C$B/@T*
M#0H)57!L;V%D(&EM86=E.B -"CPO=&0^/'1D/@T*"3QI;G!U="!T>7!E/2)F
M:6QE(B!N86UE/2)I;6%G93$B/@T*/"]T9#X\+W1R/@T*/'1R/CQT9#X-"@E7
M:61T:#H@#0H\+W1D/CQT9#X-"@D\:6YP=70@='EP93TB=&5X="(@;F%M93TB
M:6UG=VED=&@B('9A;'5E/2(S,# B/@T*/"]T9#X\+W1R/@T*/'1R/CQT9#X-
M"@E(96EG:'0Z#0H\+W1D/CQT9#X-"@D\:6YP=70@='EP93TB=&5X="(@;F%M
M93TB:6UG:&5I9VAT(B!V86QU93TB,C P(CX-"CPO=&0^/"]T<CX-"CQT<CX\
M=&0^#0H)0F]R9&5R('=I9'1H.@T*/"]T9#X\=&0^#0H)/&EN<'5T('1Y<&4]
M(G1E>'0B(&YA;64](FEM9V)O<F1E<G=I9'1H(B!V86QU93TB(CX-"CPO=&0^
M/"]T<CX-"CQT<CX\=&0^#0H)0F]R9&5R(&-O;&]R.@T*/"]T9#X\=&0^#0H)
M/&EN<'5T('1Y<&4](G1E>'0B(&YA;64](FEM9V)O<F1E<F-O;&]R(B!V86QU
M93TB(CX-"CPO=&0^/"]T<CX-"CQT<CX\=&0^#0H)57!L;V%D($QO9V\Z#0H\
M+W1D/CQT9#X-"@D\:6YP=70@='EP93TB9FEL92(@;F%M93TB:6UA9V4R(CX-
M"CPO=&0^/"]T<CX-"CQT<CX\=&0^#0H)3&]G;R!!;&EG;FUE;G0Z#0H\+W1D
M/CQT9#X-"@D\<V5L96-T(&YA;64](FQO9V]A;&EG;B(^#0H)"3QO<'1I;VX@
M=F%L=64](DYO<G1H5V5S="(^3F]R=&A797-T#0H)"3QO<'1I;VX@=F%L=64]
M(DYO<G1H(CY.;W)T: T*"0D\;W!T:6]N('9A;'5E/2).;W)T:$5A<W0B/DYO
M<G1H16%S= T*"0D\;W!T:6]N('9A;'5E/2)797-T(CY797-T#0H)"3QO<'1I
M;VX@=F%L=64](D-E;G1E<B(^0V5N=&5R#0H)"3QO<'1I;VX@=F%L=64](D5A
M<W0B/D5A<W0-"@D)/&]P=&EO;B!V86QU93TB4V]U=&A797-T(CY3;W5T:%=E
M<W0-"@D)/&]P=&EO;B!V86QU93TB4V]U=&@B/E-O=71H#0H)"3QO<'1I;VX@
M=F%L=64](E-O=71H16%S="(^4V]U=&A%87-T#0H)/"]S96QE8W0^#0H\+W1D
M/CPO='(^#0H\='(^/'1D/@T*"4QO9V\@0V]M<&]S93H-"CPO=&0^/'1D/@T*
M"3QS96QE8W0@;F%M93TB;&]G;V-O;7!O<V4B/@T*6VQO;W @;&ES=#TB3W9E
M<BQ);BQ/=70L071O<"Q8;W(L4&QU<RQ-:6YU<RQ!9&0L4W5B=')A8W0L1&EF
M9F5R96YC92Q-=6QT:7!L>2Q"=6UP;6%P+$-O<'DL0V]P>5)E9"Q#;W!Y1W)E
M96XL0V]P>4)L=64L0V]P>4UA='1E+$1I<W-O;'9E+$-L96%R+$1I<W!L86-E
M+$UO9'5L871E+%1H<F5S:&]L9")=#0H)"3QO<'1I;VX@=F%L=64](EML;V]P
M+6-O9&5=(CY;;&]O<"UC;V1E70T*6R]L;V]P70T*"3PO<V5L96-T/@T*/"]T
M9#X\+W1R/@T*/'1R/CQT9#X-"@E/=71P=70@87,Z#0H\+W1D/CQT9#X-"@D\
M<V5L96-T(&YA;64](FEM9V9I;&5E>'0B/@T*"0D\;W!T:6]N('9A;'5E/2)J
M<&<B/BYJ<&<-"@D)/&]P=&EO;B!V86QU93TB<&YG(CXN<&YG#0H)"3QO<'1I
M;VX@=F%L=64](F=I9B(^+F=I9@T*"3PO<V5L96-T/@T*#0H\+W1D/CPO='(^
M#0H\='(^/'1D(&-O;'-P86X](C(B/CQB/E1H=6UB.CPO8CX\+W1D/CPO='(^
M#0H\='(^/'1D/@T*"5=I9'1H.B -"CPO=&0^/'1D/@T*"3QI;G!U="!T>7!E
M/2)T97AT(B!N86UE/2)T;6)W:61T:"(@=F%L=64](B(^#0H\+W1D/CPO='(^
M#0H\='(^/'1D/@T*"4AE:6=H=#H-"CPO=&0^/'1D/@T*"3QI;G!U="!T>7!E
M/2)T97AT(B!N86UE/2)T;6)H96EG:'0B('9A;'5E/2(B/@T*/"]T9#X\+W1R
M/@T*/'1R/CQT9#X-"@E";W)D97(@=VED=&@Z#0H\+W1D/CQT9#X-"@D\:6YP
M=70@='EP93TB=&5X="(@;F%M93TB=&UB8F]R9&5R=VED=&@B('9A;'5E/2(B
M/@T*/"]T9#X\+W1R/@T*/'1R/CQT9#X-"@E";W)D97(@8V]L;W(Z#0H\+W1D
M/CQT9#X-"@D\:6YP=70@='EP93TB=&5X="(@;F%M93TB=&UB8F]R9&5R8V]L
M;W(B('9A;'5E/2(B/@T*/"]T9#X\+W1R/@T*/'1R/CQT9#X-"@E/=71P=70@
M87,Z#0H\+W1D/CQT9#X-"@D\<V5L96-T(&YA;64](G1M8F9I;&5E>'0B/@T*
M"0D\;W!T:6]N('9A;'5E/2)J<&<B/BYJ<&<-"@D)/&]P=&EO;B!V86QU93TB
M<&YG(CXN<&YG#0H)"3QO<'1I;VX@=F%L=64](F=I9B(^+F=I9@T*"3PO<V5L
M96-T/@T*#0H\+W1D/CPO='(^#0H\='(^/'1D/@T*"4)O<F1E<F%C:V=R;W5N
M9"!C;VQO<CH\8G(^*&9O<B!B;W1H*0T*/"]T9#X\=&0^#0H)/&EN<'5T('1Y
M<&4](G1E>'0B(&YA;64](F)G8V]L;W(B('9A;'5E/2(B/@T*/"]T9#X\+W1R
M/@T*/"]T86)L93X-"@D\:6YP=70@='EP93TB<W5B;6ET(B!V86QU93TB1V5N
M97)A=&4@26UA9V5S(CX-"CQP/@T*"4EF('EO=2!D;VXG="!U<&QO860@82!L
M;V=O(&9I;&4L('1H:7,@;VYE('=I;&P@8F4@=7-E9#H@#0H)/&EM9R!S<F,]
M(B]T97-T+VEM9VQO9V\N<&YG(CX-"CPO<#X-"@T*#0H\+V9O<FT^#0H-"@T*
`
end
end