[Biojava-l] logo painter

Brian Gilman gilmanb@genome.wi.mit.edu
Fri, 11 Jan 2002 23:42:04 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--0-1626626373-1010810524=:1288
Content-Type: TEXT/PLAIN; charset=US-ASCII

Hello please find below some code I wrote to use the jpeg codec which is a
standard part of the java 1.3 package. There is also batik (svg) code in
there. Hopefully, you'll find this code helpful. 

				-Brian

-----------------------
Brian Gilman <gilmanb@genome.wi.mit.edu>
Sr. Software Engineer MIT/Whitehead Inst. Center for Genome Research
One Kendall Square, Bldg. 300 / Cambridge, MA 02139-1561 USA
phone +1 617  252 1069 / fax +1 617 252 1902


On Sat, 12 Jan 2002, Mark Schreiber wrote:

> Hi I have been meaning to post this for a while, It is some source for a
> logoPainter that I made for an upcomming bioinformatics paper regarding
> the correction for signals in a biased genome.
> 
> It is based on a Biojava-live (although perhaps a slightly earlier
> release so it made need the odd tweak) Anyhow it demonstrates some writing
> to Jpeg Tiff bmp etc. Uses the Java Advanced Image Library (JAI 1.1 from
> Sun). Please feel free to use / review the code as you see fit. Perhaps
> ask permission before selling it ;)
> 
> I would be happy for it to be made part of the CVS if people want. It
> could probably do with some peer review so to speak as it has a few rough
> edges in the code that others might be able to make more elegant.
> 
> Enjoy
> 
> Mark
> 
> 
> 
> On Fri, 11 Jan 2002, Bert Coessens wrote:
> 
> > Dear all,
> > 
> > Does anybody know how to write a graphics object to a jpeg file? I
> > already tried almost everything but still with no result. The code
> > beneath is what I think should work, but if I run it, I only get a black
> > image of 300 by 300. Can anybody tell me what I'm doing wrong?
> > 
> > * variable dist is some distance
> > * sLogo is not a null object, I can visualise it inside a JFrame object
> > 
> > code:
> >     {
> >         DistributionLogo sLogo = new DistributionLogo();
> >         TextLogoPainter logoPainter = new TextLogoPainter();
> >         sLogo.setLogoPainter(logoPainter);
> >         sLogo.setStyle(new DNAStyle());
> >         sLogo.setDistribution(dist);
> > 
> >         BufferedImage bufIm = new BufferedImage(300, 300,
> > BufferedImage.TYPE_INT_RGB);
> >         Graphics g = bufIm.createGraphics();
> >         logoPainter.paintLogo(g, sLogo);
> > 
> >         File outfile = new File("motif.jpeg");
> >         FileOutputStream outstream = new FileOutputStream(outfile);
> >         com.sun.image.codec.jpeg.JPEGImageEncoder encoder =
> > 
> > com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(outstream);
> >         encoder.encode(img);
> >     }
> > 
> > Thanks in advance!!
> > Bert
> > 
> > _______________________________________________
> > Biojava-l mailing list  -  Biojava-l@biojava.org
> > http://biojava.org/mailman/listinfo/biojava-l
> > 
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> Mark Schreiber			Ph: 64 3 4797875
> Rm 218				email mark_s@sanger.otago.ac.nz
> Department of Biochemistry
> University of Otago		
> PO Box 56
> Dunedin
> New Zealand
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> 

--0-1626626373-1010810524=:1288
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="ContigView.java"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.OSF.4.10.10201112342040.1288@darwin.wi.mit.edu>
Content-Description: 
Content-Disposition: attachment; filename="ContigView.java"

cGFja2FnZSBvcmcuZW5zZW1ibC5kcmF3Ow0KDQppbXBvcnQgamF2YXguc3dp
bmcuKjsNCmltcG9ydCBqYXZhLmF3dC4qOw0KaW1wb3J0IGphdmEuYXd0LmV2
ZW50Lio7DQppbXBvcnQgamF2YS5hd3QuaW1hZ2UuKjsNCmltcG9ydCBqYXZh
LmlvLio7DQoNCi8qKioqKioqKioqKioqKioqKioqDQogKiBGb3IgU1ZHIEdl
bmVyYXRpb24NCiAqIEFkZGVkIDEyLzA4LzAxDQogKioqKioqKioqKioqKioq
KioqKi8NCg0KaW1wb3J0IG9yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuLio7DQpp
bXBvcnQgb3JnLmFwYWNoZS5iYXRpay5kb20uKjsNCmltcG9ydCBvcmcudzNj
LmRvbS4qOw0KaW1wb3J0IG9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci4q
Ow0KaW1wb3J0IG9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci5pbWFnZS4q
Ow0KaW1wb3J0IG9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlLio7DQppbXBvcnQg
b3JnLmFwYWNoZS5mb3Auc3ZnLio7DQppbXBvcnQgb3JnLmFwYWNoZS5mb3Au
KjsNCg0KaW1wb3J0IGNvbS5zdW4uaW1hZ2UuY29kZWMuanBlZy4qOw0KDQoN
Cg0KLyoNCiAqIFdISVRFSEVBRCBJTlNUSVRVVEUNCiAqIFNPRlRXQVJFIENP
UFlSSUdIVCBOT1RJQ0UgQUdSRUVNRU5UDQogKiBUaGlzIHNvZnR3YXJlIGFu
ZCBpdHMgZG9jdW1lbnRhdGlvbiBhcmUgY29weXJpZ2h0IDIwMDEgYnkgdGhl
DQogKiBXaGl0ZWhlYWQgSW5zdGl0dXRlIGZvciBCaW9tZWRpY2FsIFJlc2Vh
cmNoLiAgQWxsIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQuDQogKg0KICogVGhpcyBz
b2Z0d2FyZSBpcyBzdXBwbGllZCB3aXRob3V0IGFueSB3YXJyYW50eSBvciBn
dWFyYW50ZWVkIHN1cHBvcnQNCiAqIHdoYXRzb2V2ZXIuICBUaGUgV2hpdGVo
ZWFkIEluc3RpdHV0ZSBjYW4gbm90IGJlIHJlc3BvbnNpYmxlIGZvciBpdHMN
CiAqIHVzZSwgbWlzdXNlLCBvciBmdW5jdGlvbmFsaXR5Lg0KICoNCiAqIFdl
IHdvdWxkIGxpa2UgdG8gdGhhbmsgRXdhbiBCaXJuZXkgYW5kIHRoZSBFbnNl
bWJsIHRlYW0gYXQgdGhlIFNhbmdlciBDZW50cmUNCiAqIGZvciBwcm92aWRp
bmcgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIHdoaWNoIHdhcyB1c2VkIGFz
IGEgdGVtcGxhdGUgZm9yIHRoaXMNCiAqIEFQSSBhbmQgY29kZSBiYXNlLg0K
ICoNCiAqQGF1dGhvciBKb2huIE1heWVyIGFuZCB0aGUgT21uaUdlbmUgdGVh
bQ0KICovDQoNCg0KcHVibGljIGNsYXNzIENvbnRpZ1ZpZXcgZXh0ZW5kcyBK
UGFuZWwgew0KDQogICAgcHVibGljIENocm9tUGFuZSBjaHJvbVBhbmU7DQog
ICAgcHVibGljIE92ZXJ2aWV3UGFuZSBvdmVydmlld1BhbmU7DQogICAgcHVi
bGljIERldGFpbGVkUGFuZSBkZXRhaWxlZFBhbmU7DQogICAgaW50IHdpZHRo
ID0gODAwOw0KICAgIE9tbmlWaWV3IGFwcEZyYW1lOw0KDQogICAgQ29udGln
VmlldyhPbW5pVmlldyBhcHBGcmFtZSkgew0KICAgICAgICB0aGlzLmFwcEZy
YW1lID0gYXBwRnJhbWU7DQogICAgICAgIHNldExheW91dChudWxsKTsNCiAg
ICAgICAgc2V0QmFja2dyb3VuZChDb2xvci53aGl0ZSk7DQogICAgICAgIGRl
dGFpbGVkUGFuZSA9IG5ldyBEZXRhaWxlZFBhbmUoYXBwRnJhbWUsdGhpcyk7
DQogICAgICAgIGNocm9tUGFuZSA9IG5ldyBDaHJvbVBhbmUoYXBwRnJhbWUs
dGhpcyxkZXRhaWxlZFBhbmUuc2VsUGFuZWwpOw0KICAgICAgICBvdmVydmll
d1BhbmUgPSBuZXcgT3ZlcnZpZXdQYW5lKGFwcEZyYW1lLHRoaXMsZGV0YWls
ZWRQYW5lLnNlbFBhbmVsKTsNCiAgICAgICAgZGV0YWlsZWRQYW5lLnJlZnJl
c2hDb25maWcoKTsNCiAgICAgICAgcG9zaXRpb24oKTsNCg0KICAgICAgICBQ
b3B1cE1hbmFnZXIgcG9wTWFuID0gbmV3IFBvcHVwTWFuYWdlcih0aGlzKTsN
CiAgICAgICAgYWRkTW91c2VMaXN0ZW5lcihwb3BNYW4pOw0KICAgICAgICBh
ZGRNb3VzZU1vdGlvbkxpc3RlbmVyKHBvcE1hbik7DQoNCiAgICAgICAgSk1l
bnVCYXIgbWJhciA9IG5ldyBKTWVudUJhcigpOw0KICAgICAgICBKTWVudSBm
aWxlTWVudSA9IG5ldyBKTWVudSgiRmlsZSIpOw0KICAgICAgICBKTWVudSBl
ZGl0TWVudSA9IG5ldyBKTWVudSgiRWRpdCIpOw0KICAgICAgICBKTWVudUl0
ZW0gZXhpdEl0ZW0gPSBuZXcgSk1lbnVJdGVtKCJFeGl0Iik7DQogICAgICAg
IEpNZW51SXRlbSBvcHRpb25JdGVtID0gbmV3IEpNZW51SXRlbSgiT3B0aW9u
cyIpOw0KICAgICAgICBKTWVudSBleHBvcnRJdGVtID0gbmV3IEpNZW51KCJF
eHBvcnQuLi4iKTsNCglKTWVudUl0ZW0gYXNTVkcgPSBuZXcgSk1lbnVJdGVt
KCJBcyBTVkciKTsNCglKTWVudUl0ZW0gYXNQREYgPSBuZXcgSk1lbnVJdGVt
KCJBcyBQREYiKTsNCglKTWVudUl0ZW0gYXNKUEVHID1uZXcgSk1lbnVJdGVt
KCJBcyBKUEVHIik7DQoJb3B0aW9uSXRlbS5hZGRBY3Rpb25MaXN0ZW5lcihu
ZXcgQ29uZmlndXJhdGlvbkhhbmRsZXIoYXBwRnJhbWUsIHRoaXMpICk7DQoJ
YXNTVkcuYWRkQWN0aW9uTGlzdGVuZXIobmV3IEV4cG9ydEhhbmRsZXIodGhp
cywgInN2ZyIpKTsNCglhc1BERi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgRXhw
b3J0SGFuZGxlcih0aGlzLCJwZGYiKSk7DQoJYXNKUEVHLmFkZEFjdGlvbkxp
c3RlbmVyKG5ldyBFeHBvcnRIYW5kbGVyKHRoaXMsImpwZWciKSk7DQoNCiAg
ICAgICAgYXBwRnJhbWUuc2V0Sk1lbnVCYXIobWJhcik7DQogICAgICAgIG1i
YXIuYWRkKGZpbGVNZW51KTsNCiAgICAgICAgbWJhci5hZGQoZWRpdE1lbnUp
Ow0KICAgICAgICBmaWxlTWVudS5hZGQoZXhwb3J0SXRlbSk7DQogICAgICAg
IGZpbGVNZW51LmFkZChleGl0SXRlbSk7DQoJZWRpdE1lbnUuYWRkKG9wdGlv
bkl0ZW0pOw0KCWV4cG9ydEl0ZW0uYWRkKGFzU1ZHKTsNCglleHBvcnRJdGVt
LmFkZChhc1BERik7DQoJZXhwb3J0SXRlbS5hZGQoYXNKUEVHKTsNCg0KCWV4
aXRJdGVtLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBBY3Rpb25MaXN0ZW5lcigp
IHsNCiAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFj
dGlvbkV2ZW50IGFlKSB7DQogICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgw
KTsNCiAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICB2
b2lkIHBvc2l0aW9uKCkgew0KICAgICAgICBEaW1lbnNpb24gY2hyb21EaW0g
PSBjaHJvbVBhbmUucGxhbm5lZFNpemUoKSwNCiAgICAgICAgICAgICAgICAg
IG92ZXJ2aWV3RGltID0gb3ZlcnZpZXdQYW5lLnBsYW5uZWRTaXplKCksDQog
ICAgICAgICAgICAgICAgICBkZXRhaWxlZERpbSA9IGRldGFpbGVkUGFuZS5w
bGFubmVkU2l6ZSgpOw0KDQogICAgICAgIGludCBvdmVydmlld1RvcCA9IGNo
cm9tRGltLmhlaWdodDsNCiAgICAgICAgaW50IGRldGFpbGVkdmlld1RvcCA9
IG92ZXJ2aWV3VG9wK292ZXJ2aWV3RGltLmhlaWdodDsNCiAgICAgICAgY2hy
b21QYW5lLnBvc2l0aW9uKDAsMCx3aWR0aCxjaHJvbURpbS5oZWlnaHQpOw0K
ICAgICAgICBvdmVydmlld1BhbmUucG9zaXRpb24oMCxvdmVydmlld1RvcCx3
aWR0aCxvdmVydmlld0RpbS5oZWlnaHQpOw0KICAgICAgICBkZXRhaWxlZFBh
bmUucG9zaXRpb24oMCxkZXRhaWxlZHZpZXdUb3Asd2lkdGgsZGV0YWlsZWRE
aW0uaGVpZ2h0KTsNCiAgICB9DQoNCiAgICBwdWJsaWMgUGFuZSBwYW5lSW5j
bHVkaW5nUG9pbnQoaW50IHgsIGludCB5KSB7DQogICAgICAgIERpbWVuc2lv
biBjaHJvbURpbSA9IGNocm9tUGFuZS5wbGFubmVkU2l6ZSgpLA0KICAgICAg
ICAgICAgICAgICAgb3ZlcnZpZXdEaW0gPSBvdmVydmlld1BhbmUucGxhbm5l
ZFNpemUoKSwNCiAgICAgICAgICAgICAgICAgIGRldGFpbGVkRGltID0gZGV0
YWlsZWRQYW5lLnBsYW5uZWRTaXplKCk7DQogICAgICAgIGludCBvdmVydmll
d1RvcCA9IGNocm9tRGltLmhlaWdodDsNCiAgICAgICAgaW50IGRldGFpbGVk
dmlld1RvcCA9IG92ZXJ2aWV3VG9wK292ZXJ2aWV3RGltLmhlaWdodDsNCiAg
ICAgICAgaWYgKG5ldyBSZWN0YW5nbGUoMCwwLHdpZHRoLGNocm9tRGltLmhl
aWdodCkuY29udGFpbnMoeCx5KSkNCiAgICAgICAgICAgIHJldHVybiBjaHJv
bVBhbmU7DQogICAgICAgIGlmIChuZXcgUmVjdGFuZ2xlKDAsb3ZlcnZpZXdU
b3Asd2lkdGgsb3ZlcnZpZXdEaW0uaGVpZ2h0KS5jb250YWlucyh4LHkpKQ0K
ICAgICAgICAgICAgcmV0dXJuIG92ZXJ2aWV3UGFuZTsNCiAgICAgICAgaWYg
KG5ldyBSZWN0YW5nbGUoMCxkZXRhaWxlZHZpZXdUb3Asd2lkdGgsZGV0YWls
ZWREaW0uaGVpZ2h0KS5jb250YWlucyh4LHkpKQ0KICAgICAgICAgICAgcmV0
dXJuIGRldGFpbGVkUGFuZTsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAg
fQ0KDQogICAgQnVmZmVyZWRJbWFnZSBidWZmZXJJbWFnZTsNCg0KICAgIHB1
YmxpYyB2b2lkIHBhaW50Q29tcG9uZW50KEdyYXBoaWNzIGcpIHsNCiAgICAg
ICAgc3VwZXIucGFpbnRDb21wb25lbnQoZyk7DQogICAgICAgIGlmIChwbGFu
bmVkU2l6ZSgpLmhlaWdodCA9PSAwKSByZXR1cm47DQogICAgICAgIGJ1ZmZl
ckltYWdlID0gbmV3IEJ1ZmZlcmVkSW1hZ2Uod2lkdGgscGxhbm5lZFNpemUo
KS5oZWlnaHQsIEJ1ZmZlcmVkSW1hZ2UuVFlQRV9JTlRfUkdCKTsNCiAgICAg
ICAgR3JhcGhpY3MgYnVmZmVyZyA9IGJ1ZmZlckltYWdlLmdldEdyYXBoaWNz
KCk7DQogICAgICAgIHN1cGVyLnBhaW50Q29tcG9uZW50KGJ1ZmZlcmcpOw0K
ICAgICAgICBjaHJvbVBhbmUucGFpbnQoYnVmZmVyZyk7DQogICAgICAgIG92
ZXJ2aWV3UGFuZS5wYWludChidWZmZXJnKTsNCiAgICAgICAgZGV0YWlsZWRQ
YW5lLnBhaW50KGJ1ZmZlcmcpOw0KICAgICAgICBnLmRyYXdJbWFnZShidWZm
ZXJJbWFnZSwwLDAsdGhpcyk7DQogICAgfQ0KDQogICAgcHVibGljIERpbWVu
c2lvbiBnZXRQcmVmZXJyZWRTaXplKCkgew0KICAgICAgICByZXR1cm4gcGxh
bm5lZFNpemUoKTsNCiAgICB9DQoNCiAgICBEaW1lbnNpb24gcGxhbm5lZFNp
emUoKSB7DQogICAgICAgIGludCBwbGFubmVkSGVpZ2h0ID0NCiAgICAgICAg
ICAgY2hyb21QYW5lLnBsYW5uZWRTaXplKCkuaGVpZ2h0ICArDQogICAgICAg
ICAgIG92ZXJ2aWV3UGFuZS5wbGFubmVkU2l6ZSgpLmhlaWdodCAgKw0KICAg
ICAgICAgICBkZXRhaWxlZFBhbmUucGxhbm5lZFNpemUoKS5oZWlnaHQ7DQog
ICAgICAgIHJldHVybiBuZXcgRGltZW5zaW9uKDgwMCxwbGFubmVkSGVpZ2h0
KTsNCiAgICB9DQoNCiAgIHB1YmxpYyB2b2lkIGV4cG9ydEFzU1ZHKCkgdGhy
b3dzIElPRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9u
LEZpbGVOb3RGb3VuZEV4Y2VwdGlvbnsNCg0KCS8vR2V0IGFuIGluc3RhbmNl
IG9mIGEgRE9NIHRyZWUgdG8gcmVwcmVzZW50IHRoZSBncmFwaGljcyBpbiB0
aGlzIHBhbmUNCglET01JbXBsZW1lbnRhdGlvbiBkb21JbXBsID0gR2VuZXJp
Y0RPTUltcGxlbWVudGF0aW9uLmdldERPTUltcGxlbWVudGF0aW9uKCk7DQoN
CgkvL0dldCBhbiBpbnN0YW5jZSBkb2N1bWVudA0KCURvY3VtZW50IGRvYyA9
IGRvbUltcGwuY3JlYXRlRG9jdW1lbnQobnVsbCwgInN2ZyIsIG51bGwpOw0K
DQoJLy9DcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYW4gU1ZHIEdlbmVyYXRvcg0K
CVNWR0dyYXBoaWNzMkQgc3ZnR2VuID0gbmV3IFNWR0dyYXBoaWNzMkQoZG9j
KTsNCg0KCS8vc2VuZCB0aGUgZ2VuZXRhdG9yIHRvIG91ciBwYWludCByb3V0
aW5lDQoNCgl0aGlzLnBhaW50Q29tcG9uZW50KHN2Z0dlbik7DQoNCgkvL25v
dyBzdHJlYW0gdGhpcyBhbGwgb3V0IGFzIFNWRw0KDQoJYm9vbGVhbiB1c2VD
U1MgPSB0cnVlOw0KDQoJV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1X
cml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oIi4vT3V0cHV0LnN2ZyIpLCAi
VVRGLTgiKTsNCg0KCXN2Z0dlbi5zdHJlYW0ob3V0LHVzZUNTUyk7DQoNCglv
dXQuY2xvc2UoKTsNCiAgIH0NCg0KICAgIHB1YmxpYyB2b2lkIGV4cG9ydEFz
SlBFRygpIHRocm93cyAgIElPRXhjZXB0aW9uLEZpbGVOb3RGb3VuZEV4Y2Vw
dGlvbnsNCg0KCU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0
cmVhbSgiT3V0cHV0LmpwZWciKTsNCg0KCUpQRUdJbWFnZUVuY29kZXIgZW5j
b2RlciA9IEpQRUdDb2RlYy5jcmVhdGVKUEVHRW5jb2RlcihvdXQpOw0KDQoJ
ZW5jb2Rlci5lbmNvZGUoYnVmZmVySW1hZ2UpOw0KDQoJb3V0LmZsdXNoKCk7
DQoJb3V0LmNsb3NlKCk7DQoNCiAgICB9DQoNCg0KICAgIHB1YmxpYyB2b2lk
IGV4cG9ydEFzUERGKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0
ZWRFbmNvZGluZ0V4Y2VwdGlvbixGaWxlTm90Rm91bmRFeGNlcHRpb24sVHJh
bnNjb2RlckV4Y2VwdGlvbnsNCg0KCS8vZmlyc3QgZXhwb3J0IHRoaXMgYXMg
YW4gU1ZHDQoJZXhwb3J0QXNTVkcoKTsNCg0KCS8vbm93IGdldCBpbiBpbnN0
YW5jZSBvZiBhIEpQRUcgdHJhbnNjb2Rlcg0KCVBERlRyYW5zY29kZXIgdCA9
IG5ldyBQREZUcmFuc2NvZGVyKCk7DQoNCgkvL3NldCBzb21lIHRyYW5zY29k
aW5nIGhpbnRzLi4uDQoJLy90LmFkZFRyYW5zY29kaW5nSGludChKUEVHVHJh
bnNjb2Rlci5LRVlfUVVBTElUWSwgbmV3IEZsb2F0KC44KSk7DQoJLy90LmFk
ZFRyYW5zY29kaW5nSGludChKUEVHVHJhbnNjb2Rlci5LRVlfV0lEVEgsIG5l
dyBJbnRlZ2VyKDEwMCkpOw0KDQoJLy9nZXQgdGhlIFNWR0ZpbGUgd2UgY3Jl
YXRlZA0KCVRyYW5zY29kZXJJbnB1dCBpbnB1dCA9IG5ldyBUcmFuc2NvZGVy
SW5wdXQobmV3IEZpbGUoIk91dHB1dC5zdmciKS50b1VSTCgpLnRvU3RyaW5n
KCkpOw0KDQoJLy9DcmVhdGUgYW4gb3V0cHV0DQoJT3V0cHV0U3RyZWFtIG9z
dHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiT3V0cHV0LnBkZiIpOw0K
CVRyYW5zY29kZXJPdXRwdXQgb3V0cHV0ID0gbmV3IFRyYW5zY29kZXJPdXRw
dXQob3N0cmVhbSk7DQoNCgkvL3NhdmUgdGhlIGltYWdlDQoJdC50cmFuc2Nv
ZGUoaW5wdXQsIG91dHB1dCk7DQoNCgkvL2ZsdXNoIGV2ZXJ5dGhpbmcgZG93
biB0aGUgcGlwZQ0KDQoJb3N0cmVhbS5mbHVzaCgpOw0KCW9zdHJlYW0uY2xv
c2UoKTsNCg0KDQogICAgfQ0KDQoNCg0KfQ0K
--0-1626626373-1010810524=:1288--