cGFja2FnZSBvcmcuYXBhY2hlLnR1cmJpbmUuc2VydmljZXMuc2VydmxldDsKCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwogKiByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgogKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCiAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAogKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgogKgogKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kCiAqICAgICJBcGFjaGUgVHVyYmluZSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvcgogKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgogKgogKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKICogICAgIkFwYWNoZSBUdXJiaW5lIiwgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dAogKiAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAogKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgogKiBTVUNIIERBTUFHRS4KICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEZvciBtb3JlCiAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCiAqLwoKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CmltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OwoKaW1wb3J0IG9yZy5hcGFjaGUudHVyYmluZS5zZXJ2aWNlcy5UdXJiaW5lU2VydmljZXM7CgovKioKICogU2ltcGxlIHN0YXRpYyBhY2Nlc3NvciB0byB0aGUgRW5naW5lQ29udGV4dFNlcnZpY2UKICoKICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnVydG9uQGFwYWNoZS5vcmciPktldmluIEEuIEJ1cnRvbjwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86cmFwaGFlbEBhcGFjaGUub3JnIj5SYXBoYetsIEx1dGE8L2E+CiAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmVra2VyYmpAbmV0c2NhcGUubmV0Ij5KZWZmIEJyZWtrZTwvYT4KICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86anZhbnp5bEBwZXJpYXB0LmNvbSI+SmFzb24gdmFuIFp5bDwvYT4KICogQHZlcnNpb24gJElkJAogKi8KcHVibGljIGNsYXNzIFR1cmJpbmVTZXJ2bGV0CnsKICAgIC8qKgogICAgICogVXRpbGl0eSBtZXRob2QgZm9yIGFjY2Vzc2luZyB0aGUgc2VydmljZQogICAgICogaW1wbGVtZW50YXRpb24KICAgICAqCiAgICAgKiBAcmV0dXJuIGEgU2VydmxldFNlcnZpY2UgaW1wbGVtZW50YXRpb24gaW5zdGFuY2UKICAgICAqLwogICAgcHJvdGVjdGVkIHN0YXRpYyBTZXJ2bGV0U2VydmljZSBnZXRTZXJ2aWNlKCkKICAgIHsKICAgICAgICByZXR1cm4gKFNlcnZsZXRTZXJ2aWNlKSBUdXJiaW5lU2VydmljZXMKICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpLmdldFNlcnZpY2UoU2VydmxldFNlcnZpY2UuU0VSVklDRV9OQU1FKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gVVJMIG9iamVjdCBmb3IgYSBnaXZlbiBVUkkgc3RyaW5nLgogICAgICogVGhpcyBVUkkgaXMgY29uc2lkZXJlZCByZWxhdGl2ZSB0byB0aGUgY29udGV4dC4KICAgICAqCiAgICAgKiBAcGFyYW0gdXJpIHRoZSBVUkkgdG8gcmVzb2x2ZSBhcyBhbiBVUkwKICAgICAqIEByZXR1cm4gYW4gVVJMIG9iamVjdCBvciBudWxsIGlzIHRoZSB1cmkgaXMgbWFsZm9ybWVkIG9yIGNhbid0IGJlIHJlc29sdmVkCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgVVJMIGdldFJlc291cmNlKFN0cmluZyB1cmkpCiAgICB7CiAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRSZXNvdXJjZSh1cmkpOwogICAgfQoKICAgIC8qKgogICAgICogU2FtZSBhcyBnZXRSZXNvdXJjZSBleGNlcHQgdGhhdCBpdCByZXR1cm5zIGFuIElucHV0U3RyZWFtCiAgICAgKgogICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0I2dldFJlc291cmNlQXNTdHJlYW0KICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byByZXNvbHZlCiAgICAgKiBAcmV0dXJuIGFuIElucHV0U3RyZWFtIG9uIHRoZSBVUkkgY29udGVudCBvciBudWxsCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgdXJpKQogICAgewogICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh1cmkpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY29tcGxldGUgZmlsZXN5c3RlbSBwYXRoIGZvciBhCiAgICAgKiBnaXZlbiBVUkkKICAgICAqCiAgICAgKiBAc2VlIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQjZ2V0UmVhbFBhdGgKICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byByZXNvbHZlCiAgICAgKiBAcmV0dXJuIHRoZSBmdWxsIHN5c3RlbSBwYXRoIG9mIHRoaXMgVVJJCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBwYXRoKQogICAgewogICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0UmVhbFBhdGgocGF0aCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGNvbmZpZyB1c2VkIGJ5IHRoaXMKICAgICAqIFR1cmJpbmUgd2ViIGFwcGxpY2F0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gdHVyYmluZSBzZXJ2bGV0IGNvbmZpZwogICAgICovCiAgICBwdWJsaWMgc3RhdGljIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpCiAgICB7CiAgICAgICAgcmV0dXJuIGdldFNlcnZpY2UoKS5nZXRTZXJ2bGV0Q29uZmlnKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzZXJ2bGV0IGNvbnRleHQgdXNlZCBieSB0aGlzCiAgICAgKiBUdXJiaW5lIHdlYiBhcHBsaWNhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHR1cmJpbmUgc2VydmxldCBjb250ZXh0CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKQogICAgewogICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0U2VydmxldENvbnRleHQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNlcnZlciBzY2hlbWUgZm9yIHRoaXMKICAgICAqIFR1cmJpbmUgYXBwbGljYXRpb24uIFRoaXMgd2lsbCBlaXRoZXIKICAgICAqIGJlIGh0dHAgb3IgaHR0cHMuCiAgICAgKgogICAgICogQHJldHVybiBTdHJpbmcKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVyU2NoZW1lKCkKICAgIHsKICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldFNlcnZlclNjaGVtZSgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc2VydmVyIG5hbWUgdGhhdCB0aGlzCiAgICAgKiBUdXJiaW5lIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcKICAgICAqIG9uLgogICAgICoKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKQogICAgewogICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0U2VydmVyTmFtZSgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcG9ydCB0aGF0IHRoaXMgVHVyYmluZQogICAgICogYXBwbGljYXRpb24gaXMgcnVubmluZyB0aHJvdWdoCiAgICAgKiBvbiB0aGUgc2VydmVyLgogICAgICoKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlcnZlclBvcnQoKQogICAgewogICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKCkuZ2V0U2VydmVyUG9ydCgpOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgY29udGV4dCBwYXRoIGZvciB0aGlzCiAgICAgKiBUdXJiaW5lIGFwcGxpY2F0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gU3RyaW5nCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnRleHRQYXRoKCkKICAgIHsKICAgICAgICByZXR1cm4gZ2V0U2VydmljZSgpLmdldENvbnRleHRQYXRoKCk7CiAgICB9Cn0K