LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAogKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAogKgogKiBDb250cmlidXRvcnM6CiAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICogICAgIFN2ZW4gTfxsbGVyIC0gQWRkZWQgdGlsaW5nIHN1cHBvcnQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnBhY2thZ2Ugb3JnLmVjbGlwc2UuZHJhdzJkOwoKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7CmltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJpbnRpbmcuUHJpbnRlcjsKaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7CgppbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKCi8qKgogKiBDbGFzcyByZXNwb25zaWJsZSBmb3IgcHJpbnRpbmcgRmlndXJlcy4KICogCiAqIEBhdXRob3IgRGFuIExlZQogKiBAYXV0aG9yIEVyaWMgQm9yZGVhdQogKiBAYXV0aG9yIFN2ZW4gTfxsbGVyCiAqLwpwdWJsaWMgY2xhc3MgUHJpbnRGaWd1cmVPcGVyYXRpb24gZXh0ZW5kcyBQcmludE9wZXJhdGlvbiB7CgoJLyoqCgkgKiBUaGUgZGVmYXVsdCBwcmludCBtb2RlLiBQcmludHMgYXQgMTAwJSBzY2FsZSBhbmQgdGlsZXMgaG9yaXpvbnRhbGx5CgkgKiBhbmQvb3IgdmVydGljYWxseSwgaWYgbmVjZXNzYXJ5LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSUxFID0gMTsKCS8qKgoJICogQSBwcmludCBtb2RlIHRoYXQgc2NhbGVzIHRoZSBwcmludGVyIGdyYXBoaWNzIHNvIHRoYXQgdGhlIGVudGlyZSBwcmludGVkCgkgKiBpbWFnZSBmaXRzIG9uIG9uZSBwYWdlLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVRfUEFHRSA9IDI7CgkvKioKCSAqIEEgcHJpbnQgbW9kZSB0aGF0IHNjYWxlcyB0aGUgcHJpbnRlciBncmFwaGljcyBzbyB0aGF0IHRoZSB3aWR0aCBvZiB0aGUKCSAqIHByaW50ZWQgaW1hZ2UgZml0cyBvbiBvbmUgcGFnZSBhbmQgdGlsZXMgdmVydGljYWxseSwgaWYgbmVjZXNzYXJ5LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVRfV0lEVEggPSAzOwoJLyoqCgkgKiBBIHByaW50IG1vZGUgdGhhdCBzY2FsZXMgdGhlIHByaW50ZXIgZ3JhcGhpY3Mgc28gdGhhdCB0aGUgaGVpZ2h0IG9mIHRoZQoJICogcHJpbnRlZCBpbWFnZSBmaXRzIG9uIG9uZSBwYWdlIGFuZCB0aWxlcyBob3Jpem9udGFsbHksIGlmIG5lY2Vzc2FyeS4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklUX0hFSUdIVCA9IDQ7CgoJcHJpdmF0ZSBJRmlndXJlIHByaW50U291cmNlOwoJcHJpdmF0ZSBDb2xvciBvbGRCR0NvbG9yOwoJcHJpdmF0ZSBpbnQgcHJpbnRNb2RlID0gVElMRTsKCgkvKioKCSAqIENvbnN0cnVjdG9yIGZvciBQcmludEZpZ3VyZU9wZXJhdGlvbi4KCSAqIDxwPgoJICogTm90ZTogRGVzY2VuZGFudHMgbXVzdCBjYWxsIHNldFByaW50U291cmNlKElGaWd1cmUpIHRvIHNldCB0aGUgSUZpZ3VyZQoJICogdGhhdCBpcyB0byBiZSBwcmludGVkLgoJICogCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5QcmludE9wZXJhdGlvbiNQcmludE9wZXJhdGlvbihQcmludGVyKQoJICovCglwcm90ZWN0ZWQgUHJpbnRGaWd1cmVPcGVyYXRpb24oUHJpbnRlciBwKSB7CgkJc3VwZXIocCk7Cgl9CgoJLyoqCgkgKiBDb25zdHJ1Y3RvciBmb3IgUHJpbnRGaWd1cmVPcGVyYXRpb24uCgkgKiAKCSAqIEBwYXJhbSBwCgkgKiAgICAgICAgICAgIFByaW50ZXIgdG8gcHJpbnQgb24KCSAqIEBwYXJhbSBzcmNGaWd1cmUKCSAqICAgICAgICAgICAgRmlndXJlIHRvIHByaW50CgkgKi8KCXB1YmxpYyBQcmludEZpZ3VyZU9wZXJhdGlvbihQcmludGVyIHAsIElGaWd1cmUgc3JjRmlndXJlKSB7CgkJc3VwZXIocCk7CgkJc2V0UHJpbnRTb3VyY2Uoc3JjRmlndXJlKTsKCX0KCgkvKioKCSAqIEByZXR1cm4gU1dULlJJR0hUX1RPX0xFRlQgaWYgdGhlIHByaW50IHNvdXJjZSBpcyBtaXJyb3JlZDsKCSAqICAgICAgICAgU1dULkxFRlRfVE9fUklHSFQgb3RoZXJ3aXNlCgkgKiBAc2VlIG9yZy5lY2xpcHNlLmRyYXcyZC5QcmludE9wZXJhdGlvbiNnZXRHcmFwaGljc09yaWVudGF0aW9uKCkKCSAqLwoJaW50IGdldEdyYXBoaWNzT3JpZW50YXRpb24oKSB7CgkJcmV0dXJuIGdldFByaW50U291cmNlKCkuaXNNaXJyb3JlZCgpID8gU1dULlJJR0hUX1RPX0xFRlQKCQkJCTogU1dULkxFRlRfVE9fUklHSFQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHByaW50IG1vZGUuIFRoZSBwcmludCBtb2RlIGlzIG9uZSBvZjoKCSAqIHtAbGluayAjRklUX0hFSUdIVH0sIHtAbGluayAjRklUX1BBR0V9LCBvciB7QGxpbmsgI0ZJVF9XSURUSH0uCgkgKiAKCSAqIEByZXR1cm4gdGhlIHByaW50IG1vZGUKCSAqLwoJcHJvdGVjdGVkIGludCBnZXRQcmludE1vZGUoKSB7CgkJcmV0dXJuIHByaW50TW9kZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHByaW50U291cmNlLgoJICogCgkgKiBAcmV0dXJuIElGaWd1cmUgVGhlIHNvdXJjZSBJRmlndXJlCgkgKi8KCXByb3RlY3RlZCBJRmlndXJlIGdldFByaW50U291cmNlKCkgewoJCXJldHVybiBwcmludFNvdXJjZTsKCX0KCgkvKioKCSAqIEBzZWUgb3JnLmVjbGlwc2UuZHJhdzJkLlByaW50T3BlcmF0aW9uI3ByZXBhcmVQcmludFNvdXJjZSgpCgkgKi8KCXByb3RlY3RlZCB2b2lkIHByZXBhcmVQcmludFNvdXJjZSgpIHsKCQlvbGRCR0NvbG9yID0gZ2V0UHJpbnRTb3VyY2UoKS5nZXRMb2NhbEJhY2tncm91bmRDb2xvcigpOwoJCWdldFByaW50U291cmNlKCkuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKCX0KCgkvKioKCSAqIFByaW50cyB0aGUgcGFnZXMgYmFzZWQgb24gdGhlIGN1cnJlbnQgcHJpbnQgbW9kZS4KCSAqIAoJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuUHJpbnRPcGVyYXRpb24jcHJpbnRQYWdlcygpCgkgKi8KCXByb3RlY3RlZCB2b2lkIHByaW50UGFnZXMoKSB7CgkJR3JhcGhpY3MgZ3JhcGhpY3MgPSBnZXRGcmVzaFByaW50ZXJHcmFwaGljcygpOwoJCUlGaWd1cmUgZmlndXJlID0gZ2V0UHJpbnRTb3VyY2UoKTsKCQlzZXR1cFByaW50ZXJHcmFwaGljc0ZvcihncmFwaGljcywgZmlndXJlKTsKCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwoJCWludCB4ID0gYm91bmRzLngsIHkgPSBib3VuZHMueTsKCQlSZWN0YW5nbGUgY2xpcFJlY3QgPSBuZXcgUmVjdGFuZ2xlKCk7CgkJd2hpbGUgKHkgPCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpIHsKCQkJd2hpbGUgKHggPCBib3VuZHMueCArIGJvdW5kcy53aWR0aCkgewoJCQkJZ3JhcGhpY3MucHVzaFN0YXRlKCk7CgkJCQlnZXRQcmludGVyKCkuc3RhcnRQYWdlKCk7CgkJCQlncmFwaGljcy50cmFuc2xhdGUoLXgsIC15KTsKCQkJCWdyYXBoaWNzLmdldENsaXAoY2xpcFJlY3QpOwoJCQkJY2xpcFJlY3Quc2V0TG9jYXRpb24oeCwgeSk7CgkJCQlncmFwaGljcy5jbGlwUmVjdChjbGlwUmVjdCk7CgkJCQlmaWd1cmUucGFpbnQoZ3JhcGhpY3MpOwoJCQkJZ2V0UHJpbnRlcigpLmVuZFBhZ2UoKTsKCQkJCWdyYXBoaWNzLnBvcFN0YXRlKCk7CgkJCQl4ICs9IGNsaXBSZWN0LndpZHRoOwoJCQl9CgkJCXggPSBib3VuZHMueDsKCQkJeSArPSBjbGlwUmVjdC5oZWlnaHQ7CgkJfQoJfQoKCS8qKgoJICogQHNlZSBvcmcuZWNsaXBzZS5kcmF3MmQuUHJpbnRPcGVyYXRpb24jcmVzdG9yZVByaW50U291cmNlKCkKCSAqLwoJcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVByaW50U291cmNlKCkgewoJCWdldFByaW50U291cmNlKCkuc2V0QmFja2dyb3VuZENvbG9yKG9sZEJHQ29sb3IpOwoJCW9sZEJHQ29sb3IgPSBudWxsOwoJfQoKCS8qKgoJICogU2V0cyB0aGUgcHJpbnQgbW9kZS4gUG9zc2libGUgdmFsdWVzIGFyZSB7QGxpbmsgI1RJTEV9LAoJICoge0BsaW5rICNGSVRfSEVJR0hUfSwge0BsaW5rICNGSVRfV0lEVEh9IGFuZCB7QGxpbmsgI0ZJVF9QQUdFfS4KCSAqIAoJICogQHBhcmFtIG1vZGUKCSAqICAgICAgICAgICAgdGhlIHByaW50IG1vZGUKCSAqLwoJcHVibGljIHZvaWQgc2V0UHJpbnRNb2RlKGludCBtb2RlKSB7CgkJcHJpbnRNb2RlID0gbW9kZTsKCX0KCgkvKioKCSAqIFNldHMgdGhlIHByaW50U291cmNlLgoJICogCgkgKiBAcGFyYW0gcHJpbnRTb3VyY2UKCSAqICAgICAgICAgICAgVGhlIHByaW50U291cmNlIHRvIHNldAoJICovCglwcm90ZWN0ZWQgdm9pZCBzZXRQcmludFNvdXJjZShJRmlndXJlIHByaW50U291cmNlKSB7CgkJdGhpcy5wcmludFNvdXJjZSA9IHByaW50U291cmNlOwoJfQoKCS8qKgoJICogU2V0cyB1cCBHcmFwaGljcyBvYmplY3QgZm9yIHRoZSBnaXZlbiBJRmlndXJlLgoJICogCgkgKiBAcGFyYW0gZ3JhcGhpY3MKCSAqICAgICAgICAgICAgVGhlIEdyYXBoaWNzIHRvIHNldHVwCgkgKiBAcGFyYW0gZmlndXJlCgkgKiAgICAgICAgICAgIFRoZSBJRmlndXJlIHVzZWQgdG8gc2V0dXAgZ3JhcGhpY3MKCSAqLwoJcHJvdGVjdGVkIHZvaWQgc2V0dXBQcmludGVyR3JhcGhpY3NGb3IoR3JhcGhpY3MgZ3JhcGhpY3MsIElGaWd1cmUgZmlndXJlKSB7CgkJZG91YmxlIGRwaVNjYWxlID0gKGRvdWJsZSkgZ2V0UHJpbnRlcigpLmdldERQSSgpLngKCQkJCS8gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0RFBJKCkueDsKCgkJUmVjdGFuZ2xlIHByaW50UmVnaW9uID0gZ2V0UHJpbnRSZWdpb24oKTsKCQkvLyBwdXQgdGhlIHByaW50IHJlZ2lvbiBpbiBkaXNwbGF5IGNvb3JkaW5hdGVzCgkJcHJpbnRSZWdpb24ud2lkdGggLz0gZHBpU2NhbGU7CgkJcHJpbnRSZWdpb24uaGVpZ2h0IC89IGRwaVNjYWxlOwoKCQlSZWN0YW5nbGUgYm91bmRzID0gZmlndXJlLmdldEJvdW5kcygpOwoJCWRvdWJsZSB4U2NhbGUgPSAoZG91YmxlKSBwcmludFJlZ2lvbi53aWR0aCAvIGJvdW5kcy53aWR0aDsKCQlkb3VibGUgeVNjYWxlID0gKGRvdWJsZSkgcHJpbnRSZWdpb24uaGVpZ2h0IC8gYm91bmRzLmhlaWdodDsKCQlzd2l0Y2ggKGdldFByaW50TW9kZSgpKSB7CgkJY2FzZSBGSVRfUEFHRToKCQkJZ3JhcGhpY3Muc2NhbGUoTWF0aC5taW4oeFNjYWxlLCB5U2NhbGUpICogZHBpU2NhbGUpOwoJCQlicmVhazsKCQljYXNlIEZJVF9XSURUSDoKCQkJZ3JhcGhpY3Muc2NhbGUoeFNjYWxlICogZHBpU2NhbGUpOwoJCQlicmVhazsKCQljYXNlIEZJVF9IRUlHSFQ6CgkJCWdyYXBoaWNzLnNjYWxlKHlTY2FsZSAqIGRwaVNjYWxlKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJZ3JhcGhpY3Muc2NhbGUoZHBpU2NhbGUpOwoJCX0KCQlncmFwaGljcy5zZXRGb3JlZ3JvdW5kQ29sb3IoZmlndXJlLmdldEZvcmVncm91bmRDb2xvcigpKTsKCQlncmFwaGljcy5zZXRCYWNrZ3JvdW5kQ29sb3IoZmlndXJlLmdldEJhY2tncm91bmRDb2xvcigpKTsKCQlncmFwaGljcy5zZXRGb250KGZpZ3VyZS5nZXRGb250KCkpOwoJfQoKfQ==