LyoKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKgogKiAkSWQ6IFN0cnVjdHVyYWxGZWF0dXJlLmphdmEsdiAxLjQgMjAwNC8wNi8wNiAwMTozNTowMiBraHVzc2V5IEV4cCAkCiAqLwpwYWNrYWdlIG9yZy5lY2xpcHNlLnVtbDI7CgoKLyoqCiAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CiAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlN0cnVjdHVyYWwgRmVhdHVyZTwvYj48L2VtPicuCiAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgogKgogKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KICogQSBzdHJ1Y3R1cmFsIGZlYXR1cmUgaXMgYSB0eXBlZCBmZWF0dXJlIG9mIGEgY2xhc3NpZmllciB0aGF0IHNwZWNpZnkgdGhlIHN0cnVjdHVyZSBvZiBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzaWZpZXIuIFN0cnVjdHVyYWwgZmVhdHVyZSBpcyBhbiBhYnN0cmFjdCBtZXRhY2xhc3MuIEJ5IHNwZWNpYWxpemluZyBtdWx0aXBsaWNpdHkgZWxlbWVudCwgaXQgc3VwcG9ydHMgYSBtdWx0aXBsaWNpdHkgdGhhdCBzcGVjaWZpZXMgdmFsaWQgY2FyZGluYWxpdGllcyBmb3IgdGhlIHNldCBvZiB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbnRpYXRpb24gb2YgdGhlIHN0cnVjdHVyYWwgZmVhdHVyZS4gCiAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KICoKICogPHA+CiAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKICogPHVsPgogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UudW1sMi5TdHJ1Y3R1cmFsRmVhdHVyZSNpc1JlYWRPbmx5IDxlbT5JcyBSZWFkIE9ubHk8L2VtPn08L2xpPgogKiA8L3VsPgogKiA8L3A+CiAqCiAqIEBzZWUgb3JnLmVjbGlwc2UudW1sMi5VTUwyUGFja2FnZSNnZXRTdHJ1Y3R1cmFsRmVhdHVyZSgpCiAqIEBtb2RlbCBhYnN0cmFjdD0idHJ1ZSIKICogQGdlbmVyYXRlZAogKi8KcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmFsRmVhdHVyZSBleHRlbmRzIEZlYXR1cmUsIFR5cGVkRWxlbWVudCwgTXVsdGlwbGljaXR5RWxlbWVudHsKCS8qKgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogQGdlbmVyYXRlZAoJICovCglTdHJpbmcgY29weXJpZ2h0ID0gIkNvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4iOyAvLyROT04tTkxTLTEkCgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBSZWFkIE9ubHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJmYWxzZSI8L2NvZGU+LgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDxwPgoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgUmVhZCBPbmx5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KCSAqIDwvcD4KCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgoJICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CgkgKiBTdGF0ZXMgd2hldGhlciB0aGUgZmVhdHVyZZJzIHZhbHVlIG1heSBiZSBtb2RpZmllZCBieSBhIGNsaWVudC4gRGVmYXVsdCBpcyBmYWxzZS4KCSAqIDwhLS0gZW5kLW1vZGVsLWRvYyAtLT4KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklzIFJlYWQgT25seTwvZW0+JyBhdHRyaWJ1dGUuCgkgKiBAc2VlICNzZXRJc1JlYWRPbmx5KGJvb2xlYW4pCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnVtbDIuVU1MMlBhY2thZ2UjZ2V0U3RydWN0dXJhbEZlYXR1cmVfSXNSZWFkT25seSgpCgkgKiBAbW9kZWwgZGVmYXVsdD0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLkJvb2xlYW4iIHZvbGF0aWxlPSJ0cnVlIgoJICogQGdlbmVyYXRlZAoJICovCglib29sZWFuIGlzUmVhZE9ubHkoKTsKCgkvKioKCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuU3RydWN0dXJhbEZlYXR1cmUjaXNSZWFkT25seSA8ZW0+SXMgUmVhZCBPbmx5PC9lbT59JyBhdHRyaWJ1dGUuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JcyBSZWFkIE9ubHk8L2VtPicgYXR0cmlidXRlLgoJICogQHNlZSAjaXNSZWFkT25seSgpCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCXZvaWQgc2V0SXNSZWFkT25seShib29sZWFuIHZhbHVlKTsKCn0gLy8gU3RydWN0dXJhbEZlYXR1cmUK