LyoKICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKICoKICogQ29udHJpYnV0b3JzOgogKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgogKgogKiAkSWQ6IEdlbmVyYWxpemF0aW9uU2V0LmphdmEsdiAxLjUuMi4xIDIwMDQvMDgvMjQgMDE6MDM6NDUga2h1c3NleSBFeHAgJAogKi8KcGFja2FnZSBvcmcuZWNsaXBzZS51bWwyOwoKaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKCi8qKgogKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgogKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HZW5lcmFsaXphdGlvbiBTZXQ8L2I+PC9lbT4nLgogKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KICoKICogPCEtLSBiZWdpbi1tb2RlbC1kb2MgLS0+CiAqIEVhY2ggR2VuZXJhbGl6YXRpb24gaXMgYSBiaW5hcnkgcmVsYXRpb25zaGlwIHRoYXQgcmVsYXRlcyBhIHNwZWNpZmljIENsYXNzaWZpZXIgdG8gYSBtb3JlIGdlbmVyYWwgQ2xhc3NpZmllciAoaS5lLiwgYSBzdWJjbGFzcykuIAogKiA8IS0tIGVuZC1tb2RlbC1kb2MgLS0+CiAqCiAqIDxwPgogKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CiAqIDx1bD4KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuR2VuZXJhbGl6YXRpb25TZXQjaXNDb3ZlcmluZyA8ZW0+SXMgQ292ZXJpbmc8L2VtPn08L2xpPgogKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UudW1sMi5HZW5lcmFsaXphdGlvblNldCNpc0Rpc2pvaW50IDxlbT5JcyBEaXNqb2ludDwvZW0+fTwvbGk+CiAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS51bWwyLkdlbmVyYWxpemF0aW9uU2V0I2dldFBvd2VydHlwZSA8ZW0+UG93ZXJ0eXBlPC9lbT59PC9saT4KICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuR2VuZXJhbGl6YXRpb25TZXQjZ2V0R2VuZXJhbGl6YXRpb25zIDxlbT5HZW5lcmFsaXphdGlvbjwvZW0+fTwvbGk+CiAqIDwvdWw+CiAqIDwvcD4KICoKICogQHNlZSBvcmcuZWNsaXBzZS51bWwyLlVNTDJQYWNrYWdlI2dldEdlbmVyYWxpemF0aW9uU2V0KCkKICogQG1vZGVsIAogKiBAZ2VuZXJhdGVkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIEdlbmVyYWxpemF0aW9uU2V0IGV4dGVuZHMgUGFja2FnZWFibGVFbGVtZW50ewoJLyoqCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAZ2VuZXJhdGVkCgkgKi8KCVN0cmluZyBjb3B5cmlnaHQgPSAiQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiI7IC8vJE5PTi1OTFMtMSQKCgkvKioKCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklzIENvdmVyaW5nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPHA+CgkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JcyBDb3ZlcmluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCgkgKiA8L3A+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIDwhLS0gYmVnaW4tbW9kZWwtZG9jIC0tPgoJICogSW5kaWNhdGVzICh2aWEgdGhlIGFzc29jaWF0ZWQgR2VuZXJhbGl6YXRpb25zKSB3aGV0aGVyIG9yIG5vdCB0aGUgc2V0IG9mIHNwZWNpZmljIENsYXNzaWZpZXJzIGFyZSBjb3ZlcmluZyBmb3IgYSBwYXJ0aWN1bGFyIGdlbmVyYWwgY2xhc3NpZmllci4gV2hlbiBpc0NvdmVyaW5nIGlzIHRydWUsIGV2ZXJ5IGluc3RhbmNlIG9mIGEgcGFydGljdWxhciBnZW5lcmFsIENsYXNzaWZpZXIgaXMgYWxzbyBhbiBpbnN0YW5jZSBvZiBhdCBsZWFzdCBvbmUgb2YgaXRzIHNwZWNpZmljIENsYXNzaWZpZXJzIGZvciB0aGUgR2VuZXJhbGl6YXRpb25TZXQuIFdoZW4gaXNDb3ZlcmluZyBpcyBmYWxzZSwgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiB0aGUgcGFydGljdWxhciBnZW5lcmFsIENsYXNzaWZpZXIgdGhhdCBhcmUgbm90IGluc3RhbmNlcyBvZiBhdCBsZWFzdCBvbmUgb2YgaXRzIHNwZWNpZmljIENsYXNzaWZpZXJzIGRlZmluZWQgZm9yIHRoZSBHZW5lcmFsaXphdGlvblNldC4gRm9yIGV4YW1wbGUsIFBlcnNvbiBjb3VsZCBoYXZlIHR3byBHZW5lcmFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGVhY2ggd2l0aCBhIGRpZmZlcmVudCBzcGVjaWZpYyBDbGFzc2lmaWVyOiBNYWxlIFBlcnNvbiBhbmQgRmVtYWxlIFBlcnNvbi4gVGhpcyBHZW5lcmFsaXphdGlvblNldCB3b3VsZCBiZSBjb3ZlcmluZyBiZWNhdXNlIGV2ZXJ5IGluc3RhbmNlIG9mIFBlcnNvbiB3b3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBNYWxlIFBlcnNvbiBvciBGZW1hbGUgUGVyc29uLiBJbiBjb250cmFzdCwgUGVyc29uIGNvdWxkIGhhdmUgYSB0aHJlZSBHZW5lcmFsaXphdGlvbiByZWxhdGlvbnNoaXBzIGludm9sdmluZyB0aHJlZSBzcGVjaWZpYyBDbGFzc2lmaWVyczogTm9ydGggQW1lcmljYW5QZXJzb24sIEFzaWFuIFBlcnNvbiwgYW5kIEV1cm9wZWFuIFBlcnNvbi4gVGhpcyBHZW5lcmFsaXphdGlvblNldCB3b3VsZCBub3QgYmUgY292ZXJpbmcgYmVjYXVzZSB0aGVyZSBhcmUgaW5zdGFuY2VzIG9mIFBlcnNvbiBmb3Igd2hpY2ggdGhlc2UgdGhyZWUgc3BlY2lmaWMgQ2xhc3NpZmllcnMgZG8gbm90IGFwcGx5LiBUaGUgZmlyc3QgZXhhbXBsZSwgdGhlbiwgY291bGQgYmUgcmVhZDogYW55IFBlcnNvbiB3b3VsZCBiZSBzcGVjaWFsaXplZCBhcyBlaXRoZXIgYmVpbmcgYSBNYWxlIFBlcnNvbiBvciBhIEZlbWFsZSBQZXJzb26XYW5kIG5vdGhpbmcgZWxzZTsgdGhlIHNlY29uZCBjb3VsZCBiZSByZWFkOiBhbnkgUGVyc29uIHdvdWxkIGJlIHNwZWNpYWxpemVkIGFzIGJlaW5nIE5vcnRoIEFtZXJpY2FuIFBlcnNvbiwgQXNpYW4gUGVyc29uLCBFdXJvcGVhbiBQZXJzb24sIG9yIHNvbWV0aGluZyBlbHNlLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgQ292ZXJpbmc8L2VtPicgYXR0cmlidXRlLgoJICogQHNlZSAjc2V0SXNDb3ZlcmluZyhib29sZWFuKQoJICogQHNlZSBvcmcuZWNsaXBzZS51bWwyLlVNTDJQYWNrYWdlI2dldEdlbmVyYWxpemF0aW9uU2V0X0lzQ292ZXJpbmcoKQoJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLkJvb2xlYW4iIHZvbGF0aWxlPSJ0cnVlIgoJICogQGdlbmVyYXRlZAoJICovCglib29sZWFuIGlzQ292ZXJpbmcoKTsKCgkvKioKCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuR2VuZXJhbGl6YXRpb25TZXQjaXNDb3ZlcmluZyA8ZW0+SXMgQ292ZXJpbmc8L2VtPn0nIGF0dHJpYnV0ZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIENvdmVyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KCSAqIEBzZWUgI2lzQ292ZXJpbmcoKQoJICogQGdlbmVyYXRlZAoJICovCgl2b2lkIHNldElzQ292ZXJpbmcoYm9vbGVhbiB2YWx1ZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JcyBEaXNqb2ludDwvYj48L2VtPicgYXR0cmlidXRlLgoJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KCSAqIDxwPgoJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SXMgRGlzam9pbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgoJICogPC9wPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiA8IS0tIGJlZ2luLW1vZGVsLWRvYyAtLT4KCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2V0IG9mIHNwZWNpZmljIENsYXNzaWZpZXJzIGluIGEgR2VuZXJhbGl6YXRpb24gcmVsYXRpb25zaGlwIGhhdmUgaW5zdGFuY2UgaW4gY29tbW9uLiBJZiBpc0Rpc2pvaW50IGlzIHRydWUsIHRoZSBzcGVjaWZpYyBDbGFzc2lmaWVycyBmb3IgYSBwYXJ0aWN1bGFyIEdlbmVyYWxpemF0aW9uU2V0IGhhdmUgbm8gbWVtYmVycyBpbiBjb21tb247IHRoYXQgaXMsIHRoZWlyIGludGVyc2VjdGlvbiBpcyBlbXB0eS4gSWYgaXNEaXNqb2ludCBpcyBmYWxzZSwgdGhlIHNwZWNpZmljIENsYXNzaWZpZXJzIGluIGEgcGFydGljdWxhciBHZW5lcmFsaXphdGlvblNldCBoYXZlIG9uZSBvciBtb3JlIG1lbWJlcnMgaW4gY29tbW9uOyB0aGF0IGlzLCB0aGVpciBpbnRlcnNlY3Rpb24gaXMgbm90IGVtcHR5LiBGb3IgZXhhbXBsZSwgUGVyc29uIGNvdWxkIGhhdmUgdHdvIEdlbmVyYWxpemF0aW9uIHJlbGF0aW9uc2hpcHMsIGVhY2ggd2l0aCB0aGUgZGlmZmVyZW50IHNwZWNpZmljIENsYXNzaWZpZXI6IE1hbmFnZXIgb3IgU3RhZmYuIFRoaXMgd291bGQgYmUgZGlzam9pbnQgYmVjYXVzZSBldmVyeSBpbnN0YW5jZSBvZiBQZXJzb24gbXVzdCBlaXRoZXIgYmUgYSBNYW5hZ2VyIG9yIFN0YWZmLiBJbiBjb250cmFzdCwgUGVyc29uIGNvdWxkIGhhdmUgdHdvIEdlbmVyYWxpemF0aW9uIHJlbGF0aW9uc2hpcHMgaW52b2x2aW5nIHR3byBzcGVjaWZpYyAoYW5kIG5vbi1jb3ZlcmluZykgQ2xhc3NpZmllcnM6IFNhbGVzIFBlcnNvbiBhbmQgTWFuYWdlci4gVGhpcyBHZW5lcmFsaXphdGlvbi0gU2V0IHdvdWxkIG5vdCBiZSBkaXNqb2ludCBiZWNhdXNlIHRoZXJlIGFyZSBpbnN0YW5jZXMgb2YgUGVyc29uIHdoaWNoIGNhbiBiZSBhIFNhbGVzIFBlcnNvbiBhbmQgYSBNYW5hZ2VyLgoJICogPCEtLSBlbmQtbW9kZWwtZG9jIC0tPgoJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SXMgRGlzam9pbnQ8L2VtPicgYXR0cmlidXRlLgoJICogQHNlZSAjc2V0SXNEaXNqb2ludChib29sZWFuKQoJICogQHNlZSBvcmcuZWNsaXBzZS51bWwyLlVNTDJQYWNrYWdlI2dldEdlbmVyYWxpemF0aW9uU2V0X0lzRGlzam9pbnQoKQoJICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS51bWwyLkJvb2xlYW4iIHZvbGF0aWxlPSJ0cnVlIgoJICogQGdlbmVyYXRlZAoJICovCglib29sZWFuIGlzRGlzam9pbnQoKTsKCgkvKioKCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuR2VuZXJhbGl6YXRpb25TZXQjaXNEaXNqb2ludCA8ZW0+SXMgRGlzam9pbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklzIERpc2pvaW50PC9lbT4nIGF0dHJpYnV0ZS4KCSAqIEBzZWUgI2lzRGlzam9pbnQoKQoJICogQGdlbmVyYXRlZAoJICovCgl2b2lkIHNldElzRGlzam9pbnQoYm9vbGVhbiB2YWx1ZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3dlcnR5cGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KCSAqIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLnVtbDIuQ2xhc3NpZmllciNnZXRQb3dlcnR5cGVFeHRlbnRzIDxlbT5Qb3dlcnR5cGUgRXh0ZW50PC9lbT59Jy4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8cD4KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvd2VydHlwZTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCgkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCgkgKiA8L3A+CgkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvd2VydHlwZTwvZW0+JyByZWZlcmVuY2UuCgkgKiBAc2VlICNzZXRQb3dlcnR5cGUoQ2xhc3NpZmllcikKCSAqIEBzZWUgb3JnLmVjbGlwc2UudW1sMi5VTUwyUGFja2FnZSNnZXRHZW5lcmFsaXphdGlvblNldF9Qb3dlcnR5cGUoKQoJICogQHNlZSBvcmcuZWNsaXBzZS51bWwyLkNsYXNzaWZpZXIjZ2V0UG93ZXJ0eXBlRXh0ZW50cwoJICogQG1vZGVsIG9wcG9zaXRlPSJwb3dlcnR5cGVFeHRlbnQiCgkgKiBAZ2VuZXJhdGVkCgkgKi8KCUNsYXNzaWZpZXIgZ2V0UG93ZXJ0eXBlKCk7CgoJLyoqCgkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS51bWwyLkdlbmVyYWxpemF0aW9uU2V0I2dldFBvd2VydHlwZSA8ZW0+UG93ZXJ0eXBlPC9lbT59JyByZWZlcmVuY2UuCgkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3dlcnR5cGU8L2VtPicgcmVmZXJlbmNlLgoJICogQHNlZSAjZ2V0UG93ZXJ0eXBlKCkKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJdm9pZCBzZXRQb3dlcnR5cGUoQ2xhc3NpZmllciB2YWx1ZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmFsaXphdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCgkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UudW1sMi5HZW5lcmFsaXphdGlvbn0uCgkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS51bWwyLkdlbmVyYWxpemF0aW9uI2dldEdlbmVyYWxpemF0aW9uU2V0cyA8ZW0+R2VuZXJhbGl6YXRpb24gU2V0PC9lbT59Jy4KCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CgkgKiA8cD4KCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYWxpemF0aW9uPC9lbT4nIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAoJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgoJICogPC9wPgoJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmFsaXphdGlvbjwvZW0+JyByZWZlcmVuY2UgbGlzdC4KCSAqIEBzZWUgb3JnLmVjbGlwc2UudW1sMi5VTUwyUGFja2FnZSNnZXRHZW5lcmFsaXphdGlvblNldF9HZW5lcmFsaXphdGlvbigpCgkgKiBAc2VlIG9yZy5lY2xpcHNlLnVtbDIuR2VuZXJhbGl6YXRpb24jZ2V0R2VuZXJhbGl6YXRpb25TZXRzCgkgKiBAbW9kZWwgdHlwZT0ib3JnLmVjbGlwc2UudW1sMi5HZW5lcmFsaXphdGlvbiIgb3Bwb3NpdGU9ImdlbmVyYWxpemF0aW9uU2V0IiBvcmRlcmVkPSJmYWxzZSIKCSAqIEBnZW5lcmF0ZWQKCSAqLwoJRUxpc3QgZ2V0R2VuZXJhbGl6YXRpb25zKCk7Cgp9IC8vIEdlbmVyYWxpemF0aW9uU2V0Cg==