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AAAAAAAAAAkAAABNRVRBLUlORi9QSwMECgAAAAAAa1LuNLS04oZeLAAAXiwAAAcAAABMSUNFTlNFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCiAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgoKICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAogICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCiAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCiAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQogICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgogICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KCiAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KCiAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAogICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQogICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KCiAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQogICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCiAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCiAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgogICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCiAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCgogICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwogICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCiAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQogICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCiAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgogICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAogICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwogICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAogICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQogICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCgogICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCiAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCgogICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAogICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCiAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCiAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawogICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAogICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCiAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQogICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCgogICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQogICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgogICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKCiAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAoKICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCiAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCiAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAogICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgogICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAoKICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCiAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CiAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAogICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAogICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgogICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCiAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCiAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQogICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCiAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAogICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCiAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAogICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgoKICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAogICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCiAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQogICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCiAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQogICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KCiAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgogICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCiAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQogICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55CiAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KCiAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAogICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAogICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQogICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCiAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCiAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgoKICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwogICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAogICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwogICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQogICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgogICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCiAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQogICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCiAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgoKICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCgogICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCgogICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwogICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCiAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCiAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCiAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQogICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCiAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAJAAAAT1NHSS1PUFQvUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAANAAAAT1NHSS1PUFQvc3JjL1BLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAEQAAAE9TR0ktT1BUL3NyYy9vcmcvUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAWAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL1BLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAHgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL1BLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAIQAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL1BLAwQKAAAAAABrUu40QRMgXDkkAAA5JAAAMwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb24uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY20vc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbi5qYXZhLHYgMS4xNyAyMDA2LzA2LzE2IDE2OjMxOjI4IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNtOwoKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKCi8qKgogKiBUaGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSA8Y29kZT5NYW5hZ2VkU2VydmljZTwvY29kZT4gb3IKICogPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5PC9jb2RlPiBvYmplY3QuCiAqIAogKiBUaGUgQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlIHVzZXMgdGhpcyBpbnRlcmZhY2UgdG8gcmVwcmVzZW50IHRoZQogKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIDxjb2RlPk1hbmFnZWRTZXJ2aWNlPC9jb2RlPiBvciBmb3IgYQogKiBzZXJ2aWNlIGluc3RhbmNlIG9mIGEgPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5PC9jb2RlPi4KICogCiAqIDxwPgogKiBBIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCBjb250YWlucyBhIGNvbmZpZ3VyYXRpb24gZGljdGlvbmFyeSBhbmQKICogYWxsb3dzIHRoZSBwcm9wZXJ0aWVzIHRvIGJlIHVwZGF0ZWQgdmlhIHRoaXMgb2JqZWN0LiBCdW5kbGVzIHdpc2hpbmcgdG8KICogcmVjZWl2ZSBjb25maWd1cmF0aW9uIGRpY3Rpb25hcmllcyBkbyBub3QgbmVlZCB0byB1c2UgdGhpcyBjbGFzcyAtIHRoZXkKICogcmVnaXN0ZXIgYSA8Y29kZT5NYW5hZ2VkU2VydmljZTwvY29kZT4gb3IKICogPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5PC9jb2RlPi4gT25seSBhZG1pbmlzdHJhdGl2ZSBidW5kbGVzLCBhbmQKICogYnVuZGxlcyB3aXNoaW5nIHRvIHVwZGF0ZSB0aGVpciBvd24gY29uZmlndXJhdGlvbnMgbmVlZCB0byB1c2UgdGhpcyBjbGFzcy4KICogCiAqIDxwPgogKiBUaGUgcHJvcGVydGllcyBoYW5kbGVkIGluIHRoaXMgY29uZmlndXJhdGlvbiBoYXZlIGNhc2UgaW5zZW5zaXRpdmUKICogPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzIGFzIGtleXMuIEhvd2V2ZXIsIGNhc2UgaXMgcHJlc2VydmVkIGZyb20gdGhlCiAqIGxhc3Qgc2V0IGtleS92YWx1ZS4KICogPHA+CiAqIEEgY29uZmlndXJhdGlvbiBjYW4gYmUgPGk+Ym91bmQgPC9pPiB0byBhIGJ1bmRsZSBsb2NhdGlvbiAoCiAqIDxjb2RlPkJ1bmRsZS5nZXRMb2NhdGlvbigpPC9jb2RlPikuIFRoZSBwdXJwb3NlIG9mIGJpbmRpbmcgYQogKiA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgdG8gYSBsb2NhdGlvbiBpcyB0byBtYWtlIGl0IGltcG9zc2libGUKICogZm9yIGFub3RoZXIgYnVuZGxlIHRvIGZvcmdlIGEgUElEIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBjb25maWd1cmF0aW9uLiBXaGVuIGEKICogY29uZmlndXJhdGlvbiBpcyBib3VuZCB0byBhIHNwZWNpZmljIGxvY2F0aW9uLCBhbmQgYSBidW5kbGUgd2l0aCBhIGRpZmZlcmVudAogKiBsb2NhdGlvbiByZWdpc3RlcnMgYSBjb3JyZXNwb25kaW5nIDxjb2RlPk1hbmFnZWRTZXJ2aWNlPC9jb2RlPiBvYmplY3Qgb3IKICogPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5PC9jb2RlPiBvYmplY3QsIHRoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90CiAqIHBhc3NlZCB0byB0aGUgdXBkYXRlZCBtZXRob2Qgb2YgdGhhdCBvYmplY3QuCiAqIAogKiA8cD4KICogSWYgYSBjb25maWd1cmF0aW9uJ3MgbG9jYXRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4sIGl0IGlzIG5vdCB5ZXQgYm91bmQgdG8KICogYSBsb2NhdGlvbi4gSXQgd2lsbCBiZWNvbWUgYm91bmQgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBidW5kbGUgdGhhdAogKiByZWdpc3RlcnMgYSA8Y29kZT5NYW5hZ2VkU2VydmljZTwvY29kZT4gb3IKICogPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5PC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBQSUQuCiAqIDxwPgogKiBUaGUgc2FtZSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgaXMgdXNlZCBmb3IgY29uZmlndXJpbmcgYm90aCBhCiAqIE1hbmFnZWQgU2VydmljZSBGYWN0b3J5IGFuZCBhIE1hbmFnZWQgU2VydmljZS4gV2hlbiBpdCBpcyBpbXBvcnRhbnQgdG8KICogZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZXNlIHR3byB0aGUgdGVybSAiZmFjdG9yeSBjb25maWd1cmF0aW9uIiBpcyB1c2VkLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE3ICQKICovCnB1YmxpYyBpbnRlcmZhY2UgQ29uZmlndXJhdGlvbiB7CgkvKioKCSAqIEdldCB0aGUgUElEIGZvciB0aGlzIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiB0aGUgUElEIGZvciB0aGlzIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdC4KCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBkZWxldGVkCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0UGlkKCk7CgoJLyoqCgkgKiBSZXR1cm4gdGhlIHByb3BlcnRpZXMgb2YgdGhpcyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIFRoZSA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiBvYmplY3QgcmV0dXJuZWQgaXMgYSBwcml2YXRlIGNvcHkgZm9yIHRoZQoJICogY2FsbGVyIGFuZCBtYXkgYmUgY2hhbmdlZCB3aXRob3V0IGluZmx1ZW5jaW5nIHRoZSBzdG9yZWQgY29uZmlndXJhdGlvbi4KCSAqIFRoZSBrZXlzIGluIHRoZSByZXR1cm5lZCBkaWN0aW9uYXJ5IGFyZSBjYXNlIGluc2Vuc2l0aXZlIGFuZCBhcmUgYWx3YXlzCgkgKiBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCgkgKiAKCSAqIDxwPgoJICogSWYgY2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXMgY3JlYXRlZCBhbmQgYmVmb3JlIHVwZGF0ZSBoYXMKCSAqIGJlZW4gY2FsbGVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgoJICogCgkgKiBAcmV0dXJuIEEgcHJpdmF0ZSBjb3B5IG9mIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgY2FsbGVyIG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LiBUaGVzZSBwcm9wZXJ0aWVzIG11c3Qgbm90IGNvbnRhaW4gdGhlCgkgKiAgICAgICAgICJzZXJ2aWNlLmJ1bmRsZUxvY2F0aW9uIiBwcm9wZXJ0eS4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbWF5CgkgKiAgICAgICAgIGJlIG9idGFpbmVkIGZyb20gdGhlIDxjb2RlPmdldEJ1bmRsZUxvY2F0aW9uPC9jb2RlPiBtZXRob2QuCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gZGVsZXRlZAoJICovCglwdWJsaWMgRGljdGlvbmFyeSBnZXRQcm9wZXJ0aWVzKCk7CgoJLyoqCgkgKiBVcGRhdGUgdGhlIHByb3BlcnRpZXMgb2YgdGhpcyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIFN0b3JlcyB0aGUgcHJvcGVydGllcyBpbiBwZXJzaXN0ZW50IHN0b3JhZ2UgYWZ0ZXIgYWRkaW5nIG9yIG92ZXJ3cml0aW5nCgkgKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CgkgKiA8dWw+CgkgKiA8bGk+InNlcnZpY2UucGlkIiA6IGlzIHNldCB0byBiZSB0aGUgUElEIG9mIHRoaXMgY29uZmlndXJhdGlvbi48L2xpPgoJICogPGxpPiJzZXJ2aWNlLmZhY3RvcnlQaWQiIDogaWYgdGhpcyBpcyBhIGZhY3RvcnkgY29uZmlndXJhdGlvbiBpdCBpcyBzZXQKCSAqIHRvIHRoZSBmYWN0b3J5IFBJRCBlbHNlIGl0IGlzIG5vdCBzZXQuPC9saT4KCSAqIDwvdWw+CgkgKiBUaGVzZSBzeXN0ZW0gcHJvcGVydGllcyBhcmUgYWxsIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgY29ycmVzcG9uZGluZyBNYW5hZ2VkIFNlcnZpY2UvTWFuYWdlZCBTZXJ2aWNlIEZhY3RvcnkgaXMKCSAqIHJlZ2lzdGVyZWQsIGl0cyB1cGRhdGVkIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseS4gRWxzZSwgdGhpcwoJICogY2FsbGJhY2sgaXMgZGVsYXllZCB1bnRpbCBhZm9yZW1lbnRpb25lZCByZWdpc3RyYXRpb24gb2NjdXJzLgoJICogCgkgKiA8cD4KCSAqIEFsc28gaW50aWF0ZXMgYW4gYXN5bmNocm9ub3VzIGNhbGwgdG8gYWxsCgkgKiA8Y29kZT5Db25maWd1cmF0aW9uTGlzdGVuZXI8L2NvZGU+cyB3aXRoIGEKCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25FdmVudC5DTV9VUERBVEVEPC9jb2RlPiBldmVudC4KCSAqIAoJICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIG5ldyBzZXQgb2YgcHJvcGVydGllcyBmb3IgdGhpcyBjb25maWd1cmF0aW9uCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVwZGF0ZSBjYW5ub3QgYmUgbWFkZSBwZXJzaXN0ZW50CgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2JqZWN0CgkgKiAgICAgICAgIGNvbnRhaW5zIGludmFsaWQgY29uZmlndXJhdGlvbiB0eXBlcyBvciBjb250YWlucyBjYXNlIHZhcmlhbnRzIG9mCgkgKiAgICAgICAgIHRoZSBzYW1lIGtleSBuYW1lLgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKCSAqLwoJcHVibGljIHZvaWQgdXBkYXRlKERpY3Rpb25hcnkgcHJvcGVydGllcykgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogRGVsZXRlIHRoaXMgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBSZW1vdmVzIHRoaXMgY29uZmlndXJhdGlvbiBvYmplY3QgZnJvbSB0aGUgcGVyc2lzdGVudCBzdG9yZS4gTm90aWZ5CgkgKiBhc3luY2hyb25vdXNseSB0aGUgY29ycmVzcG9uZGluZyBNYW5hZ2VkIFNlcnZpY2Ugb3IgTWFuYWdlZCBTZXJ2aWNlCgkgKiBGYWN0b3J5LiBBIDxjb2RlPk1hbmFnZWRTZXJ2aWNlPC9jb2RlPiBvYmplY3QgaXMgbm90aWZpZWQgYnkgYSBjYWxsIHRvCgkgKiBpdHMgPGNvZGU+dXBkYXRlZDwvY29kZT4gbWV0aG9kIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBwcm9wZXJ0aWVzCgkgKiBhcmd1bWVudC4gQSA8Y29kZT5NYW5hZ2VkU2VydmljZUZhY3Rvcnk8L2NvZGU+IG9iamVjdCBpcyBub3RpZmllZCBieSBhCgkgKiBjYWxsIHRvIGl0cyA8Y29kZT5kZWxldGVkPC9jb2RlPiBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogQWxzbyBpbnRpYXRlcyBhbiBhc3luY2hyb25vdXMgY2FsbCB0byBhbGwKCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjwvY29kZT5zIHdpdGggYQoJICogPGNvZGU+Q29uZmlndXJhdGlvbkV2ZW50LkNNX0RFTEVURUQ8L2NvZGU+IGV2ZW50LgoJICogCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIGRlbGV0ZSBmYWlscwoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKCSAqLwoJcHVibGljIHZvaWQgZGVsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogRm9yIGEgZmFjdG9yeSBjb25maWd1cmF0aW9uIHJldHVybiB0aGUgUElEIG9mIHRoZSBjb3JyZXNwb25kaW5nIE1hbmFnZWQKCSAqIFNlcnZpY2UgRmFjdG9yeSwgZWxzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCgkgKiAKCSAqIEByZXR1cm4gZmFjdG9yeSBQSUQgb3IgPGNvZGU+bnVsbDwvY29kZT4KCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBkZWxldGVkCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeVBpZCgpOwoKCS8qKgoJICogVXBkYXRlIHRoZSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3Qgd2l0aCB0aGUgY3VycmVudAoJICogcHJvcGVydGllcy4KCSAqIAoJICogSW5pdGlhdGUgdGhlIDxjb2RlPnVwZGF0ZWQ8L2NvZGU+IGNhbGxiYWNrIHRvIHRoZSBNYW5hZ2VkIFNlcnZpY2Ugb3IKCSAqIE1hbmFnZWQgU2VydmljZSBGYWN0b3J5IHdpdGggdGhlIGN1cnJlbnQgcHJvcGVydGllcyBhc3luY2hyb25vdXNseS4KCSAqIAoJICogPHA+CgkgKiBUaGlzIGlzIHRoZSBvbmx5IHdheSBmb3IgYSBidW5kbGUgdGhhdCB1c2VzIGEgQ29uZmlndXJhdGlvbiBQbHVnaW4KCSAqIHNlcnZpY2UgdG8gaW5pdGF0ZSBhIGNhbGxiYWNrLiBGb3IgZXhhbXBsZSwgd2hlbiB0aGF0IGJ1bmRsZSBkZXRlY3RzIGEKCSAqIGNoYW5nZSB0aGF0IHJlcXVpcmVzIGFuIHVwZGF0ZSBvZiB0aGUgTWFuYWdlZCBTZXJ2aWNlIG9yIE1hbmFnZWQgU2VydmljZQoJICogRmFjdG9yeSB2aWEgaXRzIDxjb2RlPkNvbmZpZ3VyYXRpb25QbHVnaW48L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHNlZSBDb25maWd1cmF0aW9uUGx1Z2luCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHVwZGF0ZSBjYW5ub3QgYWNjZXNzIHRoZSBwcm9wZXJ0aWVzIGluIHBlcnNpc3RlbnQKCSAqICAgICAgICAgc3RvcmFnZQoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKCSAqLwoJcHVibGljIHZvaWQgdXBkYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogQmluZCB0aGlzIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCB0byB0aGUgc3BlY2lmaWVkIGJ1bmRsZQoJICogbG9jYXRpb24uCgkgKiAKCSAqIElmIHRoZSBidW5kbGVMb2NhdGlvbiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlbiB0aGUKCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCB3aWxsIG5vdCBiZSBib3VuZCB0byBhIGxvY2F0aW9uLiBJdAoJICogd2lsbCBiZSBzZXQgdG8gdGhlIGJ1bmRsZSdzIGxvY2F0aW9uIGJlZm9yZSB0aGUgZmlyc3QgdGltZSBhIE1hbmFnZWQKCSAqIFNlcnZpY2UvTWFuYWdlZCBTZXJ2aWNlIEZhY3RvcnkgcmVjZWl2ZXMgdGhpcyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPgoJICogb2JqZWN0IHZpYSB0aGUgdXBkYXRlZCBtZXRob2QgYW5kIGJlZm9yZSBhbnkgcGx1Z2lucyBhcmUgY2FsbGVkLiBUaGUKCSAqIGJ1bmRsZSBsb2NhdGlvbiB3aWxsIGJlIHNldCBwZXJzaXN0ZW50bHkuCgkgKiAKCSAqIEBwYXJhbSBidW5kbGVMb2NhdGlvbiBhIGJ1bmRsZSBsb2NhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSWYgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGRlbGV0ZWQuCgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZQoJICogICAgICAgICA8Y29kZT5Db25maWd1cmF0aW9uUGVybWlzc2lvblsqLENPTkZJR1VSRV08L2NvZGU+LgoJICovCglwdWJsaWMgdm9pZCBzZXRCdW5kbGVMb2NhdGlvbihTdHJpbmcgYnVuZGxlTG9jYXRpb24pOwoKCS8qKgoJICogR2V0IHRoZSBidW5kbGUgbG9jYXRpb24uCgkgKiAKCSAqIFJldHVybnMgdGhlIGJ1bmRsZSBsb2NhdGlvbiB0byB3aGljaCB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgYm91bmQsIG9yCgkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QgeWV0IGJvdW5kIHRvIGEgYnVuZGxlIGxvY2F0aW9uLgoJICogCgkgKiBAcmV0dXJuIGxvY2F0aW9uIHRvIHdoaWNoIHRoaXMgY29uZmlndXJhdGlvbiBpcyBib3VuZCwgb3IKCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBJZiB0aGlzIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdAoJICogICAgICAgICBoYXMgYmVlbiBkZWxldGVkLgoJICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUKCSAqICAgICAgICAgPGNvZGU+Q29uZmlndXJhdGlvblBlcm1pc3Npb25bKixDT05GSUdVUkVdPC9jb2RlPi4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRCdW5kbGVMb2NhdGlvbigpOwoKCS8qKgoJICogRXF1YWxpdHkgaXMgZGVmaW5lZCB0byBoYXZlIGVxdWFsIFBJRHMKCSAqIAoJICogVHdvIENvbmZpZ3VyYXRpb24gb2JqZWN0cyBhcmUgZXF1YWwgd2hlbiB0aGVpciBQSURzIGFyZSBlcXVhbC4KCSAqIAoJICogQHBhcmFtIG90aGVyIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZXF1YWwsIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QgYQoJICogICAgICAgICA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3Qgb3Igb25lIHdpdGggYSBkaWZmZXJlbnQgUElELgoJICovCglwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKTsKCgkvKioKCSAqIEhhc2ggY29kZSBpcyBiYXNlZCBvbiBQSUQuCgkgKiAKCSAqIFRoZSBoYXNoY29kZSBmb3IgdHdvIENvbmZpZ3VyYXRpb24gb2JqZWN0cyBtdXN0IGJlIHRoZSBzYW1lIHdoZW4gdGhlCgkgKiBDb25maWd1cmF0aW9uIFBJRCdzIGFyZSB0aGUgc2FtZS4KCSAqIAoJICogQHJldHVybiBoYXNoIGNvZGUgZm9yIHRoaXMgQ29uZmlndXJhdGlvbiBvYmplY3QKCSAqLwoJcHVibGljIGludCBoYXNoQ29kZSgpOwp9ClBLAwQKAAAAAABrUu40ANdOdAgtAAAILQAAOAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25BZG1pbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jbS9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uQWRtaW4uamF2YSx2IDEuMTYgMjAwNi8wNy8xMSAwMDo1NDowMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jbTsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkludmFsaWRTeW50YXhFeGNlcHRpb247CgovKioKICogU2VydmljZSBmb3IgYWRtaW5pc3RlcmluZyBjb25maWd1cmF0aW9uIGRhdGEuCiAqIAogKiA8cD4KICogVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGludGVyZmFjZSBpcyB0byBzdG9yZSBidW5kbGUgY29uZmlndXJhdGlvbiBkYXRhCiAqIHBlcnNpc3RlbnRseS4gVGhpcyBpbmZvcm1hdGlvbiBpcyByZXByZXNlbnRlZCBpbiA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPgogKiBvYmplY3RzLiBUaGUgYWN0dWFsIGNvbmZpZ3VyYXRpb24gZGF0YSBpcyBhIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG9mCiAqIHByb3BlcnRpZXMgaW5zaWRlIGEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0LgogKiAKICogPHA+CiAqIFRoZXJlIGFyZSB0d28gcHJpbmNpcGFsbHkgZGlmZmVyZW50IHdheXMgdG8gbWFuYWdlIGNvbmZpZ3VyYXRpb25zLiBGaXJzdAogKiB0aGVyZSBpcyB0aGUgY29uY2VwdCBvZiBhIE1hbmFnZWQgU2VydmljZSwgd2hlcmUgY29uZmlndXJhdGlvbiBkYXRhIGlzCiAqIHVuaXF1ZWx5IGFzc29jaWF0ZWQgd2l0aCBhbiBvYmplY3QgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LgogKiAKICogPHA+CiAqIE5leHQsIHRoZXJlIGlzIHRoZSBjb25jZXB0IG9mIGEgZmFjdG9yeSB3aGVyZSB0aGUgQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlCiAqIHdpbGwgbWFpbnRhaW4gMCBvciBtb3JlIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdHMgZm9yIGEgTWFuYWdlZAogKiBTZXJ2aWNlIEZhY3RvcnkgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIEZyYW1ld29yay4KICogCiAqIDxwPgogKiBUaGUgZmlyc3QgY29uY2VwdCBpcyBpbnRlbmRlZCBmb3IgY29uZmlndXJhdGlvbiBkYXRhIGFib3V0ICJ0aGluZ3Mvc2VydmljZXMiCiAqIHdob3NlIGV4aXN0ZW5jZSBpcyBkZWZpbmVkIGV4dGVybmFsbHksIGUuZy4gYSBzcGVjaWZpYyBwcmludGVyLiBGYWN0b3JpZXMgYXJlCiAqIGludGVuZGVkIGZvciAidGhpbmdzL3NlcnZpY2VzIiB0aGF0IGNhbiBiZSBjcmVhdGVkIGFueSBudW1iZXIgb2YgdGltZXMsIGUuZy4KICogYSBjb25maWd1cmF0aW9uIGZvciBhIERIQ1Agc2VydmVyIGZvciBkaWZmZXJlbnQgbmV0d29ya3MuCiAqIAogKiA8cD4KICogQnVuZGxlcyB0aGF0IHJlcXVpcmUgY29uZmlndXJhdGlvbiBzaG91bGQgcmVnaXN0ZXIgYSBNYW5hZ2VkIFNlcnZpY2Ugb3IgYQogKiBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeSBpbiB0aGUgc2VydmljZSByZWdpc3RyeS4gQSByZWdpc3RyYXRpb24gcHJvcGVydHkKICogbmFtZWQgPGNvZGU+c2VydmljZS5waWQ8L2NvZGU+IChwZXJzaXN0ZW50IGlkZW50aWZpZXIgb3IgUElEKSBtdXN0IGJlIHVzZWQKICogdG8gaWRlbnRpZnkgdGhpcyBNYW5hZ2VkIFNlcnZpY2Ugb3IgTWFuYWdlZCBTZXJ2aWNlIEZhY3RvcnkgdG8gdGhlCiAqIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZS4KICogCiAqIDxwPgogKiBXaGVuIHRoZSBDb25maWd1cmF0aW9uQWRtaW4gZGV0ZWN0cyB0aGUgcmVnaXN0cmF0aW9uIG9mIGEgTWFuYWdlZCBTZXJ2aWNlLCBpdAogKiBjaGVja3MgaXRzIHBlcnNpc3RlbnQgc3RvcmFnZSBmb3IgYSBjb25maWd1cmF0aW9uIG9iamVjdCB3aG9zZSBQSUQgbWF0Y2hlcwogKiB0aGUgUElEIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSAoPGNvZGU+c2VydmljZS5waWQ8L2NvZGU+KSBvZiB0aGUgTWFuYWdlZAogKiBTZXJ2aWNlLiBJZiBmb3VuZCwgaXQgY2FsbHMge0BsaW5rIE1hbmFnZWRTZXJ2aWNlI3VwZGF0ZWR9IG1ldGhvZCB3aXRoIHRoZQogKiBuZXcgcHJvcGVydGllcy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIGEgQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlIG11c3QgcnVuCiAqIHRoZXNlIGNhbGwtYmFja3MgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgcHJvcGVyIHN5bmNocm9uaXphdGlvbi4KICogCiAqIDxwPgogKiBXaGVuIHRoZSBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgZGV0ZWN0cyBhIE1hbmFnZWQgU2VydmljZSBGYWN0b3J5CiAqIHJlZ2lzdHJhdGlvbiwgaXQgY2hlY2tzIGl0cyBzdG9yYWdlIGZvciBjb25maWd1cmF0aW9uIG9iamVjdHMgd2hvc2UKICogPGNvZGU+ZmFjdG9yeVBpZDwvY29kZT4gbWF0Y2hlcyB0aGUgUElEIG9mIHRoZSBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeS4gRm9yCiAqIGVhY2ggc3VjaCA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3RzLCBpdCBjYWxscyB0aGUKICogPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5LnVwZGF0ZWQ8L2NvZGU+IG1ldGhvZCBhc3luY2hyb25vdXNseSB3aXRoIHRoZQogKiBuZXcgcHJvcGVydGllcy4gVGhlIGNhbGxzIHRvIHRoZSA8Y29kZT51cGRhdGVkPC9jb2RlPiBtZXRob2Qgb2YgYQogKiA8Y29kZT5NYW5hZ2VkU2VydmljZUZhY3Rvcnk8L2NvZGU+IG11c3QgYmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5IGFuZCBub3QKICogb3ZlcmxhcCBpbiB0aW1lLgogKiAKICogPHA+CiAqIEluIGdlbmVyYWwsIGJ1bmRsZXMgaGF2aW5nIHBlcm1pc3Npb24gdG8gdXNlIHRoZSBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UKICogY2FuIG9ubHkgYWNjZXNzIGFuZCBtb2RpZnkgdGhlaXIgb3duIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIEFjY2Vzc2luZyBvcgogKiBtb2RpZnlpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYW5vdGhlciBidW5kbGUgcmVxdWlyZXMKICogPGNvZGU+Q29uZmlndXJhdGlvblBlcm1pc3Npb25bKixDT05GSUdVUkVdPC9jb2RlPi4KICogCiAqIDxwPgogKiA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3RzIGNhbiBiZSA8aT5ib3VuZCA8L2k+IHRvIGEgc3BlY2lmaWVkCiAqIGJ1bmRsZSBsb2NhdGlvbi4gSW4gdGhpcyBjYXNlLCBpZiBhIG1hdGNoaW5nIE1hbmFnZWQgU2VydmljZSBvciBNYW5hZ2VkCiAqIFNlcnZpY2UgRmFjdG9yeSBpcyByZWdpc3RlcmVkIGJ5IGEgYnVuZGxlIHdpdGggYSBkaWZmZXJlbnQgbG9jYXRpb24sIHRoZW4gdGhlCiAqIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZSBtdXN0IG5vdCBkbyB0aGUgbm9ybWFsIGNhbGxiYWNrLCBhbmQgaXQgc2hvdWxkCiAqIGxvZyBhbiBlcnJvci4gSW4gdGhlIGNhc2Ugd2hlcmUgYSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgaXMgbm90CiAqIGJvdW5kLCBpdHMgbG9jYXRpb24gZmllbGQgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBDb25maWd1cmF0aW9uIEFkbWluCiAqIHNlcnZpY2Ugd2lsbCBiaW5kIGl0IHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgYnVuZGxlIHRoYXQgcmVnaXN0ZXJzIHRoZSBmaXJzdAogKiBNYW5hZ2VkIFNlcnZpY2Ugb3IgTWFuYWdlZCBTZXJ2aWNlIEZhY3RvcnkgdGhhdCBoYXMgYSBjb3JyZXNwb25kaW5nIFBJRAogKiBwcm9wZXJ0eS4gV2hlbiBhIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCBpcyBib3VuZCB0byBhIGJ1bmRsZQogKiBsb2NhdGlvbiBpbiB0aGlzIG1hbm5lciwgdGhlIENvbmZndXJhdGlvbiBBZG1pbiBzZXJ2aWNlIG11c3QgZGV0ZWN0IGlmIHRoZQogKiBidW5kbGUgY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gaXMgdW5pbnN0YWxsZWQuIElmIHRoaXMgb2NjdXJzLCB0aGUKICogPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0IGlzIHVuYm91bmQsIHRoYXQgaXMgaXRzIGxvY2F0aW9uIGZpZWxkIGlzCiAqIHNldCBiYWNrIHRvIDxjb2RlPm51bGw8L2NvZGU+LgogKiAKICogPHA+CiAqIFRoZSBtZXRob2QgZGVzY3JpcHRpb25zIG9mIHRoaXMgY2xhc3MgcmVmZXIgdG8gYSBjb25jZXB0IG9mICJ0aGUgY2FsbGluZwogKiBidW5kbGUiLiBUaGlzIGlzIGEgbG9vc2Ugd2F5IG9mIHJlZmVycmluZyB0byB0aGUgYnVuZGxlIHdoaWNoIG9idGFpbmVkIHRoZQogKiBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgZnJvbSB0aGUgc2VydmljZSByZWdpc3RyeS4gSW1wbGVtZW50YXRpb25zIG9mCiAqIDxjb2RlPkNvbmZpZ3VyYXRpb25BZG1pbjwvY29kZT4gbXVzdCB1c2UgYQogKiB7QGxpbmsgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VGYWN0b3J5fSB0byBzdXBwb3J0IHRoaXMgY29uY2VwdC4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xNiAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25BZG1pbiB7CgkvKioKCSAqIFNlcnZpY2UgcHJvcGVydHkgbmFtaW5nIHRoZSBGYWN0b3J5IFBJRCBpbiB0aGUgY29uZmlndXJhdGlvbiBkaWN0aW9uYXJ5LgoJICogVGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgoJICogCgkgKiBAc2luY2UgMS4xCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVNFUlZJQ0VfRkFDVE9SWVBJRAkJPSAic2VydmljZS5mYWN0b3J5UGlkIjsKCS8qKgoJICogU2VydmljZSBwcm9wZXJ0eSBuYW1pbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBidW5kbGUgdGhhdCBpcyBhc3NvY2lhdGVkCgkgKiB3aXRoIGEgYSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QuIFRoaXMgcHJvcGVydHkgY2FuIGJlCgkgKiBzZWFyY2hlZCBmb3IgYnV0IG11c3Qgbm90IGFwcGVhciBpbiB0aGUgY29uZmlndXJhdGlvbiBkaWN0aW9uYXJ5IGZvcgoJICogc2VjdXJpdHkgcmVhc29uLiBUaGUgcHJvcGVydHkncyB2YWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCgkgKiAKCSAqIEBzaW5jZSAxLjEKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJU0VSVklDRV9CVU5ETEVMT0NBVElPTgk9ICJzZXJ2aWNlLmJ1bmRsZUxvY2F0aW9uIjsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBmYWN0b3J5IDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCB3aXRoIGEgbmV3IFBJRC4KCSAqIAoJICogVGhlIHByb3BlcnRpZXMgb2YgdGhlIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgYXJlCgkgKiA8Y29kZT5udWxsPC9jb2RlPiB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGF0IGl0cwoJICoge0BsaW5rIENvbmZpZ3VyYXRpb24jdXBkYXRlKERpY3Rpb25hcnkpfSBtZXRob2QgaXMgY2FsbGVkLgoJICogCgkgKiA8cD4KCSAqIEl0IGlzIG5vdCByZXF1aXJlZCB0aGF0IHRoZSA8Y29kZT5mYWN0b3J5UGlkPC9jb2RlPiBtYXBzIHRvIGEKCSAqIHJlZ2lzdGVyZWQgTWFuYWdlZCBTZXJ2aWNlIEZhY3RvcnkuCgkgKiA8cD4KCSAqIFRoZSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgaXMgYm91bmQgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZQoJICogY2FsbGluZyBidW5kbGUuCgkgKiAKCSAqIEBwYXJhbSBmYWN0b3J5UGlkIFBJRCBvZiBmYWN0b3J5IChub3QgPGNvZGU+bnVsbDwvY29kZT4pLgoJICogQHJldHVybiBBIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFjY2VzcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgZmFpbHMuCgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGNhbGxlciBkb2VzIG5vdCBoYXZlIDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uWyosQ09ORklHVVJFXTwvY29kZT4gYW5kIDxjb2RlPmZhY3RvcnlQaWQ8L2NvZGU+IGlzIGJvdW5kIHRvIGFub3RoZXIgYnVuZGxlLgoJICovCglwdWJsaWMgQ29uZmlndXJhdGlvbiBjcmVhdGVGYWN0b3J5Q29uZmlndXJhdGlvbihTdHJpbmcgZmFjdG9yeVBpZCkKCQkJdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IGZhY3RvcnkgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0IHdpdGggYSBuZXcgUElELgoJICogCgkgKiBUaGUgcHJvcGVydGllcyBvZiB0aGUgbmV3IDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCBhcmUKCSAqIDxjb2RlPm51bGw8L2NvZGU+IHVudGlsIHRoZSBmaXJzdCB0aW1lIHRoYXQgaXRzCgkgKiB7QGxpbmsgQ29uZmlndXJhdGlvbiN1cGRhdGUoRGljdGlvbmFyeSl9IG1ldGhvZCBpcyBjYWxsZWQuCgkgKiAKCSAqIDxwPgoJICogSXQgaXMgbm90IHJlcXVpcmVkIHRoYXQgdGhlIDxjb2RlPmZhY3RvcnlQaWQ8L2NvZGU+IG1hcHMgdG8gYQoJICogcmVnaXN0ZXJlZCBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeS4KCSAqIAoJICogPHA+CgkgKiBUaGUgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gaXMgYm91bmQgdG8gdGhlIGxvY2F0aW9uIHNwZWNpZmllZC4gSWYKCSAqIHRoaXMgbG9jYXRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4gaXQgd2lsbCBiZSBib3VuZCB0byB0aGUgbG9jYXRpb24gb2YKCSAqIHRoZSBmaXJzdCBidW5kbGUgdGhhdCByZWdpc3RlcnMgYSBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeSB3aXRoIGEKCSAqIGNvcnJlc3BvbmRpbmcgUElELgoJICogCgkgKiBAcGFyYW0gZmFjdG9yeVBpZCBQSUQgb2YgZmFjdG9yeSAobm90IDxjb2RlPm51bGw8L2NvZGU+KS4KCSAqIEBwYXJhbSBsb2NhdGlvbiBBIGJ1bmRsZSBsb2NhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHJldHVybiBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFjY2VzcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgZmFpbHMuCgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIGNhbGxlciBkb2VzIG5vdCBoYXZlIDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uWyosQ09ORklHVVJFXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBDb25maWd1cmF0aW9uIGNyZWF0ZUZhY3RvcnlDb25maWd1cmF0aW9uKFN0cmluZyBmYWN0b3J5UGlkLCBTdHJpbmcgbG9jYXRpb24pCgkJCXRocm93cyBJT0V4Y2VwdGlvbjsKCgkvKioKCSAqIEdldCBhbiBleGlzdGluZyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgZnJvbSB0aGUgcGVyc2lzdGVudAoJICogc3RvcmUsIG9yIGNyZWF0ZSBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIDxwPgoJICogSWYgYSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiB3aXRoIHRoaXMgUElEIGFscmVhZHkgZXhpc3RzIGluCgkgKiBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgcmV0dXJuIGl0LiBUaGUgbG9jYXRpb24gcGFyYW1ldGVyIGlzIGlnbm9yZWQKCSAqIGluIHRoaXMgY2FzZS4KCSAqIAoJICogPHA+CgkgKiBFbHNlLCByZXR1cm4gYSBuZXcgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0LiBUaGlzIG5ldyBvYmplY3QKCSAqIGlzIGJvdW5kIHRvIHRoZSBsb2NhdGlvbiBhbmQgdGhlIHByb3BlcnRpZXMgYXJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIElmIHRoZSBsb2NhdGlvbiBwYXJhbWV0ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGl0IHdpbGwgYmUgc2V0IHdoZW4gYQoJICogTWFuYWdlZCBTZXJ2aWNlIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgUElEIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBmaXJzdAoJICogdGltZS4KCSAqIAoJICogQHBhcmFtIHBpZCBQZXJzaXN0ZW50IGlkZW50aWZpZXIuCgkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGJ1bmRsZSBsb2NhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHJldHVybiBBbiBleGlzdGluZyBvciBuZXcgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0LgoJICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhY2Nlc3MgdG8gcGVyc2lzdGVudCBzdG9yYWdlIGZhaWxzLgoJICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgPGNvZGU+Q29uZmlndXJhdGlvblBlcm1pc3Npb25bKixDT05GSUdVUkVdPC9jb2RlPi4KCSAqLwoJcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbihTdHJpbmcgcGlkLCBTdHJpbmcgbG9jYXRpb24pCgkJCXRocm93cyBJT0V4Y2VwdGlvbjsKCgkvKioKCSAqIEdldCBhbiBleGlzdGluZyBvciBuZXcgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0IGZyb20gdGhlCgkgKiBwZXJzaXN0ZW50IHN0b3JlLgoJICogCgkgKiBJZiB0aGUgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0IGZvciB0aGlzIFBJRCBkb2VzIG5vdCBleGlzdCwKCSAqIGNyZWF0ZSBhIG5ldyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgZm9yIHRoYXQgUElELCB3aGVyZQoJICogcHJvcGVydGllcyBhcmUgPGNvZGU+bnVsbDwvY29kZT4uIEJpbmQgaXRzIGxvY2F0aW9uIHRvIHRoZSBjYWxsaW5nCgkgKiBidW5kbGUncyBsb2NhdGlvbi4KCSAqIAoJICogPHA+CgkgKiBPdGhlcndpc2UsIGlmIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXhpc3RpbmcgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0CgkgKiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgc2V0IGl0IHRvIHRoZSBjYWxsaW5nIGJ1bmRsZSdzIGxvY2F0aW9uLgoJICogCgkgKiBAcGFyYW0gcGlkIHBlcnNpc3RlbnQgaWRlbnRpZmllci4KCSAqIEByZXR1cm4gYW4gZXhpc3Rpbmcgb3IgbmV3IDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG1hdGNoaW5nIHRoZSBQSUQuCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFjY2VzcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgZmFpbHMuCgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgaXMgYm91bmQgdG8gYSBsb2NhdGlvbiBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBjYWxsaW5nIGJ1bmRsZSBhbmQgaXQgaGFzIG5vIDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uWyosQ09ORklHVVJFXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oU3RyaW5nIHBpZCkgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogTGlzdCB0aGUgY3VycmVudCA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3RzIHdoaWNoIG1hdGNoIHRoZQoJICogZmlsdGVyLgoJICogCgkgKiA8cD4KCSAqIE9ubHkgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0cyB3aXRoIG5vbi0gPGNvZGU+bnVsbDwvY29kZT4KCSAqIHByb3BlcnRpZXMgYXJlIGNvbnNpZGVyZWQgY3VycmVudC4gVGhhdCBpcywKCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpPC9jb2RlPiBpcyBndWFyYW50ZWVkIG5vdCB0byByZXR1cm4KCSAqIDxjb2RlPm51bGw8L2NvZGU+IGZvciBlYWNoIG9mIHRoZSByZXR1cm5lZCA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPgoJICogb2JqZWN0cy4KCSAqIAoJICogPHA+CgkgKiBOb3JtYWxseSBvbmx5IDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdHMgdGhhdCBhcmUgYm91bmQgdG8gdGhlCgkgKiBsb2NhdGlvbiBvZiB0aGUgY2FsbGluZyBidW5kbGUgYXJlIHJldHVybmVkLCBvciBhbGwgaWYgdGhlIGNhbGxlciBoYXMgCgkgKiA8Y29kZT5Db25maWd1cmF0aW9uUGVybWlzc2lvblsqLENPTkZJR1VSRV08L2NvZGU+LgoJICogCgkgKiA8cD4KCSAqIFRoZSBzeW50YXggb2YgdGhlIGZpbHRlciBzdHJpbmcgaXMgYXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+RmlsdGVyPC9jb2RlPgoJICogY2xhc3MuIFRoZSBmaWx0ZXIgY2FuIHRlc3QgYW55IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmcgdGhlCgkgKiBmb2xsb3dpbmcgc3lzdGVtIHByb3BlcnRpZXM6CgkgKiA8dWw+CgkgKiA8bGk+PGNvZGU+c2VydmljZS5waWQ8L2NvZGU+LTxjb2RlPlN0cmluZzwvY29kZT4tIHRoZSBQSUQgdW5kZXIKCSAqIHdoaWNoIHRoaXMgaXMgcmVnaXN0ZXJlZDwvbGk+CgkgKiA8bGk+PGNvZGU+c2VydmljZS5mYWN0b3J5UGlkPC9jb2RlPi08Y29kZT5TdHJpbmc8L2NvZGU+LSB0aGUKCSAqIGZhY3RvcnkgaWYgYXBwbGljYWJsZTwvbGk+CgkgKiA8bGk+PGNvZGU+c2VydmljZS5idW5kbGVMb2NhdGlvbjwvY29kZT4tPGNvZGU+U3RyaW5nPC9jb2RlPi0gdGhlCgkgKiBidW5kbGUgbG9jYXRpb248L2xpPgoJICogPC91bD4KCSAqIFRoZSBmaWx0ZXIgY2FuIGFsc28gYmUgPGNvZGU+bnVsbDwvY29kZT4sIG1lYW5pbmcgdGhhdCBhbGwKCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdHMgc2hvdWxkIGJlIHJldHVybmVkLgoJICogCgkgKiBAcGFyYW0gZmlsdGVyIGEgPGNvZGU+RmlsdGVyPC9jb2RlPiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCgkgKiAgICAgICAgcmV0cmlldmUgYWxsIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdHMuCgkgKiBAcmV0dXJuIGFsbCBtYXRjaGluZyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3RzLCBvcgoJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmVuJ3QgYW55CgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFjY2VzcyB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgZmFpbHMKCSAqIEB0aHJvd3MgSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBpZiB0aGUgZmlsdGVyIHN0cmluZyBpcyBpbnZhbGlkCgkgKi8KCXB1YmxpYyBDb25maWd1cmF0aW9uW10gbGlzdENvbmZpZ3VyYXRpb25zKFN0cmluZyBmaWx0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwKCQkJSW52YWxpZFN5bnRheEV4Y2VwdGlvbjsKfQpQSwMECgAAAAAAa1LuNJ87aN+qEwAAqhMAADgAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uRXZlbnQuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY20vc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV2ZW50LmphdmEsdiAxLjkgMjAwNi8wNi8xNiAxNjozMToyOCBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA0LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNtOwoKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwoKLyoqCiAqIEEgQ29uZmlndXJhdGlvbiBFdmVudC4KICogCiAqIDxwPgogKiA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+IG9iamVjdHMgYXJlIGRlbGl2ZXJlZCB0byBhbGwgcmVnaXN0ZXJlZAogKiA8Y29kZT5Db25maWd1cmF0aW9uTGlzdGVuZXI8L2NvZGU+IHNlcnZpY2Ugb2JqZWN0cy4gQ29uZmlndXJhdGlvbkV2ZW50cwogKiBtdXN0IGJlIGFzeW5jaHJvbm91c2x5IGRlbGl2ZXJlZCBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIHdpdGggcmVzcGVjdCB0byBlYWNoCiAqIGxpc3RlbmVyLgogKiAKICogPHA+CiAqIEEgdHlwZSBjb2RlIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgZXZlbnQuIFRoZSBmb2xsb3dpbmcgZXZlbnQgdHlwZXMKICogYXJlIGRlZmluZWQ6CiAqIDx1bD4KICogPGxpPntAbGluayAjQ01fVVBEQVRFRH0KICogPGxpPntAbGluayAjQ01fREVMRVRFRH0KICogPC91bD4KICogQWRkaXRpb25hbCBldmVudCB0eXBlcyBtYXkgYmUgZGVmaW5lZCBpbiB0aGUgZnV0dXJlLgogKiAKICogPHA+CiAqIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zLiA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+IG9iamVjdHMgZG8gbm90CiAqIHByb3ZpZGUgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0cywgc28gbm8gc2Vuc2l0aXZlIGNvbmZpZ3VyYXRpb24KICogaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZyb20gdGhlIGV2ZW50LiBJZiB0aGUgbGlzdGVuZXIgd2FudHMgdG8gbG9jYXRlIHRoZQogKiA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcGlkLCBpdCBtdXN0IHVzZQogKiA8Y29kZT5Db25maWd1cmF0aW9uQWRtaW48L2NvZGU+LgogKiAKICogQHNlZSBDb25maWd1cmF0aW9uTGlzdGVuZXIKICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICogQHNpbmNlIDEuMgogKi8KcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FdmVudCB7CgkvKioKCSAqIEEgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gaGFzIGJlZW4gdXBkYXRlZC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIDxjb2RlPkNvbmZpZ3VyYXRpb25FdmVudDwvY29kZT4gdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IGEKCSAqIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggbmV3IHByb3BlcnRpZXMuCgkgKiAKCSAqIEFuIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjYWxsIHRvIDxjb2RlPkNvbmZpZ3VyYXRpb24udXBkYXRlPC9jb2RlPgoJICogc3VjY2Vzc2Z1bGx5IGNoYW5nZXMgYSBjb25maWd1cmF0aW9uLgoJICogCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBvZiA8Y29kZT5DTV9VUERBVEVEPC9jb2RlPiBpcyAxLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAkJCUNNX1VQREFURUQJPSAxOwoJLyoqCgkgKiBBIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IGhhcyBiZWVuIGRlbGV0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhpcyA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+IHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhCgkgKiA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4gZGVsZXRlZC4KCSAqIAoJICogQW4gZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNhbGwgdG8gPGNvZGU+Q29uZmlndXJhdGlvbi5kZWxldGU8L2NvZGU+CgkgKiBzdWNjZXNzZnVsbHkgZGVsZXRlcyBhIGNvbmZpZ3VyYXRpb24uCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIDxjb2RlPkNNX0RFTEVURUQ8L2NvZGU+IGlzIDIuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CQkJQ01fREVMRVRFRAk9IDI7CgkvKioKCSAqIFR5cGUgb2YgdGhpcyBldmVudC4KCSAqIAoJICogQHNlZSAjZ2V0VHlwZQoJICovCglwcml2YXRlIGZpbmFsIGludAkJCQl0eXBlOwoJLyoqCgkgKiBUaGUgZmFjdG9yeSBwaWQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCgkgKi8KCXByaXZhdGUgZmluYWwgU3RyaW5nCQkJZmFjdG9yeVBpZDsKCS8qKgoJICogVGhlIHBpZCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KCSAqLwoJcHJpdmF0ZSBmaW5hbCBTdHJpbmcJCQlwaWQ7CgkvKioKCSAqIFRoZSBDb25maWd1cmF0aW9uQWRtaW4gc2VydmljZSB3aGljaCBjcmVhdGVkIHRoaXMgZXZlbnQuCgkgKi8KCXByaXZhdGUgZmluYWwgU2VydmljZVJlZmVyZW5jZQlyZWZlcmVuY2U7CgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+Q29uZmlndXJhdGlvbkV2ZW50PC9jb2RlPiBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4KCSAqIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCwgZXZlbnQgdHlwZSwgYW5kIHBpZHMuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgVGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUKCSAqICAgICAgICBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgdGhhdCBjcmVhdGVkIHRoaXMgZXZlbnQuCgkgKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS4gU2VlIHtAbGluayAjZ2V0VHlwZX0uCgkgKiBAcGFyYW0gZmFjdG9yeVBpZCBUaGUgZmFjdG9yeSBwaWQgb2YgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBpZiB0aGUKCSAqICAgICAgICB0YXJnZXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYSBNYW5hZ2VkU2VydmljZUZhY3RvcnkuIE90aGVyd2lzZQoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0YXJnZXQgb2YgdGhlIGNvbmZpZ3VyYXRpb24gaXMgYQoJICogICAgICAgIE1hbmFnZWRTZXJ2aWNlLgoJICogQHBhcmFtIHBpZCBUaGUgcGlkIG9mIHRoZSBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24uCgkgKi8KCXB1YmxpYyBDb25maWd1cmF0aW9uRXZlbnQoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIGludCB0eXBlLAoJCQlTdHJpbmcgZmFjdG9yeVBpZCwgU3RyaW5nIHBpZCkgewoJCXRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOwoJCXRoaXMudHlwZSA9IHR5cGU7CgkJdGhpcy5mYWN0b3J5UGlkID0gZmFjdG9yeVBpZDsKCQl0aGlzLnBpZCA9IHBpZDsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgcGlkIG9mIHRoZSBhc3NvY2lhdGVkIGNvbmZpZ3VyYXRpb24uCgkgKiAKCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmFjdG9yeSBwaWQgb2YgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBpZiB0aGUKCSAqICAgICAgICAgdGFyZ2V0IG9mIHRoZSBjb25maWd1cmF0aW9uIGlzIGEgTWFuYWdlZFNlcnZpY2VGYWN0b3J5LiBPdGhlcndpc2UKCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHRhcmdldCBvZiB0aGUgY29uZmlndXJhdGlvbiBpcyBhCgkgKiAgICAgICAgIE1hbmFnZWRTZXJ2aWNlLgoJICovCglwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlQaWQoKSB7CgkJcmV0dXJuIGZhY3RvcnlQaWQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBwaWQgb2YgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbi4KCSAqIAoJICogQHJldHVybiBSZXR1cm5zIHRoZSBwaWQgb2YgdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbi4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRQaWQoKSB7CgkJcmV0dXJuIHBpZDsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGV2ZW50LgoJICogPHA+CgkgKiBUaGUgdHlwZSB2YWx1ZXMgYXJlOgoJICogPHVsPgoJICogPGxpPntAbGluayAjQ01fVVBEQVRFRH0KCSAqIDxsaT57QGxpbmsgI0NNX0RFTEVURUR9CgkgKiA8L3VsPgoJICogCgkgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuCgkgKi8KCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKCQlyZXR1cm4gdHlwZTsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IG9mIHRoZSBDb25maWd1cmF0aW9uCgkgKiBBZG1pbiBzZXJ2aWNlIHRoYXQgY3JlYXRlZCB0aGlzIGV2ZW50LgoJICogCgkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBDb25maWd1cmF0aW9uCgkgKiAgICAgICAgIEFkbWluIHNlcnZpY2UgdGhhdCBjcmVhdGVkIHRoaXMgZXZlbnQuCgkgKi8KCXB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlIGdldFJlZmVyZW5jZSgpIHsKCQlyZXR1cm4gcmVmZXJlbmNlOwoJfQp9ClBLAwQKAAAAAABrUu40a5qiDbsMAAC7DAAAPAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY20vc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhLHYgMS4xMyAyMDA2LzA3LzExIDEzOjE1OjUyIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNtOwoKLyoqCiAqIEFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gY2xhc3MgdG8gaW5mb3JtIHRoZSBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UKICogb2YgcHJvYmxlbXMgd2l0aCBjb25maWd1cmF0aW9uIGRhdGEuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTMgJAogKi8KcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewoJc3RhdGljIGZpbmFsIGxvbmcJc2VyaWFsVmVyc2lvblVJRAk9IC0xNjkwMDkwNDEzNDQxNzY5Mzc3TDsKCglwcml2YXRlIGZpbmFsIFN0cmluZwkJcHJvcGVydHk7Cglwcml2YXRlIGZpbmFsIFN0cmluZwkJcmVhc29uOwoKCS8qKgoJICogTmVzdGVkIGV4Y2VwdGlvbi4KCSAqLwoJcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUJY2F1c2U7CgoJLyoqCgkgKiBDcmVhdGUgYSA8Y29kZT5Db25maWd1cmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbSwKCSAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzcGVjaWZpYyBwcm9wZXJ0eSB3YXMgdGhlIGNhdXNlCgkgKiBAcGFyYW0gcmVhc29uIHJlYXNvbiBmb3IgZmFpbHVyZQoJICovCglwdWJsaWMgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcHJvcGVydHksIFN0cmluZyByZWFzb24pIHsKCQlzdXBlcihwcm9wZXJ0eSArICIgOiAiICsgcmVhc29uKTsKCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CgkJdGhpcy5yZWFzb24gPSByZWFzb247CgkJdGhpcy5jYXVzZSA9IG51bGw7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYSA8Y29kZT5Db25maWd1cmF0aW9uRXhjZXB0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhdXNlZCB0aGUgcHJvYmxlbSwKCSAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzcGVjaWZpYyBwcm9wZXJ0eSB3YXMgdGhlIGNhdXNlCgkgKiBAcGFyYW0gcmVhc29uIHJlYXNvbiBmb3IgZmFpbHVyZQoJICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbi4KCSAqIEBzaW5jZSAxLjIKCSAqLwoJcHVibGljIENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nIHByb3BlcnR5LCBTdHJpbmcgcmVhc29uLAoJCQlUaHJvd2FibGUgY2F1c2UpIHsKCQlzdXBlcihwcm9wZXJ0eSArICIgOiAiICsgcmVhc29uKTsKCQl0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CgkJdGhpcy5yZWFzb24gPSByZWFzb247CgkJdGhpcy5jYXVzZSA9IGNhdXNlOwoJfQoKCS8qKgoJICogUmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lIHRoYXQgY2F1c2VkIHRoZSBmYWlsdXJlIG9yIG51bGwuCgkgKiAKCSAqIEByZXR1cm4gbmFtZSBvZiBwcm9wZXJ0eSBvciBudWxsIGlmIG5vIHNwZWNpZmljIHByb3BlcnR5IGNhdXNlZCB0aGUKCSAqICAgICAgICAgcHJvYmxlbQoJICovCglwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgewoJCXJldHVybiBwcm9wZXJ0eTsKCX0KCgkvKioKCSAqIFJldHVybiB0aGUgcmVhc29uIGZvciB0aGlzIGV4Y2VwdGlvbi4KCSAqIAoJICogQHJldHVybiByZWFzb24gb2YgdGhlIGZhaWx1cmUKCSAqLwoJcHVibGljIFN0cmluZyBnZXRSZWFzb24oKSB7CgkJcmV0dXJuIHJlYXNvbjsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNhdXNlCgkgKiB3YXMgc3BlY2lmaWVkIHdoZW4gdGhpcyBleGNlcHRpb24gd2FzIGNyZWF0ZWQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNhdXNlCgkgKiAgICAgICAgIHdhcyBzcGVjaWZpZWQuCgkgKiBAc2luY2UgMS4yCgkgKi8KCXB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CgkJcmV0dXJuIGNhdXNlOwoJfQoKCS8qKgoJICogVGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIGNhbiBvbmx5IGJlIHNldCB3aGVuIGNvbnN0cnVjdGVkLgoJICogCgkgKiBAcGFyYW0gY2F1c2UgQ2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4KCSAqIEByZXR1cm4gVGhpcyBvYmplY3QuCgkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgdGhyb3cgYW4KCSAqICAgICAgICAgPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPiBzaW5jZSB0aGUgY2F1c2Ugb2YgdGhpcwoJICogICAgICAgICBleGNlcHRpb24gY2FuIG9ubHkgYmUgc2V0IHdoZW4gY29uc3RydWN0ZWQuCgkgKiBAc2luY2UgMS4yCgkgKi8KCXB1YmxpYyBUaHJvd2FibGUgaW5pdENhdXNlKFRocm93YWJsZSBjYXVzZSkgewoJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKCX0KfQpQSwMECgAAAAAAa1LuNBAo9zO3BwAAtwcAADsAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uTGlzdGVuZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY20vc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkxpc3RlbmVyLmphdmEsdiAxLjEwIDIwMDYvMDYvMTYgMTY6MzE6MjggaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNCwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jbTsKCi8qKgogKiBMaXN0ZW5lciBmb3IgQ29uZmlndXJhdGlvbiBFdmVudHMuIFdoZW4gYSA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+CiAqIGlzIGZpcmVkLCBpdCBpcyBhc3luY2hyb25vdXNseSBkZWxpdmVyZWQgdG8gYQogKiA8Y29kZT5Db25maWd1cmF0aW9uTGlzdGVuZXI8L2NvZGU+LgogKiAKICogPHA+CiAqIDxjb2RlPkNvbmZpZ3VyYXRpb25MaXN0ZW5lcjwvY29kZT4gb2JqZWN0cyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZQogKiBGcmFtZXdvcmsgc2VydmljZSByZWdpc3RyeSBhbmQgYXJlIG5vdGlmaWVkIHdpdGggYQogKiA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+IG9iamVjdCB3aGVuIGFuIGV2ZW50IGlzIGZpcmVkLgogKiA8cD4KICogPGNvZGU+Q29uZmlndXJhdGlvbkxpc3RlbmVyPC9jb2RlPiBvYmplY3RzIGNhbiBpbnNwZWN0IHRoZSByZWNlaXZlZAogKiA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+IG9iamVjdCB0byBkZXRlcm1pbmUgaXRzIHR5cGUsIHRoZSBwaWQgb2YKICogdGhlIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCB3aXRoIHdoaWNoIGl0IGlzIGFzc29jaWF0ZWQsIGFuZCB0aGUKICogQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlIHRoYXQgZmlyZWQgdGhlIGV2ZW50LgogKiAKICogPHA+CiAqIFNlY3VyaXR5IENvbnNpZGVyYXRpb25zLiBCdW5kbGVzIHdpc2hpbmcgdG8gbW9uaXRvciBjb25maWd1cmF0aW9uIGV2ZW50cyB3aWxsCiAqIHJlcXVpcmUgPGNvZGU+U2VydmljZVBlcm1pc3Npb25bQ29uZmlndXJhdGlvbkxpc3RlbmVyLFJFR0lTVEVSXTwvY29kZT4gdG8KICogcmVnaXN0ZXIgYSA8Y29kZT5Db25maWd1cmF0aW9uTGlzdGVuZXI8L2NvZGU+IHNlcnZpY2UuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTAgJAogKiBAc2luY2UgMS4yCiAqLwpwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25MaXN0ZW5lciB7CgkvKioKCSAqIFJlY2VpdmVzIG5vdGlmaWNhdGlvbiBvZiBhIENvbmZpZ3VyYXRpb24gdGhhdCBoYXMgY2hhbmdlZC4KCSAqIAoJICogQHBhcmFtIGV2ZW50IFRoZSA8Y29kZT5Db25maWd1cmF0aW9uRXZlbnQ8L2NvZGU+LgoJICovCglwdWJsaWMgdm9pZCBjb25maWd1cmF0aW9uRXZlbnQoQ29uZmlndXJhdGlvbkV2ZW50IGV2ZW50KTsKfQpQSwMECgAAAAAAa1LuNHFFr2OfFwAAnxcAAD0AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jbS9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbi5qYXZhLHYgMS4yMiAyMDA2LzA3LzA4IDAwOjQyOjAwIGhhcmdyYXZlIEV4cCAkCiAqIAogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDQsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNtOwoKaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwoKLyoqCiAqIEluZGljYXRlcyBhIGJ1bmRsZSdzIGF1dGhvcml0eSB0byBjb25maWd1cmUgYnVuZGxlcy4KICogCiAqIFRoaXMgcGVybWlzc2lvbiBoYXMgb25seSBhIHNpbmdsZSBhY3Rpb246IENPTkZJR1VSRS4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yMiAkCiAqIEBzaW5jZSAxLjIKICovCgpwdWJsaWMgZmluYWwgY2xhc3MgQ29uZmlndXJhdGlvblBlcm1pc3Npb24gZXh0ZW5kcyBCYXNpY1Blcm1pc3Npb24gewoJc3RhdGljIGZpbmFsIGxvbmcJCQlzZXJpYWxWZXJzaW9uVUlECT0gNTcxNjg2ODczNDgxMTk2NTM4M0w7CgkvKioKCSAqIFRoZSBhY3Rpb24gc3RyaW5nIDxjb2RlPmNvbmZpZ3VyZTwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCUNPTkZJR1VSRQkJCT0gImNvbmZpZ3VyZSI7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgQ29uZmlndXJhdGlvblBlcm1pc3Npb24uCgkgKiAKCSAqIEBwYXJhbSBuYW1lIE5hbWUgbXVzdCBiZSAmcXVvdDsqJnF1b3Q7LgoJICogQHBhcmFtIGFjdGlvbnMgPGNvZGU+Y29uZmlndXJlPC9jb2RlPiAoY2Fub25pY2FsIG9yZGVyKS4KCSAqLwoKCXB1YmxpYyBDb25maWd1cmF0aW9uUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKCQlzdXBlcihuYW1lKTsKCQlpZiAoIW5hbWUuZXF1YWxzKCIqIikpIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBtdXN0IGJlICoiKTsKCQl9CgkJYWN0aW9ucyA9IGFjdGlvbnMudHJpbSgpOwoJCWlmIChhY3Rpb25zLmVxdWFsc0lnbm9yZUNhc2UoQ09ORklHVVJFKXx8YWN0aW9ucy5lcXVhbHMoIioiKSkKCQkJcmV0dXJuOwoJCQoJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbnMgbXVzdCBiZSAiICsgQ09ORklHVVJFKTsKCX0KCgkvKioKCSAqIERldGVybWluZXMgaWYgYSA8Y29kZT5Db25maWd1cmF0aW9uUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0ICJpbXBsaWVzIgoJICogdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uLgoJICogCgkgKiBAcGFyYW0gcCBUaGUgdGFyZ2V0IHBlcm1pc3Npb24gdG8gY2hlY2suCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5CgkgKiAgICAgICAgIHRoaXMgb2JqZWN0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCgoJcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHApIHsKCQlyZXR1cm4gcCBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25QZXJtaXNzaW9uOwoJfQoKCS8qKgoJICogRGV0ZXJtaW5lcyB0aGUgZXF1YWxpdHkgb2YgdHdvIDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uPC9jb2RlPgoJICogb2JqZWN0cy4KCSAqIDxwPgoJICogVHdvIDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzIGFyZSBlcXVhbC4KCSAqIAoJICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IGJlaW5nIGNvbXBhcmVkIGZvciBlcXVhbGl0eSB3aXRoIHRoaXMgb2JqZWN0LgoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhpcwoJICogICAgICAgICA8Y29kZT5Db25maWd1cmF0aW9uUGVybWlzc2lvbjwvY29kZT47IDxjb2RlPmZhbHNlPC9jb2RlPgoJICogICAgICAgICBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CgkJcmV0dXJuIG9iaiBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25QZXJtaXNzaW9uOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBIYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgoJICovCgoJcHVibGljIGludCBoYXNoQ29kZSgpIHsKCQlyZXR1cm4gZ2V0TmFtZSgpLmhhc2hDb2RlKCkgXiBnZXRBY3Rpb25zKCkuaGFzaENvZGUoKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCgkgKiA8Y29kZT5Db25maWd1cmF0aW9uUGVybWlzc2lvbjwvY29kZT4gYWN0aW9ucy4KCSAqIAoJICogPHA+CgkgKiBBbHdheXMgcmV0dXJucyBwcmVzZW50IDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uPC9jb2RlPiBhY3Rpb25zIGluCgkgKiB0aGUgZm9sbG93aW5nIG9yZGVyOiA8Y29kZT5DT05GSUdVUkU8L2NvZGU+CgkgKiAKCSAqIEByZXR1cm4gQ2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUKCSAqICAgICAgICAgPGNvZGU+Q29uZmlndXJhdGlvblBlcm1pc3Npb248L2NvZGU+IGFjdGlvbnMuCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0QWN0aW9ucygpIHsKCQlyZXR1cm4gQ09ORklHVVJFOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5ldyA8Y29kZT5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gb2JqZWN0IHN1aXRhYmxlIGZvcgoJICogc3RvcmluZyA8Y29kZT5Db25maWd1cmF0aW9uUGVybWlzc2lvbjwvY29kZT5zLgoJICogCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlBlcm1pc3Npb25Db2xsZWN0aW9uPC9jb2RlPiBvYmplY3QuCgkgKi8KCXB1YmxpYyBQZXJtaXNzaW9uQ29sbGVjdGlvbiBuZXdQZXJtaXNzaW9uQ29sbGVjdGlvbigpIHsKCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25QZXJtaXNzaW9uQ29sbGVjdGlvbigpOwoJfQp9CgovKioKICogU3RvcmVzIGEgc2V0IG9mIDxjb2RlPkNvbmZpZ3VyYXRpb25QZXJtaXNzaW9uPC9jb2RlPiBwZXJtaXNzaW9ucy4KICogCiAqIEBzZWUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uCiAqIEBzZWUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9ucwogKiBAc2VlIGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb24KICovCmZpbmFsIGNsYXNzIENvbmZpZ3VyYXRpb25QZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIFBlcm1pc3Npb25Db2xsZWN0aW9uIHsKCXN0YXRpYyBmaW5hbCBsb25nCXNlcmlhbFZlcnNpb25VSUQJPSAtNjkxNzYzODg2NzA4MTY5NTgzOUw7CgkvKioKCSAqIFRydWUgaWYgY29sbGVjdGlvbiBpcyBub24tZW1wdHkuCgkgKiAKCSAqIEBzZXJpYWwKCSAqLwoJcHJpdmF0ZSBib29sZWFuCQloYXNFbGVtZW50OwoKCS8qKgoJICogQ3JlYXRlcyBhbiBlbXB0eSA8dHQ+Q29uZmlndXJhdGlvblBlcm1pc3Npb25Db2xsZWN0aW9uPC90dD4gb2JqZWN0LgoJICogCgkgKi8KCXB1YmxpYyBDb25maWd1cmF0aW9uUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CgkJaGFzRWxlbWVudCA9IGZhbHNlOwoJfQoKCS8qKgoJICogQWRkcyB0aGUgc3BlY2lmaWVkIHBlcm1pc3Npb24gdG8gdGhlCgkgKiA8dHQ+Q29uZmlndXJhdGlvblBlcm1pc3Npb25Db2xsZWN0aW9uPC90dD4uIFRoZSBrZXkgZm9yIHRoZSBoYXNoIGlzCgkgKiB0aGUgaW50ZXJmYWNlIG5hbWUgb2YgdGhlIHNlcnZpY2UuCgkgKiAKCSAqIEBwYXJhbSBwZXJtaXNzaW9uIFRoZSA8dHQ+UGVybWlzc2lvbjwvdHQ+IG9iamVjdCB0byBhZGQuCgkgKiAKCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBwZXJtaXNzaW9uIGlzIG5vdCBhbgoJICogICAgICAgICAgICA8dHQ+Q29uZmlndXJhdGlvblBlcm1pc3Npb248L3R0Pi4KCSAqIAoJICogQGV4Y2VwdGlvbiBTZWN1cml0eUV4Y2VwdGlvbiBJZiB0aGlzIENvbmZpZ3VyYXRpb25QZXJtaXNzaW9uQ29sbGVjdGlvbgoJICogICAgICAgICAgICBvYmplY3QgaGFzIGJlZW4gbWFya2VkIHJlYWQtb25seS4KCSAqLwoKCXB1YmxpYyB2b2lkIGFkZChQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKCQlpZiAoIShwZXJtaXNzaW9uIGluc3RhbmNlb2YgQ29uZmlndXJhdGlvblBlcm1pc3Npb24pKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgcGVybWlzc2lvbjogIgoJCQkJCSsgcGVybWlzc2lvbik7CgkJfQoKCQlpZiAoaXNSZWFkT25seSgpKQoJCQl0aHJvdyBuZXcgU2VjdXJpdHlFeGNlcHRpb24oImF0dGVtcHQgdG8gYWRkIGEgUGVybWlzc2lvbiB0byBhICIKCQkJCQkrICJyZWFkb25seSBQZXJtaXNzaW9uQ29sbGVjdGlvbiIpOwoKCQloYXNFbGVtZW50ID0gdHJ1ZTsKCX0KCgkvKioKCSAqIERldGVybWluZXMgaWYgdGhlIHNwZWNpZmllZCBzZXQgb2YgcGVybWlzc2lvbnMgaW1wbGllcyB0aGUgcGVybWlzc2lvbnMKCSAqIGV4cHJlc3NlZCBpbiB0aGUgcGFyYW1ldGVyIDx0dD5wZXJtaXNzaW9uPC90dD4uCgkgKiAKCSAqIEBwYXJhbSBwIFRoZSBQZXJtaXNzaW9uIG9iamVjdCB0byBjb21wYXJlLgoJICogCgkgKiBAcmV0dXJuIHRydWUgaWYgcGVybWlzc2lvbiBpcyBhIHByb3BlciBzdWJzZXQgb2YgYSBwZXJtaXNzaW9uIGluIHRoZSBzZXQ7CgkgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KCSAqLwoKCXB1YmxpYyBib29sZWFuIGltcGxpZXMoUGVybWlzc2lvbiBwKSB7CgkJcmV0dXJuIGhhc0VsZW1lbnQgJiYgKHAgaW5zdGFuY2VvZiBDb25maWd1cmF0aW9uUGVybWlzc2lvbik7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFuIDx0dD5Db25maWd1cmF0aW9uUGVybWlzc2lvbjwvdHQ+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiBFbnVtZXJhdGlvbiBvZiBhbiA8dHQ+Q29uZmlndXJhdGlvblBlcm1pc3Npb248L3R0PiBvYmplY3QuCgkgKi8KCglwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7CgkJZmluYWwgYm9vbGVhbiBub25FbXB0eSA9IGhhc0VsZW1lbnQ7CgkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKCQkJcHJpdmF0ZSBib29sZWFuCW1vcmUgPSBub25FbXB0eTsKCgkJCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKCQkJCXJldHVybiBtb3JlOwoJCQl9CgoJCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewoJCQkJaWYgKG1vcmUpIHsKCQkJCQltb3JlID0gZmFsc2U7CgoJCQkJCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblBlcm1pc3Npb24oIioiLAoJCQkJCQkJQ29uZmlndXJhdGlvblBlcm1pc3Npb24uQ09ORklHVVJFKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CgkJCQl9CgkJCX0KCQl9OwoJfQoKfQpQSwMECgAAAAAAa1LuNAKw1/G/FgAAvxYAADkAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGx1Z2luLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmNtL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QbHVnaW4uamF2YSx2IDEuMTEgMjAwNi8wNi8xNiAxNjozMToyOCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jbTsKCmltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKCi8qKgogKiBBIHNlcnZpY2UgaW50ZXJmYWNlIGZvciBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb24gZGljdGlvbmFyeSBiZWZvcmUgdGhlCiAqIHVwZGF0ZS4KICogCiAqIDxwPgogKiBBIGJ1bmRsZSByZWdpc3RlcnMgYSA8Y29kZT5Db25maWd1cmF0aW9uUGx1Z2luPC9jb2RlPiBvYmplY3QgaW4gb3JkZXIgdG8KICogcHJvY2VzcyBjb25maWd1cmF0aW9uIHVwZGF0ZXMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIE1hbmFnZWQgU2VydmljZSBvcgogKiBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeS4gVGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZSB3aWxsIGRldGVjdAogKiByZWdpc3RyYXRpb25zIG9mIENvbmZpZ3VyYXRpb24gUGx1Z2luIHNlcnZpY2VzIGFuZCBtdXN0IGNhbGwgdGhlc2Ugc2VydmljZXMKICogZXZlcnkgdGltZSBiZWZvcmUgaXQgY2FsbHMgdGhlIDxjb2RlPk1hbmFnZWRTZXJ2aWNlPC9jb2RlPiBvcgogKiA8Y29kZT5NYW5hZ2VkU2VydmljZUZhY3Rvcnk8L2NvZGU+CiAqIDxjb2RlPnVwZGF0ZWQ8L2NvZGU+IG1ldGhvZC4gVGhlCiAqIENvbmZpZ3VyYXRpb24gUGx1Z2luIHNlcnZpY2UgdGh1cyBoYXMgdGhlIG9wcG9ydHVuaXR5IHRvIHZpZXcgYW5kIG1vZGlmeSB0aGUKICogcHJvcGVydGllcyBiZWZvcmUgdGhleSBhcmUgcGFzc2VkIHRvIHRoZSBNYW5hZ2VkUyBlcnZpY2Ugb3IgTWFuYWdlZCBTZXJ2aWNlCiAqIEZhY3RvcnkuCiAqIAogKiA8cD4KICogQ29uZmlndXJhdGlvbiBQbHVnaW4gKHBsdWdpbikgc2VydmljZXMgaGF2ZSBmdWxsIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGFsbAogKiBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBUaGVyZWZvcmUsIGJ1bmRsZXMgdXNpbmcgdGhpcyBmYWNpbGl0eSBzaG91bGQgYmUKICogdHJ1c3RlZC4gQWNjZXNzIHRvIHRoaXMgZmFjaWxpdHkgc2hvdWxkIGJlIGxpbWl0ZWQgd2l0aAogKiA8Y29kZT5TZXJ2aWNlUGVybWlzc2lvbltDb25maWd1cmF0aW9uUGx1Z2luLFJFR0lTVEVSXTwvY29kZT4uCiAqIEltcGxlbWVudGF0aW9ucyBvZiBhIENvbmZpZ3VyYXRpb24gUGx1Z2luIHNlcnZpY2Ugc2hvdWxkIGFzc3VyZSB0aGF0IHRoZXkKICogb25seSBhY3Qgb24gYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbnMuCiAqIAogKiA8cD4KICogVGhlIDxjb2RlPkludGVnZXI8L2NvZGU+IDxjb2RlPnNlcnZpY2UuY21SYW5raW5nPC9jb2RlPiByZWdpc3RyYXRpb24KICogcHJvcGVydHkgbWF5IGJlIHNwZWNpZmllZC4gTm90IHNwZWNpZnlpbmcgdGhpcyByZWdpc3RyYXRpb24gcHJvcGVydHksIG9yCiAqIHNldHRpbmcgaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4sIGlzIHRoZSBzYW1lIGFzCiAqIHNldHRpbmcgaXQgdG8gdGhlIDxjb2RlPkludGVnZXI8L2NvZGU+IHplcm8uIFRoZQogKiA8Y29kZT5zZXJ2aWNlLmNtUmFua2luZzwvY29kZT4gcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2gKICogcGx1Z2lucyBhcmUgaW52b2tlZC4gTG93ZXIgcmFua2VkIHBsdWdpbnMgYXJlIGNhbGxlZCBiZWZvcmUgaGlnaGVyIHJhbmtlZAogKiBvbmVzLiBJbiB0aGUgZXZlbnQgb2YgbW9yZSB0aGFuIG9uZSBwbHVnaW4gaGF2aW5nIHRoZSBzYW1lIHZhbHVlIG9mCiAqIDxjb2RlPnNlcnZpY2UuY21SYW5raW5nPC9jb2RlPiwgdGhlbiB0aGUgQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlCiAqIGFyYml0cmFyaWx5IGNob29zZXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGNhbGxlZC4KICogCiAqIDxwPgogKiBCeSBjb252ZW50aW9uLCBwbHVnaW5zIHdpdGggPGNvZGU+c2VydmljZS5jbVJhbmtpbmcmbHQ7IDA8L2NvZGU+IG9yCiAqIDxjb2RlPnNlcnZpY2UuY21SYW5raW5nICZndDsgMTAwMDwvY29kZT4gc2hvdWxkIG5vdCBtYWtlIG1vZGlmaWNhdGlvbnMgdG8KICogdGhlIHByb3BlcnRpZXMuCiAqIAogKiA8cD4KICogVGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZSBoYXMgdGhlIHJpZ2h0IHRvIGhpZGUgcHJvcGVydGllcyBmcm9tCiAqIHBsdWdpbnMsIG9yIHRvIGlnbm9yZSBzb21lIG9yIGFsbCB0aGUgY2hhbmdlcyB0aGF0IHRoZXkgbWFrZS4gVGhpcyBtaWdodCBiZQogKiBkb25lIGZvciBzZWN1cml0eSByZWFzb25zLiBBbnkgc3VjaCBiZWhhdmlvciBpcyBlbnRpcmVseSBpbXBsZW1lbnRhdGlvbgogKiBkZWZpbmVkLgogKiAKICogPHA+CiAqIEEgcGx1Z2luIG1heSBvcHRpb25hbGx5IHNwZWNpZnkgYSA8Y29kZT5jbS50YXJnZXQ8L2NvZGU+IHJlZ2lzdHJhdGlvbgogKiBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyB0aGUgUElEIG9mIHRoZSBNYW5hZ2VkIFNlcnZpY2Ugb3IgTWFuYWdlZCBTZXJ2aWNlCiAqIEZhY3Rvcnkgd2hvc2UgY29uZmlndXJhdGlvbiB1cGRhdGVzIHRoZSBwbHVnaW4gaXMgaW50ZW5kZWQgdG8gaW50ZXJjZXB0LiBUaGUKICogcGx1Z2luIHdpbGwgdGhlbiBvbmx5IGJlIGNhbGxlZCB3aXRoIGNvbmZpZ3VyYXRpb24gdXBkYXRlcyB0aGF0IGFyZSB0YXJnZXR0ZWQKICogYXQgdGhlIE1hbmFnZWQgU2VydmljZSBvciBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQgUElELgogKiBPbWl0dGluZyB0aGUgPGNvZGU+Y20udGFyZ2V0PC9jb2RlPiByZWdpc3RyYXRpb24gcHJvcGVydHkgbWVhbnMgdGhhdCB0aGUKICogcGx1Z2luIGlzIGNhbGxlZCBmb3IgYWxsIGNvbmZpZ3VyYXRpb24gdXBkYXRlcy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMSAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25QbHVnaW4gewoJLyoqCgkgKiBBIHNlcnZpY2UgcHJvcGVydHkgdG8gbGltaXQgdGhlIE1hbmFnZWQgU2VydmljZSBvciBNYW5hZ2VkIFNlcnZpY2UKCSAqIEZhY3RvcnkgY29uZmlndXJhdGlvbiBkaWN0aW9uYXJpZXMgYSBDb25maWd1cmF0aW9uIFBsdWdpbiBzZXJ2aWNlCgkgKiByZWNlaXZlcy4KCSAqIAoJICogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBhIDxjb2RlPlN0cmluZ1tdPC9jb2RlPiBvZiBQSURzLiBBIENvbmZpZ3VyYXRpb24KCSAqIEFkbWluIHNlcnZpY2UgbXVzdCBjYWxsIGEgQ29uZmlndXJhdGlvbiBQbHVnaW4gc2VydmljZSBvbmx5IHdoZW4gdGhpcwoJICogcHJvcGVydHkgaXMgbm90IHNldCwgb3IgdGhlIHRhcmdldCBzZXJ2aWNlJ3MgUElEIGlzIGxpc3RlZCBpbiB0aGlzCgkgKiBwcm9wZXJ0eS4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJQ01fVEFSR0VUCT0gImNtLnRhcmdldCI7CgkvKioKCSAqIEEgc2VydmljZSBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBvcmRlciBpbiB3aGljaCBwbHVnaW5zIGFyZSBpbnZva2VkLgoJICogCgkgKiBUaGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIDxjb2RlPkludGVnZXI8L2NvZGU+IHJhbmtpbmcgb2YgdGhlIHBsdWdpbi4KCSAqIE5vdCBzcGVjaWZ5aW5nIHRoaXMgcmVnaXN0cmF0aW9uIHByb3BlcnR5LCBvciBzZXR0aW5nIGl0IHRvIHNvbWV0aGluZwoJICogb3RoZXIgdGhhbiBhbiA8Y29kZT5JbnRlZ2VyPC9jb2RlPiwgaXMgdGhlIHNhbWUgYXMgc2V0dGluZyBpdCB0byB0aGUKCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+IHplcm8uIFRoaXMgcHJvcGVydHkgZGV0ZXJtaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2gKCSAqIHBsdWdpbnMgYXJlIGludm9rZWQuIExvd2VyIHJhbmtlZCBwbHVnaW5zIGFyZSBjYWxsZWQgYmVmb3JlIGhpZ2hlciByYW5rZWQKCSAqIG9uZXMuCgkgKiAKCSAqIEBzaW5jZSAxLjIKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJQ01fUkFOS0lORwk9ICJzZXJ2aWNlLmNtUmFua2luZyI7CgoJLyoqCgkgKiBWaWV3IGFuZCBwb3NzaWJseSBtb2RpZnkgdGhlIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBiZWZvcmUKCSAqIHRoZXkgYXJlIHNlbnQgdG8gdGhlIE1hbmFnZWQgU2VydmljZSBvciB0aGUgTWFuYWdlZCBTZXJ2aWNlIEZhY3RvcnkuIFRoZQoJICogQ29uZmlndXJhdGlvbiBQbHVnaW4gc2VydmljZXMgYXJlIGNhbGxlZCBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHRoZWlyCgkgKiA8Y29kZT5zZXJ2aWNlLmNtUmFua2luZzwvY29kZT4gcHJvcGVydHkuIElmIHRoaXMgcHJvcGVydHkgaXMgdW5kZWZpbmVkCgkgKiBvciBpcyBhIG5vbi0gPGNvZGU+SW50ZWdlcjwvY29kZT4gdHlwZSwgMCBpcyB1c2VkLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgbW9kaWZ5IHRoZSBwcm9wZXJ0aWVzIHVubGVzcyB0aGUKCSAqIDxjb2RlPnNlcnZpY2UuY21SYW5raW5nPC9jb2RlPiBvZiB0aGlzIHBsdWdpbiBpcyBpbiB0aGUgcmFuZ2UKCSAqIDxjb2RlPjAgJmx0Oz0gc2VydmljZS5jbVJhbmtpbmcgJmx0Oz0gMTAwMDwvY29kZT4uCgkgKiA8cD4KCSAqIElmIHRoaXMgbWV0aG9kIHRocm93cyBhbnkgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiwgdGhlIENvbmZpZ3VyYXRpb24KCSAqIEFkbWluIHNlcnZpY2UgbXVzdCBjYXRjaCBpdCBhbmQgc2hvdWxkIGxvZyBpdC4KCSAqIAoJICogQHBhcmFtIHJlZmVyZW5jZSByZWZlcmVuY2UgdG8gdGhlIE1hbmFnZWQgU2VydmljZSBvciBNYW5hZ2VkIFNlcnZpY2UKCSAqICAgICAgICBGYWN0b3J5CgkgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiBUaGlzIGFyZ3VtZW50IG11c3Qgbm90CgkgKiAgICAgICAgY29udGFpbiB0aGUgInNlcnZpY2UuYnVuZGxlTG9jYXRpb24iIHByb3BlcnR5LiBUaGUgdmFsdWUgb2YgdGhpcwoJICogICAgICAgIHByb3BlcnR5IG1heSBiZSBvYnRhaW5lZCBmcm9tIHRoZQoJICogICAgICAgIDxjb2RlPkNvbmZpZ3VyYXRpb24uZ2V0QnVuZGxlTG9jYXRpb248L2NvZGU+IG1ldGhvZC4KCSAqLwoJcHVibGljIHZvaWQgbW9kaWZ5Q29uZmlndXJhdGlvbihTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwKCQkJRGljdGlvbmFyeSBwcm9wZXJ0aWVzKTsKfQpQSwMECgAAAAAAa1LuNAJYiUHdFAAA3RQAADQAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jbS9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZS5qYXZhLHYgMS4xMiAyMDA2LzA2LzE2IDE2OjMxOjI4IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNtOwoKaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwoKLyoqCiAqIEEgc2VydmljZSB0aGF0IGNhbiByZWNlaXZlIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGEgQ29uZmlndXJhdGlvbiBBZG1pbgogKiBzZXJ2aWNlLgogKiAKICogPHA+CiAqIEEgTWFuYWdlZCBTZXJ2aWNlIGlzIGEgc2VydmljZSB0aGF0IG5lZWRzIGNvbmZpZ3VyYXRpb24gZGF0YS4gU3VjaCBhbiBvYmplY3QKICogc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRnJhbWV3b3JrIHJlZ2lzdHJ5IHdpdGggdGhlCiAqIDxjb2RlPnNlcnZpY2UucGlkPC9jb2RlPiBwcm9wZXJ0eSBzZXQgdG8gc29tZSB1bmlxdWUgaWRlbnRpdGlmaWVyIGNhbGxlZCBhCiAqIFBJRC4KICogCiAqIDxwPgogKiBJZiB0aGUgQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlIGhhcyBhIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdAogKiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgUElELCBpdCB3aWxsIGNhbGxiYWNrIHRoZSA8Y29kZT51cGRhdGVkKCk8L2NvZGU+CiAqIG1ldGhvZCBvZiB0aGUgPGNvZGU+TWFuYWdlZFNlcnZpY2U8L2NvZGU+IG9iamVjdCwgcGFzc2luZyB0aGUgcHJvcGVydGllcyBvZgogKiB0aGF0IDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBJZiBpdCBoYXMgbm8gc3VjaCA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QsIHRoZW4gaXQgY2FsbHMgYmFjawogKiB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gcHJvcGVydGllcyBhcmd1bWVudC4gUmVnaXN0ZXJpbmcgYSBNYW5hZ2VkIFNlcnZpY2UKICogd2lsbCBhbHdheXMgcmVzdWx0IGluIGEgY2FsbGJhY2sgdG8gdGhlIDxjb2RlPnVwZGF0ZWQoKTwvY29kZT4gbWV0aG9kCiAqIHByb3ZpZGVkIHRoZSBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgaXMsIG9yIGJlY29tZXMgYWN0aXZlLiBUaGlzIGNhbGxiYWNrCiAqIG11c3QgYWx3YXlzIGJlIGRvbmUgYXN5bmNocm9ub3VzbHkuCiAqIAogKiA8cD4KICogRWxzZSwgZXZlcnkgdGltZSB0aGF0IGVpdGhlciBvZiB0aGUgPGNvZGU+dXBkYXRlZCgpPC9jb2RlPiBtZXRob2RzIGlzCiAqIGNhbGxlZCBvbiB0aGF0IDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCwgdGhlCiAqIDxjb2RlPk1hbmFnZWRTZXJ2aWNlLnVwZGF0ZWQoKTwvY29kZT4gbWV0aG9kIHdpdGggdGhlIG5ldyBwcm9wZXJ0aWVzIGlzCiAqIGNhbGxlZC4gSWYgdGhlIDxjb2RlPmRlbGV0ZSgpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkIG9uIHRoYXQKICogPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0LCA8Y29kZT5NYW5hZ2VkU2VydmljZS51cGRhdGVkKCk8L2NvZGU+CiAqIGlzIGNhbGxlZCB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHRoZSBwcm9wZXJ0aWVzIHBhcmFtZXRlci4gQWxsIHRoZXNlCiAqIGNhbGxiYWNrcyBtdXN0IGJlIGRvbmUgYXN5bmNocm9ub3VzbHkuCiAqIAogKiA8cD4KICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBjb2RlIG9mIGEgc2VyaWFsIHBvcnQgdGhhdCB3aWxsIGNyZWF0ZSBhIHBvcnQKICogZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCiAqIAogKiA8cHJlPgogKiAgCiAqICAgY2xhc3MgU2VyaWFsUG9ydCBpbXBsZW1lbnRzIE1hbmFnZWRTZXJ2aWNlIHsKICogIAogKiAgICAgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb247CiAqICAgICBIYXNodGFibGUgY29uZmlndXJhdGlvbjsKICogICAgIENvbW1Qb3J0SWRlbnRpZmllciBpZDsKICogIAogKiAgICAgc3luY2hyb25pemVkIHZvaWQgb3BlbihDb21tUG9ydElkZW50aWZpZXIgaWQsCiAqICAgICBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKICogICAgICAgdGhpcy5pZCA9IGlkOwogKiAgICAgICByZWdpc3RyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZSgKICogICAgICAgICBNYW5hZ2VkU2VydmljZS5jbGFzcy5nZXROYW1lKCksCiAqICAgICAgICAgdGhpcywKICogICAgICAgICBnZXREZWZhdWx0cygpCiAqICAgICAgICk7CiAqICAgICB9CiAqICAKICogICAgIEhhc2h0YWJsZSBnZXREZWZhdWx0cygpIHsKICogICAgICAgSGFzaHRhYmxlIGRlZmF1bHRzID0gbmV3IEhhc2h0YWJsZSgpOwogKiAgICAgICBkZWZhdWx0cy5wdXQoICZxdW90O3BvcnQmcXVvdDssIGlkLmdldE5hbWUoKSApOwogKiAgICAgICBkZWZhdWx0cy5wdXQoICZxdW90O3Byb2R1Y3QmcXVvdDssICZxdW90O3Vua25vd24mcXVvdDsgKTsKICogICAgICAgZGVmYXVsdHMucHV0KCAmcXVvdDtiYXVkJnF1b3Q7LCAmcXVvdDs5NjAwJnF1b3Q7ICk7CiAqICAgICAgIGRlZmF1bHRzLnB1dCggQ29uc3RhbnRzLlNFUlZJQ0VfUElELAogKiAgICAgICAgICZxdW90O2NvbS5hY21lLnNlcmlhbHBvcnQuJnF1b3Q7ICsgaWQuZ2V0TmFtZSgpICk7CiAqICAgICAgIHJldHVybiBkZWZhdWx0czsKICogICAgIH0KICogIAogKiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZWQoCiAqICAgICAgIERpY3Rpb25hcnkgY29uZmlndXJhdGlvbiAgKSB7CiAqICAgICAgIGlmICggY29uZmlndXJhdGlvbiA9PSAKICogPGNvZGU+CiAqIG51bGwKICogPC9jb2RlPgogKiAgICkKICogICAgICAgICByZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyggZ2V0RGVmYXVsdHMoKSApOwogKiAgICAgICBlbHNlIHsKICogICAgICAgICBzZXRTcGVlZCggY29uZmlndXJhdGlvbi5nZXQoJnF1b3Q7YmF1ZCZxdW90OykgKTsKICogICAgICAgICByZWdpc3RyYXRpb24uc2V0UHJvcGVydGllcyggY29uZmlndXJhdGlvbiApOwogKiAgICAgICB9CiAqICAgICB9CiAqICAgICAuLi4KICogICB9CiAqICAgCiAqIDwvcHJlPgogKiAKICogPHA+CiAqIEFzIGEgY29udmVudGlvbiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB3aGVuIGEgTWFuYWdlZCBTZXJ2aWNlIGlzIHVwZGF0ZWQsIGl0CiAqIHNob3VsZCBjb3B5IGFsbCB0aGUgcHJvcGVydGllcyBpdCBkb2VzIG5vdCByZWNvZ25pemUgaW50byB0aGUgc2VydmljZQogKiByZWdpc3RyYXRpb24gcHJvcGVydGllcy4gVGhpcyB3aWxsIGFsbG93IHRoZSBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgdG8KICogc2V0IHByb3BlcnRpZXMgb24gc2VydmljZXMgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbnMuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTIgJAogKi8KcHVibGljIGludGVyZmFjZSBNYW5hZ2VkU2VydmljZSB7CgkvKioKCSAqIFVwZGF0ZSB0aGUgY29uZmlndXJhdGlvbiBmb3IgYSBNYW5hZ2VkIFNlcnZpY2UuCgkgKiAKCSAqIDxwPgoJICogV2hlbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+dXBkYXRlZChEaWN0aW9uYXJ5KTwvY29kZT4gZGV0ZWN0cyBhbnkKCSAqIGtpbmQgb2YgZXJyb3IgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcywgaXQgc2hvdWxkIGNyZWF0ZSBhIG5ldwoJICogPGNvZGU+Q29uZmlndXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gd2hpY2ggZGVzY3JpYmVzIHRoZSBwcm9ibGVtLiBUaGlzCgkgKiBjYW4gYWxsb3cgYSBtYW5hZ2VtZW50IHN5c3RlbSB0byBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbiB0byBhIGh1bWFuCgkgKiBhZG1pbmlzdHJhdG9yLgoJICogCgkgKiA8cD4KCSAqIElmIHRoaXMgbWV0aG9kIHRocm93cyBhbnkgb3RoZXIgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiwgdGhlCgkgKiBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UgbXVzdCBjYXRjaCBpdCBhbmQgc2hvdWxkIGxvZyBpdC4KCSAqIDxwPgoJICogVGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkKCSAqIHdoaWNoIGluaXRpYXRlZCB0aGUgY2FsbGJhY2suIFRoaXMgaW1wbGllcyB0aGF0IGltcGxlbWVudG9ycyBvZiBNYW5hZ2VkCgkgKiBTZXJ2aWNlIGNhbiBiZSBhc3N1cmVkIHRoYXQgdGhlIGNhbGxiYWNrIHdpbGwgbm90IHRha2UgcGxhY2UgZHVyaW5nCgkgKiByZWdpc3RyYXRpb24gd2hlbiB0aGV5IGV4ZWN1dGUgdGhlIHJlZ2lzdHJhdGlvbiBpbiBhIHN5bmNocm9uaXplZCBtZXRob2QuCgkgKiAKCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIEEgY29weSBvZiB0aGUgQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLCBvcgoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGFyZ3VtZW50IG11c3Qgbm90IGNvbnRhaW4gdGhlCgkgKiAgICAgICAgInNlcnZpY2UuYnVuZGxlTG9jYXRpb24iIHByb3BlcnR5LiBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBtYXkKCSAqICAgICAgICBiZSBvYnRhaW5lZCBmcm9tIHRoZSA8Y29kZT5Db25maWd1cmF0aW9uLmdldEJ1bmRsZUxvY2F0aW9uPC9jb2RlPgoJICogICAgICAgIG1ldGhvZC4KCSAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB3aGVuIHRoZSB1cGRhdGUgZmFpbHMKCSAqLwoJcHVibGljIHZvaWQgdXBkYXRlZChEaWN0aW9uYXJ5IHByb3BlcnRpZXMpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uOwp9ClBLAwQKAAAAAABrUu40J1HaQpgYAACYGAAAOwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL01hbmFnZWRTZXJ2aWNlRmFjdG9yeS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jbS9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZUZhY3RvcnkuamF2YSx2IDEuMTIgMjAwNi8wNy8xMSAwMDo1NDowMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jbTsKCmltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKCi8qKgogKiBNYW5hZ2UgbXVsdGlwbGUgc2VydmljZSBpbnN0YW5jZXMuCiAqIAogKiBCdW5kbGVzIHJlZ2lzdGVyaW5nIHRoaXMgaW50ZXJmYWNlIGFyZSBnaXZpbmcgdGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZQogKiB0aGUgYWJpbGl0eSB0byBjcmVhdGUgYW5kIGNvbmZpZ3VyZSBhIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgYSBzZXJ2aWNlIHRoYXQKICogdGhlIGltcGxlbWVudGluZyBidW5kbGUgY2FuIHByb3ZpZGUuIEZvciBleGFtcGxlLCBhIGJ1bmRsZSBpbXBsZW1lbnRpbmcgYQogKiBESENQIHNlcnZlciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgbXVsdGlwbGUgdGltZXMgZm9yIGRpZmZlcmVudCBpbnRlcmZhY2VzCiAqIHVzaW5nIGEgZmFjdG9yeS4KICogCiAqIDxwPgogKiBFYWNoIG9mIHRoZXNlIDxpPnNlcnZpY2UgaW5zdGFuY2VzIDwvaT4gaXMgcmVwcmVzZW50ZWQsIGluIHRoZSBwZXJzaXN0ZW50CiAqIHN0b3JhZ2Ugb2YgdGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZSwgYnkgYSBmYWN0b3J5CiAqIDxjb2RlPkNvbmZpZ3VyYXRpb248L2NvZGU+IG9iamVjdCB0aGF0IGhhcyBhIFBJRC4gV2hlbiBzdWNoIGEKICogPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gaXMgdXBkYXRlZCwgdGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZQogKiBjYWxscyB0aGUgPGNvZGU+TWFuYWdlZFNlcnZpY2VGYWN0b3J5PC9jb2RlPiB1cGRhdGVkIG1ldGhvZCB3aXRoIHRoZSBuZXcKICogcHJvcGVydGllcy4gV2hlbiA8Y29kZT51cGRhdGVkPC9jb2RlPiBpcyBjYWxsZWQgd2l0aCBhIG5ldyBQSUQsIHRoZSBNYW5hZ2VkCiAqIFNlcnZpY2UgRmFjdG9yeSBzaG91bGQgY3JlYXRlIGEgbmV3IGZhY3RvcnkgaW5zdGFuY2UgYmFzZWQgb24gdGhlc2UKICogY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLiBXaGVuIGNhbGxlZCB3aXRoIGEgUElEIHRoYXQgaXQgaGFzIHNlZW4gYmVmb3JlLCBpdAogKiBzaG91bGQgdXBkYXRlIHRoYXQgZXhpc3Rpbmcgc2VydmljZSBpbnN0YW5jZSB3aXRoIHRoZSBuZXcgY29uZmlndXJhdGlvbgogKiBpbmZvcm1hdGlvbi4KICogCiAqIDxwPgogKiBJbiBnZW5lcmFsIGl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwKICogbWFpbnRhaW4gYSBkYXRhIHN0cnVjdHVyZSB0aGF0IG1hcHMgUElEcyB0byB0aGUgZmFjdG9yeSBpbnN0YW5jZXMgdGhhdCBpdCBoYXMKICogY3JlYXRlZC4gVGhlIHNlbWFudGljcyBvZiBhIGZhY3RvcnkgaW5zdGFuY2UgYXJlIGRlZmluZWQgYnkgdGhlIE1hbmFnZWQKICogU2VydmljZSBGYWN0b3J5LiBIb3dldmVyLCBpZiB0aGUgZmFjdG9yeSBpbnN0YW5jZSBpcyByZWdpc3RlcmVkIGFzIGEgc2VydmljZQogKiBvYmplY3Qgd2l0aCB0aGUgc2VydmljZSByZWdpc3RyeSwgaXRzIFBJRCBzaG91bGQgbWF0Y2ggdGhlIFBJRCBvZiB0aGUKICogY29ycmVzcG9uZGluZyA8Y29kZT5Db25maWd1cmF0aW9uPC9jb2RlPiBvYmplY3QgKGJ1dCBpdCBzaG91bGQgPGI+bm90IDwvYj4KICogYmUgcmVnaXN0ZXJlZCBhcyBhIE1hbmFnZWQgU2VydmljZSEpLgogKiAKICogPHA+CiAqIEFuIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhIGZhY3RvcnkuIEl0IHdpbGwgY3JlYXRlIHNlcmlhbAogKiBwb3J0cyB1bmRlciBjb21tYW5kIG9mIHRoZSBDb25maWd1cmF0aW9uIEFkbWluIHNlcnZpY2UuCiAqIAogKiA8cHJlPgogKiAgCiAqICAgY2xhc3MgU2VyaWFsUG9ydEZhY3RvcnkKICogICAgIGltcGxlbWVudHMgTWFuYWdlZFNlcnZpY2VGYWN0b3J5IHsKICogICAgIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uOwogKiAgICAgSGFzaHRhYmxlIHBvcnRzOwogKiAgICAgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKICogICAgICAgSGFzaHRhYmxlIHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CiAqICAgICAgIHByb3BlcnRpZXMucHV0KCBDb25zdGFudHMuU0VSVklDRV9QSUQsCiAqICAgICAgICAgJnF1b3Q7Y29tLmFjbWUuc2VyaWFscG9ydGZhY3RvcnkmcXVvdDsgKTsKICogICAgICAgcmVnaXN0cmF0aW9uID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoCiAqICAgICAgICAgTWFuYWdlZFNlcnZpY2VGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwKICogICAgICAgICB0aGlzLAogKiAgICAgICAgIHByb3BlcnRpZXMKICogICAgICAgKTsKICogICAgIH0KICogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZWQoIFN0cmluZyBwaWQsCiAqICAgICAgIERpY3Rpb25hcnkgcHJvcGVydGllcyAgKSB7CiAqICAgICAgIFN0cmluZyBwb3J0TmFtZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KCZxdW90O3BvcnQmcXVvdDspOwogKiAgICAgICBTZXJpYWxQb3J0U2VydmljZSBwb3J0ID0KICogICAgICAgICAoU2VyaWFsUG9ydCkgcG9ydHMuZ2V0KCBwaWQgKTsKICogICAgICAgaWYgKCBwb3J0ID09IG51bGwgKSB7CiAqICAgICAgICAgcG9ydCA9IG5ldyBTZXJpYWxQb3J0U2VydmljZSgpOwogKiAgICAgICAgIHBvcnRzLnB1dCggcGlkLCBwb3J0ICk7CiAqICAgICAgICAgcG9ydC5vcGVuKCk7CiAqICAgICAgIH0KICogICAgICAgaWYgKCBwb3J0LmdldFBvcnROYW1lKCkuZXF1YWxzKHBvcnROYW1lKSApCiAqICAgICAgICAgcmV0dXJuOwogKiAgICAgICBwb3J0LnNldFBvcnROYW1lKCBwb3J0TmFtZSApOwogKiAgICAgfQogKiAgICAgcHVibGljIHZvaWQgZGVsZXRlZCggU3RyaW5nIHBpZCApIHsKICogICAgICAgU2VyaWFsUG9ydFNlcnZpY2UgcG9ydCA9CiAqICAgICAgICAgKFNlcmlhbFBvcnQpIHBvcnRzLmdldCggcGlkICk7CiAqICAgICAgIHBvcnQuY2xvc2UoKTsKICogICAgICAgcG9ydHMucmVtb3ZlKCBwaWQgKTsKICogICAgIH0KICogICAgIC4uLgogKiAgIH0KICogICAKICogPC9wcmU+CiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTIgJAogKi8KcHVibGljIGludGVyZmFjZSBNYW5hZ2VkU2VydmljZUZhY3RvcnkgewoJLyoqCgkgKiBSZXR1cm4gYSBkZXNjcmlwdGl2ZSBuYW1lIG9mIHRoaXMgZmFjdG9yeS4KCSAqIAoJICogQHJldHVybiB0aGUgbmFtZSBmb3IgdGhlIGZhY3RvcnksIHdoaWNoIG1pZ2h0IGJlIGxvY2FsaXplZAoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKCgkvKioKCSAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSwgb3IgdXBkYXRlIHRoZSBjb25maWd1cmF0aW9uIG9mIGFuIGV4aXN0aW5nCgkgKiBpbnN0YW5jZS4KCSAqIAoJICogSWYgdGhlIFBJRCBvZiB0aGUgPGNvZGU+Q29uZmlndXJhdGlvbjwvY29kZT4gb2JqZWN0IGlzIG5ldyBmb3IgdGhlCgkgKiBNYW5hZ2VkIFNlcnZpY2UgRmFjdG9yeSwgdGhlbiBjcmVhdGUgYSBuZXcgZmFjdG9yeSBpbnN0YW5jZSwgdXNpbmcgdGhlCgkgKiBjb25maWd1cmF0aW9uIDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+IHByb3ZpZGVkLiBFbHNlLCB1cGRhdGUgdGhlCgkgKiBzZXJ2aWNlIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+LgoJICogCgkgKiA8cD4KCSAqIElmIHRoZSBmYWN0b3J5IGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRnJhbWV3b3JrLCB0aGVuIHRoZQoJICogY29uZmlndXJhdGlvbiA8Y29kZT5wcm9wZXJ0aWVzPC9jb2RlPiBzaG91bGQgYmUgY29waWVkIHRvIGl0cyByZWdpc3RyeQoJICogcHJvcGVydGllcy4gVGhpcyBpcyBub3QgbWFuZGF0b3J5IGFuZCBzZWN1cml0eSBzZW5zaXRpdmUgcHJvcGVydGllcwoJICogc2hvdWxkIG9idmlvdXNseSBub3QgYmUgY29waWVkLgoJICogCgkgKiA8cD4KCSAqIElmIHRoaXMgbWV0aG9kIHRocm93cyBhbnkgPGNvZGU+RXhjZXB0aW9uPC9jb2RlPiwgdGhlIENvbmZpZ3VyYXRpb24KCSAqIEFkbWluIHNlcnZpY2UgbXVzdCBjYXRjaCBpdCBhbmQgc2hvdWxkIGxvZyBpdC4KCSAqIAoJICogPHA+CgkgKiBXaGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB1cGRhdGVkIGRldGVjdHMgYW55IGtpbmQgb2YgZXJyb3IgaW4gdGhlCgkgKiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMsIGl0IHNob3VsZCBjcmVhdGUgYSBuZXcKCSAqIHtAbGluayBDb25maWd1cmF0aW9uRXhjZXB0aW9ufSB3aGljaCBkZXNjcmliZXMgdGhlIHByb2JsZW0uCgkgKiAKCSAqIDxwPgoJICogVGhlIENvbmZpZ3VyYXRpb24gQWRtaW4gc2VydmljZSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCgkgKiBUaGlzIGltcGxpZXMgdGhhdCBpbXBsZW1lbnRvcnMgb2YgdGhlIDxjb2RlPk1hbmFnZWRTZXJ2aWNlRmFjdG9yeTwvY29kZT4KCSAqIGNsYXNzIGNhbiBiZSBhc3N1cmVkIHRoYXQgdGhlIGNhbGxiYWNrIHdpbGwgbm90IHRha2UgcGxhY2UgZHVyaW5nCgkgKiByZWdpc3RyYXRpb24gd2hlbiB0aGV5IGV4ZWN1dGUgdGhlIHJlZ2lzdHJhdGlvbiBpbiBhIHN5bmNocm9uaXplZCBtZXRob2QuCgkgKiAKCSAqIEBwYXJhbSBwaWQgVGhlIFBJRCBmb3IgdGhpcyBjb25maWd1cmF0aW9uLgoJICogQHBhcmFtIHByb3BlcnRpZXMgQSBjb3B5IG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuIFRoaXMgYXJndW1lbnQKCSAqICAgICAgICBtdXN0IG5vdCBjb250YWluIHRoZSBzZXJ2aWNlLmJ1bmRsZUxvY2F0aW9uIiBwcm9wZXJ0eS4gVGhlIHZhbHVlCgkgKiAgICAgICAgb2YgdGhpcyBwcm9wZXJ0eSBtYXkgYmUgb2J0YWluZWQgZnJvbSB0aGUKCSAqICAgICAgICA8Y29kZT5Db25maWd1cmF0aW9uLmdldEJ1bmRsZUxvY2F0aW9uPC9jb2RlPiBtZXRob2QuCgkgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGFyZQoJICogICAgICAgICBpbnZhbGlkLgoJICovCglwdWJsaWMgdm9pZCB1cGRhdGVkKFN0cmluZyBwaWQsIERpY3Rpb25hcnkgcHJvcGVydGllcykKCQkJdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb247CgoJLyoqCgkgKiBSZW1vdmUgYSBmYWN0b3J5IGluc3RhbmNlLgoJICogCgkgKiBSZW1vdmUgdGhlIGZhY3RvcnkgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBQSUQuIElmIHRoZSBpbnN0YW5jZSB3YXMKCSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmljZSByZWdpc3RyeSwgaXQgc2hvdWxkIGJlIHVucmVnaXN0ZXJlZC4KCSAqIDxwPgoJICogSWYgdGhpcyBtZXRob2QgdGhyb3dzIGFueSA8Y29kZT5FeGNlcHRpb248L2NvZGU+LCB0aGUgQ29uZmlndXJhdGlvbgoJICogQWRtaW4gc2VydmljZSBtdXN0IGNhdGNoIGl0IGFuZCBzaG91bGQgbG9nIGl0LgoJICogPHA+CgkgKiBUaGUgQ29uZmlndXJhdGlvbiBBZG1pbiBzZXJ2aWNlIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBhc3luY2hyb25vdXNseS4KCSAqIAoJICogQHBhcmFtIHBpZCB0aGUgUElEIG9mIHRoZSBzZXJ2aWNlIHRvIGJlIHJlbW92ZWQKCSAqLwoJcHVibGljIHZvaWQgZGVsZXRlZChTdHJpbmcgcGlkKTsKfQpQSwMECgAAAAAAa1LuNO8JSKV+AQAAfgEAAC0AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9wYWNrYWdlLmh0bWw8IS0tICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY20vc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vcGFja2FnZS5odG1sLHYgMS4zIDIwMDYvMDcvMTIgMjE6MDc6MDIgaGFyZ3JhdmUgRXhwICQgLS0+DTxCT0RZPg08cD5Db25maWd1cmF0aW9uIEFkbWluIFBhY2thZ2UgVmVyc2lvbiAxLjIuDTxwPkJ1bmRsZXMgd2lzaGluZyB0byB1c2UgdGhpcyBwYWNrYWdlIG11c3QgbGlzdCB0aGUgcGFja2FnZQ1pbiB0aGUgSW1wb3J0LVBhY2thZ2UgaGVhZGVyIG9mIHRoZSBidW5kbGUncyBtYW5pZmVzdC4NRm9yIGV4YW1wbGU6DTxwcmU+DUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5zZXJ2aWNlLmNtOyB2ZXJzaW9uPTEuMg08L3ByZT4NPC9CT0RZPg0NUEsDBAoAAAAAAGtS7jRH/TecDAAAAAwAAAAsAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vcGFja2FnZWluZm92ZXJzaW9uIDEuMgpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAACgAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvUEsDBAoAAAAAAGtS7jRoGqENCQsAAAkLAAA/AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudENvbnN0YW50cy5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudENvbnN0YW50cy5qYXZhLHYgMS4xNCAyMDA2LzA2LzE2IDE2OjMxOjI2IGhhcmdyYXZlIEV4cCAkCiAqIAogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDQsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNvbXBvbmVudDsKCi8qKgogKiBEZWZpbmVzIHN0YW5kYXJkIG5hbWVzIGZvciBTZXJ2aWNlIENvbXBvbmVudCBjb25zdGFudHMuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTQgJAogKi8KcHVibGljIGludGVyZmFjZSBDb21wb25lbnRDb25zdGFudHMgewoJLyoqCgkgKiBNYW5pZmVzdCBoZWFkZXIgKG5hbWVkICZxdW90O1NlcnZpY2UtQ29tcG9uZW50JnF1b3Q7KSBzcGVjaWZ5aW5nIHRoZSBYTUwKCSAqIGRvY3VtZW50cyB3aXRoaW4gYSBidW5kbGUgdGhhdCBjb250YWluIHRoZSBidW5kbGUncyBTZXJ2aWNlIENvbXBvbmVudAoJICogZGVzY3JpcHRpb25zLgoJICogPHA+CgkgKiBUaGUgYXR0cmlidXRlIHZhbHVlIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4KCSAqIG9iamVjdCByZXR1cm5lZCBieSB0aGUgPGNvZGU+QnVuZGxlLmdldEhlYWRlcnM8L2NvZGU+IG1ldGhvZC4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJU0VSVklDRV9DT01QT05FTlQJCT0gIlNlcnZpY2UtQ29tcG9uZW50IjsKCgkvKioKCSAqIEEgY29tcG9uZW50IHByb3BlcnR5IGZvciBhIGNvbXBvbmVudCBjb25maWd1cmF0aW9uIHRoYXQgY29udGFpbnMgdGhlIG5hbWUKCSAqIG9mIHRoZSBjb21wb25lbnQgYXMgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlCgkgKiA8Y29kZT5jb21wb25lbnQ8L2NvZGU+IGVsZW1lbnQuIFRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkgbXVzdCBiZQoJICogPGNvZGU+U3RyaW5nPC9jb2RlPi4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJQ09NUE9ORU5UX05BTUUJCQk9ICJjb21wb25lbnQubmFtZSI7CgoJLyoqCgkgKiBBIGNvbXBvbmVudCBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIHRoZSBnZW5lcmF0ZWQgaWQgZm9yIGEgY29tcG9uZW50CgkgKiBjb25maWd1cmF0aW9uLiBUaGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IG11c3QgYmUgPGNvZGU+TG9uZzwvY29kZT4uCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgYXNzaWduZWQgYnkgdGhlIFNlcnZpY2UgQ29tcG9uZW50IFJ1bnRpbWUKCSAqIHdoZW4gYSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBpcyBjcmVhdGVkLiBUaGUgU2VydmljZSBDb21wb25lbnQgUnVudGltZQoJICogYXNzaWducyBhIHVuaXF1ZSB2YWx1ZSB0aGF0IGlzIGxhcmdlciB0aGFuIGFsbCBwcmV2aW91c2x5IGFzc2lnbmVkIHZhbHVlcwoJICogc2luY2UgdGhlIFNlcnZpY2UgQ29tcG9uZW50IFJ1bnRpbWUgd2FzIHN0YXJ0ZWQuIFRoZXNlIHZhbHVlcyBhcmUgTk9UCgkgKiBwZXJzaXN0ZW50IGFjcm9zcyByZXN0YXJ0cyBvZiB0aGUgU2VydmljZSBDb21wb25lbnQgUnVudGltZS4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJQ09NUE9ORU5UX0lECQkJPSAiY29tcG9uZW50LmlkIjsKCgkvKioKCSAqIEEgc2VydmljZSByZWdpc3RyYXRpb24gcHJvcGVydHkgZm9yIGEgQ29tcG9uZW50IEZhY3RvcnkgdGhhdCBjb250YWlucyB0aGUKCSAqIHZhbHVlIG9mIHRoZSA8Y29kZT5mYWN0b3J5PC9jb2RlPiBhdHRyaWJ1dGUuIFRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkKCSAqIG11c3QgYmUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJQ09NUE9ORU5UX0ZBQ1RPUlkJCT0gImNvbXBvbmVudC5mYWN0b3J5IjsKCgkvKioKCSAqIFRoZSBzdWZmaXggZm9yIHJlZmVyZW5jZSB0YXJnZXQgcHJvcGVydGllcy4gVGhlc2UgcHJvcGVydGllcyBjb250YWluIHRoZQoJICogZmlsdGVyIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IHNlcnZpY2VzIGZvciBhIHJlZmVyZW5jZS4gVGhlIHR5cGUgb2YgdGhpcwoJICogcHJvcGVydHkgbXVzdCBiZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlSRUZFUkVOQ0VfVEFSR0VUX1NVRkZJWAk9ICIudGFyZ2V0IjsKfQpQSwMECgAAAAAAa1LuNA7STQ4cHgAAHB4AAD0AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29udGV4dC5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudENvbnRleHQuamF2YSx2IDEuMjAgMjAwNi8wNi8xNiAxNjozMToyNiBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDQsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmNvbXBvbmVudDsKCmltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKCi8qKgogKiBBIENvbXBvbmVudCBDb250ZXh0IG9iamVjdCBpcyB1c2VkIGJ5IGEgY29tcG9uZW50IGluc3RhbmNlIHRvIGludGVyYWN0IHdpdGgKICogaXRzIGV4ZWN1dGlvbiBjb250ZXh0IGluY2x1ZGluZyBsb2NhdGluZyBzZXJ2aWNlcyBieSByZWZlcmVuY2UgbmFtZS4gRWFjaAogKiBjb21wb25lbnQgaW5zdGFuY2UgaGFzIGEgdW5pcXVlIENvbXBvbmVudCBDb250ZXh0LgogKiAKICogPHA+CiAqIEEgY29tcG9uZW50J3MgaW1wbGVtZW50YXRpb24gY2xhc3MgbWF5IG9wdGlvbmFseSBpbXBsZW1lbnQgYW4gYWN0aXZhdGUKICogbWV0aG9kOgogKiAKICogPHByZT4KICogcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoQ29tcG9uZW50Q29udGV4dCBjb250ZXh0KTsKICogPC9wcmU+CiAqIAogKiBJZiBhIGNvbXBvbmVudCBpbXBsZW1lbnRzIHRoaXMgbWV0aG9kLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEKICogY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gaXMgYWN0aXZhdGVkIHRvIHByb3ZpZGUgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSdzCiAqIENvbXBvbmVudCBDb250ZXh0IG9iamVjdC4KICogCiAqIDxwPgogKiBBIGNvbXBvbmVudCdzIGltcGxlbWVudGF0aW9uIGNsYXNzIG1heSBvcHRpb25hbHkgaW1wbGVtZW50IGEgZGVhY3RpdmF0ZQogKiBtZXRob2Q6CiAqIAogKiA8cHJlPgogKiBwcm90ZWN0ZWQgdm9pZCBkZWFjdGl2YXRlKENvbXBvbmVudENvbnRleHQgY29udGV4dCk7CiAqIDwvcHJlPgogKiAKICogSWYgYSBjb21wb25lbnQgaW1wbGVtZW50cyB0aGlzIG1ldGhvZCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUKICogY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gaXMgZGVhY3RpdmF0ZWQuCiAqIAogKiA8cD4KICogVGhlIGFjdGl2YXRlIGFuZCBkZWFjdGl2YXRlIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgdXNpbmcgcmVmbGVjdGlvbiBhbmQgbXVzdAogKiBiZSBwcm90ZWN0ZWQgb3IgcHVibGljIGFjY2Vzc2libGUuIFRoZXNlIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBwdWJsaWMgbWV0aG9kcwogKiBzbyB0aGF0IHRoZXkgZG8gbm90IGFwcGVhciBhcyBwdWJsaWMgbWV0aG9kcyBvbiB0aGUgY29tcG9uZW50IGluc3RhbmNlIHdoZW4KICogdXNlZCBhcyBhIHNlcnZpY2Ugb2JqZWN0LiBUaGVzZSBtZXRob2RzIHdpbGwgYmUgbG9jYXRlZCBieSBsb29raW5nIHRocm91Z2gKICogdGhlIGNvbXBvbmVudCdzIGltcGxlbWVudGF0aW9uIGNsYXNzIGhpZXJhcmNoeSBmb3IgdGhlIGZpcnN0IGRlY2xhcmF0aW9uIG9mCiAqIHRoZSBtZXRob2QuIElmIHRoZSBtZXRob2QgaXMgZm91bmQsIGlmIGl0IGlzIGRlY2xhcmVkIHByb3RlY3RlZCBvciBwdWJsaWMsCiAqIHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuIE90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMjAgJAogKi8KcHVibGljIGludGVyZmFjZSBDb21wb25lbnRDb250ZXh0IHsKCS8qKgoJICogUmV0dXJucyB0aGUgY29tcG9uZW50IHByb3BlcnRpZXMgZm9yIHRoaXMgQ29tcG9uZW50IENvbnRleHQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIHByb3BlcnRpZXMgZm9yIHRoaXMgQ29tcG9uZW50IENvbnRleHQuIFRoZSBEaWN0aW9uYXJ5IGlzIHJlYWQKCSAqICAgICAgICAgb25seSBhbmQgY2Fubm90IGJlIG1vZGlmaWVkLgoJICovCglwdWJsaWMgRGljdGlvbmFyeSBnZXRQcm9wZXJ0aWVzKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBzZXJ2aWNlIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UgbmFtZS4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIHJlZmVyZW5jZSBpcyA8Y29kZT4wLi5uPC9jb2RlPiBvcgoJICogPGNvZGU+MS4ubjwvY29kZT4gYW5kIG11bHRpcGxlIHNlcnZpY2VzIGFyZSBib3VuZCB0byB0aGUgcmVmZXJlbmNlLCB0aGUKCSAqIHNlcnZpY2Ugd2l0aCB0aGUgaGlnaGVzdCByYW5raW5nIChhcyBzcGVjaWZpZWQgaW4gaXRzCgkgKiA8Y29kZT5Db25zdGFudHMuU0VSVklDRV9SQU5LSU5HPC9jb2RlPiBwcm9wZXJ0eSkgaXMgcmV0dXJuZWQuIElmIHRoZXJlCgkgKiBpcyBhIHRpZSBpbiByYW5raW5nLCB0aGUgc2VydmljZSB3aXRoIHRoZSBsb3dlc3Qgc2VydmljZSBJRCAoYXMgc3BlY2lmaWVkCgkgKiBpbiBpdHMgPGNvZGU+Q29uc3RhbnRzLlNFUlZJQ0VfSUQ8L2NvZGU+IHByb3BlcnR5KTsgdGhhdCBpcywgdGhlCgkgKiBzZXJ2aWNlIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZmlyc3QgaXMgcmV0dXJuZWQuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIGEgcmVmZXJlbmNlIGFzIHNwZWNpZmllZCBpbiBhCgkgKiAgICAgICAgPGNvZGU+cmVmZXJlbmNlPC9jb2RlPiBlbGVtZW50IGluIHRoaXMgY29tcG9uZW50J3MgZGVzY3JpcHRpb24uCgkgKiBAcmV0dXJuIEEgc2VydmljZSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2VkIHNlcnZpY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4KCSAqICAgICAgICAgaWYgdGhlIHJlZmVyZW5jZSBjYXJkaW5hbGl0eSBpcyA8Y29kZT4wLi4xPC9jb2RlPiBvcgoJICogICAgICAgICA8Y29kZT4wLi5uPC9jb2RlPiBhbmQgbm8gYm91bmQgc2VydmljZSBpcyBhdmFpbGFibGUuCgkgKiBAdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbiBJZiB0aGUgU2VydmljZSBDb21wb25lbnQgUnVudGltZSBjYXRjaGVzIGFuCgkgKiAgICAgICAgIGV4Y2VwdGlvbiB3aGlsZSBhY3RpdmF0aW5nIHRoZSBib3VuZCBzZXJ2aWNlLgoJICovCglwdWJsaWMgT2JqZWN0IGxvY2F0ZVNlcnZpY2UoU3RyaW5nIG5hbWUpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgc2VydmljZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIG5hbWUgYW5kCgkgKiA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPi4KCSAqIAoJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYSByZWZlcmVuY2UgYXMgc3BlY2lmaWVkIGluIGEKCSAqICAgICAgICA8Y29kZT5yZWZlcmVuY2U8L2NvZGU+IGVsZW1lbnQgaW4gdGhpcyBjb21wb25lbnQncyBkZXNjcmlwdGlvbi4KCSAqIEBwYXJhbSByZWZlcmVuY2UgVGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IHRvIGEgYm91bmQgc2VydmljZS4KCSAqICAgICAgICBUaGlzIG11c3QgYmUgYSA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBwcm92aWRlZCB0byB0aGUKCSAqICAgICAgICBjb21wb25lbnQgdmlhIHRoZSBiaW5kIG9yIHVuYmluZCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQKCSAqICAgICAgICByZWZlcmVuY2UgbmFtZS4KCSAqIEByZXR1cm4gQSBzZXJ2aWNlIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZWQgc2VydmljZSBvciA8Y29kZT5udWxsPC9jb2RlPgoJICogICAgICAgICBpZiB0aGUgc3BlY2lmaWVkIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IGlzIG5vdCBhIGJvdW5kCgkgKiAgICAgICAgIHNlcnZpY2UgZm9yIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIG5hbWUuCgkgKiBAdGhyb3dzIENvbXBvbmVudEV4Y2VwdGlvbiBJZiB0aGUgU2VydmljZSBDb21wb25lbnQgUnVudGltZSBjYXRjaGVzIGFuCgkgKiAgICAgICAgIGV4Y2VwdGlvbiB3aGlsZSBhY3RpdmF0aW5nIHRoZSBib3VuZCBzZXJ2aWNlLgoJICovCglwdWJsaWMgT2JqZWN0IGxvY2F0ZVNlcnZpY2UoU3RyaW5nIG5hbWUsIFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIHNlcnZpY2Ugb2JqZWN0cyBmb3IgdGhlIHNwZWNpZmllZCByZWZlcmVuY2UgbmFtZS4KCSAqIAoJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgYSByZWZlcmVuY2UgYXMgc3BlY2lmaWVkIGluIGEKCSAqICAgICAgICA8Y29kZT5yZWZlcmVuY2U8L2NvZGU+IGVsZW1lbnQgaW4gdGhpcyBjb21wb25lbnQncyBkZXNjcmlwdGlvbi4KCSAqIEByZXR1cm4gQW4gYXJyYXkgb2Ygc2VydmljZSBvYmplY3RzIGZvciB0aGUgcmVmZXJlbmNlZCBzZXJ2aWNlIG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZWZlcmVuY2UgY2FyZGluYWxpdHkgaXMKCSAqICAgICAgICAgPGNvZGU+MC4uMTwvY29kZT4gb3IgPGNvZGU+MC4ubjwvY29kZT4gYW5kIG5vIGJvdW5kIHNlcnZpY2UKCSAqICAgICAgICAgaXMgYXZhaWxhYmxlLgoJICogQHRocm93cyBDb21wb25lbnRFeGNlcHRpb24gSWYgdGhlIFNlcnZpY2UgQ29tcG9uZW50IFJ1bnRpbWUgY2F0Y2hlcyBhbgoJICogICAgICAgICBleGNlcHRpb24gd2hpbGUgYWN0aXZhdGluZyBhIGJvdW5kIHNlcnZpY2UuCgkgKi8KCXB1YmxpYyBPYmplY3RbXSBsb2NhdGVTZXJ2aWNlcyhTdHJpbmcgbmFtZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSA8Y29kZT5CdW5kbGVDb250ZXh0PC9jb2RlPiBvZiB0aGUgYnVuZGxlIHdoaWNoIGNvbnRhaW5zCgkgKiB0aGlzIGNvbXBvbmVudC4KCSAqIAoJICogQHJldHVybiBUaGUgPGNvZGU+QnVuZGxlQ29udGV4dDwvY29kZT4gb2YgdGhlIGJ1bmRsZSBjb250YWluaW5nIHRoaXMKCSAqICAgICAgICAgY29tcG9uZW50LgoJICovCglwdWJsaWMgQnVuZGxlQ29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCk7CgoJLyoqCgkgKiBJZiB0aGUgY29tcG9uZW50IGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgYXMgYSBzZXJ2aWNlIHVzaW5nIHRoZQoJICogPGNvZGU+c2VydmljZWZhY3Rvcnk9JnF1b3Q7dHJ1ZSZxdW90OzwvY29kZT4gYXR0cmlidXRlLCB0aGVuIHRoaXMKCSAqIG1ldGhvZCByZXR1cm5zIHRoZSBidW5kbGUgdXNpbmcgdGhlIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudAoJICogaW5zdGFuY2UuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmOgoJICogPHVsPgoJICogPGxpPlRoZSBjb21wb25lbnQgaW5zdGFuY2UgaXMgbm90IGEgc2VydmljZSwgdGhlbiBubyBidW5kbGUgY2FuIGJlIHVzaW5nCgkgKiBpdCBhcyBhIHNlcnZpY2UuCgkgKiA8bGk+VGhlIGNvbXBvbmVudCBpbnN0YW5jZSBpcyBhIHNlcnZpY2UgYnV0IGRpZCBub3Qgc3BlY2lmeSB0aGUKCSAqIDxjb2RlPnNlcnZpY2VmYWN0b3J5PSZxdW90O3RydWUmcXVvdDs8L2NvZGU+IGF0dHJpYnV0ZSwgdGhlbiBhbGwKCSAqIGJ1bmRsZXMgdXNpbmcgdGhlIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSB3aWxsIHNoYXJlCgkgKiB0aGUgc2FtZSBjb21wb25lbnQgaW5zdGFuY2UuCgkgKiA8bGk+VGhlIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBpcyBub3QgY3VycmVudGx5CgkgKiBiZWluZyB1c2VkIGJ5IGFueSBidW5kbGUuCgkgKiA8L3VsPgoJICogCgkgKiBAcmV0dXJuIFRoZSBidW5kbGUgdXNpbmcgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhcyBhIHNlcnZpY2Ugb3IKCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCgkgKi8KCXB1YmxpYyBCdW5kbGUgZ2V0VXNpbmdCdW5kbGUoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIENvbXBvbmVudCBJbnN0YW5jZSBvYmplY3QgZm9yIHRoZSBjb21wb25lbnQgaW5zdGFuY2UKCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIENvbXBvbmVudCBDb250ZXh0LgoJICogCgkgKiBAcmV0dXJuIFRoZSBDb21wb25lbnQgSW5zdGFuY2Ugb2JqZWN0IGZvciB0aGUgY29tcG9uZW50IGluc3RhbmNlLgoJICovCglwdWJsaWMgQ29tcG9uZW50SW5zdGFuY2UgZ2V0Q29tcG9uZW50SW5zdGFuY2UoKTsKCgkvKioKCSAqIEVuYWJsZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4gVGhlIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZSBtdXN0CgkgKiBiZSBpbiB0aGUgc2FtZSBidW5kbGUgYXMgdGhpcyBjb21wb25lbnQuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIGEgY29tcG9uZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGluZGljYXRlCgkgKiAgICAgICAgYWxsIGNvbXBvbmVudHMgaW4gdGhlIGJ1bmRsZS4KCSAqLwoJcHVibGljIHZvaWQgZW5hYmxlQ29tcG9uZW50KFN0cmluZyBuYW1lKTsKCgkvKioKCSAqIERpc2FibGVzIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IG5hbWUuIFRoZSBzcGVjaWZpZWQgY29tcG9uZW50IG5hbWUgbXVzdAoJICogYmUgaW4gdGhlIHNhbWUgYnVuZGxlIGFzIHRoaXMgY29tcG9uZW50LgoJICogCgkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiBhIGNvbXBvbmVudC4KCSAqLwoJcHVibGljIHZvaWQgZGlzYWJsZUNvbXBvbmVudChTdHJpbmcgbmFtZSk7CgoJLyoqCgkgKiBJZiB0aGUgY29tcG9uZW50IGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgYXMgYSBzZXJ2aWNlIHVzaW5nIHRoZQoJICogPGNvZGU+c2VydmljZTwvY29kZT4gZWxlbWVudCwgdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzZXJ2aWNlCgkgKiByZWZlcmVuY2Ugb2YgdGhlIHNlcnZpY2UgcHJvdmlkZWQgYnkgdGhpcyBjb21wb25lbnQgaW5zdGFuY2UuCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaXMKCSAqIG5vdCByZWdpc3RlcmVkIGFzIGEgc2VydmljZS4KCSAqIAoJICogQHJldHVybiBUaGUgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IGZvciB0aGUgY29tcG9uZW50CgkgKiAgICAgICAgIGluc3RhbmNlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgaXMgbm90CgkgKiAgICAgICAgIHJlZ2lzdGVyZWQgYXMgYSBzZXJ2aWNlLgoJICovCglwdWJsaWMgU2VydmljZVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmZXJlbmNlKCk7Cgp9ClBLAwQKAAAAAABrUu40I2ekwkkKAABJCgAAPwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRFeGNlcHRpb24uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY29tcG9uZW50L3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRFeGNlcHRpb24uamF2YSx2IDEuMTMgMjAwNi8wNy8xMSAxMzoxNTo1NiBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA0LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQ7CgovKioKICogVW5jaGVja2VkIGV4Y2VwdGlvbiB3aGljaCBtYXkgYmUgdGhyb3duIGJ5IHRoZSBTZXJ2aWNlIENvbXBvbmVudCBSdW50aW1lLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEzICQKICovCnB1YmxpYyBjbGFzcyBDb21wb25lbnRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKCXN0YXRpYyBmaW5hbCBsb25nCXNlcmlhbFZlcnNpb25VSUQJPSAtNzQzODIxMjY1NjI5ODcyNjkyNEw7CgkvKioKCSAqIE5lc3RlZCBleGNlcHRpb24uCgkgKi8KCXByaXZhdGUgZmluYWwgVGhyb3dhYmxlCWNhdXNlOwoKCS8qKgoJICogQ29uc3RydWN0IGEgbmV3IENvbXBvbmVudEV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgY2F1c2UuCgkgKiAKCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgoJICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCgkgKi8KCXB1YmxpYyBDb21wb25lbnRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewoJCXN1cGVyKG1lc3NhZ2UpOwoJCXRoaXMuY2F1c2UgPSBjYXVzZTsKCX0KCgkvKioKCSAqIENvbnN0cnVjdCBhIG5ldyBDb21wb25lbnRFeGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCgkgKiAKCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLgoJICovCglwdWJsaWMgQ29tcG9uZW50RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CgkJc3VwZXIobWVzc2FnZSk7CgkJdGhpcy5jYXVzZSA9IG51bGw7Cgl9CgoJLyoqCgkgKiBDb25zdHJ1Y3QgYSBuZXcgQ29tcG9uZW50RXhjZXB0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBjYXVzZS4KCSAqIAoJICogQHBhcmFtIGNhdXNlIFRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uLiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCgkgKi8KCXB1YmxpYyBDb21wb25lbnRFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CgkJc3VwZXIoKTsKCQl0aGlzLmNhdXNlID0gY2F1c2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjYXVzZQoJICogd2FzIHNwZWNpZmllZCB3aGVuIHRoaXMgZXhjZXB0aW9uIHdhcyBjcmVhdGVkLgoJICogCgkgKiBAcmV0dXJuIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjYXVzZQoJICogICAgICAgICB3YXMgc3BlY2lmaWVkLgoJICovCglwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewoJCXJldHVybiBjYXVzZTsKCX0KCgkvKioKCSAqIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiBjYW4gb25seSBiZSBzZXQgd2hlbiBjb25zdHJ1Y3RlZC4KCSAqIAoJICogQHBhcmFtIGNhdXNlIENhdXNlIG9mIHRoZSBleGNlcHRpb24uCgkgKiBAcmV0dXJuIFRoaXMgb2JqZWN0LgoJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHRocm93IGFuCgkgKiAgICAgICAgIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4gc2luY2UgdGhlIGNhdXNlIG9mIHRoaXMKCSAqICAgICAgICAgZXhjZXB0aW9uIGNhbiBvbmx5IGJlIHNldCB3aGVuIGNvbnN0cnVjdGVkLgoJICovCglwdWJsaWMgVGhyb3dhYmxlIGluaXRDYXVzZShUaHJvd2FibGUgY2F1c2UpIHsKCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Cgl9Cn0KUEsDBAoAAAAAAGtS7jRoL6mrNAgAADQIAAA9AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEZhY3RvcnkuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuY29tcG9uZW50L3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRGYWN0b3J5LmphdmEsdiAxLjE5IDIwMDYvMDYvMTYgMTY6MzE6MjYgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA0LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQ7CgppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgovKioKICogV2hlbiBhIGNvbXBvbmVudCBpcyBkZWNsYXJlZCB3aXRoIHRoZSA8Y29kZT5mYWN0b3J5PC9jb2RlPiBhdHRyaWJ1dGUgb24gaXRzCiAqIDxjb2RlPmNvbXBvbmVudDwvY29kZT4gZWxlbWVudCwgdGhlIFNlcnZpY2UgQ29tcG9uZW50IFJ1bnRpbWUgd2lsbCByZWdpc3RlcgogKiBhIENvbXBvbmVudCBGYWN0b3J5IHNlcnZpY2UgdG8gYWxsb3cgbmV3IGNvbXBvbmVudCBjb25maWd1cmF0aW9ucyB0byBiZQogKiBjcmVhdGVkIGFuZCBhY3RpdmF0ZWQgcmF0aGVyIHRoYW4gYXV0b21hdGljYWxseSBjcmVhdGluZyBhbmQgYWN0aXZhdGluZwogKiBjb21wb25lbnQgY29uZmlndXJhdGlvbiBhcyBuZWNlc3NhcnkuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTkgJAogKi8KcHVibGljIGludGVyZmFjZSBDb21wb25lbnRGYWN0b3J5IHsKCS8qKgoJICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBjb21wb25lbnQgY29uZmlndXJhdGlvbi4gQWRkaXRpb25hbCBwcm9wZXJ0aWVzCgkgKiBtYXkgYmUgcHJvdmlkZWQgZm9yIHRoZSBjb21wb25lbnQgY29uZmlndXJhdGlvbi4KCSAqIAoJICogQHBhcmFtIHByb3BlcnRpZXMgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGZvciB0aGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24KCSAqICAgICAgICBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gYWRkaXRpb25hbCBwcm9wZXJ0aWVzLgoJICogQHJldHVybiBBIDxjb2RlPkNvbXBvbmVudEluc3RhbmNlPC9jb2RlPiBvYmplY3QgZW5jYXBzdWxhdGluZyB0aGUKCSAqICAgICAgICAgY29tcG9uZW50IGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnQgY29uZmlndXJhdGlvbi4gVGhlIGNvbXBvbmVudAoJICogICAgICAgICBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGFjdGl2YXRlZCBhbmQsIGlmIHRoZSBjb21wb25lbnQgc3BlY2lmaWVzCgkgKiAgICAgICAgIGEgPGNvZGU+c2VydmljZTwvY29kZT4gZWxlbWVudCwgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBoYXMgYmVlbgoJICogICAgICAgICByZWdpc3RlcmVkIGFzIGEgc2VydmljZS4KCSAqIEB0aHJvd3MgQ29tcG9uZW50RXhjZXB0aW9uIElmIHRoZSBTZXJ2aWNlIENvbXBvbmVudCBSdW50aW1lIGlzIHVuYWJsZSB0bwoJICogICAgICAgICBhY3RpdmF0ZSB0aGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24uCgkgKi8KCXB1YmxpYyBDb21wb25lbnRJbnN0YW5jZSBuZXdJbnN0YW5jZShEaWN0aW9uYXJ5IHByb3BlcnRpZXMpOwp9ClBLAwQKAAAAAABrUu401sRYoMkGAADJBgAAPgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRJbnN0YW5jZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEluc3RhbmNlLmphdmEsdiAxLjEzIDIwMDYvMDYvMTYgMTY6MzE6MjYgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA0LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQ7CgovKioKICogQSBDb21wb25lbnRJbnN0YW5jZSBlbmNhcHN1bGF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugb2YgYW4gYWN0aXZhdGVkCiAqIGNvbXBvbmVudCBjb25maWd1cmF0aW9uLiBDb21wb25lbnRJbnN0YW5jZXMgYXJlIGNyZWF0ZWQgd2hlbmV2ZXIgYSBjb21wb25lbnQKICogY29uZmlndXJhdGlvbiBpcyBhY3RpdmF0ZWQuCiAqIAogKiA8cD4KICogQ29tcG9uZW50SW5zdGFuY2VzIGFyZSBuZXZlciByZXVzZWQuIEEgbmV3IENvbXBvbmVudEluc3RhbmNlIG9iamVjdCB3aWxsIGJlCiAqIGNyZWF0ZWQgd2hlbiB0aGUgY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gaXMgYWN0aXZhdGVkIGFnYWluLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEzICQKICovCnB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50SW5zdGFuY2UgewoJLyoqCgkgKiBEaXNwb3NlIG9mIHRoZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBjb21wb25lbnQgaW5zdGFuY2UuIFRoZQoJICogY29tcG9uZW50IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBkZWFjdGl2YXRlZC4gSWYgdGhlIGNvbXBvbmVudAoJICogY29uZmlndXJhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRlYWN0aXZhdGVkLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCgkgKi8KCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBvZiB0aGUgYWN0aXZhdGVkIGNvbXBvbmVudCBjb25maWd1cmF0aW9uLgoJICogCgkgKiBAcmV0dXJuIFRoZSBjb21wb25lbnQgaW5zdGFuY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNvbXBvbmVudAoJICogICAgICAgICBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGRlYWN0aXZhdGVkLgoJICovCglwdWJsaWMgT2JqZWN0IGdldEluc3RhbmNlKCk7Cn0KUEsDBAoAAAAAAGtS7jRU5AJUkQEAAJEBAAA0AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L3BhY2thZ2UuaHRtbCx2IDEuMyAyMDA2LzA3LzEyIDIxOjA3OjAwIGhhcmdyYXZlIEV4cCAkIC0tPg08Qk9EWT4NPHA+U2VydmljZSBDb21wb25lbnQgUGFja2FnZSBWZXJzaW9uIDEuMC4NPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlDWluIHRoZSBJbXBvcnQtUGFja2FnZSBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0Lg1Gb3IgZXhhbXBsZToNPHByZT4NSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnNlcnZpY2UuY29tcG9uZW50OyB2ZXJzaW9uPTEuMA08L3ByZT4NPC9CT0RZPg0NUEsDBAoAAAAAAGtS7jTFnwGuDAAAAAwAAAAzAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L3BhY2thZ2VpbmZvdmVyc2lvbiAxLjAKUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAlAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL1BLAwQKAAAAAABrUu409vcg43QKAAB0CgAAMwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Db25zdGFudHMuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZGV2aWNlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Db25zdGFudHMuamF2YSx2IDEuOSAyMDA2LzA3LzExIDAwOjU0OjA4IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMCwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmRldmljZTsKCi8qKgogKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHN0YW5kYXJkIG5hbWVzIGZvciBwcm9wZXJ0eSBrZXlzIGFzc29jaWF0ZWQgd2l0aAogKiB7QGxpbmsgRGV2aWNlfSBhbmQge0BsaW5rIERyaXZlcn0gc2VydmljZXMuCiAqIAogKiA8cD4KICogVGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlc2Uga2V5cyBhcmUgb2YgdHlwZSA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nPC9jb2RlPiwKICogdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCiAqIEBzaW5jZSAxLjEKICogQHNlZSBEZXZpY2UKICogQHNlZSBEcml2ZXIKICovCnB1YmxpYyBpbnRlcmZhY2UgQ29uc3RhbnRzIHsKCS8qKgoJICogUHJvcGVydHkgKG5hbWVkICZxdW90O0RSSVZFUl9JRCZxdW90OykgaWRlbnRpZnlpbmcgYSBkcml2ZXIuCgkgKiAKCSAqIDxwPgoJICogQSA8Y29kZT5EUklWRVJfSUQ8L2NvZGU+IHNob3VsZCBzdGFydCB3aXRoIHRoZSByZXZlcnNlZCBkb21haW4gbmFtZSBvZiB0aGUKCSAqIGNvbXBhbnkgdGhhdCBpbXBsZW1lbnRlZCB0aGUgZHJpdmVyIChlLmcuLCA8Y29kZT5jb20uYWNtZTwvY29kZT4pLCBhbmQKCSAqIG11c3QgbWVldCB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50czoKCSAqIAoJICogPHVsPgoJICogPGxpPkl0IG11c3QgYmUgaW5kZXBlbmRlbnQgb2YgdGhlIGxvY2F0aW9uIGZyb20gd2hlcmUgaXQgaXMgb2J0YWluZWQuCgkgKiA8bGk+SXQgbXVzdCBiZSBpbmRlcGVuZGVudCBvZiB0aGUge0BsaW5rIERyaXZlckxvY2F0b3J9IHNlcnZpY2UgdGhhdAoJICogZG93bmxvYWRlZCBpdC4KCSAqIDxsaT5JdCBtdXN0IGJlIHVuaXF1ZS4KCSAqIDxsaT5JdCBtdXN0IGJlIGRpZmZlcmVudCBmb3IgZGlmZmVyZW50IHJldmlzaW9ucyBvZiB0aGUgc2FtZSBkcml2ZXIuCgkgKiA8L3VsPgoJICogCgkgKiA8cD4KCSAqIFRoaXMgcHJvcGVydHkgaXMgbWFuZGF0b3J5LCBpLmUuLCBldmVyeSA8Y29kZT5Ecml2ZXI8L2NvZGU+IHNlcnZpY2UgbXVzdCBiZQoJICogcmVnaXN0ZXJlZCB3aXRoIGl0LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlEUklWRVJfSUQJCQk9ICJEUklWRVJfSUQiOwoJLyoqCgkgKiBQcm9wZXJ0eSAobmFtZWQgJnF1b3Q7REVWSUNFX0NBVEVHT1JZJnF1b3Q7KSBjb250YWluaW5nIGEgaHVtYW4gcmVhZGFibGUKCSAqIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXZpY2UgY2F0ZWdvcmllcyBpbXBsZW1lbnRlZCBieSBhIGRldmljZS4gVGhpcwoJICogcHJvcGVydHkgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmdbXTwvY29kZT4KCSAqIAoJICogPHA+CgkgKiBTZXJ2aWNlcyByZWdpc3RlcmVkIHdpdGggdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIHRyZWF0ZWQgYXMgZGV2aWNlcyBhbmQKCSAqIGRpc2NvdmVyZWQgYnkgdGhlIGRldmljZSBtYW5hZ2VyCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCURFVklDRV9DQVRFR09SWQkJPSAiREVWSUNFX0NBVEVHT1JZIjsKCS8qKgoJICogUHJvcGVydHkgKG5hbWVkICZxdW90O0RFVklDRV9TRVJJQUwmcXVvdDspIHNwZWNpZnlpbmcgYSBkZXZpY2UncyBzZXJpYWwKCSAqIG51bWJlci4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJREVWSUNFX1NFUklBTAkJPSAiREVWSUNFX1NFUklBTCI7CgkvKioKCSAqIFByb3BlcnR5IChuYW1lZCAmcXVvdDtERVZJQ0VfREVTQ1JJUFRJT04mcXVvdDspIGNvbnRhaW5pbmcgYSBodW1hbgoJICogcmVhZGFibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGFjdHVhbCBoYXJkd2FyZSBkZXZpY2UuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCURFVklDRV9ERVNDUklQVElPTgk9ICJERVZJQ0VfREVTQ1JJUFRJT04iOwp9ClBLAwQKAAAAAABrUu40ttAe/ugIAADoCAAAMAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9EZXZpY2UuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZGV2aWNlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9EZXZpY2UuamF2YSx2IDEuMTAgMjAwNi8wNy8xMSAwMDo1NDowOCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDAsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5kZXZpY2U7CgovKioKICogPHA+CiAqIEludGVyZmFjZSBmb3IgaWRlbnRpZnlpbmcgZGV2aWNlIHNlcnZpY2VzLgogKiAKICogPHA+CiAqIEEgc2VydmljZSBtdXN0IGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBvciB1c2UgdGhlCiAqIHtAbGluayBDb25zdGFudHMjREVWSUNFX0NBVEVHT1JZfSByZWdpc3RyYXRpb24gcHJvcGVydHkgdG8gaW5kaWNhdGUgdGhhdCBpdAogKiBpcyBhIGRldmljZS4gQW55IHNlcnZpY2VzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBvciByZWdpc3RlcmVkIHdpdGggdGhlCiAqIDxjb2RlPkRFVklDRV9DQVRFR09SWTwvY29kZT4gcHJvcGVydHkgd2lsbCBiZSBkaXNjb3ZlcmVkIGJ5IHRoZSBkZXZpY2UgbWFuYWdlci4KICogCiAqIDxwPgogKiBEZXZpY2Ugc2VydmljZXMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGdpdmUgdGhlIGRldmljZSBtYW5hZ2VyIHRoZQogKiBvcHBvcnR1bml0eSB0byBpbmRpY2F0ZSB0byB0aGUgZGV2aWNlIHRoYXQgbm8gZHJpdmVycyB3ZXJlIGZvdW5kIHRoYXQgY291bGQKICogKGZ1cnRoZXIpIHJlZmluZSBpdC4gSW4gdGhpcyBjYXNlLCB0aGUgZGV2aWNlIG1hbmFnZXIgY2FsbHMgdGhlCiAqIHtAbGluayAjbm9Ecml2ZXJGb3VuZH0gbWV0aG9kIG9uIHRoZSA8Y29kZT5EZXZpY2U8L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBTcGVjaWFsaXplZCBkZXZpY2UgaW1wbGVtZW50YXRpb25zIHdpbGwgZXh0ZW5kIHRoaXMgaW50ZXJmYWNlIGJ5IGFkZGluZwogKiBtZXRob2RzIGFwcHJvcHJpYXRlIHRvIHRoZWlyIGRldmljZSBjYXRlZ29yeSB0byBpdC4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqIEBzZWUgRHJpdmVyCiAqLwpwdWJsaWMgaW50ZXJmYWNlIERldmljZSB7CgkvKioKCSAqIFJldHVybiB2YWx1ZSBmcm9tIHtAbGluayBEcml2ZXIjbWF0Y2h9IGluZGljYXRpbmcgdGhhdCB0aGUgZHJpdmVyIGNhbm5vdAoJICogcmVmaW5lIHRoZSBkZXZpY2UgcHJlc2VudGVkIHRvIGl0IGJ5IHRoZSBkZXZpY2UgbWFuYWdlci4KCSAqIAoJICogVGhlIHZhbHVlIGlzIHplcm8uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CU1BVENIX05PTkUJPSAwOwoKCS8qKgoJICogSW5kaWNhdGVzIHRvIHRoaXMgPGNvZGU+RGV2aWNlPC9jb2RlPiBvYmplY3QgdGhhdCB0aGUgZGV2aWNlIG1hbmFnZXIgaGFzCgkgKiBmYWlsZWQgdG8gYXR0YWNoIGFueSBkcml2ZXJzIHRvIGl0LgoJICogCgkgKiA8cD4KCSAqIElmIHRoaXMgPGNvZGU+RGV2aWNlPC9jb2RlPiBvYmplY3QgY2FuIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHksIHRoZQoJICogZHJpdmVyIHRoYXQgcmVnaXN0ZXJlZCB0aGlzIDxjb2RlPkRldmljZTwvY29kZT4gb2JqZWN0IG1heSB1bnJlZ2lzdGVyIGl0CgkgKiBhbmQgcmVnaXN0ZXIgYSBkaWZmZXJlbnQgRGV2aWNlIHNlcnZpY2UgaW5zdGVhZC4KCSAqLwoJcHVibGljIHZvaWQgbm9Ecml2ZXJGb3VuZCgpOwp9ClBLAwQKAAAAAABrUu40HHZ8c2wRAABsEQAAMAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZGV2aWNlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXIuamF2YSx2IDEuMTEgMjAwNi8wNy8xMSAwMDo1NDowOCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDAsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5kZXZpY2U7CgppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CgovKioKICogQSA8Y29kZT5Ecml2ZXI8L2NvZGU+IHNlcnZpY2Ugb2JqZWN0IG11c3QgYmUgcmVnaXN0ZXJlZCBieSBlYWNoIERyaXZlciBidW5kbGUKICogd2lzaGluZyB0byBhdHRhY2ggdG8gRGV2aWNlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IG90aGVyIGRyaXZlcnMuIEZvciBlYWNoCiAqIG5ld2x5IGRpc2NvdmVyZWQge0BsaW5rIERldmljZX0gb2JqZWN0LCB0aGUgZGV2aWNlIG1hbmFnZXIgZW50ZXJzIGEgYmlkZGluZwogKiBwaGFzZS4gVGhlIDxjb2RlPkRyaXZlcjwvY29kZT4gb2JqZWN0IHdob3NlIHtAbGluayAjbWF0Y2h9IG1ldGhvZCBiaWRzIHRoZQogKiBoaWdoZXN0IGZvciBhIHBhcnRpY3VsYXIgPGNvZGU+RGV2aWNlPC9jb2RlPiBvYmplY3Qgd2lsbCBiZSBpbnN0cnVjdGVkIGJ5IHRoZQogKiBkZXZpY2UgbWFuYWdlciB0byBhdHRhY2ggdG8gdGhlIDxjb2RlPkRldmljZTwvY29kZT4gb2JqZWN0LgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjExICQKICogQHNlZSBEZXZpY2UKICogQHNlZSBEcml2ZXJMb2NhdG9yCiAqLwpwdWJsaWMgaW50ZXJmYWNlIERyaXZlciB7CgkvKioKCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgRHJpdmVyIHNlcnZpY2UgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBEZXZpY2Ugc2VydmljZS4KCSAqIAoJICogVGhlIERldmljZSBzZXJ2aWNlIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB7QGxpbmsgU2VydmljZVJlZmVyZW5jZX0KCSAqIGFuZCByZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyBob3cgd2VsbCB0aGlzIGRyaXZlciBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4KCSAqIERldmljZSBzZXJ2aWNlLCBvciB7QGxpbmsgRGV2aWNlI01BVENIX05PTkV9IGlmIGl0IGNhbm5vdCBzdXBwb3J0IHRoZQoJICogZ2l2ZW4gRGV2aWNlIHNlcnZpY2UgYXQgYWxsLgoJICogCgkgKiA8cD4KCSAqIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIHBvc3NpYmxlIG1hdGNoIHZhbHVlcyBkZWZpbmVkIGluIHRoZQoJICogZGV2aWNlIGNhdGVnb3J5IGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBEZXZpY2Ugc2VydmljZSwgb3IKCSAqIDxjb2RlPkRldmljZS5NQVRDSF9OT05FPC9jb2RlPiBpZiB0aGUgY2F0ZWdvcnkgb2YgdGhlIERldmljZSBzZXJ2aWNlIGlzIG5vdAoJICogcmVjb2duaXplZC4KCSAqIAoJICogPHA+CgkgKiBJbiBvcmRlciB0byBtYWtlIGl0cyBkZWNpc2lvbiwgdGhpcyBEcml2ZXIgc2VydmljZSBtYXkgZXhhbWluZSB0aGUKCSAqIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBEZXZpY2Ugc2VydmljZSwgb3IgbWF5IGdldCB0aGUKCSAqIHJlZmVyZW5jZWQgc2VydmljZSBvYmplY3QgKHJlcHJlc2VudGluZyB0aGUgYWN0dWFsIHBoeXNpY2FsIGRldmljZSkgdG8KCSAqIHRhbGsgdG8gaXQsIGFzIGxvbmcgYXMgaXQgdW5nZXRzIHRoZSBzZXJ2aWNlIGFuZCByZXR1cm5zIHRoZSBwaHlzaWNhbAoJICogZGV2aWNlIHRvIGEgbm9ybWFsIHN0YXRlIGJlZm9yZSB0aGlzIG1ldGhvZCByZXR1cm5zLgoJICogCgkgKiA8cD4KCSAqIEEgRHJpdmVyIHNlcnZpY2UgbXVzdCBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG1hdGNoIGNvZGUgd2hlbmV2ZXIgaXQgaXMKCSAqIHByZXNlbnRlZCB3aXRoIHRoZSBzYW1lIERldmljZSBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIFRoZSBtYXRjaCBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGRldmljZSBtYW5hZ2VyIGR1cmluZyB0aGUgbWF0Y2hpbmcKCSAqIHByb2Nlc3MuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgdGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUgZGV2aWNlIHRvCgkgKiAgICAgICAgbWF0Y2gKCSAqIAoJICogQHJldHVybiB2YWx1ZSBpbmRpY2F0aW5nIGhvdyB3ZWxsIHRoaXMgZHJpdmVyIGNhbiBzdXBwb3J0IHRoZSBnaXZlbgoJICogICAgICAgICBEZXZpY2Ugc2VydmljZSwgb3IgPGNvZGU+RGV2aWNlLk1BVENIX05PTkU8L2NvZGU+IGlmIGl0IGNhbm5vdAoJICogICAgICAgICBzdXBwb3J0IHRoZSBEZXZpY2Ugc2VydmljZSBhdCBhbGwKCSAqIAoJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIGlmIHRoaXMgRHJpdmVyIHNlcnZpY2UgY2Fubm90IGV4YW1pbmUgdGhlCgkgKiAgICAgICAgICAgIERldmljZSBzZXJ2aWNlCgkgKi8KCXB1YmxpYyBpbnQgbWF0Y2goU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHRocm93cyBFeGNlcHRpb247CgoJLyoqCgkgKiBBdHRhY2hlcyB0aGlzIERyaXZlciBzZXJ2aWNlIHRvIHRoZSBEZXZpY2Ugc2VydmljZSByZXByZXNlbnRlZCBieSB0aGUKCSAqIGdpdmVuIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBBIHJldHVybiB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCB0aGlzIERyaXZlciBzZXJ2aWNlIGhhcwoJICogc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkIHRvIHRoZSBnaXZlbiBEZXZpY2Ugc2VydmljZS4gSWYgdGhpcyBEcml2ZXIgc2VydmljZQoJICogaXMgdW5hYmxlIHRvIGF0dGFjaCB0byB0aGUgZ2l2ZW4gRGV2aWNlIHNlcnZpY2UsIGJ1dCBrbm93cyBvZiBhIG1vcmUKCSAqIHN1aXRhYmxlIERyaXZlciBzZXJ2aWNlLCBpdCBtdXN0IHJldHVybiB0aGUgPGNvZGU+RFJJVkVSX0lEPC9jb2RlPiBvZiB0aGF0CgkgKiBEcml2ZXIgc2VydmljZS4gVGhpcyBhbGxvd3MgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiByZWZlcnJpbmcgZHJpdmVycwoJICogd2hvc2Ugb25seSBwdXJwb3NlIGlzIHRvIHJlZmVyIHRvIG90aGVyIGRyaXZlcnMgY2FwYWJsZSBvZiBoYW5kbGluZyBhCgkgKiBnaXZlbiBEZXZpY2Ugc2VydmljZS4KCSAqIAoJICogPHA+CgkgKiBBZnRlciBoYXZpbmcgYXR0YWNoZWQgdG8gdGhlIERldmljZSBzZXJ2aWNlLCB0aGlzIGRyaXZlciBtYXkgcmVnaXN0ZXIgdGhlCgkgKiB1bmRlcmx5aW5nIGRldmljZSBhcyBhIG5ldyBzZXJ2aWNlIGV4cG9zaW5nIGRyaXZlci1zcGVjaWZpYwoJICogZnVuY3Rpb25hbGl0eS4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRldmljZSBtYW5hZ2VyLgoJICogCgkgKiBAcGFyYW0gcmVmZXJlbmNlIHRoZSA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3Qgb2YgdGhlIGRldmljZSB0bwoJICogICAgICAgIGF0dGFjaCB0bwoJICogCgkgKiBAcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgRHJpdmVyIHNlcnZpY2UgaGFzIHN1Y2Nlc3NmdWxseSBhdHRhY2hlZAoJICogICAgICAgICB0byB0aGUgZ2l2ZW4gRGV2aWNlIHNlcnZpY2UsIG9yIHRoZSA8Y29kZT5EUklWRVJfSUQ8L2NvZGU+IG9mIGEKCSAqICAgICAgICAgbW9yZSBzdWl0YWJsZSBkcml2ZXIKCSAqIAoJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIGlmIHRoZSBkcml2ZXIgY2Fubm90IGF0dGFjaCB0byB0aGUgZ2l2ZW4KCSAqICAgICAgICAgICAgZGV2aWNlIGFuZCBkb2VzIG5vdCBrbm93IG9mIGEgbW9yZSBzdWl0YWJsZSBkcml2ZXIKCSAqLwoJcHVibGljIFN0cmluZyBhdHRhY2goU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHRocm93cyBFeGNlcHRpb247Cn0KUEsDBAoAAAAAAGtS7jSK8m1fZQoAAGUKAAA3AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlckxvY2F0b3IuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZGV2aWNlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXJMb2NhdG9yLmphdmEsdiAxLjEwIDIwMDYvMDcvMTIgMjE6MjI6MTIgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAwLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UuZGV2aWNlOwoKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgovKioKICogQSBEcml2ZXIgTG9jYXRvciBzZXJ2aWNlIGNhbiBmaW5kIGFuZCBsb2FkIGRldmljZSBkcml2ZXIgYnVuZGxlcyBnaXZlbiBhCiAqIHByb3BlcnR5IHNldC4gRWFjaCBkcml2ZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSB1bmlxdWUgPGNvZGU+RFJJVkVSX0lEPC9jb2RlPi4KICogPHA+CiAqIERyaXZlciBMb2NhdG9yIHNlcnZpY2VzIHByb3ZpZGUgdGhlIG1lY2hhbmlzbSBmb3IgZHluYW1pY2FsbHkgZG93bmxvYWRpbmcgbmV3CiAqIGRldmljZSBkcml2ZXIgYnVuZGxlcyBpbnRvIGFuIE9TR2kgZW52aXJvbm1lbnQuIFRoZXkgYXJlIHN1cHBsaWVkIGJ5CiAqIHByb3ZpZGVycyBhbmQgZW5jYXBzdWxhdGUgYWxsIHByb3ZpZGVyLXNwZWNpZmljIGRldGFpbHMgcmVsYXRlZCB0byB0aGUKICogbG9jYXRpb24gYW5kIGFjcXVpc2l0aW9uIG9mIGRyaXZlciBidW5kbGVzLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEwICQKICogQHNlZSBEcml2ZXIKICovCnB1YmxpYyBpbnRlcmZhY2UgRHJpdmVyTG9jYXRvciB7CgkvKioKCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgPGNvZGU+RFJJVkVSX0lEPC9jb2RlPiBzdHJpbmdzIG9mIGRyaXZlcnMgY2FwYWJsZSBvZgoJICogYXR0YWNoaW5nIHRvIGEgZGV2aWNlIHdpdGggdGhlIGdpdmVuIHByb3BlcnRpZXMuCgkgKiAKCSAqIDxwPgoJICogVGhlIHByb3BlcnR5IGtleXMgaW4gdGhlIHNwZWNpZmllZCA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiBvYmplY3RzIGFyZQoJICogY2FzZS1pbnNlbnNpdGl2ZS4KCSAqIAoJICogQHBhcmFtIHByb3BzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBkZXZpY2UgZm9yIHdoaWNoIGEgZHJpdmVyIGlzIHNvdWdodAoJICogQHJldHVybiBhcnJheSBvZiBkcml2ZXIgPGNvZGU+RFJJVkVSX0lEPC9jb2RlPiBzdHJpbmdzIG9mIGRyaXZlcnMgY2FwYWJsZQoJICogICAgICAgICBvZiBhdHRhY2hpbmcgdG8gYSBEZXZpY2Ugc2VydmljZSB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLCBvcgoJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIERyaXZlciBMb2NhdG9yIHNlcnZpY2UgZG9lcyBub3Qga25vdyBvZgoJICogICAgICAgICBhbnkgc3VjaCBkcml2ZXJzCgkgKi8KCXB1YmxpYyBTdHJpbmdbXSBmaW5kRHJpdmVycyhEaWN0aW9uYXJ5IHByb3BzKTsKCgkvKioKCSAqIEdldCBhbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gZnJvbSB3aGljaCB0aGUgZHJpdmVyIGJ1bmRsZSBwcm92aWRpbmcgYQoJICogZHJpdmVyIHdpdGggdGhlIGdpdmluZyA8Y29kZT5EUklWRVJfSUQ8L2NvZGU+IGNhbiBiZSBpbnN0YWxsZWQuCgkgKiAKCSAqIEBwYXJhbSBpZCB0aGUgPGNvZGU+RFJJVkVSX0lEPC9jb2RlPiBvZiB0aGUgZHJpdmVyIHRoYXQgbmVlZHMgdG8gYmUKCSAqICAgICAgICBpbnN0YWxsZWQuCgkgKiBAcmV0dXJuIEFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QgZnJvbSB3aGljaCB0aGUgZHJpdmVyIGJ1bmRsZSBjYW4KCSAqICAgICAgICAgYmUgaW5zdGFsbGVkIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkcml2ZXIgd2l0aCB0aGUgZ2l2ZW4gSUQKCSAqICAgICAgICAgY2Fubm90IGJlIGxvY2F0ZWQKCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB0aGUgaW5wdXQgc3RyZWFtIGZvciB0aGUgYnVuZGxlIGNhbm5vdCBiZQoJICogICAgICAgICBjcmVhdGVkCgkgKi8KCXB1YmxpYyBJbnB1dFN0cmVhbSBsb2FkRHJpdmVyKFN0cmluZyBpZCkgdGhyb3dzIElPRXhjZXB0aW9uOwp9ClBLAwQKAAAAAABrUu40fPEGJicJAAAnCQAAOAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXJTZWxlY3Rvci5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5kZXZpY2Uvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlclNlbGVjdG9yLmphdmEsdiAxLjkgMjAwNi8wNi8xNiAxNjozMToyOSBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5kZXZpY2U7CgppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CgovKioKICogV2hlbiB0aGUgZGV2aWNlIG1hbmFnZXIgZGV0ZWN0cyBhIG5ldyBEZXZpY2Ugc2VydmljZSwgaXQgY2FsbHMgYWxsIHJlZ2lzdGVyZWQKICogRHJpdmVyIHNlcnZpY2VzIHRvIGRldGVybWluZSBpZiBhbnlvbmUgbWF0Y2hlcyB0aGUgRGV2aWNlIHNlcnZpY2UuIElmIGF0CiAqIGxlYXN0IG9uZSBEcml2ZXIgc2VydmljZSBtYXRjaGVzLCB0aGUgZGV2aWNlIG1hbmFnZXIgbXVzdCBjaG9vc2Ugb25lLiBJZgogKiB0aGVyZSBpcyBhIERyaXZlciBTZWxlY3RvciBzZXJ2aWNlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRnJhbWV3b3JrLCB0aGUgZGV2aWNlCiAqIG1hbmFnZXIgd2lsbCBhc2sgaXQgdG8gbWFrZSB0aGUgc2VsZWN0aW9uLiBJZiB0aGVyZSBpcyBubyBEcml2ZXIgU2VsZWN0b3IKICogc2VydmljZSwgb3IgaWYgaXQgcmV0dXJucyBhbiBpbnZhbGlkIHJlc3VsdCwgb3IgdGhyb3dzIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4sCiAqIHRoZSBkZXZpY2UgbWFuYWdlciB1c2VzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBzdHJhdGVneS4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICogQHNpbmNlIDEuMQogKi8KcHVibGljIGludGVyZmFjZSBEcml2ZXJTZWxlY3RvciB7CgkvKioKCSAqIFJldHVybiB2YWx1ZSBmcm9tIDxjb2RlPkRyaXZlclNlbGVjdG9yLnNlbGVjdDwvY29kZT4sIGlmIG5vIERyaXZlciBzZXJ2aWNlCgkgKiBzaG91bGQgYmUgYXR0YWNoZWQgdG8gdGhlIERldmljZSBzZXJ2aWNlLiBUaGUgdmFsdWUgaXMgLTEuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CVNFTEVDVF9OT05FCT0gLTE7CgoJLyoqCgkgKiBTZWxlY3Qgb25lIG9mIHRoZSBtYXRjaGluZyBEcml2ZXIgc2VydmljZXMuIFRoZSBkZXZpY2UgbWFuYWdlciBjYWxscyB0aGlzCgkgKiBtZXRob2QgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGRyaXZlciBiaWRkaW5nIGZvciBhIGRldmljZS4gT25seSBEcml2ZXIKCSAqIHNlcnZpY2VzIHRoYXQgaGF2ZSByZXNwb25kZWQgd2l0aCBub256ZXJvIChub3Qge0BsaW5rIERldmljZSNNQVRDSF9OT05FfSkKCSAqIDxjb2RlPjwvY29kZT4gbWF0Y2ggdmFsdWVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgdGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUgRGV2aWNlCgkgKiAgICAgICAgc2VydmljZS4KCSAqIEBwYXJhbSBtYXRjaGVzIHRoZSBhcnJheSBvZiBhbGwgbm9uLXplcm8gbWF0Y2hlcy4KCSAqIEByZXR1cm4gaW5kZXggaW50byB0aGUgYXJyYXkgb2YgPGNvZGU+TWF0Y2g8L2NvZGU+IG9iamVjdHMsIG9yCgkgKiAgICAgICAgIDxjb2RlPlNFTEVDVF9OT05FPC9jb2RlPiBpZiBubyBEcml2ZXIgc2VydmljZSBzaG91bGQgYmUgYXR0YWNoZWQKCSAqLwoJcHVibGljIGludCBzZWxlY3QoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE1hdGNoW10gbWF0Y2hlcyk7Cn0KUEsDBAoAAAAAAGtS7jRCGVyehgUAAIYFAAAvAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL01hdGNoLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmRldmljZS9zcmMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvTWF0Y2guamF2YSx2IDEuOSAyMDA2LzA2LzE2IDE2OjMxOjI5IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmRldmljZTsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKCi8qKgogKiBJbnN0YW5jZXMgb2YgPGNvZGU+TWF0Y2g8L2NvZGU+IGFyZSB1c2VkIGluIHRoZSB7QGxpbmsgRHJpdmVyU2VsZWN0b3Ijc2VsZWN0fQogKiBtZXRob2QgdG8gaWRlbnRpZnkgRHJpdmVyIHNlcnZpY2VzIG1hdGNoaW5nIGEgRGV2aWNlIHNlcnZpY2UuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCiAqIEBzaW5jZSAxLjEKICogQHNlZSBEcml2ZXJTZWxlY3RvcgogKi8KcHVibGljIGludGVyZmFjZSBNYXRjaCB7CgkvKioKCSAqIFJldHVybiB0aGUgcmVmZXJlbmNlIHRvIGEgRHJpdmVyIHNlcnZpY2UuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IHRvIGEgRHJpdmVyIHNlcnZpY2UuCgkgKi8KCXB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlIGdldERyaXZlcigpOwoKCS8qKgoJICogUmV0dXJuIHRoZSBtYXRjaCB2YWx1ZSBvZiB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiB0aGUgbWF0Y2ggdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBEcml2ZXIgc2VydmljZS4KCSAqLwoJcHVibGljIGludCBnZXRNYXRjaFZhbHVlKCk7Cn0KUEsDBAoAAAAAAGtS7jRb4AGKgwEAAIMBAAAxAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5kZXZpY2Uvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL3BhY2thZ2UuaHRtbCx2IDEuMyAyMDA2LzA3LzEyIDIxOjA3OjA1IGhhcmdyYXZlIEV4cCAkIC0tPgo8Qk9EWT4KPHA+RGV2aWNlIEFjY2VzcyBQYWNrYWdlIFZlcnNpb24gMS4xLgo8cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UKaW4gdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuCkZvciBleGFtcGxlOgo8cHJlPgpJbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuc2VydmljZS5kZXZpY2U7IHZlcnNpb249MS4xCjwvcHJlPgo8L0JPRFk+ClBLAwQKAAAAAABrUu40hK4atwwAAAAMAAAAMAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAJAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1BLAwQKAAAAAABrUu40/Mv5SQ4VAAAOFQAALgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50LmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmV2ZW50L3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50LmphdmEsdiAxLjggMjAwNi8wNy8xMiAxMzoxNzowNCBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA1LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5ldmVudDsKCmltcG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuRmlsdGVyOwoKLyoqCiAqIEFuIGV2ZW50LgogKiAKICogPGNvZGU+RXZlbnQ8L2NvZGU+IG9iamVjdHMgYXJlIGRlbGl2ZXJlZCB0byA8Y29kZT5FdmVudEhhbmRsZXI8L2NvZGU+CiAqIHNlcnZpY2VzIHdoaWNoIHN1YnNyY2liZSB0byB0aGUgdG9waWMgb2YgdGhlIGV2ZW50LgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAogKi8KcHVibGljIGNsYXNzIEV2ZW50IHsKCS8qKgoJICogVGhlIHRvcGljIG9mIHRoaXMgZXZlbnQuCgkgKi8KCVN0cmluZwl0b3BpYzsKCS8qKgoJICogVGhlIHByb3BlcnRpZXMgY2FycmllZCBieSB0aGlzIGV2ZW50LiBLZXlzIGFyZSBzdHJpbmdzIGFuZCB2YWx1ZXMgYXJlCgkgKiBvYmplY3RzCgkgKi8KCUhhc2h0YWJsZQlwcm9wZXJ0aWVzOwoKCS8qKgoJICogQ29uc3RydWN0cyBhbiBldmVudC4KCSAqIAoJICogQHBhcmFtIHRvcGljIFRoZSB0b3BpYyBvZiB0aGUgZXZlbnQuCgkgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgZXZlbnQncyBwcm9wZXJ0aWVzIChtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4pLgoJICogCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0b3BpYyBpcyBub3QgYSB2YWxpZCB0b3BpYyBuYW1lLgoJICovCglwdWJsaWMgRXZlbnQoU3RyaW5nIHRvcGljLCBEaWN0aW9uYXJ5IHByb3BlcnRpZXMpIHsKCQl0aGlzLnRvcGljID0gdG9waWM7CgkJdmFsaWRhdGVUb3BpY05hbWUoKTsKCQl0aGlzLnByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKCk7CgkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgewoJCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBwcm9wZXJ0aWVzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CgkJCQlPYmplY3QgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChrZXkpOwoJCQkJdGhpcy5wcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKCQkJfQoJCX0KCQl0aGlzLnByb3BlcnRpZXMucHV0KEV2ZW50Q29uc3RhbnRzLkVWRU5UX1RPUElDLCB0b3BpYyk7Cgl9CgoJLyoqCgkgKiBSZXRyaWV2ZXMgYSBwcm9wZXJ0eS4KCSAqIAoJICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHJldHJpZXZlCgkgKiAKCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGZvdW5kLgoJICovCglwdWJsaWMgZmluYWwgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CgkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0KG5hbWUpOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIGxpc3Qgb2YgdGhpcyBldmVudCdzIHByb3BlcnR5IG5hbWVzLgoJICogCgkgKiBAcmV0dXJuIEEgbm9uLWVtcHR5IGFycmF5IHdpdGggb25lIGVsZW1lbnQgcGVyIHByb3BlcnR5LgoJICovCglwdWJsaWMgZmluYWwgU3RyaW5nW10gZ2V0UHJvcGVydHlOYW1lcygpIHsKCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcHJvcGVydGllcy5zaXplKCldOwoJCUVudW1lcmF0aW9uIGtleXMgPSBwcm9wZXJ0aWVzLmtleXMoKTsKCQlmb3IgKGludCBpID0gMDsga2V5cy5oYXNNb3JlRWxlbWVudHMoKTsgaSsrKSB7CgkJCW5hbWVzW2ldID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwoJCX0KCQlyZXR1cm4gbmFtZXM7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB0b3BpYyBvZiB0aGlzIGV2ZW50LgoJICogCgkgKiBAcmV0dXJuIFRoZSB0b3BpYyBvZiB0aGlzIGV2ZW50LgoJICovCglwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRvcGljKCkgewoJCXJldHVybiB0b3BpYzsKCX0KCgkvKioKCSAqIFRlc3RzIHRoaXMgZXZlbnQncyBwcm9wZXJ0aWVzIGFnYWluc3QgdGhlIGdpdmVuIGZpbHRlci4KCSAqIAoJICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRvIHRlc3QuCgkgKiAKCSAqIEByZXR1cm4gdHJ1ZSBJZiB0aGlzIGV2ZW50J3MgcHJvcGVydGllcyBtYXRjaCB0aGUgZmlsdGVyLCBmYWxzZQoJICogICAgICAgICBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBmaW5hbCBib29sZWFuIG1hdGNoZXMoRmlsdGVyIGZpbHRlcikgewoJCXJldHVybiBmaWx0ZXIubWF0Y2hDYXNlKHByb3BlcnRpZXMpOwoJfQoKCS8qKgoJICogQ29tcGFyZXMgdGhpcyA8Y29kZT5FdmVudDwvY29kZT4gb2JqZWN0IHRvIGFub3RoZXIgb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIEFuIGV2ZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgPGI+ZXF1YWwgdG8gPC9iPiBhbm90aGVyCgkgKiBldmVudCBpZiB0aGUgdG9waWMgaXMgZXF1YWwgYW5kIHRoZSBwcm9wZXJ0aWVzIGFyZSBlcXVhbC4KCSAqIAoJICogQHBhcmFtIG9iamVjdCBUaGUgPGNvZGU+RXZlbnQ8L2NvZGU+IG9iamVjdCB0byBiZSBjb21wYXJlZC4KCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+b2JqZWN0PC9jb2RlPiBpcyBhCgkgKiAgICAgICAgIDxjb2RlPkV2ZW50PC9jb2RlPiBhbmQgaXMgZXF1YWwgdG8gdGhpcyBvYmplY3Q7CgkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CgkJaWYgKG9iamVjdCA9PSB0aGlzKSB7IC8vIHF1aWNrdGVzdAoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIEV2ZW50KSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlFdmVudCBldmVudCA9IChFdmVudCkgb2JqZWN0OwoJCXJldHVybiB0b3BpYy5lcXVhbHMoZXZlbnQudG9waWMpICYmIHByb3BlcnRpZXMuZXF1YWxzKGV2ZW50LnByb3BlcnRpZXMpOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBBbiBpbnRlZ2VyIHdoaWNoIGlzIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIGludCBoYXNoQ29kZSgpIHsKCQlyZXR1cm4gdG9waWMuaGFzaENvZGUoKSBeIHByb3BlcnRpZXMuaGFzaENvZGUoKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGV2ZW50LgoJICogCgkgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBldmVudC4KCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlyZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIFt0b3BpYz0iICsgdG9waWMgKyAiXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAoJfQoKCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlTRVBBUkFUT1IJPSAiLyI7IC8vJE5PTi1OTFMtMSQKCgkvKioKCSAqIENhbGxlZCBieSB0aGUgY29uc3RydWN0b3IgdG8gdmFsaWRhdGUgdGhlIHRvcGljIG5hbWUuCgkgKiAKCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSB0b3BpYyBuYW1lIGlzIGludmFsaWQuCgkgKi8KCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVRvcGljTmFtZSgpIHsKCQl0cnkgewoJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRvcGljLCBTRVBBUkFUT1IsIHRydWUpOwoJCQl2YWxpZGF0ZVRva2VuKHN0Lm5leHRUb2tlbigpKTsKCgkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKCQkJCXN0Lm5leHRUb2tlbigpOyAvLyBjb25zdW1lIGRlbGltaXRlcgoJCQkJdmFsaWRhdGVUb2tlbihzdC5uZXh0VG9rZW4oKSk7CgkJCX0KCQl9CgkJY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHRvcGljIik7IC8vJE5PTi1OTFMtMSQKCQl9Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCXRva2VuQWxwaGFiZXQJPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfLSI7IC8vJE5PTi1OTFMtMSQKCgkvKioKCSAqIFZhbGlkYXRlIGEgdG9rZW4uCgkgKiAKCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSB0b2tlbiBpcyBpbnZhbGlkLgoJICovCglwcml2YXRlIHZvaWQgdmFsaWRhdGVUb2tlbihTdHJpbmcgdG9rZW4pIHsKCQlpbnQgbGVuZ3RoID0gdG9rZW4ubGVuZ3RoKCk7CgkJaWYgKGxlbmd0aCA8IDEpIHsJLy8gdG9rZW4gbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB0b3BpYyIpOyAvLyROT04tTkxTLTEkCgkJfQoJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsgLy8gZWFjaCBjaGFyYWN0ZXIgaW4gdGhlIHRva2VuIG11c3QgYmUgZnJvbSB0aGUgdG9rZW4gYWxwaGFiZXQKCQkJaWYgKHRva2VuQWxwaGFiZXQuaW5kZXhPZih0b2tlbi5jaGFyQXQoaSkpID09IC0xKSB7IC8vJE5PTi1OTFMtMSQKCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgdG9waWMiKTsgLy8kTk9OLU5MUy0xJAoJCQl9CgkJfQoJfQp9ClBLAwQKAAAAAABrUu40R9rSvJQHAACUBwAAMwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50QWRtaW4uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZXZlbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRBZG1pbi5qYXZhLHYgMS42IDIwMDYvMDYvMTYgMTY6MzE6NDggaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQ7CgovKioKICogVGhlIEV2ZW50IEFkbWluIHNlcnZpY2UuIEJ1bmRsZXMgd2lzaGluZyB0byBwdWJsaXNoIGV2ZW50cyBtdXN0IG9idGFpbiB0aGUKICogRXZlbnQgQWRtaW4gc2VydmljZSBhbmQgY2FsbCBvbmUgb2YgdGhlIGV2ZW50IGRlbGl2ZXJ5IG1ldGhvZHMuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuNiAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIEV2ZW50QWRtaW4gewoJLyoqCgkgKiBJbml0aWF0ZSBhc3luY2hyb25vdXMgZGVsaXZlcnkgb2YgYW4gZXZlbnQuIFRoaXMgbWV0aG9kIHJldHVybnMgdG8KCSAqIHRoZSBjYWxsZXIgYmVmb3JlIGRlbGl2ZXJ5IG9mIHRoZSBldmVudCBpcyBjb21wbGV0ZWQuCgkgKiAKCSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBhbGwgbGlzdGVuZXJzIHdoaWNoIHN1YnNjcmliZQoJICogICAgICAgIHRvIHRoZSB0b3BpYyBvZiB0aGUgZXZlbnQuCgkgKiAKCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlCgkgKiAgICAgICAgICAgIDxjb2RlPlRvcGljUGVybWlzc2lvblt0b3BpYyxQVUJMSVNIXTwvY29kZT4gZm9yIHRoZSB0b3BpYwoJICogICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIGV2ZW50LgoJICovCgl2b2lkIHBvc3RFdmVudChFdmVudCBldmVudCk7CgoJLyoqCgkgKiBJbml0aWF0ZSBzeW5jaHJvbm91cyBkZWxpdmVyeSBvZiBhbiBldmVudC4gVGhpcyBtZXRob2QgZG9lcyBub3QKCSAqIHJldHVybiB0byB0aGUgY2FsbGVyIHVudGlsIGRlbGl2ZXJ5IG9mIHRoZSBldmVudCBpcyBjb21wbGV0ZWQuCgkgKiAKCSAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBhbGwgbGlzdGVuZXJzIHdoaWNoIHN1YnNjcmliZQoJICogICAgICAgIHRvIHRoZSB0b3BpYyBvZiB0aGUgZXZlbnQuCgkgKiAKCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgdGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlCgkgKiAgICAgICAgICAgIDxjb2RlPlRvcGljUGVybWlzc2lvblt0b3BpYyxQVUJMSVNIXTwvY29kZT4gZm9yIHRoZSB0b3BpYwoJICogICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIGV2ZW50LgoJICovCgl2b2lkIHNlbmRFdmVudChFdmVudCBldmVudCk7Cn0KUEsDBAoAAAAAAGtS7jT7s8Fg0BIAANASAAA3AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRDb25zdGFudHMuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZXZlbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRDb25zdGFudHMuamF2YSx2IDEuMTQgMjAwNi8wNy8xMiAyMTowNjoxOCBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA1LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5ldmVudDsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwoKLyoqCiAqIAogKiBEZWZpbmVzIHN0YW5kYXJkIG5hbWVzIGZvciA8Y29kZT5FdmVudEhhbmRsZXI8L2NvZGU+IHByb3BlcnRpZXMuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTQgJAogKi8KcHVibGljIGludGVyZmFjZSBFdmVudENvbnN0YW50cyB7CgoJLyoqCgkgKiBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSAobmFtZWQgPGNvZGU+ZXZlbnQudG9waWM8L2NvZGU+KQoJICogc3BlY2lmeWluZyB0aGUgPGNvZGU+RXZlbnQ8L2NvZGU+IHRvcGljcyBvZiBpbnRlcmVzdCB0byBhIEV2ZW50IEhhbmRsZXIKCSAqIHNlcnZpY2UuCgkgKiA8cD4KCSAqIEV2ZW50IGhhbmRsZXJzIFNIT1VMRCBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwcm9wZXJ0eS4gVGhlIHZhbHVlIG9mIHRoZQoJICogcHJvcGVydHkgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyB0aGF0IGRlc2NyaWJlIHRoZSB0b3BpY3MgaW4gd2hpY2ggdGhlCgkgKiBoYW5kbGVyIGlzIGludGVyZXN0ZWQuIEFuIGFzdGVyaXNrICgnKicpIG1heSBiZSB1c2VkIGFzIGEgdHJhaWxpbmcKCSAqIHdpbGRjYXJkLiBFdmVudCBIYW5kbGVycyB3aGljaCBkbyBub3QgaGF2ZSBhIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5IG11c3QKCSAqIG5vdCByZWNlaXZlIGV2ZW50cy4gTW9yZSBwcmVjaXNlbHksIHRoZSB2YWx1ZSBvZiBlYWNoIGVudHJ5IGluIHRoZSBhcnJheQoJICogbXVzdCBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgZ3JhbW1hcjoKCSAqIAoJICogPHByZT4KCSAqICAgICAgICAgICAgdG9waWMtZGVzY3JpcHRpb24gOj0gJyonIHwgdG9waWMgKCAnLyonICk/CgkgKiAgICAgICAgICAgIHRvcGljIDo9IHRva2VuICggJy8nIHRva2VuICkqCgkgKiA8L3ByZT4KCSAqIAoJICogQHNlZSBFdmVudAoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlFVkVOVF9UT1BJQwkJCT0gImV2ZW50LnRvcGljcyI7CgoJLyoqCgkgKiBTZXJ2aWNlIFJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSAobmFtZWQgPGNvZGU+ZXZlbnQuZmlsdGVyPC9jb2RlPikKCSAqIHNwZWNpZnlpbmcgYSBmaWx0ZXIgdG8gZnVydGhlciBzZWxlY3QgPGNvZGU+RXZlbnQ8L2NvZGU+IHMgb2YgaW50ZXJlc3QKCSAqIHRvIGEgRXZlbnQgSGFuZGxlciBzZXJ2aWNlLgoJICogPHA+CgkgKiBFdmVudCBoYW5kbGVycyBNQVkgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcHJvcGVydHkuIFRoZSB2YWx1ZSBvZiB0aGlzCgkgKiBwcm9wZXJ0eSBpcyBhIHN0cmluZyBjb250YWluaW5nIGFuIExEQVAtc3R5bGUgZmlsdGVyIHNwZWNpZmljYXRpb24uIEFueQoJICogb2YgdGhlIGV2ZW50J3MgcHJvcGVydGllcyBtYXkgYmUgdXNlZCBpbiB0aGUgZmlsdGVyIGV4cHJlc3Npb24uIEVhY2gKCSAqIGV2ZW50IGhhbmRsZXIgaXMgbm90aWZpZWQgZm9yIGFueSBldmVudCB3aGljaCBiZWxvbmdzIHRvIHRoZSB0b3BpY3MgaW4KCSAqIHdoaWNoIHRoZSBoYW5kbGVyIGhhcyBleHByZXNzZWQgYW4gaW50ZXJlc3QuIElmIHRoZSBldmVudCBoYW5kbGVyIGlzIGFsc28KCSAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHNlcnZpY2UgcHJvcGVydHksIHRoZW4gdGhlIHByb3BlcnRpZXMgb2YgdGhlIGV2ZW50CgkgKiBtdXN0IGFsc28gbWF0Y2ggdGhlIGZpbHRlciBmb3IgdGhlIGV2ZW50IHRvIGJlIGRlbGl2ZXJlZCB0byB0aGUgZXZlbnQKCSAqIGhhbmRsZXIuCgkgKiA8cD4KCSAqIElmIHRoZSBmaWx0ZXIgc3ludGF4IGlzIGludmFsaWQsIHRoZW4gdGhlIEV2ZW50IEhhbmRsZXIgbXVzdCBiZSBpZ25vcmVkCgkgKiBhbmQgYSB3YXJuaW5nIHNob3VsZCBiZSBsb2dnZWQuCgkgKiAKCSAqIEBzZWUgRXZlbnQKCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkZpbHRlcgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlFVkVOVF9GSUxURVIJCT0gImV2ZW50LmZpbHRlciI7CgoJLyoqCgkgKiBUaGUgRGlzdGluZ3Vpc2hlZCBOYW1lIG9mIHRoZSBidW5kbGUgcmVsZXZhbnQgdG8gdGhlIGV2ZW50LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlCVU5ETEVfU0lHTkVSCQk9ICJidW5kbGUuc2lnbmVyIjsKCgkvKioKCSAqIFRoZSBCdW5kbGUgU3ltYm9saWMgTmFtZSBvZiB0aGUgYnVuZGxlIHJlbGV2YW50IHRvIHRoZSBldmVudC4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJQlVORExFX1NZTUJPTElDTkFNRQk9ICJidW5kbGUuc3ltYm9saWNOYW1lIjsKCgkvKioKCSAqIFRoZSBCdW5kbGUgaWQgb2YgdGhlIGJ1bmRsZSByZWxldmFudCB0byB0aGUgZXZlbnQuCgkgKiAKCSAqIEBzaW5jZSAxLjEKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJQlVORExFX0lECQkJPSAiYnVuZGxlLmlkIjsKCgkvKioKCSAqIFRoZSBCdW5kbGUgb2JqZWN0IG9mIHRoZSBidW5kbGUgcmVsZXZhbnQgdG8gdGhlIGV2ZW50LgoJICogCgkgKiBAc2luY2UgMS4xCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCUJVTkRMRQkJCQk9ICJidW5kbGUiOwoKCS8qKgoJICogVGhlIGFjdHVhbCBldmVudCBvYmplY3QuIFVzZWQgd2hlbiByZWJyb2FkY2FzdGluZyBhbiBldmVudCB0aGF0IHdhcyBzZW50CgkgKiB2aWEgc29tZSBvdGhlciBldmVudCBtZWNoYW5pc20uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCUVWRU5UCQkJCT0gImV2ZW50IjsKCgkvKioKCSAqIEFuIGV4Y2VwdGlvbiBvciBlcnJvci4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJRVhDRVBUSU9OCQkJPSAiZXhjZXB0aW9uIjsKCgkvKioKCSAqIE11c3QgYmUgZXF1YWwgdG8gdGhlIG5hbWUgb2YgdGhlIEV4Y2VwdGlvbiBjbGFzcy4KCSAqIAoJICogQHNpbmNlIDEuMQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlFWENFUFRJT05fQ0xBU1MJCT0gImV4Y2VwdGlvbi5jbGFzcyI7CgoJLyoqCgkgKiBNdXN0IGJlIGVxdWFsIHRvIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJRVhDRVBUSU9OX01FU1NBR0UJPSAiZXhjZXB0aW9uLm1lc3NhZ2UiOwoKCS8qKgoJICogQSBodW1hbi1yZWFkYWJsZSBtZXNzYWdlIHRoYXQgaXMgdXN1YWxseSBub3QgbG9jYWxpemVkLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlNRVNTQUdFCQkJCT0gIm1lc3NhZ2UiOwoKCS8qKgoJICogQSBzZXJ2aWNlCgkgKi8KCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlTRVJWSUNFCQkJCT0gInNlcnZpY2UiOwoKCS8qKgoJICogQSBzZXJ2aWNlJ3MgaWQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCVNFUlZJQ0VfSUQJCQk9IENvbnN0YW50cy5TRVJWSUNFX0lEOwoKCS8qKgoJICogCgkgKiBBIHNlcnZpY2UncyBvYmplY3RDbGFzcwoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlTRVJWSUNFX09CSkVDVENMQVNTCT0gInNlcnZpY2Uub2JqZWN0Q2xhc3MiOwoKCS8qKgoJICogCgkgKiBBIHNlcnZpY2UncyBwZXJzaXN0ZW50IGlkZW50aXR5LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlTRVJWSUNFX1BJRAkJCT0gQ29uc3RhbnRzLlNFUlZJQ0VfUElEOwoKCS8qKgoJICogCgkgKiBUaGUgdGltZSB3aGVuIHRoZSBldmVudCBvY2N1cnJlZCwgYXMgcmVwb3J0ZWQgYnkKCSAqIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCVRJTUVTVEFNUAkJCT0gInRpbWVzdGFtcCI7CgoJLyoqCgkgKiBUaGlzIGNvbnN0YW50IHdhcyByZWxlYXNlZCB3aXRoIGFuIGluY29ycmVjdCBzcGVsbGluZy4gSXQgaGFzIGJlZW4KCSAqIHJlcGxhY2VkIGJ5IHtAbGluayAjRVhDRVBUSU9OX0NMQVNTfQoJICogCgkgKiBAZGVwcmVjYXRlZCBBcyBvZiAxLjEsIHJlcGxhY2VkIGJ5IEVYQ0VQVElPTl9DTEFTUwoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlFWEVDUFRJT05fQ0xBU1MJCT0gImV4Y2VwdGlvbi5jbGFzcyI7Cn1QSwMECgAAAAAAa1LuNB/TEoX9CQAA/QkAADUAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudEhhbmRsZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZXZlbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRIYW5kbGVyLmphdmEsdiAxLjEwIDIwMDYvMDcvMTEgMTY6NDM6NTkgaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQ7CgovKioKICogTGlzdGVuZXIgZm9yIEV2ZW50cy4KICogCiAqIDxwPgogKiA8Y29kZT5FdmVudEhhbmRsZXI8L2NvZGU+IG9iamVjdHMgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRnJhbWV3b3JrIHNlcnZpY2UKICogcmVnaXN0cnkgYW5kIGFyZSBub3RpZmllZCB3aXRoIGFuIDxjb2RlPkV2ZW50PC9jb2RlPiBvYmplY3Qgd2hlbiBhbgogKiBldmVudCBpcyBzZW50IG9yIHBvc3RlZC4KICogPHA+CiAqIDxjb2RlPkV2ZW50SGFuZGxlcjwvY29kZT4gb2JqZWN0cyBjYW4gaW5zcGVjdCB0aGUgcmVjZWl2ZWQKICogPGNvZGU+RXZlbnQ8L2NvZGU+IG9iamVjdCB0byBkZXRlcm1pbmUgaXRzIHRvcGljIGFuZCBwcm9wZXJ0aWVzLgogKiAKICogPHA+CiAqIDxjb2RlPkV2ZW50SGFuZGxlcjwvY29kZT4gb2JqZWN0cyBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBhIHNlcnZpY2UKICogcHJvcGVydHkge0BsaW5rIEV2ZW50Q29uc3RhbnRzI0VWRU5UX1RPUElDfSB3aG9zZSB2YWx1ZSBpcyB0aGUgbGlzdCBvZgogKiB0b3BpY3MgaW4gd2hpY2ggdGhlIGV2ZW50IGhhbmRsZXIgaXMgaW50ZXJlc2VkLgogKiA8cD4KICogRm9yIGV4YW1wbGU6CiAqIAogKiA8cHJlPgogKiBTdHJpbmdbXSB0b3BpY3MgPSBuZXcgU3RyaW5nW10ge0V2ZW50Q29uc3RhbnRzLkVWRU5UX1RPUElDLCAmcXVvdDtjb20vaXN2LyomcXVvdDt9OwogKiBIYXNodGFibGUgaHQgPSBuZXcgSGFzaHRhYmxlKCk7CiAqIGh0LnB1dChFVkVOVF9UT1BJQywgdG9waWNzKTsKICogY29udGV4dC5yZWdpc3RlclNlcnZpY2UoRXZlbnRIYW5kbGVyLmNsYXNzLmdldE5hbWUoKSwgdGhpcywgaHQpOwogKiA8L3ByZT4KICogRXZlbnQgSGFuZGxlciBzZXJ2aWNlcyBjYW4gYWxzbyBiZSByZWdpc3RlcmVkIHdpdGggYW4ge0BsaW5rIEV2ZW50Q29uc3RhbnRzI0VWRU5UX0ZJTFRFUn0KICogc2VydmljZSBwcm9wZXJ5IHRvIGZ1cnRoZXIgZmlsdGVyIHRoZSBldmVudHMuIElmIHRoZSBzeW50YXggb2YgdGhpcyBmaWx0ZXIgaXMgaW52YWxpZCwKICogdGhlbiB0aGUgRXZlbnQgSGFuZGxlciBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEV2ZW50IEFkbWluIHNlcnZpY2UuIFRoZSBFdmVudCBBZG1pbgogKiBzZXJ2aWNlIHNob3VsZCBsb2cgYSB3YXJuaW5nLgogKiA8cD4KICogU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMuIEJ1bmRsZXMgd2lzaGluZyB0byBtb25pdG9yIDxjb2RlPkV2ZW50PC9jb2RlPgogKiBvYmplY3RzIHdpbGwgcmVxdWlyZSA8Y29kZT5TZXJ2aWNlUGVybWlzc2lvbltFdmVudEhhbmRsZXIsUkVHSVNURVJdPC9jb2RlPgogKiB0byByZWdpc3RlciBhbiA8Y29kZT5FdmVudEhhbmRsZXI8L2NvZGU+IHNlcnZpY2UuIFRoZSBidW5kbGUgbXVzdCBhbHNvIGhhdmUKICogPGNvZGU+VG9waWNQZXJtaXNzaW9uW3RvcGljLFNVQlNDUklCRV08L2NvZGU+IGZvciB0aGUgdG9waWMgc3BlY2lmaWVkIGluIHRoZQogKiBldmVudCBpbiBvcmRlciB0byByZWNlaXZlIHRoZSBldmVudC4KICogCiAqIEBzZWUgRXZlbnQKICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIEV2ZW50SGFuZGxlciB7CgkvKioKCSAqIENhbGxlZCBieSB0aGUge0BsaW5rIEV2ZW50QWRtaW59IHNlcnZpY2UgdG8gbm90aWZ5IHRoZSBsaXN0ZW5lciBvZiBhbiBldmVudC4KCSAqIAoJICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IG9jY3VycmVkLgoJICovCgl2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KTsKfQpQSwMECgAAAAAAa1LuNI88rSusOAAArDgAADgAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9Ub3BpY1Blcm1pc3Npb24uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuZXZlbnQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uLmphdmEsdiAxLjExIDIwMDYvMDYvMTYgMTY6MzE6NDggaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQ7CgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbkNvbGxlY3Rpb247CmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CmltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwoKLyoqCiAqIEEgYnVuZGxlJ3MgYXV0aG9yaXR5IHRvIHB1Ymxpc2ggb3Igc3Vic2NyaWJlIHRvIGV2ZW50IG9uIGEgdG9waWMuCiAqIAogKiA8cD4KICogQSB0b3BpYyBpcyBhIHNsYXNoLXNlcGFyYXRlZCBzdHJpbmcgdGhhdCBkZWZpbmVzIGEgdG9waWMuCiAqIDxwPgogKiBGb3IgZXhhbXBsZToKICogCiAqIDxwcmU+CiAqIG9yZy9vc2dpL3NlcnZpY2UvZm9vL0Zvb0V2ZW50L0FDVElPTgogKiA8L3ByZT4KICogCiAqIDxwPgogKiA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+IGhhcyB0d28gYWN0aW9uczogPGNvZGU+cHVibGlzaDwvY29kZT4gYW5kCiAqIDxjb2RlPnN1YnNjcmliZTwvY29kZT4uCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTEgJAogKi8KcHVibGljIGZpbmFsIGNsYXNzIFRvcGljUGVybWlzc2lvbiBleHRlbmRzIFBlcm1pc3Npb24gewoJc3RhdGljIGZpbmFsIGxvbmcJCQlzZXJpYWxWZXJzaW9uVUlECT0gLTU4NTU1NjM4ODY5NjE2MTgzMDBMOwoJLyoqCgkgKiBUaGUgYWN0aW9uIHN0cmluZyA8Y29kZT5wdWJsaXNoPC9jb2RlPi4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJUFVCTElTSAkJCQk9ICJwdWJsaXNoIjsJCQkJLy8kTk9OLU5MUy0xJAoJLyoqCgkgKiBUaGUgYWN0aW9uIHN0cmluZyA8Y29kZT5zdWJzY3JpYmU8L2NvZGU+LgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlTVUJTQ1JJQkUJCQk9ICJzdWJzY3JpYmUiOwkJCQkvLyROT04tTkxTLTEkCglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJQUNUSU9OX1BVQkxJU0gJCT0gMHgwMDAwMDAwMTsKCXByaXZhdGUgZmluYWwgc3RhdGljIGludAlBQ1RJT05fU1VCU0NSSUJFCT0gMHgwMDAwMDAwMjsKCXByaXZhdGUgZmluYWwgc3RhdGljIGludAlBQ1RJT05fQUxMCQkJPSBBQ1RJT05fUFVCTElTSAoJCQkJCQkJCQkJCQkJCQl8IEFDVElPTl9TVUJTQ1JJQkU7Cglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJQUNUSU9OX05PTkUJCQk9IDA7CgkvKioKCSAqIFRoZSBhY3Rpb25zIG1hc2suCgkgKi8KCXByaXZhdGUgdHJhbnNpZW50IGludAkJYWN0aW9uX21hc2sJCQk9IEFDVElPTl9OT05FOwoKCS8qKgoJICogcHJlZml4IGlmIHRoZSBuYW1lIGlzIHdpbGRjYXJkZWQuCgkgKi8KCXByaXZhdGUgdHJhbnNpZW50IFN0cmluZwlwcmVmaXg7CgoJLyoqCgkgKiBUaGUgYWN0aW9ucyBpbiBjYW5vbmljYWwgZm9ybS4KCSAqIAoJICogQHNlcmlhbAoJICovCglwcml2YXRlIFN0cmluZwkJCQlhY3Rpb25zCQkJCT0gbnVsbDsKCgkvKioKCSAqIERlZmluZXMgdGhlIGF1dGhvcml0eSB0byBwdWJsaWNoIGFuZC9vciBzdWJzY3JpYmUgdG8gYSB0b3BpYyB3aXRoaW4gdGhlCgkgKiBFdmVudEFkbWluIHNlcnZpY2UuCgkgKiA8cD4KCSAqIFRoZSBuYW1lIGlzIHNwZWNpZmllZCBhcyBhIHNsYXNoLXNlcGFyYXRlZCBzdHJpbmcuIFdpbGRjYXJkcyBtYXkgYmUgdXNlZC4KCSAqIEZvciBleGFtcGxlOgoJICogCgkgKiA8cHJlPgoJICogICAgb3JnL29zZ2kvc2VydmljZS9mb29Gb29FdmVudC9BQ1RJT04KCSAqICAgIGNvbS9pc3YvKgoJICogICAgKgoJICogPC9wcmU+CgkgKiAKCSAqIDxwPgoJICogQSBidW5kbGUgdGhhdCBuZWVkcyB0byBwdWJsaXNoIGV2ZW50cyBvbiBhIHRvcGljIG11c3QgaGF2ZSB0aGUKCSAqIGFwcHJvcHJpYXRlIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gZm9yIHRoYXQgdG9waWM7IHNpbWlsYXJseSwgYQoJICogYnVuZGxlIHRoYXQgbmVlZHMgdG8gc3Vic2NyaWJlIHRvIGV2ZW50cyBvbiBhIHRvcGljIG11c3QgaGF2ZSB0aGUKCSAqIGFwcHJvcHJpYXRlIDxjb2RlPlRvcGljUGVybXNzaW9uPC9jb2RlPiBmb3IgdGhhdCB0b3BpYy4KCSAqIDxwPgoJICogCgkgKiBAcGFyYW0gbmFtZSBUb3BpYyBuYW1lLgoJICogQHBhcmFtIGFjdGlvbnMgPGNvZGU+cHVibGlzaDwvY29kZT4sPGNvZGU+c3Vic2NyaWJlPC9jb2RlPgoJICogICAgICAgIChjYW5vbmljYWwgb3JkZXIpLgoJICovCglwdWJsaWMgVG9waWNQZXJtaXNzaW9uKFN0cmluZyBuYW1lLCBTdHJpbmcgYWN0aW9ucykgewoJCXRoaXMobmFtZSwgZ2V0TWFzayhhY3Rpb25zKSk7Cgl9CgoJLyoqCgkgKiBQYWNrYWdlIHByaXZhdGUgY29uc3RydWN0b3IgdXNlZCBieSBUb3BpY1Blcm1pc3Npb25Db2xsZWN0aW9uLgoJICogCgkgKiBAcGFyYW0gbmFtZSBjbGFzcyBuYW1lCgkgKiBAcGFyYW0gbWFzayBhY3Rpb24gbWFzawoJICovCglUb3BpY1Blcm1pc3Npb24oU3RyaW5nIG5hbWUsIGludCBtYXNrKSB7CgkJc3VwZXIobmFtZSk7CgkJaW5pdChuYW1lLCBtYXNrKTsKCX0KCgkvKioKCSAqIENhbGxlZCBieSBjb25zdHJ1Y3RvcnMgYW5kIHdoZW4gZGVzZXJpYWxpemVkLgoJICogCgkgKiBAcGFyYW0gbmFtZSB0b3BpYyBuYW1lCgkgKiBAcGFyYW0gbWFzayBhY3Rpb24gbWFzawoJICovCglwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgbmFtZSwgaW50IG1hc2spIHsKCQlpZiAoKG5hbWUgPT0gbnVsbCkgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgbmFtZSIpOyAvLyROT04tTkxTLTEkCgkJfQoKCQlpZiAobmFtZS5lcXVhbHMoIioiKSkgewoJCQlwcmVmaXggPSAiIjsKCQl9CgkJZWxzZQoJCQlpZiAobmFtZS5lbmRzV2l0aCgiLyoiKSkgewoJCQkJcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDEpOwoJCQl9CgkJCWVsc2UgewoJCQkJcHJlZml4ID0gbnVsbDsKCQkJfQoKCQlpZiAoKG1hc2sgPT0gQUNUSU9OX05PTkUpIHx8ICgobWFzayAmIEFDVElPTl9BTEwpICE9IG1hc2spKSB7CgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgYWN0aW9uIHN0cmluZyIpOyAvLyROT04tTkxTLTEkCgkJfQoJCWFjdGlvbl9tYXNrID0gbWFzazsKCX0KCgkvKioKCSAqIFBhcnNlIGFjdGlvbiBzdHJpbmcgaW50byBhY3Rpb24gbWFzay4KCSAqIAoJICogQHBhcmFtIGFjdGlvbnMgQWN0aW9uIHN0cmluZy4KCSAqIEByZXR1cm4gYWN0aW9uIG1hc2suCgkgKi8KCXByaXZhdGUgc3RhdGljIGludCBnZXRNYXNrKFN0cmluZyBhY3Rpb25zKSB7CgkJYm9vbGVhbiBzZWVuY29tbWEgPSBmYWxzZTsKCQlpbnQgbWFzayA9IEFDVElPTl9OT05FOwoJCWlmIChhY3Rpb25zID09IG51bGwpIHsKCQkJcmV0dXJuIG1hc2s7CgkJfQoJCWNoYXJbXSBhID0gYWN0aW9ucy50b0NoYXJBcnJheSgpOwoJCWludCBpID0gYS5sZW5ndGggLSAxOwoJCWlmIChpIDwgMCkKCQkJcmV0dXJuIG1hc2s7CgkJd2hpbGUgKGkgIT0gLTEpIHsKCQkJY2hhciBjOwoJCQkvLyBza2lwIHdoaXRlc3BhY2UKCQkJd2hpbGUgKChpICE9IC0xKQoJCQkJCSYmICgoYyA9IGFbaV0pID09ICcgJyB8fCBjID09ICdccicgfHwgYyA9PSAnXG4nCgkJCQkJCQl8fCBjID09ICdcZicgfHwgYyA9PSAnXHQnKSkKCQkJCWktLTsKCQkJLy8gY2hlY2sgZm9yIHRoZSBrbm93biBzdHJpbmdzCgkJCWludCBtYXRjaGxlbjsKCQkJaWYgKGkgPj0gOCAmJiAoYVtpIC0gOF0gPT0gJ3MnIHx8IGFbaSAtIDhdID09ICdTJykKCQkJCQkmJiAoYVtpIC0gN10gPT0gJ3UnIHx8IGFbaSAtIDddID09ICdVJykKCQkJCQkmJiAoYVtpIC0gNl0gPT0gJ2InIHx8IGFbaSAtIDZdID09ICdCJykKCQkJCQkmJiAoYVtpIC0gNV0gPT0gJ3MnIHx8IGFbaSAtIDVdID09ICdTJykKCQkJCQkmJiAoYVtpIC0gNF0gPT0gJ2MnIHx8IGFbaSAtIDRdID09ICdDJykKCQkJCQkmJiAoYVtpIC0gM10gPT0gJ3InIHx8IGFbaSAtIDNdID09ICdSJykKCQkJCQkmJiAoYVtpIC0gMl0gPT0gJ2knIHx8IGFbaSAtIDJdID09ICdJJykKCQkJCQkmJiAoYVtpIC0gMV0gPT0gJ2InIHx8IGFbaSAtIDFdID09ICdCJykKCQkJCQkmJiAoYVtpXSA9PSAnZScgfHwgYVtpXSA9PSAnRScpKSB7CgkJCQltYXRjaGxlbiA9IDk7CgkJCQltYXNrIHw9IEFDVElPTl9TVUJTQ1JJQkU7CgkJCX0KCQkJZWxzZQoJCQkJaWYgKGkgPj0gNiAmJiAoYVtpIC0gNl0gPT0gJ3AnIHx8IGFbaSAtIDZdID09ICdQJykKCQkJCQkJJiYgKGFbaSAtIDVdID09ICd1JyB8fCBhW2kgLSA1XSA9PSAnVScpCgkJCQkJCSYmIChhW2kgLSA0XSA9PSAnYicgfHwgYVtpIC0gNF0gPT0gJ0InKQoJCQkJCQkmJiAoYVtpIC0gM10gPT0gJ2wnIHx8IGFbaSAtIDNdID09ICdMJykKCQkJCQkJJiYgKGFbaSAtIDJdID09ICdpJyB8fCBhW2kgLSAyXSA9PSAnSScpCgkJCQkJCSYmIChhW2kgLSAxXSA9PSAncycgfHwgYVtpIC0gMV0gPT0gJ1MnKQoJCQkJCQkmJiAoYVtpXSA9PSAnaCcgfHwgYVtpXSA9PSAnSCcpKSB7CgkJCQkJbWF0Y2hsZW4gPSA3OwoJCQkJCW1hc2sgfD0gQUNUSU9OX1BVQkxJU0g7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQkvLyBwYXJzZSBlcnJvcgoJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgcGVybWlzc2lvbjogIiAvLyROT04tTkxTLTEkCgkJCQkJCQkrIGFjdGlvbnMpOwoJCQkJfQoJCQkvLyBtYWtlIHN1cmUgd2UgZGlkbid0IGp1c3QgbWF0Y2ggdGhlIHRhaWwgb2YgYSB3b3JkCgkJCS8vIGxpa2UgImFja2JhcmZwdWJsaXNoIi4gQWxzbywgc2tpcCB0byB0aGUgY29tbWEuCgkJCXNlZW5jb21tYSA9IGZhbHNlOwoJCQl3aGlsZSAoaSA+PSBtYXRjaGxlbiAmJiAhc2VlbmNvbW1hKSB7CgkJCQlzd2l0Y2ggKGFbaSAtIG1hdGNobGVuXSkgewoJCQkJCWNhc2UgJywnIDoKCQkJCQkJc2VlbmNvbW1hID0gdHJ1ZTsKCQkJCQkvKiBGQUxMVEhST1VHSCAqLwoJCQkJCWNhc2UgJyAnIDoKCQkJCQljYXNlICdccicgOgoJCQkJCWNhc2UgJ1xuJyA6CgkJCQkJY2FzZSAnXGYnIDoKCQkJCQljYXNlICdcdCcgOgoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0IDoKCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKCQkJCQkJCQkiaW52YWxpZCBwZXJtaXNzaW9uOiAiICsgYWN0aW9ucyk7IC8vJE5PTi1OTFMtMSQKCQkJCX0KCQkJCWktLTsKCQkJfQoJCQkvLyBwb2ludCBpIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tbWEgbWludXMgb25lIChvciAtMSkuCgkJCWkgLT0gbWF0Y2hsZW47CgkJfQoJCWlmIChzZWVuY29tbWEpIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBwZXJtaXNzaW9uOiAiICsgYWN0aW9ucyk7IC8vJE5PTi1OTFMtMSQKCQl9CgkJcmV0dXJuIG1hc2s7Cgl9CgoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoaXMgb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSB0b3BpYyBuYW1lIG9mIHRoZSB0YXJnZXQgaXMgaW1wbGllZCBieSB0aGUKCSAqIHRvcGljIG5hbWUgb2YgdGhpcyBvYmplY3QuIFRoZSBsaXN0IG9mIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4KCSAqIGFjdGlvbnMgbXVzdCBlaXRoZXIgbWF0Y2ggb3IgYWxsb3cgZm9yIHRoZSBsaXN0IG9mIHRoZSB0YXJnZXQgb2JqZWN0IHRvCgkgKiBpbXBseSB0aGUgdGFyZ2V0IDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gYWN0aW9uLgoJICogCgkgKiA8cHJlPgoJICogICAgeC95LyosJnF1b3Q7cHVibGlzaCZxdW90OyAtJmd0OyB4L3kveiwmcXVvdDtwdWJsaXNoJnF1b3Q7IGlzIHRydWUKCSAqICAgICosJnF1b3Q7c3Vic2NyaWJlJnF1b3Q7IC0mZ3Q7IHgveSwmcXVvdDtzdWJzY3JpYmUmcXVvdDsgICBpcyB0cnVlCgkgKiAgICAqLCZxdW90O3B1Ymxpc2gmcXVvdDsgLSZndDsgeC95LCZxdW90O3N1YnNjcmliZSZxdW90OyAgICAgaXMgZmFsc2UKCSAqICAgIHgveSwmcXVvdDtwdWJsaXNoJnF1b3Q7IC0mZ3Q7IHgveS96LCZxdW90O3B1Ymxpc2gmcXVvdDsgICBpcyBmYWxzZQoJICogPC9wcmU+CgkgKiAKCSAqIEBwYXJhbSBwIFRoZSB0YXJnZXQgcGVybWlzc2lvbiB0byBpbnRlcnJvZ2F0ZS4KCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+CgkgKiAgICAgICAgIGFjdGlvbiBpcyBpbXBsaWVkIGJ5IHRoaXMgb2JqZWN0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcCkgewoJCWlmIChwIGluc3RhbmNlb2YgVG9waWNQZXJtaXNzaW9uKSB7CgkJCVRvcGljUGVybWlzc2lvbiB0YXJnZXQgPSAoVG9waWNQZXJtaXNzaW9uKSBwOwoJCQlpZiAoKGFjdGlvbl9tYXNrICYgdGFyZ2V0LmFjdGlvbl9tYXNrKSA9PSB0YXJnZXQuYWN0aW9uX21hc2spIHsKCQkJCWlmIChwcmVmaXggIT0gbnVsbCkgewoJCQkJCXJldHVybiB0YXJnZXQuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KTsKCQkJCX0KCgkJCQlyZXR1cm4gdGFyZ2V0LmdldE5hbWUoKS5lcXVhbHMoZ2V0TmFtZSgpKTsKCQkJfQoJCX0KCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQoJICogPGNvZGU+VG9waWNQZXJtaXNzaW9uPC9jb2RlPiBhY3Rpb25zLgoJICogCgkgKiA8cD4KCSAqIEFsd2F5cyByZXR1cm5zIHByZXNlbnQgPGNvZGU+VG9waWNQZXJtaXNzaW9uPC9jb2RlPiBhY3Rpb25zIGluIHRoZQoJICogZm9sbG93aW5nIG9yZGVyOiA8Y29kZT5wdWJsaXNoPC9jb2RlPiw8Y29kZT5zdWJzY3JpYmU8L2NvZGU+LgoJICogCgkgKiBAcmV0dXJuIENhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlCgkgKiAgICAgICAgIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gYWN0aW9ucy4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRBY3Rpb25zKCkgewoJCWlmIChhY3Rpb25zID09IG51bGwpIHsKCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoJCQlib29sZWFuIGNvbW1hID0gZmFsc2U7CgkJCWlmICgoYWN0aW9uX21hc2sgJiBBQ1RJT05fUFVCTElTSCkgPT0gQUNUSU9OX1BVQkxJU0gpIHsKCQkJCXNiLmFwcGVuZChQVUJMSVNIKTsKCQkJCWNvbW1hID0gdHJ1ZTsKCQkJfQoJCQlpZiAoKGFjdGlvbl9tYXNrICYgQUNUSU9OX1NVQlNDUklCRSkgPT0gQUNUSU9OX1NVQlNDUklCRSkgewoJCQkJaWYgKGNvbW1hKQoJCQkJCXNiLmFwcGVuZCgnLCcpOwoJCQkJc2IuYXBwZW5kKFNVQlNDUklCRSk7CgkJCX0KCQkJYWN0aW9ucyA9IHNiLnRvU3RyaW5nKCk7CgkJfQoJCXJldHVybiBhY3Rpb25zOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5ldyA8Y29kZT5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gb2JqZWN0IHN1aXRhYmxlIGZvcgoJICogc3RvcmluZyA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+IG9iamVjdHMuCgkgKiAKCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+UGVybWlzc2lvbkNvbGxlY3Rpb248L2NvZGU+IG9iamVjdC4KCSAqLwoJcHVibGljIFBlcm1pc3Npb25Db2xsZWN0aW9uIG5ld1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewoJCXJldHVybiBuZXcgVG9waWNQZXJtaXNzaW9uQ29sbGVjdGlvbigpOwoJfQoKCS8qKgoJICogRGV0ZXJtaW5lcyB0aGUgZXF1YWxpdHkgb2YgdHdvIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0cy4KCSAqIAoJICogVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgc3BlY2lmaWVkIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gaGFzIHRoZSBzYW1lIHRvcGljIG5hbWUgYW5kCgkgKiBhY3Rpb25zIGFzIHRoaXMKCSAqIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCB0aGlzCgkgKiAgICAgICAgPGNvZGU+VG9waWNQZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QuCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPm9iajwvY29kZT4gaXMgYQoJICogICAgICAgICA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+LCBhbmQgaGFzIHRoZSBzYW1lIHRvcGljIG5hbWUgYW5kCgkgKiAgICAgICAgIGFjdGlvbnMgYXMgdGhpcyA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+IG9iamVjdDsKCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKCQlpZiAob2JqID09IHRoaXMpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRvcGljUGVybWlzc2lvbikpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlUb3BpY1Blcm1pc3Npb24gcCA9IChUb3BpY1Blcm1pc3Npb24pIG9iajsKCQlyZXR1cm4gKGFjdGlvbl9tYXNrID09IHAuYWN0aW9uX21hc2spICYmIGdldE5hbWUoKS5lcXVhbHMocC5nZXROYW1lKCkpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBBIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCgkgKi8KCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CgkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpIF4gZ2V0QWN0aW9ucygpLmhhc2hDb2RlKCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGlvbiBtYXNrLgoJICogPHA+CgkgKiBVc2VkIGJ5IHRoZSBUb3BpY1Blcm1pc3Npb25Db2xsZWN0aW9uIGNsYXNzLgoJICogCgkgKiBAcmV0dXJuIEN1cnJlbnQgYWN0aW9uIG1hc2suCgkgKi8KCWludCBnZXRNYXNrKCkgewoJCXJldHVybiBhY3Rpb25fbWFzazsKCX0KCgkvKioKCSAqIFdyaXRlT2JqZWN0IGlzIGNhbGxlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIHBlcm1pc3Npb24gb2JqZWN0IHRvIGEKCSAqIHN0cmVhbS4gVGhlIGFjdGlvbnMgYXJlIHNlcmlhbGl6ZWQsIGFuZCB0aGUgc3VwZXJjbGFzcyB0YWtlcyBjYXJlIG9mIHRoZQoJICogbmFtZS4KCSAqLwoJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQoJCQl0aHJvd3MgSU9FeGNlcHRpb24gewoJCS8vIFdyaXRlIG91dCB0aGUgYWN0aW9ucy4gVGhlIHN1cGVyY2xhc3MgdGFrZXMgY2FyZSBvZiB0aGUgbmFtZQoJCS8vIGNhbGwgZ2V0QWN0aW9ucyB0byBtYWtlIHN1cmUgYWN0aW9ucyBmaWVsZCBpcyBpbml0aWFsaXplZAoJCWlmIChhY3Rpb25zID09IG51bGwpCgkJCWdldEFjdGlvbnMoKTsKCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwoJfQoKCS8qKgoJICogcmVhZE9iamVjdCBpcyBjYWxsZWQgdG8gcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhpcyBwZXJtaXNzaW9uIGZyb20gYQoJICogc3RyZWFtLgoJICovCglwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQoJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewoJCS8vIFJlYWQgaW4gdGhlIGFjdGlvbiwgdGhlbiBpbml0aWFsaXplIHRoZSByZXN0CgkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwoJCWluaXQoZ2V0TmFtZSgpLCBnZXRNYXNrKGFjdGlvbnMpKTsKCX0KfQoKLyoqCiAqIFN0b3JlcyBhIHNldCBvZiA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+IHBlcm1pc3Npb25zLgogKiAKICogQHNlZSBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb24KICogQHNlZSBqYXZhLnNlY3VyaXR5LlBlcm1pc3Npb25zCiAqIEBzZWUgamF2YS5zZWN1cml0eS5QZXJtaXNzaW9uQ29sbGVjdGlvbgogKi8KZmluYWwgY2xhc3MgVG9waWNQZXJtaXNzaW9uQ29sbGVjdGlvbiBleHRlbmRzIFBlcm1pc3Npb25Db2xsZWN0aW9uIHsKCXN0YXRpYyBmaW5hbCBsb25nCXNlcmlhbFZlcnNpb25VSUQJPSAtNjE0NjQ3NzgzNTMzOTI0MDQ4TDsKCS8qKgoJICogVGFibGUgb2YgcGVybWlzc2lvbnMuCgkgKiAKCSAqIEBzZXJpYWwKCSAqLwoJcHJpdmF0ZSBIYXNodGFibGUJcGVybWlzc2lvbnM7CgkvKioKCSAqIEJvb2xlYW4gc2F5aW5nIGlmICIqIiBpcyBpbiB0aGUgY29sbGVjdGlvbi4KCSAqIAoJICogQHNlcmlhbAoJICovCglwcml2YXRlIGJvb2xlYW4JCWFsbF9hbGxvd2VkOwoKCS8qKgoJICogQ3JlYXRlIGFuIGVtcHR5IFRvcGljUGVybWlzc2lvbnMgb2JqZWN0LgoJICogCgkgKi8KCXB1YmxpYyBUb3BpY1Blcm1pc3Npb25Db2xsZWN0aW9uKCkgewoJCXBlcm1pc3Npb25zID0gbmV3IEhhc2h0YWJsZSgpOwoJCWFsbF9hbGxvd2VkID0gZmFsc2U7Cgl9CgoJLyoqCgkgKiBBZGRzIGEgcGVybWlzc2lvbiB0byB0aGUgPGNvZGU+VG9waWNQZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzLiBUaGUga2V5CgkgKiBmb3IgdGhlIGhhc2ggaXMgdGhlIG5hbWUuCgkgKiAKCSAqIEBwYXJhbSBwZXJtaXNzaW9uIFRoZSA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+IG9iamVjdCB0byBhZGQuCgkgKiAKCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBwZXJtaXNzaW9uIGlzIG5vdCBhCgkgKiAgICAgICAgICAgIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gaW5zdGFuY2UuCgkgKiAKCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgdGhpcwoJICogICAgICAgICAgICA8Y29kZT5Ub3BpY1Blcm1pc3Npb25Db2xsZWN0aW9uPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4KCSAqICAgICAgICAgICAgbWFya2VkIHJlYWQtb25seS4KCSAqLwoJcHVibGljIHZvaWQgYWRkKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewoJCWlmICghKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBUb3BpY1Blcm1pc3Npb24pKQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHBlcm1pc3Npb246ICIgLy8kTk9OLU5MUy0xJAoJCQkJCSsgcGVybWlzc2lvbik7CgkJaWYgKGlzUmVhZE9ubHkoKSkKCQkJdGhyb3cgbmV3IFNlY3VyaXR5RXhjZXB0aW9uKCJhdHRlbXB0IHRvIGFkZCBhIFBlcm1pc3Npb24gdG8gYSAiIC8vJE5PTi1OTFMtMSQKCQkJCQkrICJyZWFkb25seSBQZXJtaXNzaW9uQ29sbGVjdGlvbiIpOyAvLyROT04tTkxTLTEkCgkJVG9waWNQZXJtaXNzaW9uIHBwID0gKFRvcGljUGVybWlzc2lvbikgcGVybWlzc2lvbjsKCQlTdHJpbmcgbmFtZSA9IHBwLmdldE5hbWUoKTsKCQlUb3BpY1Blcm1pc3Npb24gZXhpc3RpbmcgPSAoVG9waWNQZXJtaXNzaW9uKSBwZXJtaXNzaW9ucy5nZXQobmFtZSk7CgkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKCQkJaW50IG9sZE1hc2sgPSBleGlzdGluZy5nZXRNYXNrKCk7CgkJCWludCBuZXdNYXNrID0gcHAuZ2V0TWFzaygpOwoJCQlpZiAob2xkTWFzayAhPSBuZXdNYXNrKSB7CgkJCQlwZXJtaXNzaW9ucy5wdXQobmFtZSwgbmV3IFRvcGljUGVybWlzc2lvbihuYW1lLCBvbGRNYXNrCgkJCQkJCXwgbmV3TWFzaykpOwoJCQl9CgkJfQoJCWVsc2UgewoJCQlwZXJtaXNzaW9ucy5wdXQobmFtZSwgcGVybWlzc2lvbik7CgkJfQoJCWlmICghYWxsX2FsbG93ZWQpIHsKCQkJaWYgKG5hbWUuZXF1YWxzKCIqIikpIC8vJE5PTi1OTFMtMSQKCQkJCWFsbF9hbGxvd2VkID0gdHJ1ZTsKCQl9Cgl9CgoJLyoqCgkgKiBEZXRlcm1pbmVzIGlmIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbnMgaW1wbGllcyB0aGUgcGVybWlzc2lvbnMgZXhwcmVzc2VkCgkgKiBpbiA8Y29kZT5wZXJtaXNzaW9uPC9jb2RlPi4KCSAqIAoJICogQHBhcmFtIHBlcm1pc3Npb24gVGhlIFBlcm1pc3Npb24gb2JqZWN0IHRvIGNvbXBhcmUgd2l0aCB0aGlzCgkgKiAgICAgICAgPGNvZGU+VG9waWNQZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cGVybWlzc2lvbjwvY29kZT4gaXMgYSBwcm9wZXIKCSAqICAgICAgICAgc3Vic2V0IG9mIGEgcGVybWlzc2lvbiBpbiB0aGUgc2V0OyA8Y29kZT5mYWxzZTwvY29kZT4KCSAqICAgICAgICAgb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewoJCWlmICghKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBUb3BpY1Blcm1pc3Npb24pKQoJCQlyZXR1cm4gZmFsc2U7CgkJVG9waWNQZXJtaXNzaW9uIHBwID0gKFRvcGljUGVybWlzc2lvbikgcGVybWlzc2lvbjsKCQlUb3BpY1Blcm1pc3Npb24geDsKCQlpbnQgZGVzaXJlZCA9IHBwLmdldE1hc2soKTsKCQlpbnQgZWZmZWN0aXZlID0gMDsKCQkvLyBzaG9ydCBjaXJjdWl0IGlmIHRoZSAiKiIgUGVybWlzc2lvbiB3YXMgYWRkZWQKCQlpZiAoYWxsX2FsbG93ZWQpIHsKCQkJeCA9IChUb3BpY1Blcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldCgiKiIpOyAvLyROT04tTkxTLTEkCgkJCWlmICh4ICE9IG51bGwpIHsKCQkJCWVmZmVjdGl2ZSB8PSB4LmdldE1hc2soKTsKCQkJCWlmICgoZWZmZWN0aXZlICYgZGVzaXJlZCkgPT0gZGVzaXJlZCkKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQkvLyBzdHJhdGVneToKCQkvLyBDaGVjayBmb3IgZnVsbCBtYXRjaCBmaXJzdC4gVGhlbiB3b3JrIG91ciB3YXkgdXAgdGhlCgkJLy8gbmFtZSBsb29raW5nIGZvciBtYXRjaGVzIG9uIGEvYi8qCgkJU3RyaW5nIG5hbWUgPSBwcC5nZXROYW1lKCk7CgkJeCA9IChUb3BpY1Blcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChuYW1lKTsKCQlpZiAoeCAhPSBudWxsKSB7CgkJCS8vIHdlIGhhdmUgYSBkaXJlY3QgaGl0IQoJCQllZmZlY3RpdmUgfD0geC5nZXRNYXNrKCk7CgkJCWlmICgoZWZmZWN0aXZlICYgZGVzaXJlZCkgPT0gZGVzaXJlZCkKCQkJCXJldHVybiB0cnVlOwoJCX0KCQkvLyB3b3JrIG91ciB3YXkgdXAgdGhlIHRyZWUuLi4KCQlpbnQgbGFzdCwgb2Zmc2V0OwoJCW9mZnNldCA9IG5hbWUubGVuZ3RoKCkgLSAxOwoJCXdoaWxlICgobGFzdCA9IG5hbWUubGFzdEluZGV4T2YoIi8iLCBvZmZzZXQpKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCgkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBsYXN0ICsgMSkgKyAiKiI7IC8vJE5PTi1OTFMtMSQKCQkJeCA9IChUb3BpY1Blcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChuYW1lKTsKCQkJaWYgKHggIT0gbnVsbCkgewoJCQkJZWZmZWN0aXZlIHw9IHguZ2V0TWFzaygpOwoJCQkJaWYgKChlZmZlY3RpdmUgJiBkZXNpcmVkKSA9PSBkZXNpcmVkKQoJCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCW9mZnNldCA9IGxhc3QgLSAxOwoJCX0KCQkvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciAiKiIgYXMgaXQgd2FzIGFscmVhZHkgY2hlY2tlZAoJCS8vIGF0IHRoZSB0b3AgKGFsbF9hbGxvd2VkKSwgc28gd2UganVzdCByZXR1cm4gZmFsc2UKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIGFsbCA8Y29kZT5Ub3BpY1Blcm1pc3Npb248L2NvZGU+IG9iamVjdHMgaW4KCSAqIHRoZSBjb250YWluZXIuCgkgKiAKCSAqIEByZXR1cm4gRW51bWVyYXRpb24gb2YgYWxsIDxjb2RlPlRvcGljUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0cy4KCSAqLwoJcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewoJCXJldHVybiBwZXJtaXNzaW9ucy5lbGVtZW50cygpOwoJfQp9ClBLAwQKAAAAAABrUu406loR14cBAACHAQAAMAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5ldmVudC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9wYWNrYWdlLmh0bWwsdiAxLjggMjAwNi8wNy8xMiAyMTowNzoxOCBoYXJncmF2ZSBFeHAgJCAtLT4KPEJPRFk+CjxwPkV2ZW50IEFkbWluIFBhY2thZ2UgVmVyc2lvbiAxLjEuCjxwPkJ1bmRsZXMgd2lzaGluZyB0byB1c2UgdGhpcyBwYWNrYWdlIG11c3QgbGlzdCB0aGUgcGFja2FnZQppbiB0aGUgPFRUPkltcG9ydC1QYWNrYWdlPC9UVD4gaGVhZGVyIG9mIHRoZSBidW5kbGUncyBtYW5pZmVzdC4KRm9yIGV4YW1wbGU6CjxwcmU+CkltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50OyB2ZXJzaW9uPTEuMQo8L3ByZT4KPC9CT0RZPgpQSwMECgAAAAAAa1LuNISuGrcMAAAADAAAAC8AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAIwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvUEsDBAoAAAAAAGtS7jRRav20oRwAAKEcAAAzAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9IdHRwQ29udGV4dC5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5odHRwL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvSHR0cENvbnRleHQuamF2YSx2IDEuMTIgMjAwNi8wNy8xMiAyMToyMjoxMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDAsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5odHRwOwoKaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CmltcG9ydCBqYXZhLm5ldC5VUkw7CgppbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwoKLyoqCiAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgbWV0aG9kcyB0aGF0IHRoZSBIdHRwIFNlcnZpY2UgbWF5IGNhbGwgdG8gZ2V0CiAqIGluZm9ybWF0aW9uIGFib3V0IGEgcmVnaXN0cmF0aW9uLgogKiAKICogPHA+CiAqIFNlcnZsZXRzIGFuZCByZXNvdXJjZXMgbWF5IGJlIHJlZ2lzdGVyZWQgd2l0aCBhbiA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4KICogb2JqZWN0OyBpZiBubyA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4gb2JqZWN0IGlzIHNwZWNpZmllZCwgYSBkZWZhdWx0CiAqIDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBvYmplY3QgaXMgdXNlZC4gU2VydmxldHMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUKICogc2FtZSA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4gb2JqZWN0IHdpbGwgc2hhcmUgdGhlIHNhbWUKICogPGNvZGU+U2VydmxldENvbnRleHQ8L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB1c2VycyBvZiB0aGUgPGNvZGU+SHR0cFNlcnZpY2U8L2NvZGU+LgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEyICQKICovCnB1YmxpYyBpbnRlcmZhY2UgSHR0cENvbnRleHQgewoJLyoqCgkgKiA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZQoJICogYXV0aGVudGljYXRlZCB1c2VyLiBUaGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBjYW4gYmUgcmV0cmlldmVkIGJ5CgkgKiA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3QuZ2V0UmVtb3RlVXNlcjwvY29kZT4uIFRoaXMgYXR0cmlidXRlIG5hbWUgaXMKCSAqIDxjb2RlPm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5hdXRoZW50aWNhdGlvbi5yZW1vdGUudXNlcjwvY29kZT4uCgkgKiAKCSAqIEBzaW5jZSAxLjEKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJUkVNT1RFX1VTRVIJCQk9ICJvcmcub3NnaS5zZXJ2aWNlLmh0dHAuYXV0aGVudGljYXRpb24ucmVtb3RlLnVzZXIiOwoJLyoqCgkgKiA8Y29kZT5IdHRwU2VydmxldFJlcXVlc3Q8L2NvZGU+IGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHRoZSBzY2hlbWUgdXNlZCBpbgoJICogYXV0aGVudGljYXRpb24uIFRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGNhbiBiZSByZXRyaWV2ZWQgYnkKCSAqIDxjb2RlPkh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRBdXRoVHlwZTwvY29kZT4uIFRoaXMgYXR0cmlidXRlIG5hbWUgaXMKCSAqIDxjb2RlPm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5hdXRoZW50aWNhdGlvbi50eXBlPC9jb2RlPi4KCSAqIAoJICogQHNpbmNlIDEuMQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlBVVRIRU5USUNBVElPTl9UWVBFCT0gIm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5hdXRoZW50aWNhdGlvbi50eXBlIjsKCS8qKgoJICogPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0PC9jb2RlPiBhdHRyaWJ1dGUgc3BlY2lmeWluZyB0aGUKCSAqIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+IG9iamVjdCBvYnRhaW5lZCBmcm9tIHRoZQoJICogPGNvZGU+b3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4uVXNlckFkbWluPC9jb2RlPiBzZXJ2aWNlLiBUaGUgdmFsdWUgb2YgdGhlCgkgKiBhdHRyaWJ1dGUgY2FuIGJlIHJldHJpZXZlZCBieQoJICogPGNvZGU+SHR0cFNlcnZsZXRSZXF1ZXN0LmdldEF0dHJpYnV0ZShIdHRwQ29udGV4dC5BVVRIT1JJWkFUSU9OKTwvY29kZT4uCgkgKiBUaGlzIGF0dHJpYnV0ZSBuYW1lIGlzIDxjb2RlPm9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLmF1dGhvcml6YXRpb248L2NvZGU+LgoJICogCgkgKiBAc2luY2UgMS4xCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCUFVVEhPUklaQVRJT04JCT0gIm9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLmF1dGhvcml6YXRpb24iOwoKCS8qKgoJICogSGFuZGxlcyBzZWN1cml0eSBmb3IgdGhlIHNwZWNpZmllZCByZXF1ZXN0LgoJICogCgkgKiA8cD4KCSAqIFRoZSBIdHRwIFNlcnZpY2UgY2FsbHMgdGhpcyBtZXRob2QgcHJpb3IgdG8gc2VydmljaW5nIHRoZSBzcGVjaWZpZWQKCSAqIHJlcXVlc3QuIFRoaXMgbWV0aG9kIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIGluIHRoZQoJICogbm9ybWFsIG1hbm5lciBvciBhbiBlcnJvciBpcyByZXR1cm5lZC4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgcmVxdWVzdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiBhbmQgdGhlIEF1dGhvcml6YXRpb24gaGVhZGVyIGluCgkgKiB0aGUgcmVxdWVzdCBpcyBtaXNzaW5nIG9yIG5vdCBhY2NlcHRhYmxlLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBzZXQgdGhlCgkgKiBXV1ctQXV0aGVudGljYXRlIGhlYWRlciBpbiB0aGUgcmVzcG9uc2Ugb2JqZWN0LCBzZXQgdGhlIHN0YXR1cyBpbiB0aGUKCSAqIHJlc3BvbnNlIG9iamVjdCB0byBVbmF1dGhvcml6ZWQoNDAxKSBhbmQgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4gU2VlCgkgKiBhbHNvIFJGQyAyNjE3OiA8aT5IVFRQIEF1dGhlbnRpY2F0aW9uOiBCYXNpYyBhbmQgRGlnZXN0IEFjY2VzcwoJICogQXV0aGVudGljYXRpb24gPC9pPiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI2MTcudHh0KS4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgcmVxdWVzdCByZXF1aXJlcyBhIHNlY3VyZSBjb25uZWN0aW9uIGFuZCB0aGUgPGNvZGU+Z2V0U2NoZW1lPC9jb2RlPgoJICogbWV0aG9kIGluIHRoZSByZXF1ZXN0IGRvZXMgbm90IHJldHVybiAnaHR0cHMnIG9yIHNvbWUgb3RoZXIgYWNjZXB0YWJsZQoJICogc2VjdXJlIHByb3RvY29sLCB0aGVuIHRoaXMgbWV0aG9kIHNob3VsZCBzZXQgdGhlIHN0YXR1cyBpbiB0aGUgcmVzcG9uc2UKCSAqIG9iamVjdCB0byBGb3JiaWRkZW4oNDAzKSBhbmQgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPi4KCSAqIAoJICogPHA+CgkgKiBXaGVuIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgSHR0cCBTZXJ2aWNlIHdpbGwgc2VuZAoJICogdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGNsaWVudCwgdGhlcmVieSBjb21wbGV0aW5nIHRoZSByZXF1ZXN0LiBXaGVuCgkgKiB0aGlzIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgSHR0cCBTZXJ2aWNlIHdpbGwgcHJvY2VlZCB3aXRoCgkgKiBzZXJ2aWNpbmcgdGhlIHJlcXVlc3QuCgkgKiAKCSAqIDxwPgoJICogSWYgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGhhcyBiZWVuIGF1dGhlbnRpY2F0ZWQsIHRoaXMgbWV0aG9kIG11c3Qgc2V0IHRoZQoJICoge0BsaW5rICNBVVRIRU5USUNBVElPTl9UWVBFfSByZXF1ZXN0IGF0dHJpYnV0ZSB0byB0aGUgdHlwZSBvZgoJICogYXV0aGVudGljYXRpb24gdXNlZCwgYW5kIHRoZSB7QGxpbmsgI1JFTU9URV9VU0VSfSByZXF1ZXN0IGF0dHJpYnV0ZSB0bwoJICogdGhlIHJlbW90ZSB1c2VyIChyZXF1ZXN0IGF0dHJpYnV0ZXMgYXJlIHNldCB1c2luZyB0aGUKCSAqIDxjb2RlPnNldEF0dHJpYnV0ZTwvY29kZT4gbWV0aG9kIG9uIHRoZSByZXF1ZXN0KS4gSWYgdGhpcyBtZXRob2QgZG9lcyBub3QKCSAqIHBlcmZvcm0gYW55IGF1dGhlbnRpY2F0aW9uLCBpdCBtdXN0IG5vdCBzZXQgdGhlc2UgYXR0cmlidXRlcy4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyIGlzIGFsc28gYXV0aG9yaXplZCB0byBhY2Nlc3MgY2VydGFpbiByZXNvdXJjZXMsCgkgKiB0aGlzIG1ldGhvZCBtdXN0IHNldCB0aGUge0BsaW5rICNBVVRIT1JJWkFUSU9OfSByZXF1ZXN0IGF0dHJpYnV0ZSB0byB0aGUKCSAqIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+IG9iamVjdCBvYnRhaW5lZCBmcm9tIHRoZQoJICogPGNvZGU+b3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4uVXNlckFkbWluPC9jb2RlPiBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIFRoZSBzZXJ2bGV0IHJlc3BvbnNpYmxlIGZvciBzZXJ2aWNpbmcgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGRldGVybWluZXMKCSAqIHRoZSBhdXRoZW50aWNhdGlvbiB0eXBlIGFuZCByZW1vdGUgdXNlciBieSBjYWxsaW5nIHRoZQoJICogPGNvZGU+Z2V0QXV0aFR5cGU8L2NvZGU+IGFuZCA8Y29kZT5nZXRSZW1vdGVVc2VyPC9jb2RlPiBtZXRob2RzLAoJICogcmVzcGVjdGl2ZWx5LCBvbiB0aGUgcmVxdWVzdC4KCSAqIAoJICogQHBhcmFtIHJlcXVlc3QgdGhlIEhUVFAgcmVxdWVzdAoJICogQHBhcmFtIHJlc3BvbnNlIHRoZSBIVFRQIHJlc3BvbnNlCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXF1ZXN0IHNob3VsZCBiZSBzZXJ2aWNlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+CgkgKiAgICAgICAgIGlmIHRoZSByZXF1ZXN0IHNob3VsZCBub3QgYmUgc2VydmljZWQgYW5kIEh0dHAgU2VydmljZSB3aWxsIHNlbmQKCSAqICAgICAgICAgdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIGNsaWVudC4KCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBtYXkgYmUgdGhyb3duIGJ5IHRoaXMgbWV0aG9kLiBJZiB0aGlzCgkgKiAgICAgICAgICAgIG9jY3VycywgdGhlIEh0dHAgU2VydmljZSB3aWxsIHRlcm1pbmF0ZSB0aGUgcmVxdWVzdCBhbmQgY2xvc2UKCSAqICAgICAgICAgICAgdGhlIHNvY2tldC4KCSAqLwoJcHVibGljIGJvb2xlYW4gaGFuZGxlU2VjdXJpdHkoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCgkJCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKCgkvKioKCSAqIE1hcHMgYSByZXNvdXJjZSBuYW1lIHRvIGEgVVJMLgoJICogCgkgKiA8cD4KCSAqIENhbGxlZCBieSB0aGUgSHR0cCBTZXJ2aWNlIHRvIG1hcCBhIHJlc291cmNlIG5hbWUgdG8gYSBVUkwuIEZvciBzZXJ2bGV0CgkgKiByZWdpc3RyYXRpb25zLCBIdHRwIFNlcnZpY2Ugd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIHN1cHBvcnQgdGhlCgkgKiA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4gbWV0aG9kcyA8Y29kZT5nZXRSZXNvdXJjZTwvY29kZT4gYW5kCgkgKiA8Y29kZT5nZXRSZXNvdXJjZUFzU3RyZWFtPC9jb2RlPi4gRm9yIHJlc291cmNlIHJlZ2lzdHJhdGlvbnMsIEh0dHAgU2VydmljZQoJICogd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvIGxvY2F0ZSB0aGUgbmFtZWQgcmVzb3VyY2UuIFRoZSBjb250ZXh0IGNhbgoJICogY29udHJvbCBmcm9tIHdoZXJlIHJlc291cmNlcyBjb21lLiBGb3IgZXhhbXBsZSwgdGhlIHJlc291cmNlIGNhbiBiZQoJICogbWFwcGVkIHRvIGEgZmlsZSBpbiB0aGUgYnVuZGxlJ3MgcGVyc2lzdGVudCBzdG9yYWdlIGFyZWEgdmlhCgkgKiA8Y29kZT5idW5kbGVDb250ZXh0LmdldERhdGFGaWxlKG5hbWUpLnRvVVJMKCk8L2NvZGU+IG9yIHRvIGEgcmVzb3VyY2UgaW4KCSAqIHRoZSBjb250ZXh0J3MgYnVuZGxlIHZpYSA8Y29kZT5nZXRDbGFzcygpLmdldFJlc291cmNlKG5hbWUpPC9jb2RlPgoJICogCgkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIHJlc291cmNlCgkgKiBAcmV0dXJuIFVSTCB0aGF0IEh0dHAgU2VydmljZSBjYW4gdXNlIHRvIHJlYWQgdGhlIHJlc291cmNlIG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBleGlzdC4KCSAqLwoJcHVibGljIFVSTCBnZXRSZXNvdXJjZShTdHJpbmcgbmFtZSk7CgoJLyoqCgkgKiBNYXBzIGEgbmFtZSB0byBhIE1JTUUgdHlwZS4KCSAqIAoJICogQ2FsbGVkIGJ5IHRoZSBIdHRwIFNlcnZpY2UgdG8gZGV0ZXJtaW5lIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSBuYW1lLiBGb3IKCSAqIHNlcnZsZXQgcmVnaXN0cmF0aW9ucywgdGhlIEh0dHAgU2VydmljZSB3aWxsIGNhbGwgdGhpcyBtZXRob2QgdG8gc3VwcG9ydAoJICogdGhlIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPiBtZXRob2QgPGNvZGU+Z2V0TWltZVR5cGU8L2NvZGU+LiBGb3IKCSAqIHJlc291cmNlIHJlZ2lzdHJhdGlvbnMsIHRoZSBIdHRwIFNlcnZpY2Ugd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHRvCgkgKiBkZXRlcm1pbmUgdGhlIE1JTUUgdHlwZSBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaW4gdGhlIHJlc3BvbnNlLgoJICogCgkgKiBAcGFyYW0gbmFtZSBkZXRlcm1pbmUgdGhlIE1JTUUgdHlwZSBmb3IgdGhpcyBuYW1lLgoJICogQHJldHVybiBNSU1FIHR5cGUgKGUuZy4gdGV4dC9odG1sKSBvZiB0aGUgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiB0bwoJICogICAgICAgICBpbmRpY2F0ZSB0aGF0IHRoZSBIdHRwIFNlcnZpY2Ugc2hvdWxkIGRldGVybWluZSB0aGUgTUlNRSB0eXBlCgkgKiAgICAgICAgIGl0c2VsZi4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgbmFtZSk7Cn0KUEsDBAoAAAAAAGtS7jRwNk3rjx4AAI8eAAAzAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9IdHRwU2VydmljZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5odHRwL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvSHR0cFNlcnZpY2UuamF2YSx2IDEuMTMgMjAwNi8wNy8xMiAyMToyMjoxMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDAsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5odHRwOwoKaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwoKaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKCi8qKgogKiBUaGUgSHR0cCBTZXJ2aWNlIGFsbG93cyBvdGhlciBidW5kbGVzIGluIHRoZSBPU0dpIGVudmlyb25tZW50IHRvIGR5bmFtaWNhbGx5CiAqIHJlZ2lzdGVyIHJlc291cmNlcyBhbmQgc2VydmxldHMgaW50byB0aGUgVVJJIG5hbWVzcGFjZSBvZiBIdHRwIFNlcnZpY2UuIEEKICogYnVuZGxlIG1heSBsYXRlciB1bnJlZ2lzdGVyIGl0cyByZXNvdXJjZXMgb3Igc2VydmxldHMuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTMgJAogKiBAc2VlIEh0dHBDb250ZXh0CiAqLwpwdWJsaWMgaW50ZXJmYWNlIEh0dHBTZXJ2aWNlIHsKCS8qKgoJICogUmVnaXN0ZXJzIGEgc2VydmxldCBpbnRvIHRoZSBVUkkgbmFtZXNwYWNlLgoJICogCgkgKiA8cD4KCSAqIFRoZSBhbGlhcyBpcyB0aGUgbmFtZSBpbiB0aGUgVVJJIG5hbWVzcGFjZSBvZiB0aGUgSHR0cCBTZXJ2aWNlIGF0IHdoaWNoCgkgKiB0aGUgcmVnaXN0cmF0aW9uIHdpbGwgYmUgbWFwcGVkLgoJICogCgkgKiA8cD4KCSAqIEFuIGFsaWFzIG11c3QgYmVnaW4gd2l0aCBzbGFzaCAoJy8nKSBhbmQgbXVzdCBub3QgZW5kIHdpdGggc2xhc2ggKCcvJyksCgkgKiB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCBhbiBhbGlhcyBvZiB0aGUgZm9ybSAmcXVvdDsvJnF1b3Q7IGlzIHVzZWQgdG8KCSAqIGRlbm90ZSB0aGUgcm9vdCBhbGlhcy4gU2VlIHRoZSBzcGVjaWZpY2F0aW9uIHRleHQgZm9yIGRldGFpbHMgb24gaG93IEhUVFAKCSAqIHJlcXVlc3RzIGFyZSBtYXBwZWQgdG8gc2VydmxldCBhbmQgcmVzb3VyY2UgcmVnaXN0cmF0aW9ucy4KCSAqIAoJICogPHA+CgkgKiBUaGUgSHR0cCBTZXJ2aWNlIHdpbGwgY2FsbCB0aGUgc2VydmxldCdzIDxjb2RlPmluaXQ8L2NvZGU+IG1ldGhvZCBiZWZvcmUKCSAqIHJldHVybmluZy4KCSAqIAoJICogPHByZT4KCSAqIGh0dHBTZXJ2aWNlLnJlZ2lzdGVyU2VydmxldCgmcXVvdDsvbXlzZXJ2bGV0JnF1b3Q7LCBzZXJ2bGV0LCBpbml0cGFyYW1zLCBjb250ZXh0KTsKCSAqIDwvcHJlPgoJICogCgkgKiA8cD4KCSAqIFNlcnZsZXRzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2FtZSA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4gb2JqZWN0IHdpbGwKCSAqIHNoYXJlIHRoZSBzYW1lIDxjb2RlPlNlcnZsZXRDb250ZXh0PC9jb2RlPi4gVGhlIEh0dHAgU2VydmljZSB3aWxsIGNhbGwgdGhlCgkgKiA8Y29kZT5jb250ZXh0PC9jb2RlPiBhcmd1bWVudCB0byBzdXBwb3J0IHRoZSA8Y29kZT5TZXJ2bGV0Q29udGV4dDwvY29kZT4KCSAqIG1ldGhvZHMgPGNvZGU+Z2V0UmVzb3VyY2U8L2NvZGU+LDxjb2RlPmdldFJlc291cmNlQXNTdHJlYW08L2NvZGU+IGFuZAoJICogPGNvZGU+Z2V0TWltZVR5cGU8L2NvZGU+LCBhbmQgdG8gaGFuZGxlIHNlY3VyaXR5IGZvciByZXF1ZXN0cy4gSWYgdGhlCgkgKiA8Y29kZT5jb250ZXh0PC9jb2RlPiBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgYSBkZWZhdWx0CgkgKiA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4gb2JqZWN0IGlzIHVzZWQgKHNlZQoJICoge0BsaW5rICNjcmVhdGVEZWZhdWx0SHR0cENvbnRleHR9KS4KCSAqIAoJICogQHBhcmFtIGFsaWFzIG5hbWUgaW4gdGhlIFVSSSBuYW1lc3BhY2UgYXQgd2hpY2ggdGhlIHNlcnZsZXQgaXMgcmVnaXN0ZXJlZAoJICogQHBhcmFtIHNlcnZsZXQgdGhlIHNlcnZsZXQgb2JqZWN0IHRvIHJlZ2lzdGVyCgkgKiBAcGFyYW0gaW5pdHBhcmFtcyBpbml0aWFsaXphdGlvbiBhcmd1bWVudHMgZm9yIHRoZSBzZXJ2bGV0IG9yCgkgKiAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vbmUuIFRoaXMgYXJndW1lbnQgaXMgdXNlZCBieSB0aGUKCSAqICAgICAgICBzZXJ2bGV0J3MgPGNvZGU+U2VydmxldENvbmZpZzwvY29kZT4gb2JqZWN0LgoJICogQHBhcmFtIGNvbnRleHQgdGhlIDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBvYmplY3QgZm9yIHRoZSByZWdpc3RlcmVkCgkgKiAgICAgICAgc2VydmxldCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYSBkZWZhdWx0IDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBpcwoJICogICAgICAgIHRvIGJlIGNyZWF0ZWQgYW5kIHVzZWQuCgkgKiBAdGhyb3dzIE5hbWVzcGFjZUV4Y2VwdGlvbiBpZiB0aGUgcmVnaXN0cmF0aW9uIGZhaWxzIGJlY2F1c2UgdGhlIGFsaWFzCgkgKiAgICAgICAgICAgIGlzIGFscmVhZHkgaW4gdXNlLgoJICogQHRocm93cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIHNlcnZsZXQncyA8Y29kZT5pbml0PC9jb2RlPgoJICogICAgICAgICAgICBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgb3IgdGhlIGdpdmVuIHNlcnZsZXQgb2JqZWN0IGhhcwoJICogICAgICAgICAgICBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCBhdCBhIGRpZmZlcmVudCBhbGlhcy4KCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBhcmUKCSAqICAgICAgICAgICAgaW52YWxpZAoJICovCglwdWJsaWMgdm9pZCByZWdpc3RlclNlcnZsZXQoU3RyaW5nIGFsaWFzLCBTZXJ2bGV0IHNlcnZsZXQsCgkJCURpY3Rpb25hcnkgaW5pdHBhcmFtcywgSHR0cENvbnRleHQgY29udGV4dCkKCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIE5hbWVzcGFjZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFJlZ2lzdGVycyByZXNvdXJjZXMgaW50byB0aGUgVVJJIG5hbWVzcGFjZS4KCSAqIAoJICogPHA+CgkgKiBUaGUgYWxpYXMgaXMgdGhlIG5hbWUgaW4gdGhlIFVSSSBuYW1lc3BhY2Ugb2YgdGhlIEh0dHAgU2VydmljZSBhdCB3aGljaAoJICogdGhlIHJlZ2lzdHJhdGlvbiB3aWxsIGJlIG1hcHBlZC4gQW4gYWxpYXMgbXVzdCBiZWdpbiB3aXRoIHNsYXNoICgnLycpIGFuZAoJICogbXVzdCBub3QgZW5kIHdpdGggc2xhc2ggKCcvJyksIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGFuIGFsaWFzIG9mIHRoZQoJICogZm9ybSAmcXVvdDsvJnF1b3Q7IGlzIHVzZWQgdG8gZGVub3RlIHRoZSByb290IGFsaWFzLiBUaGUgbmFtZSBwYXJhbWV0ZXIKCSAqIG11c3QgYWxzbyBub3QgZW5kIHdpdGggc2xhc2ggKCcvJykuIFNlZSB0aGUgc3BlY2lmaWNhdGlvbiB0ZXh0IGZvcgoJICogZGV0YWlscyBvbiBob3cgSFRUUCByZXF1ZXN0cyBhcmUgbWFwcGVkIHRvIHNlcnZsZXQgYW5kIHJlc291cmNlCgkgKiByZWdpc3RyYXRpb25zLgoJICogPHA+CgkgKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGUgcmVzb3VyY2UgbmFtZSAvdG1wIGlzIHJlZ2lzdGVyZWQgdG8gdGhlIGFsaWFzCgkgKiAvZmlsZXMuIEEgcmVxdWVzdCBmb3IgL2ZpbGVzL2Zvby50eHQgd2lsbCBtYXAgdG8gdGhlIHJlc291cmNlIG5hbWUKCSAqIC90bXAvZm9vLnR4dC4KCSAqIAoJICogPHByZT4KCSAqIGh0dHBzZXJ2aWNlLnJlZ2lzdGVyUmVzb3VyY2VzKCZxdW90Oy9maWxlcyZxdW90OywgJnF1b3Q7L3RtcCZxdW90OywgY29udGV4dCk7CgkgKiA8L3ByZT4KCSAqIAoJICogVGhlIEh0dHAgU2VydmljZSB3aWxsIGNhbGwgdGhlIDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBhcmd1bWVudCB0byBtYXAKCSAqIHJlc291cmNlIG5hbWVzIHRvIFVSTHMgYW5kIE1JTUUgdHlwZXMgYW5kIHRvIGhhbmRsZSBzZWN1cml0eSBmb3IKCSAqIHJlcXVlc3RzLiBJZiB0aGUgPGNvZGU+SHR0cENvbnRleHQ8L2NvZGU+IGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+LCBhCgkgKiBkZWZhdWx0IDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBpcyB1c2VkIChzZWUKCSAqIHtAbGluayAjY3JlYXRlRGVmYXVsdEh0dHBDb250ZXh0fSkuCgkgKiAKCSAqIEBwYXJhbSBhbGlhcyBuYW1lIGluIHRoZSBVUkkgbmFtZXNwYWNlIGF0IHdoaWNoIHRoZSByZXNvdXJjZXMgYXJlCgkgKiAgICAgICAgcmVnaXN0ZXJlZAoJICogQHBhcmFtIG5hbWUgdGhlIGJhc2UgbmFtZSBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkCgkgKiBAcGFyYW0gY29udGV4dCB0aGUgPGNvZGU+SHR0cENvbnRleHQ8L2NvZGU+IG9iamVjdCBmb3IgdGhlIHJlZ2lzdGVyZWQKCSAqICAgICAgICByZXNvdXJjZXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgZGVmYXVsdCA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4KCSAqICAgICAgICBpcyB0byBiZSBjcmVhdGVkIGFuZCB1c2VkLgoJICogQHRocm93cyBOYW1lc3BhY2VFeGNlcHRpb24gaWYgdGhlIHJlZ2lzdHJhdGlvbiBmYWlscyBiZWNhdXNlIHRoZSBhbGlhcwoJICogICAgICAgICAgICBpcyBhbHJlYWR5IGluIHVzZS4KCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMKCSAqICAgICAgICAgICAgYXJlIGludmFsaWQKCSAqLwoJcHVibGljIHZvaWQgcmVnaXN0ZXJSZXNvdXJjZXMoU3RyaW5nIGFsaWFzLCBTdHJpbmcgbmFtZSwKCQkJSHR0cENvbnRleHQgY29udGV4dCkgdGhyb3dzIE5hbWVzcGFjZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFVucmVnaXN0ZXJzIGEgcHJldmlvdXMgcmVnaXN0cmF0aW9uIGRvbmUgYnkgPGNvZGU+cmVnaXN0ZXJTZXJ2bGV0PC9jb2RlPiBvcgoJICogPGNvZGU+cmVnaXN0ZXJSZXNvdXJjZXM8L2NvZGU+IG1ldGhvZHMuCgkgKiAKCSAqIDxwPgoJICogQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgcmVnaXN0ZXJlZCBhbGlhcyBpbiB0aGUgVVJJIG5hbWUtc3BhY2Ugd2lsbCBubwoJICogbG9uZ2VyIGJlIGF2YWlsYWJsZS4gSWYgdGhlIHJlZ2lzdHJhdGlvbiB3YXMgZm9yIGEgc2VydmxldCwgdGhlIEh0dHAKCSAqIFNlcnZpY2UgbXVzdCBjYWxsIHRoZSA8Y29kZT5kZXN0cm95PC9jb2RlPiBtZXRob2Qgb2YgdGhlIHNlcnZsZXQgYmVmb3JlCgkgKiByZXR1cm5pbmcuCgkgKiA8cD4KCSAqIElmIHRoZSBidW5kbGUgd2hpY2ggcGVyZm9ybWVkIHRoZSByZWdpc3RyYXRpb24gaXMgc3RvcHBlZCBvciBvdGhlcndpc2UKCSAqICJ1bmdldCJzIHRoZSBIdHRwIFNlcnZpY2Ugd2l0aG91dCBjYWxsaW5nIHtAbGluayAjdW5yZWdpc3Rlcn0gdGhlbiBIdHRwCgkgKiBTZXJ2aWNlIG11c3QgYXV0b21hdGljYWxseSB1bnJlZ2lzdGVyIHRoZSByZWdpc3RyYXRpb24uIEhvd2V2ZXIsIGlmIHRoZQoJICogcmVnaXN0cmF0aW9uIHdhcyBmb3IgYSBzZXJ2bGV0LCB0aGUgPGNvZGU+ZGVzdHJveTwvY29kZT4gbWV0aG9kIG9mIHRoZQoJICogc2VydmxldCB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gdGhpcyBjYXNlIHNpbmNlIHRoZSBidW5kbGUgbWF5IGJlIHN0b3BwZWQuCgkgKiB7QGxpbmsgI3VucmVnaXN0ZXJ9IG11c3QgYmUgZXhwbGljaXRseSBjYWxsZWQgdG8gY2F1c2UgdGhlCgkgKiA8Y29kZT5kZXN0cm95PC9jb2RlPiBtZXRob2Qgb2YgdGhlIHNlcnZsZXQgdG8gYmUgY2FsbGVkLiBUaGlzIGNhbiBiZSBkb25lCgkgKiBpbiB0aGUgPGNvZGU+QnVuZGxlQWN0aXZhdG9yLnN0b3A8L2NvZGU+IG1ldGhvZCBvZiB0aGUKCSAqIGJ1bmRsZSByZWdpc3RlcmluZyB0aGUgc2VydmxldC4KCSAqIAoJICogQHBhcmFtIGFsaWFzIG5hbWUgaW4gdGhlIFVSSSBuYW1lLXNwYWNlIG9mIHRoZSByZWdpc3RyYXRpb24gdG8gdW5yZWdpc3RlcgoJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIHJlZ2lzdHJhdGlvbgoJICogICAgICAgICAgICBmb3IgdGhlIGFsaWFzIG9yIHRoZSBjYWxsaW5nIGJ1bmRsZSB3YXMgbm90IHRoZSBidW5kbGUgd2hpY2gKCSAqICAgICAgICAgICAgcmVnaXN0ZXJlZCB0aGUgYWxpYXMuCgkgKi8KCXB1YmxpYyB2b2lkIHVucmVnaXN0ZXIoU3RyaW5nIGFsaWFzKTsKCgkvKioKCSAqIENyZWF0ZXMgYSBkZWZhdWx0IDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBmb3IgcmVnaXN0ZXJpbmcgc2VydmxldHMgb3IKCSAqIHJlc291cmNlcyB3aXRoIHRoZSBIdHRwU2VydmljZSwgYSBuZXcgPGNvZGU+SHR0cENvbnRleHQ8L2NvZGU+IG9iamVjdCBpcwoJICogY3JlYXRlZCBlYWNoIHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLgoJICogCgkgKiA8cD4KCSAqIFRoZSBiZWhhdmlvciBvZiB0aGUgbWV0aG9kcyBvbiB0aGUgZGVmYXVsdCA8Y29kZT5IdHRwQ29udGV4dDwvY29kZT4gaXMKCSAqIGRlZmluZWQgYXMgZm9sbG93czoKCSAqIDx1bD4KCSAqIDxsaT48Y29kZT5nZXRNaW1lVHlwZTwvY29kZT4tIERvZXMgbm90IGRlZmluZSBhbnkgY3VzdG9taXplZCBNSU1FIHR5cGVzCgkgKiBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaW4gdGhlIHJlc3BvbnNlLCBhbmQgYWx3YXlzIHJldHVybnMKCSAqIDxjb2RlPm51bGw8L2NvZGU+LgoJICogPGxpPjxjb2RlPmhhbmRsZVNlY3VyaXR5PC9jb2RlPi0gUGVyZm9ybXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZAoJICogYXV0aGVudGljYXRpb24gb24gdGhlIHJlcXVlc3QuCgkgKiA8bGk+PGNvZGU+Z2V0UmVzb3VyY2U8L2NvZGU+LSBBc3N1bWVzIHRoZSBuYW1lZCByZXNvdXJjZSBpcyBpbiB0aGUKCSAqIGNvbnRleHQgYnVuZGxlOyB0aGlzIG1ldGhvZCBjYWxscyB0aGUgY29udGV4dCBidW5kbGUncwoJICogPGNvZGU+QnVuZGxlLmdldFJlc291cmNlPC9jb2RlPiBtZXRob2QsIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBVUkwgdG8KCSAqIGFjY2VzcyB0aGUgcmVzb3VyY2UuIE9uIGEgSmF2YSBydW50aW1lIGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMKCSAqIHBlcm1pc3Npb25zLCB0aGUgSHR0cCBTZXJ2aWNlIG5lZWRzIHRvIGJlIGdyYW50ZWQgCgkgKiA8Y29kZT5vcmcub3NnaS5mcmFtZXdvcmsuQWRtaW5QZXJtaXNzaW9uWyosUkVTT1VSQ0VdPC9jb2RlPi4KCSAqIDwvdWw+CgkgKiAKCSAqIEByZXR1cm4gYSBkZWZhdWx0IDxjb2RlPkh0dHBDb250ZXh0PC9jb2RlPiBvYmplY3QuCgkgKiBAc2luY2UgMS4xCgkgKi8KCXB1YmxpYyBIdHRwQ29udGV4dCBjcmVhdGVEZWZhdWx0SHR0cENvbnRleHQoKTsKfQpQSwMECgAAAAAAa1LuNOeNPuRiCwAAYgsAADoAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9odHRwL05hbWVzcGFjZUV4Y2VwdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5odHRwL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvTmFtZXNwYWNlRXhjZXB0aW9uLmphdmEsdiAxLjExIDIwMDYvMDcvMTEgMTM6MTU6NTYgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAwLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UuaHR0cDsKCi8qKgogKiBBIE5hbWVzcGFjZUV4Y2VwdGlvbiBpcyB0aHJvd24gdG8gaW5kaWNhdGUgYW4gZXJyb3Igd2l0aCB0aGUgY2FsbGVyJ3MgcmVxdWVzdAogKiB0byByZWdpc3RlciBhIHNlcnZsZXQgb3IgcmVzb3VyY2VzIGludG8gdGhlIFVSSSBuYW1lc3BhY2Ugb2YgdGhlIEh0dHAKICogU2VydmljZS4gVGhpcyBleGNlcHRpb24gaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3RlZCBhbGlhcyBhbHJlYWR5IGlzIGluIHVzZS4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMSAkCiAqLwpwdWJsaWMgY2xhc3MgTmFtZXNwYWNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjM1NjA2MDMxMTQ3ODc3NzQ3TDsKCS8qKgoJICogTmVzdGVkIGV4Y2VwdGlvbi4KCSAqLwoJcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGUJY2F1c2U7CgoJLyoqCgkgKiBDb25zdHJ1Y3QgYSA8Y29kZT5OYW1lc3BhY2VFeGNlcHRpb248L2NvZGU+IG9iamVjdCB3aXRoIGEgZGV0YWlsIG1lc3NhZ2UuCgkgKiAKCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBkZXRhaWwgbWVzc2FnZQoJICovCglwdWJsaWMgTmFtZXNwYWNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CgkJc3VwZXIobWVzc2FnZSk7CgkJY2F1c2UgPSBudWxsOwoJfQoKCS8qKgoJICogQ29uc3RydWN0IGEgPGNvZGU+TmFtZXNwYWNlRXhjZXB0aW9uPC9jb2RlPiBvYmplY3Qgd2l0aCBhIGRldGFpbCBtZXNzYWdlCgkgKiBhbmQgYSBuZXN0ZWQgZXhjZXB0aW9uLgoJICogCgkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZGV0YWlsIG1lc3NhZ2UuCgkgKiBAcGFyYW0gY2F1c2UgVGhlIG5lc3RlZCBleGNlcHRpb24uCgkgKi8KCXB1YmxpYyBOYW1lc3BhY2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewoJCXN1cGVyKG1lc3NhZ2UpOwoJCXRoaXMuY2F1c2UgPSBjYXVzZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIG5lc3RlZCBleGNlcHRpb24uCgkgKgogICAgICogPHA+VGhpcyBtZXRob2QgcHJlZGF0ZXMgdGhlIGdlbmVyYWwgcHVycG9zZSBleGNlcHRpb24gY2hhaW5pbmcgbWVjaGFuaXNtLgogICAgICogVGhlIHtAbGluayAjZ2V0Q2F1c2UoKX0gbWV0aG9kIGlzIG5vdyB0aGUgcHJlZmVycmVkIG1lYW5zIG9mCiAgICAgKiBvYnRhaW5pbmcgdGhpcyBpbmZvcm1hdGlvbi4KCSAqIAoJICogQHJldHVybiB0aGUgbmVzdGVkIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBuZXN0ZWQKCSAqICAgICAgICAgZXhjZXB0aW9uLgoJICovCglwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKCQlyZXR1cm4gY2F1c2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwoJICogY2F1c2Ugd2FzIHNwZWNpZmllZCB3aGVuIHRoaXMgZXhjZXB0aW9uIHdhcyBjcmVhdGVkLgoJICoKCSAqIEByZXR1cm4gIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwoJICogY2F1c2Ugd2FzIHNwZWNpZmllZC4KCSAqIEBzaW5jZSAxLjIgCgkgKi8KCXB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7CgkgICAgcmV0dXJuIGNhdXNlOwoJfQoKCS8qKgoJICogVGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIGNhbiBvbmx5IGJlIHNldCB3aGVuIGNvbnN0cnVjdGVkLgoJICoKCSAqIEBwYXJhbSBjYXVzZSBDYXVzZSBvZiB0aGUgZXhjZXB0aW9uLgoJICogQHJldHVybiBUaGlzIG9iamVjdC4KCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbgoJICogVGhpcyBtZXRob2Qgd2lsbCBhbHdheXMgdGhyb3cgYW4gPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPgoJICogc2luY2UgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIGNhbiBvbmx5IGJlIHNldCB3aGVuIGNvbnN0cnVjdGVkLgoJICogQHNpbmNlIDEuMiAKCSAqLwoJcHVibGljIFRocm93YWJsZSBpbml0Q2F1c2UoVGhyb3dhYmxlIGNhdXNlKSB7CgkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwoJfQp9ClBLAwQKAAAAAABrUu40ST7KvYUBAACFAQAALwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmh0dHAvc3JjL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9wYWNrYWdlLmh0bWwsdiAxLjQgMjAwNi8wNy8xMiAyMTowNzoxOCBoYXJncmF2ZSBFeHAgJCAtLT4KPEJPRFk+CjxwPkh0dHAgU2VydmljZSBQYWNrYWdlIFZlcnNpb24gMS4yLgo8cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UKaW4gdGhlIDxUVD5JbXBvcnQtUGFja2FnZTwvVFQ+IGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuCkZvciBleGFtcGxlOgo8cHJlPgpJbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuc2VydmljZS5odHRwOyB2ZXJzaW9uPTEuMgo8L3ByZT4KPC9CT0RZPgpQSwMECgAAAAAAa1LuNEf9N5wMAAAADAAAAC4AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9odHRwL3BhY2thZ2VpbmZvdmVyc2lvbiAxLjIKUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAhAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vUEsDBAoAAAAAAGtS7jQF07fgGAoAABgKAAA3AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vQ29ubmVjdGlvbkZhY3RvcnkuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuaW8vc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vQ29ubmVjdGlvbkZhY3RvcnkuamF2YSx2IDEuOSAyMDA2LzA3LzEyIDIxOjIyOjEyIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5pbzsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwoKaW1wb3J0IGphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uOwoKLyoqCiAqIEEgQ29ubmVjdGlvbiBGYWN0b3J5IHNlcnZpY2UgaXMgY2FsbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29ubmVjdG9yCiAqIFNlcnZpY2UgdG8gY3JlYXRlIDxjb2RlPmphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uPC9jb2RlPiBvYmplY3RzIHdoaWNoCiAqIGltcGxlbWVudCB0aGUgc2NoZW1lIG5hbWVkIGJ5IDxjb2RlPklPX1NDSEVNRTwvY29kZT4uCiAqIAogKiBXaGVuIGEgPGNvZGU+Q29ubmVjdG9yU2VydmljZS5vcGVuPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW1wbGVtZW50YXRpb24KICogb2YgdGhlIENvbm5lY3RvciBTZXJ2aWNlIHdpbGwgZXhhbWluZSB0aGUgc3BlY2lmaWVkIG5hbWUgZm9yIGEgc2NoZW1lLiBUaGUKICogQ29ubmVjdG9yIFNlcnZpY2Ugd2lsbCB0aGVuIGxvb2sgZm9yIGEgQ29ubmVjdGlvbiBGYWN0b3J5IHNlcnZpY2Ugd2hpY2ggaXMKICogcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2aWNlIHByb3BlcnR5IDxjb2RlPklPX1NDSEVNRTwvY29kZT4gd2hpY2ggbWF0Y2hlcyB0aGUKICogc2NoZW1lLiBUaGUge0BsaW5rICNjcmVhdGVDb25uZWN0aW9ufSBtZXRob2Qgb2YgdGhlIHNlbGVjdGVkIENvbm5lY3Rpb24KICogRmFjdG9yeSB3aWxsIHRoZW4gYmUgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgYWN0dWFsIDxjb2RlPkNvbm5lY3Rpb248L2NvZGU+CiAqIG9iamVjdC4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICovCnB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkZhY3RvcnkgewoJLyoqCgkgKiBTZXJ2aWNlIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHNjaGVtZShzKSBmb3Igd2hpY2ggdGhpcyBDb25uZWN0aW9uCgkgKiBGYWN0b3J5IGNhbiBjcmVhdGUgPGNvZGU+Q29ubmVjdGlvbjwvY29kZT4gb2JqZWN0cy4gVGhpcyBwcm9wZXJ0eSBpcyBvZgoJICogdHlwZSA8Y29kZT5TdHJpbmdbXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCUlPX1NDSEVNRQk9ICJpby5zY2hlbWUiOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IDxjb2RlPkNvbm5lY3Rpb248L2NvZGU+IG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBVUkkuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBmdWxsIFVSSSBwYXNzZWQgdG8gdGhlIDxjb2RlPkNvbm5lY3RvclNlcnZpY2Uub3BlbjwvY29kZT4KCSAqICAgICAgICBtZXRob2QKCSAqIEBwYXJhbSBtb2RlIFRoZSBtb2RlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlCgkgKiAgICAgICAgPGNvZGU+Q29ubmVjdG9yU2VydmljZS5vcGVuPC9jb2RlPiBtZXRob2QKCSAqIEBwYXJhbSB0aW1lb3V0cyBUaGUgdGltZW91dHMgcGFyYW1ldGVyIHBhc3NlZCB0byB0aGUKCSAqICAgICAgICA8Y29kZT5Db25uZWN0b3JTZXJ2aWNlLm9wZW48L2NvZGU+IG1ldGhvZAoJICogQHJldHVybiBBIG5ldyA8Y29kZT5qYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdGlvbjwvY29kZT4gb2JqZWN0LgoJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBhIDxjb2RlPmphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uPC9jb2RlPgoJICogICAgICAgICBvYmplY3QgY2FuIG5vdCBub3QgYmUgY3JlYXRlZC4KCSAqLwoJcHVibGljIENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihTdHJpbmcgbmFtZSwgaW50IG1vZGUsIGJvb2xlYW4gdGltZW91dHMpCgkJCXRocm93cyBJT0V4Y2VwdGlvbjsKfQpQSwMECgAAAAAAa1LuNKRxCxFkGgAAZBoAADYAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9pby9Db25uZWN0b3JTZXJ2aWNlLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmlvL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2lvL0Nvbm5lY3RvclNlcnZpY2UuamF2YSx2IDEuOSAyMDA2LzA3LzEyIDIxOjIyOjEyIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5pbzsKCmltcG9ydCBqYXZhLmlvLio7CgppbXBvcnQgamF2YXgubWljcm9lZGl0aW9uLmlvLkNvbm5lY3Rpb247CmltcG9ydCBqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdG9yOwoKLyoqCiAqIFRoZSBDb25uZWN0b3IgU2VydmljZSBzaG91bGQgYmUgY2FsbGVkIHRvIGNyZWF0ZSBhbmQgb3BlbgogKiA8Y29kZT5qYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdGlvbjwvY29kZT4gb2JqZWN0cy4KICogCiAqIFdoZW4gYW4gPGNvZGU+b3Blbio8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKICogQ29ubmVjdG9yIFNlcnZpY2Ugd2lsbCBleGFtaW5lIHRoZSBzcGVjaWZpZWQgbmFtZSBmb3IgYSBzY2hlbWUuIFRoZSBDb25uZWN0b3IKICogU2VydmljZSB3aWxsIHRoZW4gbG9vayBmb3IgYSBDb25uZWN0aW9uIEZhY3Rvcnkgc2VydmljZSB3aGljaCBpcyByZWdpc3RlcmVkCiAqIHdpdGggdGhlIHNlcnZpY2UgcHJvcGVydHkgPGNvZGU+SU9fU0NIRU1FPC9jb2RlPiB3aGljaCBtYXRjaGVzIHRoZSBzY2hlbWUuIFRoZQogKiA8Y29kZT5jcmVhdGVDb25uZWN0aW9uPC9jb2RlPiBtZXRob2Qgb2YgdGhlIHNlbGVjdGVkIENvbm5lY3Rpb24gRmFjdG9yeSB3aWxsCiAqIHRoZW4gYmUgY2FsbGVkIHRvIGNyZWF0ZSB0aGUgYWN0dWFsIDxjb2RlPkNvbm5lY3Rpb248L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBJZiBtb3JlIHRoYW4gb25lIENvbm5lY3Rpb24gRmFjdG9yeSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgZm9yIGEgcGFydGljdWxhcgogKiBzY2hlbWUsIHRoZSBzZXJ2aWNlIHdpdGggdGhlIGhpZ2hlc3QgcmFua2luZyAoYXMgc3BlY2lmaWVkIGluIGl0cwogKiA8Y29kZT5zZXJ2aWNlLnJhbmtpbmc8L2NvZGU+IHByb3BlcnR5KSBpcyBjYWxsZWQuIElmIHRoZXJlIGlzIGEgdGllIGluIHJhbmtpbmcsCiAqIHRoZSBzZXJ2aWNlIHdpdGggdGhlIGxvd2VzdCBzZXJ2aWNlIElEIChhcyBzcGVjaWZpZWQgaW4gaXRzCiAqIDxjb2RlPnNlcnZpY2UuaWQ8L2NvZGU+IHByb3BlcnR5KSwgdGhhdCBpcyB0aGUgc2VydmljZSB0aGF0IHdhcyByZWdpc3RlcmVkCiAqIGZpcnN0LCBpcyBjYWxsZWQuIFRoaXMgaXMgdGhlIHNhbWUgYWxnb3JpdGhtIHVzZWQgYnkKICogPGNvZGU+QnVuZGxlQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPi4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICovCnB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yU2VydmljZSB7CgkvKioKCSAqIFJlYWQgYWNjZXNzIG1vZGUuCgkgKiAKCSAqIEBzZWUgImphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0b3IuUkVBRCIKCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQJUkVBRAkJPSBDb25uZWN0b3IuUkVBRDsKCS8qKgoJICogV3JpdGUgYWNjZXNzIG1vZGUuCgkgKiAKCSAqIEBzZWUgImphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0b3IuV1JJVEUiCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CVdSSVRFCQk9IENvbm5lY3Rvci5XUklURTsKCS8qKgoJICogUmVhZC9Xcml0ZSBhY2Nlc3MgbW9kZS4KCSAqIAoJICogQHNlZSAiamF2YXgubWljcm9lZGl0aW9uLmlvLkNvbm5lY3Rvci5SRUFEX1dSSVRFIgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlSRUFEX1dSSVRFCT0gQ29ubmVjdG9yLlJFQURfV1JJVEU7CgoJLyoqCgkgKiBDcmVhdGUgYW5kIG9wZW4gYSA8Y29kZT5Db25uZWN0aW9uPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZS4KCSAqIAoJICogQHBhcmFtIG5hbWUgVGhlIFVSSSBmb3IgdGhlIGNvbm5lY3Rpb24uCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPmphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLgoJICogQHRocm93cyBqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdGlvbk5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZQoJICogICAgICAgICBjb25uZWN0aW9uIGNhbm5vdCBiZSBmb3VuZC4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgc29tZSBvdGhlciBraW5kIG9mIEkvTyBlcnJvciBvY2N1cnMuCgkgKiBAc2VlICJqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdG9yLm9wZW4oU3RyaW5nIG5hbWUpIgoJICovCglwdWJsaWMgQ29ubmVjdGlvbiBvcGVuKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb247CgoJLyoqCgkgKiBDcmVhdGUgYW5kIG9wZW4gYSA8Y29kZT5Db25uZWN0aW9uPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKCSAqIGFjY2VzcyBtb2RlLgoJICogCgkgKiBAcGFyYW0gbmFtZSBUaGUgVVJJIGZvciB0aGUgY29ubmVjdGlvbi4KCSAqIEBwYXJhbSBtb2RlIFRoZSBhY2Nlc3MgbW9kZS4KCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+amF2YXgubWljcm9lZGl0aW9uLmlvLkNvbm5lY3Rpb248L2NvZGU+IG9iamVjdC4KCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuCgkgKiBAdGhyb3dzIGphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlCgkgKiAgICAgICAgIGNvbm5lY3Rpb24gY2Fubm90IGJlIGZvdW5kLgoJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBzb21lIG90aGVyIGtpbmQgb2YgSS9PIGVycm9yIG9jY3Vycy4KCSAqIEBzZWUgImphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0b3Iub3BlbihTdHJpbmcgbmFtZSwgaW50IG1vZGUpIgoJICovCglwdWJsaWMgQ29ubmVjdGlvbiBvcGVuKFN0cmluZyBuYW1lLCBpbnQgbW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogQ3JlYXRlIGFuZCBvcGVuIGEgPGNvZGU+Q29ubmVjdGlvbjwvY29kZT4gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIG5hbWUsCgkgKiBhY2Nlc3MgbW9kZSBhbmQgdGltZW91dHMuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBVUkkgZm9yIHRoZSBjb25uZWN0aW9uLgoJICogQHBhcmFtIG1vZGUgVGhlIGFjY2VzcyBtb2RlLgoJICogQHBhcmFtIHRpbWVvdXRzIEEgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsZXIgd2FudHMgdGltZW91dAoJICogICAgICAgIGV4Y2VwdGlvbnMuCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPmphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLgoJICogQHRocm93cyBqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdGlvbk5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZQoJICogICAgICAgICBjb25uZWN0aW9uIGNhbm5vdCBiZSBmb3VuZC4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgc29tZSBvdGhlciBraW5kIG9mIEkvTyBlcnJvciBvY2N1cnMuCgkgKiBAc2VlICI8Y29kZT5qYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdG9yLm9wZW48L2NvZGU+IgoJICovCglwdWJsaWMgQ29ubmVjdGlvbiBvcGVuKFN0cmluZyBuYW1lLCBpbnQgbW9kZSwgYm9vbGVhbiB0aW1lb3V0cykKCQkJdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogQ3JlYXRlIGFuZCBvcGVuIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZS4KCSAqIAoJICogQHBhcmFtIG5hbWUgVGhlIFVSSSBmb3IgdGhlIGNvbm5lY3Rpb24uCgkgKiBAcmV0dXJuIEFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLgoJICogQHRocm93cyBqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdGlvbk5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZQoJICogICAgICAgICBjb25uZWN0aW9uIGNhbm5vdCBiZSBmb3VuZC4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgc29tZSBvdGhlciBraW5kIG9mIEkvTyBlcnJvciBvY2N1cnMuCgkgKiBAc2VlICJqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdG9yLm9wZW5JbnB1dFN0cmVhbShTdHJpbmcgbmFtZSkiCgkgKi8KCXB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW0oU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKCgkvKioKCSAqIENyZWF0ZSBhbmQgb3BlbiBhIDxjb2RlPkRhdGFJbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkCgkgKiBuYW1lLgoJICogCgkgKiBAcGFyYW0gbmFtZSBUaGUgVVJJIGZvciB0aGUgY29ubmVjdGlvbi4KCSAqIEByZXR1cm4gQSA8Y29kZT5EYXRhSW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdC4KCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuCgkgKiBAdGhyb3dzIGphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlCgkgKiAgICAgICAgIGNvbm5lY3Rpb24gY2Fubm90IGJlIGZvdW5kLgoJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBzb21lIG90aGVyIGtpbmQgb2YgSS9PIGVycm9yIG9jY3Vycy4KCSAqIEBzZWUgImphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0b3Iub3BlbkRhdGFJbnB1dFN0cmVhbShTdHJpbmcgbmFtZSkiCgkgKi8KCXB1YmxpYyBEYXRhSW5wdXRTdHJlYW0gb3BlbkRhdGFJbnB1dFN0cmVhbShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogQ3JlYXRlIGFuZCBvcGVuIGFuIDxjb2RlPk91dHB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIG5hbWUuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBVUkkgZm9yIHRoZSBjb25uZWN0aW9uLgoJICogQHJldHVybiBBbiA8Y29kZT5PdXRwdXRTdHJlYW08L2NvZGU+IG9iamVjdC4KCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuCgkgKiBAdGhyb3dzIGphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0aW9uTm90Rm91bmRFeGNlcHRpb24gSWYgdGhlCgkgKiAgICAgICAgIGNvbm5lY3Rpb24gY2Fubm90IGJlIGZvdW5kLgoJICogQHRocm93cyBJT0V4Y2VwdGlvbiBJZiBzb21lIG90aGVyIGtpbmQgb2YgSS9PIGVycm9yIG9jY3Vycy4KCSAqIEBzZWUgImphdmF4Lm1pY3JvZWRpdGlvbi5pby5Db25uZWN0b3Iub3Blbk91dHB1dFN0cmVhbShTdHJpbmcgbmFtZSkiCgkgKi8KCXB1YmxpYyBPdXRwdXRTdHJlYW0gb3Blbk91dHB1dFN0cmVhbShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwoKCS8qKgoJICogQ3JlYXRlIGFuZCBvcGVuIGEgPGNvZGU+RGF0YU91dHB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkCgkgKiBuYW1lLgoJICogCgkgKiBAcGFyYW0gbmFtZSBUaGUgVVJJIGZvciB0aGUgY29ubmVjdGlvbi4KCSAqIEByZXR1cm4gQSA8Y29kZT5EYXRhT3V0cHV0U3RyZWFtPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiBhIHBhcmFtZXRlciBpcyBpbnZhbGlkLgoJICogQHRocm93cyBqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdGlvbk5vdEZvdW5kRXhjZXB0aW9uIElmIHRoZQoJICogICAgICAgICBjb25uZWN0aW9uIGNhbm5vdCBiZSBmb3VuZC4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgc29tZSBvdGhlciBraW5kIG9mIEkvTyBlcnJvciBvY2N1cnMuCgkgKiBAc2VlICJqYXZheC5taWNyb2VkaXRpb24uaW8uQ29ubmVjdG9yLm9wZW5EYXRhT3V0cHV0U3RyZWFtKFN0cmluZyBuYW1lKSIKCSAqLwoJcHVibGljIERhdGFPdXRwdXRTdHJlYW0gb3BlbkRhdGFPdXRwdXRTdHJlYW0oU3RyaW5nIG5hbWUpCgkJCXRocm93cyBJT0V4Y2VwdGlvbjsKfQpQSwMECgAAAAAAa1LuNGJCwImWAQAAlgEAAC0AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9pby9wYWNrYWdlLmh0bWw8IS0tICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UuaW8vc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vcGFja2FnZS5odG1sLHYgMS4zIDIwMDYvMDcvMTIgMjE6MDc6MDYgaGFyZ3JhdmUgRXhwICQgLS0+CjxCT0RZPgo8cD5JTyBDb25uZWN0b3IgUGFja2FnZSBWZXJzaW9uIDEuMC4KPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlCmluIHRoZSA8VFQ+SW1wb3J0LVBhY2thZ2U8L1RUPiBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0LgpGb3IgZXhhbXBsZToKPHByZT4KSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnNlcnZpY2UuaW87IHZlcnNpb249MS4wLCBqYXZheC5taWNyb2VkaXRpb24uaW8KPC9wcmU+CjwvQk9EWT4KUEsDBAoAAAAAAGtS7jTFnwGuDAAAAAwAAAAsAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vcGFja2FnZWluZm92ZXJzaW9uIDEuMApQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAACIAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvUEsDBAoAAAAAAGtS7jRjsL12xA4AAMQOAAAvAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ0VudHJ5LmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmxvZy9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nRW50cnkuamF2YSx2IDEuOSAyMDA2LzA2LzE2IDE2OjMxOjQ5IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMCwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmxvZzsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CgovKioKICogUHJvdmlkZXMgbWV0aG9kcyB0byBhY2Nlc3MgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBhbiBpbmRpdmlkdWFsIExvZwogKiBTZXJ2aWNlIGxvZyBlbnRyeS4KICogCiAqIDxwPgogKiBBIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPiBvYmplY3QgbWF5IGJlIGFjcXVpcmVkIGZyb20gdGhlCiAqIDxjb2RlPkxvZ1JlYWRlclNlcnZpY2UuZ2V0TG9nPC9jb2RlPiBtZXRob2Qgb3IgYnkgcmVnaXN0ZXJpbmcgYQogKiA8Y29kZT5Mb2dMaXN0ZW5lcjwvY29kZT4gb2JqZWN0LgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjkgJAogKiBAc2VlIExvZ1JlYWRlclNlcnZpY2UjZ2V0TG9nCiAqIEBzZWUgTG9nTGlzdGVuZXIKICovCnB1YmxpYyBpbnRlcmZhY2UgTG9nRW50cnkgewoJLyoqCgkgKiBSZXR1cm5zIHRoZSBidW5kbGUgdGhhdCBjcmVhdGVkIHRoaXMgPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiBUaGUgYnVuZGxlIHRoYXQgY3JlYXRlZCB0aGlzIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPiBvYmplY3Q7CgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGJ1bmRsZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhpcwoJICogICAgICAgICA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgQnVuZGxlIGdldEJ1bmRsZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IGZvciB0aGUgc2VydmljZSBhc3NvY2lhdGVkCgkgKiB3aXRoIHRoaXMgPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3QgZm9yIHRoZSBzZXJ2aWNlIGFzc29jaWF0ZWQKCSAqICAgICAgICAgd2l0aCB0aGlzIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPiBvYmplY3Q7IDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCgkgKiAgICAgICAgIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCB3YXMgcHJvdmlkZWQuCgkgKi8KCXB1YmxpYyBTZXJ2aWNlUmVmZXJlbmNlIGdldFNlcnZpY2VSZWZlcmVuY2UoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIHNldmVyaXR5IGxldmVsIG9mIHRoaXMgPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIGlzIG9uZSBvZiB0aGUgc2V2ZXJpdHkgbGV2ZWxzIGRlZmluZWQgYnkgdGhlIDxjb2RlPkxvZ1NlcnZpY2U8L2NvZGU+CgkgKiBpbnRlcmZhY2UuCgkgKiAKCSAqIEByZXR1cm4gU2V2ZXJpdHkgbGV2ZWwgb2YgdGhpcyA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAc2VlIExvZ1NlcnZpY2UjTE9HX0VSUk9SCgkgKiBAc2VlIExvZ1NlcnZpY2UjTE9HX1dBUk5JTkcKCSAqIEBzZWUgTG9nU2VydmljZSNMT0dfSU5GTwoJICogQHNlZSBMb2dTZXJ2aWNlI0xPR19ERUJVRwoJICovCglwdWJsaWMgaW50IGdldExldmVsKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBodW1hbiByZWFkYWJsZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPgoJICogb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIDxjb2RlPlN0cmluZzwvY29kZT4gY29udGFpbmluZyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhpcwoJICogICAgICAgICA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGV4Y2VwdGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgPGNvZGU+TG9nRW50cnk8L2NvZGU+CgkgKiBvYmplY3QuCgkgKiAKCSAqIDxwPgoJICogSW4gc29tZSBpbXBsZW1lbnRhdGlvbnMsIHRoZSByZXR1cm5lZCBleGNlcHRpb24gbWF5IG5vdCBiZSB0aGUgb3JpZ2luYWwKCSAqIGV4Y2VwdGlvbi4gVG8gYXZvaWQgcmVmZXJlbmNlcyB0byBhIGJ1bmRsZSBkZWZpbmVkIGV4Y2VwdGlvbiBjbGFzcywgdGh1cwoJICogcHJldmVudGluZyBhbiB1bmluc3RhbGxlZCBidW5kbGUgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCwgdGhlIExvZwoJICogU2VydmljZSBtYXkgcmV0dXJuIGFuIGV4Y2VwdGlvbiBvYmplY3Qgb2YgYW4gaW1wbGVtZW50YXRpb24gZGVmaW5lZAoJICogVGhyb3dhYmxlIHN1YmNsYXNzLiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYXR0ZW1wdCB0byBwcm92aWRlIGFzIG11Y2gKCSAqIGluZm9ybWF0aW9uIGFzIHBvc3NpYmxlIGZyb20gdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBvYmplY3Qgc3VjaCBhcyB0aGUKCSAqIG1lc3NhZ2UgYW5kIHN0YWNrIHRyYWNlLgoJICogCgkgKiBAcmV0dXJuIDxjb2RlPlRocm93YWJsZTwvY29kZT4gb2JqZWN0IG9mIHRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKCSAqICAgICAgICAgPGNvZGU+TG9nRW50cnk8L2NvZGU+Ozxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGV4Y2VwdGlvbiBpcwoJICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgPGNvZGU+Y3VycmVudFRpbWVNaWxsaXMoKTwvY29kZT4gYXQgdGhlIHRpbWUgdGhpcwoJICogPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdCB3YXMgY3JlYXRlZC4KCSAqIAoJICogQHJldHVybiBUaGUgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHdoZW4gdGhpcyA8Y29kZT5Mb2dFbnRyeTwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0IHdhcyBjcmVhdGVkLgoJICogQHNlZSAiU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkiCgkgKi8KCXB1YmxpYyBsb25nIGdldFRpbWUoKTsKfQpQSwMECgAAAAAAa1LuNCHbLQ50BwAAdAcAADIAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nTGlzdGVuZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UubG9nL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dMaXN0ZW5lci5qYXZhLHYgMS45IDIwMDYvMDYvMTYgMTY6MzE6NDkgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAwLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UubG9nOwoKaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwoKLyoqCiAqIFN1YnNjcmliZXMgdG8gPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdHMgZnJvbSB0aGUgPGNvZGU+TG9nUmVhZGVyU2VydmljZTwvY29kZT4uCiAqIAogKiA8cD4KICogQSA8Y29kZT5Mb2dMaXN0ZW5lcjwvY29kZT4gb2JqZWN0IG1heSBiZSByZWdpc3RlcmVkIHdpdGggdGhlIExvZyBSZWFkZXIgU2VydmljZQogKiB1c2luZyB0aGUgPGNvZGU+TG9nUmVhZGVyU2VydmljZS5hZGRMb2dMaXN0ZW5lcjwvY29kZT4gbWV0aG9kLiBBZnRlciB0aGUKICogbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCwgdGhlIDxjb2RlPmxvZ2dlZDwvY29kZT4gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoCiAqIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPiBvYmplY3QgY3JlYXRlZC4gVGhlIDxjb2RlPkxvZ0xpc3RlbmVyPC9jb2RlPiBvYmplY3QgbWF5IGJlCiAqIHVucmVnaXN0ZXJlZCBieSBjYWxsaW5nIHRoZSA8Y29kZT5Mb2dSZWFkZXJTZXJ2aWNlLnJlbW92ZUxvZ0xpc3RlbmVyPC9jb2RlPgogKiBtZXRob2QuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCiAqIEBzZWUgTG9nUmVhZGVyU2VydmljZQogKiBAc2VlIExvZ0VudHJ5CiAqIEBzZWUgTG9nUmVhZGVyU2VydmljZSNhZGRMb2dMaXN0ZW5lcihMb2dMaXN0ZW5lcikKICogQHNlZSBMb2dSZWFkZXJTZXJ2aWNlI3JlbW92ZUxvZ0xpc3RlbmVyKExvZ0xpc3RlbmVyKQogKi8KcHVibGljIGludGVyZmFjZSBMb2dMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewoJLyoqCgkgKiBMaXN0ZW5lciBtZXRob2QgY2FsbGVkIGZvciBlYWNoIExvZ0VudHJ5IG9iamVjdCBjcmVhdGVkLgoJICogCgkgKiA8cD4KCSAqIEFzIHdpdGggYWxsIGV2ZW50IGxpc3RlbmVycywgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0byBpdHMgY2FsbGVyIGFzCgkgKiBzb29uIGFzIHBvc3NpYmxlLgoJICogCgkgKiBAcGFyYW0gZW50cnkgQSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcgbG9nIGluZm9ybWF0aW9uLgoJICogQHNlZSBMb2dFbnRyeQoJICovCglwdWJsaWMgdm9pZCBsb2dnZWQoTG9nRW50cnkgZW50cnkpOwp9ClBLAwQKAAAAAABrUu40Y/WIV0cOAABHDgAANwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dSZWFkZXJTZXJ2aWNlLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmxvZy9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nUmVhZGVyU2VydmljZS5qYXZhLHYgMS4xMCAyMDA2LzA2LzE2IDE2OjMxOjQ5IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMCwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLmxvZzsKCmltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CgovKioKICogUHJvdmlkZXMgbWV0aG9kcyB0byByZXRyaWV2ZSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0cyBmcm9tIHRoZSBsb2cuCiAqIDxwPgogKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gcmV0cmlldmUgPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdHM6CiAqIDx1bD4KICogPGxpPlRoZSBwcmltYXJ5IHdheSB0byByZXRyaWV2ZSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0cyBpcyB0byByZWdpc3RlciBhCiAqIDxjb2RlPkxvZ0xpc3RlbmVyPC9jb2RlPiBvYmplY3Qgd2hvc2UgPGNvZGU+TG9nTGlzdGVuZXIubG9nZ2VkPC9jb2RlPiBtZXRob2Qgd2lsbAogKiBiZSBjYWxsZWQgZm9yIGVhY2ggZW50cnkgYWRkZWQgdG8gdGhlIGxvZy4KICogPGxpPlRvIHJldHJpZXZlIHBhc3QgPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdHMsIHRoZSA8Y29kZT5nZXRMb2c8L2NvZGU+CiAqIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdoaWNoIHdpbGwgcmV0dXJuIGFuIDxjb2RlPkVudW1lcmF0aW9uPC9jb2RlPiBvZiBhbGwKICogPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdHMgaW4gdGhlIGxvZy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqIEBzZWUgTG9nRW50cnkKICogQHNlZSBMb2dMaXN0ZW5lcgogKiBAc2VlIExvZ0xpc3RlbmVyI2xvZ2dlZChMb2dFbnRyeSkKICovCnB1YmxpYyBpbnRlcmZhY2UgTG9nUmVhZGVyU2VydmljZSB7CgkvKioKCSAqIFN1YnNjcmliZXMgdG8gPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdHMuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGEgPGNvZGU+TG9nTGlzdGVuZXI8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSBMb2cgUmVhZGVyCgkgKiBTZXJ2aWNlLiBUaGUgPGNvZGU+TG9nTGlzdGVuZXIubG9nZ2VkKExvZ0VudHJ5KTwvY29kZT4gbWV0aG9kIHdpbGwgYmUKCSAqIGNhbGxlZCBmb3IgZWFjaCA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0IHBsYWNlZCBpbnRvIHRoZSBsb2cuCgkgKiAKCSAqIDxwPgoJICogV2hlbiBhIGJ1bmRsZSB3aGljaCByZWdpc3RlcnMgYSA8Y29kZT5Mb2dMaXN0ZW5lcjwvY29kZT4gb2JqZWN0IGlzIHN0b3BwZWQKCSAqIG9yIG90aGVyd2lzZSByZWxlYXNlcyB0aGUgTG9nIFJlYWRlciBTZXJ2aWNlLCB0aGUgTG9nIFJlYWRlciBTZXJ2aWNlIG11c3QKCSAqIHJlbW92ZSBhbGwgb2YgdGhlIGJ1bmRsZSdzIGxpc3RlbmVycy4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGlzIExvZyBSZWFkZXIgU2VydmljZSdzIGxpc3Qgb2YgbGlzdGVuZXJzIGFscmVhZHkgY29udGFpbnMgYQoJICogbGlzdGVuZXIgPGNvZGU+bDwvY29kZT4gc3VjaCB0aGF0IDxjb2RlPihsPT1saXN0ZW5lcik8L2NvZGU+LCB0aGlzIG1ldGhvZAoJICogZG9lcyBub3RoaW5nLgoJICogCgkgKiBAcGFyYW0gbGlzdGVuZXIgQSA8Y29kZT5Mb2dMaXN0ZW5lcjwvY29kZT4gb2JqZWN0IHRvIHJlZ2lzdGVyOyB0aGUKCSAqICAgICAgICA8Y29kZT5Mb2dMaXN0ZW5lcjwvY29kZT4gb2JqZWN0IGlzIHVzZWQgdG8gcmVjZWl2ZSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4KCSAqICAgICAgICBvYmplY3RzLgoJICogQHNlZSBMb2dMaXN0ZW5lcgoJICogQHNlZSBMb2dFbnRyeQoJICogQHNlZSBMb2dMaXN0ZW5lciNsb2dnZWQoTG9nRW50cnkpCgkgKi8KCXB1YmxpYyB2b2lkIGFkZExvZ0xpc3RlbmVyKExvZ0xpc3RlbmVyIGxpc3RlbmVyKTsKCgkvKioKCSAqIFVuc3Vic2NyaWJlcyB0byA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0cy4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCB1bnJlZ2lzdGVycyBhIDxjb2RlPkxvZ0xpc3RlbmVyPC9jb2RlPiBvYmplY3QgZnJvbSB0aGUgTG9nCgkgKiBSZWFkZXIgU2VydmljZS4KCSAqIAoJICogPHA+CgkgKiBJZiA8Y29kZT5saXN0ZW5lcjwvY29kZT4gaXMgbm90IGNvbnRhaW5lZCBpbiB0aGlzIExvZyBSZWFkZXIgU2VydmljZSdzIGxpc3QKCSAqIG9mIGxpc3RlbmVycywgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgoJICogCgkgKiBAcGFyYW0gbGlzdGVuZXIgQSA8Y29kZT5Mb2dMaXN0ZW5lcjwvY29kZT4gb2JqZWN0IHRvIHVucmVnaXN0ZXIuCgkgKiBAc2VlIExvZ0xpc3RlbmVyCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZUxvZ0xpc3RlbmVyKExvZ0xpc3RlbmVyIGxpc3RlbmVyKTsKCgkvKioKCSAqIFJldHVybnMgYW4gPGNvZGU+RW51bWVyYXRpb248L2NvZGU+IG9mIGFsbCA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0cyBpbgoJICogdGhlIGxvZy4KCSAqIAoJICogPHA+CgkgKiBFYWNoIGVsZW1lbnQgb2YgdGhlIGVudW1lcmF0aW9uIGlzIGEgPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdCwgb3JkZXJlZAoJICogd2l0aCB0aGUgbW9zdCByZWNlbnQgZW50cnkgZmlyc3QuIFdoZXRoZXIgdGhlIGVudW1lcmF0aW9uIGlzIG9mIGFsbAoJICogPGNvZGU+TG9nRW50cnk8L2NvZGU+IG9iamVjdHMgc2luY2UgdGhlIExvZyBTZXJ2aWNlIHdhcyBzdGFydGVkIG9yIHNvbWUKCSAqIHJlY2VudCBwYXN0IGlzIGltcGxlbWVudGF0aW9uLXNwZWNpZmljLiBBbHNvIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGlzCgkgKiB3aGV0aGVyIGluZm9ybWF0aW9uYWwgYW5kIGRlYnVnIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPiBvYmplY3RzIGFyZSBpbmNsdWRlZAoJICogaW4gdGhlIGVudW1lcmF0aW9uLgoJICogQHJldHVybiBBbiA8Y29kZT5FbnVtZXJhdGlvbjwvY29kZT4gb2YgYWxsIDxjb2RlPkxvZ0VudHJ5PC9jb2RlPiBvYmplY3RzIGluCgkgKiB0aGUgbG9nLgoJICovCglwdWJsaWMgRW51bWVyYXRpb24gZ2V0TG9nKCk7Cn0KUEsDBAoAAAAAAGtS7jTr1b2x7RMAAO0TAAAxAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1NlcnZpY2UuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UubG9nL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dTZXJ2aWNlLmphdmEsdiAxLjkgMjAwNi8wNi8xNiAxNjozMTo0OSBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDAsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5sb2c7CgppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CgovKioKICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgYnVuZGxlcyB0byB3cml0ZSBtZXNzYWdlcyB0byB0aGUgbG9nLgogKiAKICogPHA+CiAqIDxjb2RlPkxvZ1NlcnZpY2U8L2NvZGU+IG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRvIGxvZyBtZXNzYWdlczsgb3B0aW9uYWxseSB3aXRoIGEKICogPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IG9yIGFuIGV4Y2VwdGlvbi4KICogCiAqIDxwPgogKiBCdW5kbGVzIG11c3QgbG9nIG1lc3NhZ2VzIGluIHRoZSBPU0dpIGVudmlyb25tZW50IHdpdGggYSBzZXZlcml0eSBsZXZlbAogKiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6CiAqIDxvbD4KICogPGxpPntAbGluayAjTE9HX0VSUk9SfQogKiA8bGk+e0BsaW5rICNMT0dfV0FSTklOR30KICogPGxpPntAbGluayAjTE9HX0lORk99CiAqIDxsaT57QGxpbmsgI0xPR19ERUJVR30KICogPC9vbD4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICovCnB1YmxpYyBpbnRlcmZhY2UgTG9nU2VydmljZSB7CgkvKioKCSAqIEFuIGVycm9yIG1lc3NhZ2UgKFZhbHVlIDEpLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbG9nIGVudHJ5IGluZGljYXRlcyB0aGUgYnVuZGxlIG9yIHNlcnZpY2UgbWF5IG5vdCBiZSBmdW5jdGlvbmFsLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlMT0dfRVJST1IJPSAxOwoJLyoqCgkgKiBBIHdhcm5pbmcgbWVzc2FnZSAoVmFsdWUgMikuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBsb2cgZW50cnkgaW5kaWNhdGVzIGEgYnVuZGxlIG9yIHNlcnZpY2UgaXMgc3RpbGwgZnVuY3Rpb25pbmcgYnV0IG1heQoJICogZXhwZXJpZW5jZSBwcm9ibGVtcyBpbiB0aGUgZnV0dXJlIGJlY2F1c2Ugb2YgdGhlIHdhcm5pbmcgY29uZGl0aW9uLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlMT0dfV0FSTklORwk9IDI7CgkvKioKCSAqIEFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAoVmFsdWUgMykuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBsb2cgZW50cnkgbWF5IGJlIHRoZSByZXN1bHQgb2YgYW55IGNoYW5nZSBpbiB0aGUgYnVuZGxlIG9yIHNlcnZpY2UKCSAqIGFuZCBkb2VzIG5vdCBpbmRpY2F0ZSBhIHByb2JsZW0uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CUxPR19JTkZPCT0gMzsKCS8qKgoJICogQSBkZWJ1Z2dpbmcgbWVzc2FnZSAoVmFsdWUgNCkuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBsb2cgZW50cnkgaXMgdXNlZCBmb3IgcHJvYmxlbSBkZXRlcm1pbmF0aW9uIGFuZCBtYXkgYmUgaXJyZWxldmFudCB0bwoJICogYW55b25lIGJ1dCB0aGUgYnVuZGxlIGRldmVsb3Blci4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQJTE9HX0RFQlVHCT0gNDsKCgkvKioKCSAqIExvZ3MgYSBtZXNzYWdlLgoJICogCgkgKiA8cD4KCSAqIFRoZSA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBmaWVsZCBhbmQgdGhlIDxjb2RlPlRocm93YWJsZTwvY29kZT4gZmllbGQKCSAqIG9mIHRoZSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0IHdpbGwgYmUgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LgoJICogCgkgKiBAcGFyYW0gbGV2ZWwgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLiBUaGlzIHNob3VsZCBiZSBvbmUgb2YgdGhlCgkgKiAgICAgICAgZGVmaW5lZCBsb2cgbGV2ZWxzIGJ1dCBtYXkgYmUgYW55IGludGVnZXIgdGhhdCBpcyBpbnRlcnByZXRlZCBpbiBhCgkgKiAgICAgICAgdXNlciBkZWZpbmVkIHdheS4KCSAqIEBwYXJhbSBtZXNzYWdlIEh1bWFuIHJlYWRhYmxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb25kaXRpb24gb3IKCSAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIEBzZWUgI0xPR19FUlJPUgoJICogQHNlZSAjTE9HX1dBUk5JTkcKCSAqIEBzZWUgI0xPR19JTkZPCgkgKiBAc2VlICNMT0dfREVCVUcKCSAqLwoJcHVibGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpOwoKCS8qKgoJICogTG9ncyBhIG1lc3NhZ2Ugd2l0aCBhbiBleGNlcHRpb24uCgkgKiAKCSAqIDxwPgoJICogVGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IGZpZWxkIG9mIHRoZSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gb2JqZWN0CgkgKiB3aWxsIGJlIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIAoJICogQHBhcmFtIGxldmVsIFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4gVGhpcyBzaG91bGQgYmUgb25lIG9mIHRoZQoJICogICAgICAgIGRlZmluZWQgbG9nIGxldmVscyBidXQgbWF5IGJlIGFueSBpbnRlZ2VyIHRoYXQgaXMgaW50ZXJwcmV0ZWQgaW4gYQoJICogICAgICAgIHVzZXIgZGVmaW5lZCB3YXkuCgkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgaHVtYW4gcmVhZGFibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBvcgoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRoYXQgcmVmbGVjdHMgdGhlIGNvbmRpdGlvbiBvcgoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHNlZSAjTE9HX0VSUk9SCgkgKiBAc2VlICNMT0dfV0FSTklORwoJICogQHNlZSAjTE9HX0lORk8KCSAqIEBzZWUgI0xPR19ERUJVRwoJICovCglwdWJsaWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbik7CgoJLyoqCgkgKiBMb2dzIGEgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPgoJICogb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFRoZSA8Y29kZT5UaHJvd2FibGU8L2NvZGU+IGZpZWxkIG9mIHRoZSA8Y29kZT5Mb2dFbnRyeTwvY29kZT4gd2lsbCBiZSBzZXQgdG8KCSAqIDxjb2RlPm51bGw8L2NvZGU+LgoJICogCgkgKiBAcGFyYW0gc3IgVGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUgc2VydmljZSB0aGF0IHRoaXMKCSAqICAgICAgICBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBvciA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIEBwYXJhbSBsZXZlbCBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuIFRoaXMgc2hvdWxkIGJlIG9uZSBvZiB0aGUKCSAqICAgICAgICBkZWZpbmVkIGxvZyBsZXZlbHMgYnV0IG1heSBiZSBhbnkgaW50ZWdlciB0aGF0IGlzIGludGVycHJldGVkIGluIGEKCSAqICAgICAgICB1c2VyIGRlZmluZWQgd2F5LgoJICogQHBhcmFtIG1lc3NhZ2UgSHVtYW4gcmVhZGFibGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbmRpdGlvbiBvcgoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHNlZSAjTE9HX0VSUk9SCgkgKiBAc2VlICNMT0dfV0FSTklORwoJICogQHNlZSAjTE9HX0lORk8KCSAqIEBzZWUgI0xPR19ERUJVRwoJICovCglwdWJsaWMgdm9pZCBsb2coU2VydmljZVJlZmVyZW5jZSBzciwgaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSk7CgoJLyoqCgkgKiBMb2dzIGEgbWVzc2FnZSB3aXRoIGFuIGV4Y2VwdGlvbiBhc3NvY2lhdGVkIGFuZCBhCgkgKiA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBzciBUaGUgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IG9mIHRoZSBzZXJ2aWNlIHRoYXQgdGhpcwoJICogICAgICAgIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoLgoJICogQHBhcmFtIGxldmVsIFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZS4gVGhpcyBzaG91bGQgYmUgb25lIG9mIHRoZQoJICogICAgICAgIGRlZmluZWQgbG9nIGxldmVscyBidXQgbWF5IGJlIGFueSBpbnRlZ2VyIHRoYXQgaXMgaW50ZXJwcmV0ZWQgaW4gYQoJICogICAgICAgIHVzZXIgZGVmaW5lZCB3YXkuCgkgKiBAcGFyYW0gbWVzc2FnZSBIdW1hbiByZWFkYWJsZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY29uZGl0aW9uIG9yCgkgKiAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCByZWZsZWN0cyB0aGUgY29uZGl0aW9uIG9yCgkgKiAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAc2VlICNMT0dfRVJST1IKCSAqIEBzZWUgI0xPR19XQVJOSU5HCgkgKiBAc2VlICNMT0dfSU5GTwoJICogQHNlZSAjTE9HX0RFQlVHCgkgKi8KCXB1YmxpYyB2b2lkIGxvZyhTZXJ2aWNlUmVmZXJlbmNlIHNyLCBpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLAoJCQlUaHJvd2FibGUgZXhjZXB0aW9uKTsKfQpQSwMECgAAAAAAa1LuNMHi80t5AQAAeQEAAC4AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLmxvZy9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvcGFja2FnZS5odG1sLHYgMS40IDIwMDYvMDcvMTIgMjE6MDc6MTUgaGFyZ3JhdmUgRXhwICQgLS0+DTxCT0RZPg08cD5Mb2cgU2VydmljZSBQYWNrYWdlIFZlcnNpb24gMS4zLg08cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UNaW4gdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuDUZvciBleGFtcGxlOg08cHJlPg1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuc2VydmljZS5sb2c7IHZlcnNpb249MS4zDTwvcHJlPg08L0JPRFk+DQ1QSwMECgAAAAAAa1LuNAbMLIUMAAAADAAAAC0AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvcGFja2FnZWluZm92ZXJzaW9uIDEuMwpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAACcAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9QSwMECgAAAAAAa1LuNHHZSdE6JwAAOicAAD8AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9BdHRyaWJ1dGVEZWZpbml0aW9uLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL0F0dHJpYnV0ZURlZmluaXRpb24uamF2YSx2IDEuMTMgMjAwNi8wNi8xNiAxNjozMToyMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UubWV0YXR5cGU7CgovKioKICogQW4gaW50ZXJmYWNlIHRvIGRlc2NyaWJlIGFuIGF0dHJpYnV0ZS4KICogCiAqIDxwPgogKiBBbiA8Y29kZT5BdHRyaWJ1dGVEZWZpbml0aW9uPC9jb2RlPiBvYmplY3QgZGVmaW5lcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkYXRhCiAqIHR5cGUgb2YgYSBwcm9wZXJ0eS9hdHRyaWJ1dGUuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTMgJAogKi8KcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVEZWZpbml0aW9uIHsKCS8qKgoJICogVGhlIDxjb2RlPlNUUklORzwvY29kZT4gKDEpIHR5cGUuCgkgKiAKCSAqIDxwPgoJICogQXR0cmlidXRlcyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIHN0b3JlZCBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+LAoJICogPGNvZGU+VmVjdG9yPC9jb2RlPiB3aXRoIDxjb2RlPlN0cmluZzwvY29kZT4gb3IgPGNvZGU+U3RyaW5nW108L2NvZGU+IG9iamVjdHMsCgkgKiBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmdldENhcmRpbmFsaXR5KCk8L2NvZGU+IHZhbHVlLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlTVFJJTkcJCT0gMTsKCS8qKgoJICogVGhlIDxjb2RlPkxPTkc8L2NvZGU+ICgyKSB0eXBlLgoJICogCgkgKiBBdHRyaWJ1dGVzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgc3RvcmVkIGFzIDxjb2RlPkxvbmc8L2NvZGU+LAoJICogPGNvZGU+VmVjdG9yPC9jb2RlPiB3aXRoIDxjb2RlPkxvbmc8L2NvZGU+IG9yIDxjb2RlPmxvbmdbXTwvY29kZT4gb2JqZWN0cywKCSAqIGRlcGVuZGluZyBvbiB0aGUgPGNvZGU+Z2V0Q2FyZGluYWxpdHkoKTwvY29kZT4gdmFsdWUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CUxPTkcJCT0gMjsKCS8qKgoJICogVGhlIDxjb2RlPklOVEVHRVI8L2NvZGU+ICgzKSB0eXBlLgoJICogCgkgKiBBdHRyaWJ1dGVzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgc3RvcmVkIGFzIDxjb2RlPkludGVnZXI8L2NvZGU+LAoJICogPGNvZGU+VmVjdG9yPC9jb2RlPiB3aXRoIDxjb2RlPkludGVnZXI8L2NvZGU+IG9yIDxjb2RlPmludFtdPC9jb2RlPiBvYmplY3RzLAoJICogZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5nZXRDYXJkaW5hbGl0eSgpPC9jb2RlPiB2YWx1ZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQJSU5URUdFUgkJPSAzOwoJLyoqCgkgKiBUaGUgPGNvZGU+U0hPUlQ8L2NvZGU+ICg0KSB0eXBlLgoJICogCgkgKiBBdHRyaWJ1dGVzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgc3RvcmVkIGFzIDxjb2RlPlNob3J0PC9jb2RlPiwKCSAqIDxjb2RlPlZlY3RvcjwvY29kZT4gd2l0aCA8Y29kZT5TaG9ydDwvY29kZT4gb3IgPGNvZGU+c2hvcnRbXTwvY29kZT4gb2JqZWN0cywKCSAqIGRlcGVuZGluZyBvbiB0aGUgPGNvZGU+Z2V0Q2FyZGluYWxpdHkoKTwvY29kZT4gdmFsdWUuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CVNIT1JUCQk9IDQ7CgkvKioKCSAqIFRoZSA8Y29kZT5DSEFSQUNURVI8L2NvZGU+ICg1KSB0eXBlLgoJICogCgkgKiBBdHRyaWJ1dGVzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgc3RvcmVkIGFzIDxjb2RlPkNoYXJhY3RlcjwvY29kZT4sCgkgKiA8Y29kZT5WZWN0b3I8L2NvZGU+IHdpdGggPGNvZGU+Q2hhcmFjdGVyPC9jb2RlPiBvciA8Y29kZT5jaGFyW108L2NvZGU+IG9iamVjdHMsCgkgKiBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmdldENhcmRpbmFsaXR5KCk8L2NvZGU+IHZhbHVlLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlDSEFSQUNURVIJPSA1OwoJLyoqCgkgKiBUaGUgPGNvZGU+QllURTwvY29kZT4gKDYpIHR5cGUuCgkgKiAKCSAqIEF0dHJpYnV0ZXMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBzdG9yZWQgYXMgPGNvZGU+Qnl0ZTwvY29kZT4sCgkgKiA8Y29kZT5WZWN0b3I8L2NvZGU+IHdpdGggPGNvZGU+Qnl0ZTwvY29kZT4gb3IgPGNvZGU+Ynl0ZVtdPC9jb2RlPiBvYmplY3RzLAoJICogZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5nZXRDYXJkaW5hbGl0eSgpPC9jb2RlPiB2YWx1ZS4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQJQllURQkJPSA2OwoJLyoqCgkgKiBUaGUgPGNvZGU+RE9VQkxFPC9jb2RlPiAoNykgdHlwZS4KCSAqIAoJICogQXR0cmlidXRlcyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIHN0b3JlZCBhcyA8Y29kZT5Eb3VibGU8L2NvZGU+LAoJICogPGNvZGU+VmVjdG9yPC9jb2RlPiB3aXRoIDxjb2RlPkRvdWJsZTwvY29kZT4gb3IgPGNvZGU+ZG91YmxlW108L2NvZGU+IG9iamVjdHMsCgkgKiBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmdldENhcmRpbmFsaXR5KCk8L2NvZGU+IHZhbHVlLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlET1VCTEUJCT0gNzsKCS8qKgoJICogVGhlIDxjb2RlPkZMT0FUPC9jb2RlPiAoOCkgdHlwZS4KCSAqIAoJICogQXR0cmlidXRlcyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIHN0b3JlZCBhcyA8Y29kZT5GbG9hdDwvY29kZT4sCgkgKiA8Y29kZT5WZWN0b3I8L2NvZGU+IHdpdGggPGNvZGU+RmxvYXQ8L2NvZGU+IG9yIDxjb2RlPmZsb2F0W108L2NvZGU+IG9iamVjdHMsCgkgKiBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPmdldENhcmRpbmFsaXR5KCk8L2NvZGU+IHZhbHVlLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlGTE9BVAkJPSA4OwoJLyoqCgkgKiBUaGUgPGNvZGU+QklHSU5URUdFUjwvY29kZT4gKDkpIHR5cGUuCgkgKiAKCSAqIEF0dHJpYnV0ZXMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBzdG9yZWQgYXMgPGNvZGU+QmlnSW50ZWdlcjwvY29kZT4sCgkgKiA8Y29kZT5WZWN0b3I8L2NvZGU+IHdpdGggPGNvZGU+QmlnSW50ZWdlcjwvY29kZT4gb3IgPGNvZGU+QmlnSW50ZWdlcltdPC9jb2RlPgoJICogb2JqZWN0cywgZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5nZXRDYXJkaW5hbGl0eSgpPC9jb2RlPiB2YWx1ZS4KCSAqIAoJICogQGRlcHJlY2F0ZWQgQXMgb2YgMS4xLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlCSUdJTlRFR0VSCT0gOTsKCS8qKgoJICogVGhlIDxjb2RlPkJJR0RFQ0lNQUw8L2NvZGU+ICgxMCkgdHlwZS4KCSAqIAoJICogQXR0cmlidXRlcyBvZiB0aGlzIHR5cGUgc2hvdWxkIGJlIHN0b3JlZCBhcyA8Y29kZT5CaWdEZWNpbWFsPC9jb2RlPiwKCSAqIDxjb2RlPlZlY3RvcjwvY29kZT4gd2l0aCA8Y29kZT5CaWdEZWNpbWFsPC9jb2RlPiBvciA8Y29kZT5CaWdEZWNpbWFsW108L2NvZGU+CgkgKiBvYmplY3RzIGRlcGVuZGluZyBvbiA8Y29kZT5nZXRDYXJkaW5hbGl0eSgpPC9jb2RlPi4KCSAqIAoJICogQGRlcHJlY2F0ZWQgQXMgb2YgMS4xLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlCSUdERUNJTUFMCT0gMTA7CgkvKioKCSAqIFRoZSA8Y29kZT5CT09MRUFOPC9jb2RlPiAoMTEpIHR5cGUuCgkgKiAKCSAqIEF0dHJpYnV0ZXMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBzdG9yZWQgYXMgPGNvZGU+Qm9vbGVhbjwvY29kZT4sCgkgKiA8Y29kZT5WZWN0b3I8L2NvZGU+IHdpdGggPGNvZGU+Qm9vbGVhbjwvY29kZT4gb3IgPGNvZGU+Ym9vbGVhbltdPC9jb2RlPiBvYmplY3RzCgkgKiBkZXBlbmRpbmcgb24gPGNvZGU+Z2V0Q2FyZGluYWxpdHkoKTwvY29kZT4uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CUJPT0xFQU4JCT0gMTE7CgoJLyoqCgkgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gVGhpcyBuYW1lIG1heSBiZSBsb2NhbGl6ZWQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGxvY2FsaXplZCBuYW1lIG9mIHRoZSBkZWZpbml0aW9uLgoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKCgkvKioKCSAqIFVuaXF1ZSBpZGVudGl0eSBmb3IgdGhpcyBhdHRyaWJ1dGUuCgkgKiAKCSAqIEF0dHJpYnV0ZXMgc2hhcmUgYSBnbG9iYWwgbmFtZXNwYWNlIGluIHRoZSByZWdpc3RyeS4gRS5nLiBhbiBhdHRyaWJ1dGUKCSAqIDxjb2RlPmNuPC9jb2RlPiBvciA8Y29kZT5jb21tb25OYW1lPC9jb2RlPiBtdXN0IGFsd2F5cyBiZSBhIDxjb2RlPlN0cmluZzwvY29kZT4KCSAqIGFuZCB0aGUgc2VtYW50aWNzIGFyZSBhbHdheXMgYSBuYW1lIG9mIHNvbWUgb2JqZWN0LiBUaGV5IHNoYXJlIHRoaXMKCSAqIGFzcGVjdCB3aXRoIExEQVAvWC41MDAgYXR0cmlidXRlcy4gSW4gdGhlc2Ugc3RhbmRhcmRzIHRoZSBPU0kgT2JqZWN0CgkgKiBJZGVudGlmaWVyIChPSUQpIGlzIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYW4gYXR0cmlidXRlLiBJZiBzdWNoIGFuCgkgKiBPSUQgZXhpc3RzLCAod2hpY2ggY2FuIGJlIHJlcXVlc3RlZCBhdCBzZXZlcmFsIHN0YW5kYXJkIG9yZ2FuaXNhdGlvbnMgYW5kCgkgKiBtYW55IGNvbXBhbmllcyBhbHJlYWR5IGhhdmUgYSBub2RlIGluIHRoZSB0cmVlKSBpdCBjYW4gYmUgcmV0dXJuZWQgaGVyZS4KCSAqIE90aGVyd2lzZSwgYSB1bmlxdWUgaWQgc2hvdWxkIGJlIHJldHVybmVkIHdoaWNoIGNhbiBiZSBhIEphdmEgY2xhc3MgbmFtZQoJICogKHJldmVyc2UgZG9tYWluIG5hbWUpIG9yIGdlbmVyYXRlZCB3aXRoIGEgR1VJRCBhbGdvcml0aG0uIE5vdGUgdGhhdCBhbGwKCSAqIExEQVAgZGVmaW5lZCBhdHRyaWJ1dGVzIGFscmVhZHkgaGF2ZSBhbiBPSUQuIEl0IGlzIHN0cm9uZ2x5IGFkdmlzZWQgdG8KCSAqIGRlZmluZSB0aGUgYXR0cmlidXRlcyBmcm9tIGV4aXN0aW5nIExEQVAgc2NoZW1lcyB3aGljaCB3aWxsIGdpdmUgdGhlIE9JRC4KCSAqIE1hbnkgc3VjaCBzY2hlbWVzIGV4aXN0IHJhbmdpbmcgZnJvbSBwb3N0YWwgYWRkcmVzc2VzIHRvIERIQ1AgcGFyYW1ldGVycy4KCSAqIAoJICogQHJldHVybiBUaGUgaWQgb3Igb2lkCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKCgkvKioKCSAqIFJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgYXR0cmlidXRlLgoJICogCgkgKiBUaGUgZGVzY3JpcHRpb24gbWF5IGJlIGxvY2FsaXplZCBhbmQgbXVzdCBkZXNjcmliZSB0aGUgc2VtYW50aWNzIG9mIHRoaXMKCSAqIHR5cGUgYW5kIGFueSBjb25zdHJhaW50cy4KCSAqIAoJICogQHJldHVybiBUaGUgbG9jYWxpemVkIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWZpbml0aW9uLgoJICovCglwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7CgoJLyoqCgkgKiBSZXR1cm4gdGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgYXR0cmlidXRlLgoJICogCgkgKiBUaGUgT1NHaSBlbnZpcm9ubWVudCBoYW5kbGVzIG11bHRpIHZhbHVlZCBhdHRyaWJ1dGVzIGluIGFycmF5cyAoW10pIG9yIGluCgkgKiA8Y29kZT5WZWN0b3I8L2NvZGU+IG9iamVjdHMuIFRoZSByZXR1cm4gdmFsdWUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgoJICogCgkgKiA8cHJlPgoJICogCgkgKiAgICB4ID0gSW50ZWdlci5NSU5fVkFMVUUgICAgbm8gbGltaXQsIGJ1dCB1c2UgVmVjdG9yCgkgKiAgICB4ICZsdDsgMCAgICAgICAgICAgICAgICAgICAgLXggPSBtYXggb2NjdXJyZW5jZXMsIHN0b3JlIGluIFZlY3RvcgoJICogICAgeCAmZ3Q7IDAgICAgICAgICAgICAgICAgICAgICB4ID0gbWF4IG9jY3VycmVuY2VzLCBzdG9yZSBpbiBhcnJheSBbXQoJICogICAgeCA9IEludGVnZXIuTUFYX1ZBTFVFICAgIG5vIGxpbWl0LCBidXQgdXNlIGFycmF5IFtdCgkgKiAgICB4ID0gMCAgICAgICAgICAgICAgICAgICAgIDEgb2NjdXJyZW5jZSByZXF1aXJlZAoJICogIAoJICogPC9wcmU+CgkgKiAKCSAqIEByZXR1cm4gVGhlIGNhcmRpbmFsaXR5IG9mIHRoaXMgYXR0cmlidXRlLiAKCSAqLwoJcHVibGljIGludCBnZXRDYXJkaW5hbGl0eSgpOwoKCS8qKgoJICogUmV0dXJuIHRoZSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZS4KCSAqIAoJICogPHA+CgkgKiBEZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHdoaWNoIG1hcCB0byB0aGUgYXBwcm9wcmlhdGUgSmF2YQoJICogdHlwZS4gPGNvZGU+U1RSSU5HPC9jb2RlPiw8Y29kZT5MT05HPC9jb2RlPiw8Y29kZT5JTlRFR0VSPC9jb2RlPiwKCSAqIDxjb2RlPkNIQVI8L2NvZGU+LDxjb2RlPkJZVEU8L2NvZGU+LDxjb2RlPkRPVUJMRTwvY29kZT4sPGNvZGU+RkxPQVQ8L2NvZGU+LAoJICogPGNvZGU+Qk9PTEVBTjwvY29kZT4uCgkgKgoJICogQHJldHVybiBUaGUgdHlwZSBmb3IgdGhpcyBhdHRyaWJ1dGUuCgkgKi8KCXB1YmxpYyBpbnQgZ2V0VHlwZSgpOwoKCS8qKgoJICogUmV0dXJuIGEgbGlzdCBvZiBvcHRpb24gdmFsdWVzIHRoYXQgdGhpcyBhdHRyaWJ1dGUgY2FuIHRha2UuCgkgKiAKCSAqIDxwPgoJICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZXJlIGFyZSBubyBvcHRpb24gdmFsdWVzCgkgKiBhdmFpbGFibGUuCgkgKiAKCSAqIDxwPgoJICogRWFjaCB2YWx1ZSBtdXN0IGJlIGFjY2VwdGFibGUgdG8gdmFsaWRhdGUoKSAocmV0dXJuICIiKSBhbmQgbXVzdCBiZSBhCgkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIGRhdGEgdHlwZSBkZWZpbmVkCgkgKiBieSBnZXRUeXBlKCkgZm9yIHRoaXMgYXR0cmlidXRlLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbGlzdCBtdXN0IGJlIGluIHRoZSBzYW1lIHNlcXVlbmNlIGFzIDxjb2RlPmdldE9wdGlvbkxhYmVscygpPC9jb2RlPi4KCSAqIEkuZS4gZm9yIGVhY2ggaW5kZXggaSBpbiA8Y29kZT5nZXRPcHRpb25WYWx1ZXM8L2NvZGU+LCBpIGluCgkgKiA8Y29kZT5nZXRPcHRpb25MYWJlbHMoKTwvY29kZT4gc2hvdWxkIGJlIHRoZSBsYWJlbC4KCSAqIAoJICogPHA+CgkgKiBGb3IgZXhhbXBsZSwgaWYgYW4gYXR0cmlidXRlIGNhbiBoYXZlIHRoZSB2YWx1ZSBtYWxlLCBmZW1hbGUsIHVua25vd24sCgkgKiB0aGlzIGxpc3QgY2FuIHJldHVybgoJICogPGNvZGU+bmV3IFN0cmluZ1tdIHsgIm1hbGUiLCAiZmVtYWxlIiwgInVua25vd24iIH08L2NvZGU+LgoJICogCgkgKiBAcmV0dXJuIEEgbGlzdCB2YWx1ZXMKCSAqLwoJcHVibGljIFN0cmluZ1tdIGdldE9wdGlvblZhbHVlcygpOwoKCS8qKgoJICogUmV0dXJuIGEgbGlzdCBvZiBsYWJlbHMgb2Ygb3B0aW9uIHZhbHVlcy4KCSAqIAoJICogPHA+CgkgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBhbGxvdyBtZW51cyB3aXRoIGxvY2FsaXplZCBsYWJlbHMuIEl0IGlzCgkgKiBhc3NvY2lhdGVkIHdpdGggPGNvZGU+Z2V0T3B0aW9uVmFsdWVzPC9jb2RlPi4gVGhlIGxhYmVscyByZXR1cm5lZCBoZXJlIGFyZQoJICogb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHZhbHVlcyBpbiB0aGF0IG1ldGhvZC4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlcmUgYXJlIG5vIG9wdGlvbiBsYWJlbHMKCSAqIGF2YWlsYWJsZS4KCSAqIDxwPgoJICogVGhpcyBsaXN0IG11c3QgYmUgaW4gdGhlIHNhbWUgc2VxdWVuY2UgYXMgdGhlIDxjb2RlPmdldE9wdGlvblZhbHVlcygpPC9jb2RlPgoJICogbWV0aG9kLiBJLmUuIGZvciBlYWNoIGluZGV4IGkgaW4gPGNvZGU+Z2V0T3B0aW9uTGFiZWxzPC9jb2RlPiwgaSBpbgoJICogPGNvZGU+Z2V0T3B0aW9uVmFsdWVzKCk8L2NvZGU+IHNob3VsZCBiZSB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KCSAqIAoJICogPHA+CgkgKiBGb3IgZXhhbXBsZSwgaWYgYW4gYXR0cmlidXRlIGNhbiBoYXZlIHRoZSB2YWx1ZSBtYWxlLCBmZW1hbGUsIHVua25vd24sCgkgKiB0aGlzIGxpc3QgY2FuIHJldHVybiAoZm9yIGR1dGNoKQoJICogPGNvZGU+bmV3IFN0cmluZ1tdIHsgIk1hbiIsICJWcm91dyIsICJPbmJla2VuZCIgfTwvY29kZT4uCgkgKiAKCSAqIEByZXR1cm4gQSBsaXN0IHZhbHVlcwoJICovCglwdWJsaWMgU3RyaW5nW10gZ2V0T3B0aW9uTGFiZWxzKCk7CgoJLyoqCgkgKiBWYWxpZGF0ZSBhbiBhdHRyaWJ1dGUgaW4gPGNvZGU+U3RyaW5nPC9jb2RlPiBmb3JtLgoJICogCgkgKiBBbiBhdHRyaWJ1dGUgbWlnaHQgYmUgZnVydGhlciBjb25zdHJhaW5lZCBpbiB2YWx1ZS4gVGhpcyBtZXRob2Qgd2lsbAoJICogYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGFjY29yZGluZyB0byB0aGVzZSBjb25zdHJhaW50cy4gSXQgY2FuCgkgKiByZXR1cm4gdGhyZWUgZGlmZmVyZW50IHZhbHVlczoKCSAqIAoJICogPHByZT4KCSAqICBudWxsICAgICAgICAgICBObyB2YWxpZGF0aW9uIHByZXNlbnQKCSAqICAiIiAgICAgICAgICAgICBObyBwcm9ibGVtcyBkZXRlY3RlZAoJICogICIuLi4iICAgICAgICAgIEEgbG9jYWxpemVkIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGUgdmFsdWUgaXMgd3JvbmcKCSAqIDwvcHJlPgoJICogCgkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGJlZm9yZSB0dXJuaW5nIGl0IGludG8gdGhlIGJhc2ljIGRhdGEgdHlwZQoJICogQHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiwgIiIsIG9yIGFub3RoZXIgc3RyaW5nCgkgKi8KCXB1YmxpYyBTdHJpbmcgdmFsaWRhdGUoU3RyaW5nIHZhbHVlKTsKCgkvKioKCSAqIFJldHVybiBhIGRlZmF1bHQgZm9yIHRoaXMgYXR0cmlidXRlLgoJICogCgkgKiBUaGUgb2JqZWN0IG11c3QgYmUgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgYXMgZGVmaW5lZCBieSB0aGUgY2FyZGluYWxpdHkKCSAqIGFuZCA8Y29kZT5nZXRUeXBlKCk8L2NvZGU+LiBUaGUgcmV0dXJuIHR5cGUgaXMgYSBsaXN0IG9mIDxjb2RlPlN0cmluZzwvY29kZT4KCSAqIG9iamVjdHMgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLiBUaGUgY2FyZGluYWxpdHkgb2YKCSAqIHRoZSByZXR1cm4gYXJyYXkgbXVzdCBmb2xsb3cgdGhlIGFic29sdXRlIGNhcmRpbmFsaXR5IG9mIHRoaXMgdHlwZS4gRS5nLgoJICogaWYgdGhlIGNhcmRpbmFsaXR5ID0gMCwgdGhlIGFycmF5IG11c3QgY29udGFpbiAxIGVsZW1lbnQuIElmIHRoZQoJICogY2FyZGluYWxpdHkgaXMgMSwgaXQgbXVzdCBjb250YWluIDAgb3IgMSBlbGVtZW50cy4gSWYgaXQgaXMgLTUsIGl0IG11c3QKCSAqIGNvbnRhaW4gZnJvbSAwIHRvIG1heCA1IGVsZW1lbnRzLiBOb3RlIHRoYXQgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIDAKCSAqIGNhcmRpbmFsaXR5LCBtZWFuaW5nIGEgc2luZ2xlIHZhbHVlLCBkb2VzIG5vdCBhbGxvdyBhcnJheXMgb3IgdmVjdG9ycyBvZgoJICogMCBlbGVtZW50cy4KCSAqIAoJICogQHJldHVybiBSZXR1cm4gYSBkZWZhdWx0IHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGRlZmF1bHQgZXhpc3RzLgoJICovCglwdWJsaWMgU3RyaW5nW10gZ2V0RGVmYXVsdFZhbHVlKCk7Cn0KUEsDBAoAAAAAAGtS7jRslXTrjAYAAIwGAAA/AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVJbmZvcm1hdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5tZXRhdHlwZS9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZUluZm9ybWF0aW9uLmphdmEsdiAxLjggMjAwNi8wNi8xNiAxNjozMToyMyBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA1LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlOwoKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CgovKioKICogQSBNZXRhVHlwZSBJbmZvcm1hdGlvbiBvYmplY3QgaXMgY3JlYXRlZCBieSB0aGUgTWV0YVR5cGVTZXJ2aWNlIHRvIHJldHVybgogKiBtZXRhIHR5cGUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgYnVuZGxlLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAogKiBAc2luY2UgMS4xCiAqLwpwdWJsaWMgaW50ZXJmYWNlIE1ldGFUeXBlSW5mb3JtYXRpb24gZXh0ZW5kcyBNZXRhVHlwZVByb3ZpZGVyIHsKCS8qKgoJICogUmV0dXJuIHRoZSBQSURzIChmb3IgTWFuYWdlZFNlcnZpY2VzKSBmb3Igd2hpY2ggT2JqZWN0Q2xhc3NEZWZpbml0aW9uCgkgKiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuCgkgKiAKCSAqIEByZXR1cm4gQXJyYXkgb2YgUElEcy4KCSAqLwoJcHVibGljIFN0cmluZ1tdIGdldFBpZHMoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgRmFjdG9yeSBQSURzIChmb3IgTWFuYWdlZFNlcnZpY2VGYWN0b3JpZXMpIGZvciB3aGljaAoJICogT2JqZWN0Q2xhc3NEZWZpbml0aW9uIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KCSAqIAoJICogQHJldHVybiBBcnJheSBvZiBGYWN0b3J5IFBJRHMuCgkgKi8KCXB1YmxpYyBTdHJpbmdbXSBnZXRGYWN0b3J5UGlkcygpOwoKCS8qKgoJICogUmV0dXJuIHRoZSBidW5kbGUgZm9yIHdoaWNoIHRoaXMgb2JqZWN0IHByb3ZpZGVzIG1ldGEgdHlwZSBpbmZvcm1hdGlvbi4KCSAqIAoJICogQHJldHVybiBCdW5kbGUgZm9yIHdoaWNoIHRoaXMgb2JqZWN0IHByb3ZpZGVzIG1ldGEgdHlwZSBpbmZvcm1hdGlvbi4KCSAqLwoJcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoKTsKfQpQSwMECgAAAAAAa1LuNLlAC4GBCAAAgQgAADwAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVByb3ZpZGVyLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlUHJvdmlkZXIuamF2YSx2IDEuMTEgMjAwNi8wNi8xNiAxNjozMToyMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UubWV0YXR5cGU7CgovKioKICogUHJvdmlkZXMgYWNjZXNzIHRvIG1ldGF0eXBlcy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMSAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIE1ldGFUeXBlUHJvdmlkZXIgewoJLyoqCgkgKiBSZXR1cm5zIGFuIG9iamVjdCBjbGFzcyBkZWZpbml0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGlkIGxvY2FsaXplZCB0byB0aGUKCSAqIHNwZWNpZmllZCBsb2NhbGUuCgkgKiAKCSAqIDxwPgoJICogVGhlIGxvY2FsZSBwYXJhbWV0ZXIgbXVzdCBiZSBhIG5hbWUgdGhhdCBjb25zaXN0cyBvZiA8Y29kZT5sYW5ndWFnZTwvY29kZT5bCgkgKiAiXyIgPGNvZGU+Y291bnRyeTwvY29kZT5bICJfIiA8Y29kZT52YXJpYXRpb248L2NvZGU+XSBdIGFzIGlzIGN1c3RvbWFyeSBpbgoJICogdGhlIDxjb2RlPkxvY2FsZTwvY29kZT4gY2xhc3MuIFRoaXMgPGNvZGU+TG9jYWxlPC9jb2RlPiBjbGFzcyBpcyBub3QgdXNlZAoJICogYmVjYXVzZSBjZXJ0YWluIHByb2ZpbGVzIGRvIG5vdCBjb250YWluIGl0LgoJICogCgkgKiBAcGFyYW0gaWQgVGhlIElEIG9mIHRoZSByZXF1ZXN0ZWQgb2JqZWN0IGNsYXNzLiBUaGlzIGNhbiBiZSBhIHBpZCBvcgoJICogICAgICAgIGZhY3RvcnkgcGlkIHJldHVybmVkIGJ5IGdldFBpZHMgb3IgZ2V0RmFjdG9yeVBpZHMuCgkgKiBAcGFyYW0gbG9jYWxlIFRoZSBsb2NhbGUgb2YgdGhlIGRlZmluaXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGRlZmF1bHQKCSAqICAgICAgICBsb2NhbGUuCgkgKiBAcmV0dXJuIEEgPGNvZGU+T2JqZWN0Q2xhc3NEZWZpbml0aW9uPC9jb2RlPiBvYmplY3QuCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiB0aGUgaWQgb3IgbG9jYWxlIGFyZ3VtZW50cyBhcmUgbm90CgkgKiAgICAgICAgIHZhbGlkCgkgKi8KCXB1YmxpYyBPYmplY3RDbGFzc0RlZmluaXRpb24gZ2V0T2JqZWN0Q2xhc3NEZWZpbml0aW9uKFN0cmluZyBpZCwgU3RyaW5nIGxvY2FsZSk7CgoJLyoqCgkgKiBSZXR1cm4gYSBsaXN0IG9mIGF2YWlsYWJsZSBsb2NhbGVzLgoJICogCgkgKiBUaGUgcmVzdWx0cyBtdXN0IGJlIG5hbWVzIHRoYXQgY29uc2lzdHMgb2YgbGFuZ3VhZ2UgWyBfIGNvdW50cnkgWyBfCgkgKiB2YXJpYXRpb24gXV0gYXMgaXMgY3VzdG9tYXJ5IGluIHRoZSA8Y29kZT5Mb2NhbGU8L2NvZGU+IGNsYXNzLgoJICogCgkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGxvY2FsZSBzdHJpbmdzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vCgkgKiAgICAgICAgIGxvY2FsZSBzcGVjaWZpYyBsb2NhbGl6YXRpb24gY2FuIGJlIGZvdW5kLgoJICogIAoJICovCglwdWJsaWMgU3RyaW5nW10gZ2V0TG9jYWxlcygpOwp9ClBLAwQKAAAAAABrUu40R4UqUpgIAACYCAAAOwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlU2VydmljZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5tZXRhdHlwZS9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVNlcnZpY2UuamF2YSx2IDEuMTAgMjAwNi8wNi8xNiAxNjozMToyMyBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA1LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlOwoKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CgovKioKICogVGhlIE1ldGFUeXBlIFNlcnZpY2UgY2FuIGJlIHVzZWQgdG8gb2J0YWluIG1ldGEgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYQogKiBidW5kbGUuIFRoZSBNZXRhVHlwZSBTZXJ2aWNlIHdpbGwgZXhhbWluZSB0aGUgc3BlY2lmaWVkIGJ1bmRsZSBmb3IgbWV0YSB0eXBlCiAqIGRvY3VtZW50cyB0byBjcmVhdGUgdGhlIHJldHVybmVkIDxjb2RlPk1ldGFUeXBlSW5mb3JtYXRpb248L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBJZiB0aGUgc3BlY2lmaWVkIGJ1bmRsZSBkb2VzIG5vdCBjb250YWluIGFueSBtZXRhIHR5cGUgZG9jdW1lbnRzLCB0aGVuIGEKICogPGNvZGU+TWV0YVR5cGVJbmZvcm1hdGlvbjwvY29kZT4gb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQgdGhhdCB3cmFwcGVycyBhbnkKICogPGNvZGU+TWFuYWdlZFNlcnZpY2U8L2NvZGU+IG9yIDxjb2RlPk1hbmFnZWRTZXJ2aWNlRmFjdG9yeTwvY29kZT4KICogc2VydmljZXMgcmVnaXN0ZXJlZCBieSB0aGUgc3BlY2lmaWVkIGJ1bmRsZSB0aGF0IGltcGxlbWVudAogKiA8Y29kZT5NZXRhVHlwZVByb3ZpZGVyPC9jb2RlPi4gVGh1cyB0aGUgTWV0YVR5cGUgU2VydmljZSBjYW4gYmUgdXNlZCB0bwogKiByZXRyaWV2ZSBtZXRhIHR5cGUgaW5mb3JtYXRpb24gZm9yIGJ1bmRsZXMgd2hpY2ggY29udGFpbiBhIG1ldGEgdHlwZQogKiBkb2N1bWVudHMgb3Igd2hpY2ggcHJvdmlkZSB0aGVpciBvd24gPGNvZGU+TWV0YVR5cGVQcm92aWRlcjwvY29kZT4gb2JqZWN0cy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqIEBzaW5jZSAxLjEKICovCnB1YmxpYyBpbnRlcmZhY2UgTWV0YVR5cGVTZXJ2aWNlIHsKCS8qKgoJICogUmV0dXJuIHRoZSBNZXRhVHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBidW5kbGUuCgkgKiAKCSAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSBmb3Igd2hpY2ggbWV0YSB0eXBlIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZC4KCSAqIEByZXR1cm4gQSBNZXRhVHlwZUluZm9ybWF0aW9uIG9iamVjdCBmb3IgdGhlIHNwZWNpZmllZCBidW5kbGUuCgkgKi8KCXB1YmxpYyBNZXRhVHlwZUluZm9ybWF0aW9uIGdldE1ldGFUeXBlSW5mb3JtYXRpb24oQnVuZGxlIGJ1bmRsZSk7CgoJLyoqCgkgKiBMb2NhdGlvbiBvZiBtZXRhIHR5cGUgZG9jdW1lbnRzLiBUaGUgTWV0YVR5cGUgU2VydmljZSB3aWxsIHByb2Nlc3MgZWFjaAoJICogZW50cnkgaW4gdGhlIG1ldGEgdHlwZSBkb2N1bWVudHMgZGlyZWN0b3J5LgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlNRVRBVFlQRV9ET0NVTUVOVFNfTE9DQVRJT04JPSAiT1NHSS1JTkYvbWV0YXR5cGUiOwp9ClBLAwQKAAAAAABrUu40rTdcBiwQAAAsEAAAQQAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL09iamVjdENsYXNzRGVmaW5pdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5tZXRhdHlwZS9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9PYmplY3RDbGFzc0RlZmluaXRpb24uamF2YSx2IDEuMTEgMjAwNi8wNi8xNiAxNjozMToyMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5tZXRhdHlwZTsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKCi8qKgogKiBEZXNjcmlwdGlvbiBmb3IgdGhlIGRhdGEgdHlwZSBpbmZvcm1hdGlvbiBvZiBhbiBvYmplY3RjbGFzcy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMSAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIE9iamVjdENsYXNzRGVmaW5pdGlvbiB7CgkvKioKCSAqIEFyZ3VtZW50IGZvciA8Y29kZT5nZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhpbnQpPC9jb2RlPi4KCSAqIDxwPgoJICogPGNvZGU+UkVRVUlSRUQ8L2NvZGU+IGluZGljYXRlcyB0aGF0IG9ubHkgdGhlIHJlcXVpcmVkIGRlZmluaXRpb25zIGFyZQoJICogcmV0dXJuZWQuIFRoZSB2YWx1ZSBpcyAxLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlSRVFVSVJFRAk9IDE7CgkvKioKCSAqIEFyZ3VtZW50IGZvciA8Y29kZT5nZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhpbnQpPC9jb2RlPi4KCSAqIDxwPgoJICogPGNvZGU+T1BUSU9OQUw8L2NvZGU+IGluZGljYXRlcyB0aGF0IG9ubHkgdGhlIG9wdGlvbmFsIGRlZmluaXRpb25zIGFyZQoJICogcmV0dXJuZWQuIFRoZSB2YWx1ZSBpcyAyLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAlPUFRJT05BTAk9IDI7CgkvKioKCSAqIEFyZ3VtZW50IGZvciA8Y29kZT5nZXRBdHRyaWJ1dGVEZWZpbml0aW9ucyhpbnQpPC9jb2RlPi4KCSAqIDxwPgoJICogPGNvZGU+QUxMPC9jb2RlPiBpbmRpY2F0ZXMgdGhhdCBhbGwgdGhlIGRlZmluaXRpb25zIGFyZSByZXR1cm5lZC4gVGhlIHZhbHVlCgkgKiBpcyAtMS4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQJQUxMCQkJPSAweEZGRkZGRkZGOwoKCS8qKgoJICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgb2JqZWN0IGNsYXNzLgoJICogCgkgKiBUaGUgbmFtZSBtYXkgYmUgbG9jYWxpemVkLgoJICogCgkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgb2JqZWN0IGNsYXNzLgoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgaWQgb2YgdGhpcyBvYmplY3QgY2xhc3MuCgkgKiAKCSAqIDxwPgoJICogPGNvZGU+T2JqZWN0RGVmaW50aW9uPC9jb2RlPiBvYmplY3RzIHNoYXJlIGEgZ2xvYmFsIG5hbWVzcGFjZSBpbiB0aGUKCSAqIHJlZ2lzdHJ5LiBUaGV5IHNoYXJlIHRoaXMgYXNwZWN0IHdpdGggTERBUC9YLjUwMCBhdHRyaWJ1dGVzLiBJbiB0aGVzZQoJICogc3RhbmRhcmRzIHRoZSBPU0kgT2JqZWN0IElkZW50aWZpZXIgKE9JRCkgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeQoJICogb2JqZWN0IGNsYXNzZXMuIElmIHN1Y2ggYW4gT0lEIGV4aXN0cywgKHdoaWNoIGNhbiBiZSByZXF1ZXN0ZWQgYXQgc2V2ZXJhbAoJICogc3RhbmRhcmQgb3JnYW5pc2F0aW9ucyBhbmQgbWFueSBjb21wYW5pZXMgYWxyZWFkeSBoYXZlIGEgbm9kZSBpbiB0aGUKCSAqIHRyZWUpIGl0IGNhbiBiZSByZXR1cm5lZCBoZXJlLiBPdGhlcndpc2UsIGEgdW5pcXVlIGlkIHNob3VsZCBiZSByZXR1cm5lZAoJICogd2hpY2ggY2FuIGJlIGEgamF2YSBjbGFzcyBuYW1lIChyZXZlcnNlIGRvbWFpbiBuYW1lKSBvciBnZW5lcmF0ZWQgd2l0aCBhCgkgKiBHVUlEIGFsZ29yaXRobS4gTm90ZSB0aGF0IGFsbCBMREFQIGRlZmluZWQgb2JqZWN0IGNsYXNzZXMgYWxyZWFkeSBoYXZlIGFuCgkgKiBPSUQgYXNzb2NpYXRlZC4gSXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0byBkZWZpbmUgdGhlIG9iamVjdCBjbGFzc2VzIGZyb20KCSAqIGV4aXN0aW5nIExEQVAgc2NoZW1lcyB3aGljaCB3aWxsIGdpdmUgdGhlIE9JRCBmb3IgZnJlZS4gTWFueSBzdWNoIHNjaGVtZXMKCSAqIGV4aXN0IHJhbmdpbmcgZnJvbSBwb3N0YWwgYWRkcmVzc2VzIHRvIERIQ1AgcGFyYW1ldGVycy4KCSAqIAoJICogQHJldHVybiBUaGUgaWQgb2YgdGhpcyBvYmplY3QgY2xhc3MuCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0SUQoKTsKCgkvKioKCSAqIFJldHVybiBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgb2JqZWN0IGNsYXNzLgoJICogCgkgKiBUaGUgZGVzY3JpcHRpb24gbWF5IGJlIGxvY2FsaXplZC4KCSAqIAoJICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gb2YgdGhpcyBvYmplY3QgY2xhc3MuCgkgKi8KCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKCgkvKioKCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIGRlZmluaXRpb25zIGZvciB0aGlzIG9iamVjdCBjbGFzcy4KCSAqIAoJICogPHA+CgkgKiBSZXR1cm4gYSBzZXQgb2YgYXR0cmlidXRlcy4gVGhlIGZpbHRlciBwYXJhbWV0ZXIgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4KCSAqIDxjb2RlPkFMTDwvY29kZT4sPGNvZGU+UkVRVUlSRUQ8L2NvZGU+IG9yIHRoZSA8Y29kZT5PUFRJT05BTDwvY29kZT4KCSAqIGF0dHJpYnV0ZXMuCgkgKiAKCSAqIEBwYXJhbSBmaWx0ZXIgPGNvZGU+QUxMPC9jb2RlPiw8Y29kZT5SRVFVSVJFRDwvY29kZT4sPGNvZGU+T1BUSU9OQUw8L2NvZGU+CgkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwoJICogICAgICAgICBhdHRyaWJ1dGVzIGFyZSBzZWxlY3RlZAoJICovCglwdWJsaWMgQXR0cmlidXRlRGVmaW5pdGlvbltdIGdldEF0dHJpYnV0ZURlZmluaXRpb25zKGludCBmaWx0ZXIpOwoKCS8qKgoJICogUmV0dXJuIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4KCSAqIGljb24gZnJvbS4KCSAqIAoJICogPHA+CgkgKiBJbmRpY2F0ZSB0aGUgc2l6ZSBhbmQgcmV0dXJuIGFuIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBvYmplY3QgY29udGFpbmluZwoJICogYW4gaWNvbi4gVGhlIHJldHVybmVkIGljb24gbWF5YmUgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aGUgaW5kaWNhdGVkCgkgKiBzaXplLgoJICogCgkgKiA8cD4KCSAqIFRoZSBpY29uIG1heSBkZXBlbmQgb24gdGhlIGxvY2FsaXphdGlvbi4KCSAqIAoJICogQHBhcmFtIHNpemUgUmVxdWVzdGVkIHNpemUgb2YgYW4gaWNvbiwgZS5nLiBhIDE2eDE2IHBpeGVscyBpY29uIHRoZW4gc2l6ZSA9CgkgKiAgICAgICAgMTYKCSAqIEByZXR1cm4gQW4gSW5wdXRTdHJlYW0gcmVwcmVzZW50aW5nIGFuIGljb24gb3IgPGNvZGU+bnVsbDwvY29kZT4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBjYW5ub3QgYmUgcmV0dXJuZWQuCgkgKi8KCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJY29uKGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb247Cn0KUEsDBAoAAAAAAGtS7jQQ6kMJjgEAAI4BAAAzAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL3BhY2thZ2UuaHRtbCx2IDEuNSAyMDA2LzA3LzEyIDIxOjA3OjE2IGhhcmdyYXZlIEV4cCAkIC0tPg08Qk9EWT4NPHA+TWV0YXR5cGUgUGFja2FnZSBWZXJzaW9uIDEuMS4NPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlDWluIHRoZSA8VFQ+SW1wb3J0LVBhY2thZ2U8L1RUPiBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0Lg1Gb3IgZXhhbXBsZToNPHByZT4NSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnNlcnZpY2UubWV0YXR5cGU7IHZlcnNpb249MS4xDTwvcHJlPg08L0JPRFk+DQ1QSwMECgAAAAAAa1LuNISuGrcMAAAADAAAADIAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAJAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1BLAwQKAAAAAABrUu40OtYIUMsJAADLCQAAPgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5wcmVmcy9zcmMvb3JnL29zZ2kvc2VydmljZS9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb24uamF2YSx2IDEuMTIgMjAwNi8wNy8xMSAxMzoxNTo1NSBoYXJncmF2ZSBFeHAgJAogKiAKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAxLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICogCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnByZWZzOwoKLyoqCiAqIFRocm93biB0byBpbmRpY2F0ZSB0aGF0IGEgcHJlZmVyZW5jZXMgb3BlcmF0aW9uIGNvdWxkIG5vdCBjb21wbGV0ZSBiZWNhdXNlIG9mCiAqIGEgZmFpbHVyZSBpbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgYSBmYWlsdXJlIHRvIGNvbnRhY3QgdGhlIGJhY2tpbmcgc3RvcmUuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTIgJAogKi8KcHVibGljIGNsYXNzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE0MTU2MzczNjQxMjI4Mjk1NzRMOwoJLyoqCgkgKiBOZXN0ZWQgZXhjZXB0aW9uLgoJICovCglwcml2YXRlIGZpbmFsIFRocm93YWJsZQljYXVzZTsKCgkvKioKCSAqIENvbnN0cnVjdHMgYSA8Y29kZT5CYWNraW5nU3RvcmVFeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwKCSAqIG1lc3NhZ2UuCgkgKiAKCSAqIEBwYXJhbSBzIFRoZSBkZXRhaWwgbWVzc2FnZS4KCSAqLwoJcHVibGljIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbihTdHJpbmcgcykgewoJCXN1cGVyKHMpOwoJCXRoaXMuY2F1c2UgPSBudWxsOwoJfQoJCgkvKioKCSAqIENvbnN0cnVjdHMgYSA8Y29kZT5CYWNraW5nU3RvcmVFeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIHNwZWNpZmllZCBkZXRhaWwKCSAqIG1lc3NhZ2UuCgkgKiAKCSAqIEBwYXJhbSBzIFRoZSBkZXRhaWwgbWVzc2FnZS4KCSAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbi4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHNpbmNlIDEuMSAKCSAqLwoJcHVibGljIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CgkJc3VwZXIocyk7CgkJdGhpcy5jYXVzZSA9IGNhdXNlOwoJfQoJCgkvKioKCSAqIFJldHVybnMgdGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNhdXNlIHdhcwoJICogc3BlY2lmaWVkIHdoZW4gdGhpcyBleGNlcHRpb24gd2FzIGNyZWF0ZWQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNhdXNlIHdhcwoJICogICAgICAgICBzcGVjaWZpZWQuCgkgKiBAc2luY2UgMS4xIAoJICovCglwdWJsaWMgVGhyb3dhYmxlIGdldENhdXNlKCkgewoJCXJldHVybiBjYXVzZTsKCX0KCgkvKioKCSAqIFRoZSBjYXVzZSBvZiB0aGlzIGV4Y2VwdGlvbiBjYW4gb25seSBiZSBzZXQgd2hlbiBjb25zdHJ1Y3RlZC4KCSAqIAoJICogQHBhcmFtIGNhdXNlIENhdXNlIG9mIHRoZSBleGNlcHRpb24uCgkgKiBAcmV0dXJuIFRoaXMgb2JqZWN0LgoJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHRocm93IGFuCgkgKiAgICAgICAgIDxjb2RlPklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjwvY29kZT4gc2luY2UgdGhlIGNhdXNlIG9mIHRoaXMKCSAqICAgICAgICAgZXhjZXB0aW9uIGNhbiBvbmx5IGJlIHNldCB3aGVuIGNvbnN0cnVjdGVkLgoJICogQHNpbmNlIDEuMSAKCSAqLwoJcHVibGljIFRocm93YWJsZSBpbml0Q2F1c2UoVGhyb3dhYmxlIGNhdXNlKSB7CgkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwoJfQoKfQpQSwMECgAAAAAAa1LuNP6hOliuhgAAroYAADQAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcmVmcy9QcmVmZXJlbmNlcy5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5wcmVmcy9zcmMvb3JnL29zZ2kvc2VydmljZS9wcmVmcy9QcmVmZXJlbmNlcy5qYXZhLHYgMS4xMSAyMDA2LzA3LzExIDAwOjU0OjA0IGhhcmdyYXZlIEV4cCAkCiAqIAogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UucHJlZnM7CgovKioKICogQSBub2RlIGluIGEgaGllcmFyY2hpY2FsIGNvbGxlY3Rpb24gb2YgcHJlZmVyZW5jZSBkYXRhLgogKiAKICogPHA+CiAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBhcHBsaWNhdGlvbnMgdG8gc3RvcmUgYW5kIHJldHJpZXZlIHVzZXIgYW5kIHN5c3RlbQogKiBwcmVmZXJlbmNlIGRhdGEuIFRoaXMgZGF0YSBpcyBzdG9yZWQgcGVyc2lzdGVudGx5IGluIGFuCiAqIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBiYWNraW5nIHN0b3JlLiBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBpbmNsdWRlIGZsYXQKICogZmlsZXMsIE9TLXNwZWNpZmljIHJlZ2lzdHJpZXMsIGRpcmVjdG9yeSBzZXJ2ZXJzIGFuZCBTUUwgZGF0YWJhc2VzLgogKiAKICogPHA+CiAqIEZvciBlYWNoIGJ1bmRsZSwgdGhlcmUgaXMgYSBzZXBhcmF0ZSB0cmVlIG9mIG5vZGVzIGZvciBlYWNoIHVzZXIsIGFuZCBvbmUgZm9yCiAqIHN5c3RlbSBwcmVmZXJlbmNlcy4gVGhlIHByZWNpc2UgZGVzY3JpcHRpb24gb2YgInVzZXIiIGFuZCAic3lzdGVtIiB3aWxsIHZhcnkKICogZnJvbSBvbmUgYnVuZGxlIHRvIGFub3RoZXIuIFR5cGljYWwgaW5mb3JtYXRpb24gc3RvcmVkIGluIHRoZSB1c2VyIHByZWZlcmVuY2UKICogdHJlZSBtaWdodCBpbmNsdWRlIGZvbnQgY2hvaWNlLCBhbmQgY29sb3IgY2hvaWNlIGZvciBhIGJ1bmRsZSB3aGljaCBpbnRlcmFjdHMKICogd2l0aCB0aGUgdXNlciB2aWEgYSBzZXJ2bGV0LiBUeXBpY2FsIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgc3lzdGVtCiAqIHByZWZlcmVuY2UgdHJlZSBtaWdodCBpbmNsdWRlIGluc3RhbGxhdGlvbiBkYXRhLCBvciB0aGluZ3MgbGlrZSBoaWdoIHNjb3JlCiAqIGluZm9ybWF0aW9uIGZvciBhIGdhbWUgcHJvZ3JhbS4KICogCiAqIDxwPgogKiBOb2RlcyBpbiBhIHByZWZlcmVuY2UgdHJlZSBhcmUgbmFtZWQgaW4gYSBzaW1pbGFyIGZhc2hpb24gdG8gZGlyZWN0b3JpZXMgaW4gYQogKiBoaWVyYXJjaGljYWwgZmlsZSBzeXN0ZW0uIEV2ZXJ5IG5vZGUgaW4gYSBwcmVmZXJlbmNlIHRyZWUgaGFzIGEgPGk+bm9kZSBuYW1lCiAqIDwvaT4gKHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB1bmlxdWUpLCBhIHVuaXF1ZSA8aT5hYnNvbHV0ZSBwYXRoIG5hbWUgPC9pPiwKICogYW5kIGEgcGF0aCBuYW1lIDxpPnJlbGF0aXZlIDwvaT4gdG8gZWFjaCBhbmNlc3RvciBpbmNsdWRpbmcgaXRzZWxmLgogKiAKICogPHA+CiAqIFRoZSByb290IG5vZGUgaGFzIGEgbm9kZSBuYW1lIG9mIHRoZSBlbXB0eSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCAoIiIpLgogKiBFdmVyeSBvdGhlciBub2RlIGhhcyBhbiBhcmJpdHJhcnkgbm9kZSBuYW1lLCBzcGVjaWZpZWQgYXQgdGhlIHRpbWUgaXQgaXMKICogY3JlYXRlZC4gVGhlIG9ubHkgcmVzdHJpY3Rpb25zIG9uIHRoaXMgbmFtZSBhcmUgdGhhdCBpdCBjYW5ub3QgYmUgdGhlIGVtcHR5CiAqIHN0cmluZywgYW5kIGl0IGNhbm5vdCBjb250YWluIHRoZSBzbGFzaCBjaGFyYWN0ZXIgKCcvJykuCiAqIAogKiA8cD4KICogVGhlIHJvb3Qgbm9kZSBoYXMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lIG9mIDxjb2RlPiIvIjwvY29kZT4uIENoaWxkcmVuIG9mIHRoZQogKiByb290IG5vZGUgaGF2ZSBhYnNvbHV0ZSBwYXRoIG5hbWVzIG9mIDxjb2RlPiIvIiArIDwvY29kZT4gPGk+Jmx0O25vZGUgbmFtZSZndDsKICogPC9pPi4gQWxsIG90aGVyIG5vZGVzIGhhdmUgYWJzb2x1dGUgcGF0aCBuYW1lcyBvZiA8aT4mbHQ7cGFyZW50J3MgYWJzb2x1dGUKICogcGF0aCBuYW1lJmd0OyA8L2k+IDxjb2RlPiArICIvIiArIDwvY29kZT4gPGk+Jmx0O25vZGUgbmFtZSZndDsgPC9pPi4gTm90ZSB0aGF0CiAqIGFsbCBhYnNvbHV0ZSBwYXRoIG5hbWVzIGJlZ2luIHdpdGggdGhlIHNsYXNoIGNoYXJhY3Rlci4KICogCiAqIDxwPgogKiBBIG5vZGUgPGk+biA8L2k+J3MgcGF0aCBuYW1lIHJlbGF0aXZlIHRvIGl0cyBhbmNlc3RvciA8aT5hIDwvaT4gaXMgc2ltcGx5IHRoZQogKiBzdHJpbmcgdGhhdCBtdXN0IGJlIGFwcGVuZGVkIHRvIDxpPmEgPC9pPidzIGFic29sdXRlIHBhdGggbmFtZSBpbiBvcmRlciB0bwogKiBmb3JtIDxpPm4gPC9pPidzIGFic29sdXRlIHBhdGggbmFtZSwgd2l0aCB0aGUgaW5pdGlhbCBzbGFzaCBjaGFyYWN0ZXIgKGlmCiAqIHByZXNlbnQpIHJlbW92ZWQuIE5vdGUgdGhhdDoKICogPHVsPgogKiA8bGk+Tm8gcmVsYXRpdmUgcGF0aCBuYW1lcyBiZWdpbiB3aXRoIHRoZSBzbGFzaCBjaGFyYWN0ZXIuCiAqIDxsaT5FdmVyeSBub2RlJ3MgcGF0aCBuYW1lIHJlbGF0aXZlIHRvIGl0c2VsZiBpcyB0aGUgZW1wdHkgc3RyaW5nLgogKiA8bGk+RXZlcnkgbm9kZSdzIHBhdGggbmFtZSByZWxhdGl2ZSB0byBpdHMgcGFyZW50IGlzIGl0cyBub2RlIG5hbWUgKGV4Y2VwdAogKiBmb3IgdGhlIHJvb3Qgbm9kZSwgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHBhcmVudCkuCiAqIDxsaT5FdmVyeSBub2RlJ3MgcGF0aCBuYW1lIHJlbGF0aXZlIHRvIHRoZSByb290IGlzIGl0cyBhYnNvbHV0ZSBwYXRoIG5hbWUKICogd2l0aCB0aGUgaW5pdGlhbCBzbGFzaCBjaGFyYWN0ZXIgcmVtb3ZlZC4KICogPC91bD4KICogCiAqIDxwPgogKiBOb3RlIGZpbmFsbHkgdGhhdDoKICogPHVsPgogKiA8bGk+Tm8gcGF0aCBuYW1lIGNvbnRhaW5zIG11bHRpcGxlIGNvbnNlY3V0aXZlIHNsYXNoIGNoYXJhY3RlcnMuCiAqIDxsaT5ObyBwYXRoIG5hbWUgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSByb290J3MgYWJzb2x1dGUgcGF0aCBuYW1lIGVuZCBpbgogKiB0aGUgc2xhc2ggY2hhcmFjdGVyLgogKiA8bGk+QW55IHN0cmluZyB0aGF0IGNvbmZvcm1zIHRvIHRoZXNlIHR3byBydWxlcyBpcyBhIHZhbGlkIHBhdGggbmFtZS4KICogPC91bD4KICogCiAqIDxwPgogKiBFYWNoIDxjb2RlPlByZWZlcmVuY2U8L2NvZGU+IG5vZGUgaGFzIHplcm8gb3IgbW9yZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aAogKiBpdCwgd2hlcmUgYSBwcm9wZXJ0eSBjb25zaXN0cyBvZiBhIG5hbWUgYW5kIGEgdmFsdWUuIFRoZSBidW5kbGUgd3JpdGVyIGlzCiAqIGZyZWUgdG8gY2hvb3NlIGFueSBhcHByb3ByaWF0ZSBuYW1lcyBmb3IgcHJvcGVydGllcy4gVGhlaXIgdmFsdWVzIGNhbiBiZSBvZgogKiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4sPGNvZGU+bG9uZzwvY29kZT4sPGNvZGU+aW50PC9jb2RlPiw8Y29kZT5ib29sZWFuPC9jb2RlPiwKICogPGNvZGU+Ynl0ZVtdPC9jb2RlPiw8Y29kZT5mbG9hdDwvY29kZT4sIG9yIDxjb2RlPmRvdWJsZTwvY29kZT4gYnV0IHRoZXkgY2FuCiAqIGFsd2F5cyBiZSBhY2Nlc3NlZCBhcyBpZiB0aGV5IHdlcmUgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzLgogKiAKICogPHA+CiAqIEFsbCBub2RlIG5hbWUgYW5kIHByb3BlcnR5IG5hbWUgY29tcGFyaXNvbnMgYXJlIGNhc2Utc2Vuc2l0aXZlLgogKiAKICogPHA+CiAqIEFsbCBvZiB0aGUgbWV0aG9kcyB0aGF0IG1vZGlmeSBwcmVmZXJlbmNlIGRhdGEgYXJlIHBlcm1pdHRlZCB0byBvcGVyYXRlCiAqIGFzeW5jaHJvbm91c2x5OyB0aGV5IG1heSByZXR1cm4gaW1tZWRpYXRlbHksIGFuZCBjaGFuZ2VzIHdpbGwgZXZlbnR1YWxseQogKiBwcm9wYWdhdGUgdG8gdGhlIHBlcnNpc3RlbnQgYmFja2luZyBzdG9yZSwgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQKICogZGVsYXkuIFRoZSA8Y29kZT5mbHVzaDwvY29kZT4gbWV0aG9kIG1heSBiZSB1c2VkIHRvIHN5bmNocm9ub3VzbHkgZm9yY2UgdXBkYXRlcwogKiB0byB0aGUgYmFja2luZyBzdG9yZS4KICogCiAqIDxwPgogKiBJbXBsZW1lbnRhdGlvbnMgbXVzdCBhdXRvbWF0aWNhbGx5IGF0dGVtcHQgdG8gZmx1c2ggdG8gdGhlIGJhY2tpbmcgc3RvcmUgYW55CiAqIHBlbmRpbmcgdXBkYXRlcyBmb3IgYSBidW5kbGUncyBwcmVmZXJlbmNlcyB3aGVuIHRoZSBidW5kbGUgaXMgc3RvcHBlZCBvcgogKiBvdGhlcndpc2UgdW5nZXRzIHRoZSBQcmVmZXJlbmNlcyBTZXJ2aWNlLgogKiAKICogPHA+CiAqIFRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgbWF5IGJlIGludm9rZWQgY29uY3VycmVudGx5IGJ5IG11bHRpcGxlIHRocmVhZHMgaW4KICogYSBzaW5nbGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgKEpWTSkgd2l0aG91dCB0aGUgbmVlZCBmb3IgZXh0ZXJuYWwKICogc3luY2hyb25pemF0aW9uLCBhbmQgdGhlIHJlc3VsdHMgd2lsbCBiZSBlcXVpdmFsZW50IHRvIHNvbWUgc2VyaWFsIGV4ZWN1dGlvbi4KICogSWYgdGhpcyBjbGFzcyBpcyB1c2VkIGNvbmN1cnJlbnRseSA8aT5ieSBtdWx0aXBsZSBKVk1zIDwvaT4gdGhhdCBzdG9yZSB0aGVpcgogKiBwcmVmZXJlbmNlIGRhdGEgaW4gdGhlIHNhbWUgYmFja2luZyBzdG9yZSwgdGhlIGRhdGEgc3RvcmUgd2lsbCBub3QgYmUKICogY29ycnVwdGVkLCBidXQgbm8gb3RoZXIgZ3VhcmFudGVlcyBhcmUgbWFkZSBjb25jZXJuaW5nIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUKICogcHJlZmVyZW5jZSBkYXRhLgogKiAKICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMSAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VzIHsKCS8qKgoJICogQXNzb2NpYXRlcyB0aGUgc3BlY2lmaWVkIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgaW4gdGhpcyBub2RlLgoJICogCgkgKiBAcGFyYW0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgdG8gYmUgYXNzb2NpYXRlZC4KCSAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gb3IgPGNvZGU+dmFsdWU8L2NvZGU+IGlzCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICovCglwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcwoJICogbm9kZS4gUmV0dXJucyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoCgkgKiB0aGUgPGNvZGU+a2V5PC9jb2RlPiwgb3IgdGhlIGJhY2tpbmcgc3RvcmUgaXMgaW5hY2Nlc3NpYmxlLgoJICogCgkgKiBAcGFyYW0ga2V5IGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgoJICogQHBhcmFtIGRlZiB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGV2ZW50IHRoYXQgdGhpcyBub2RlIGhhcyBubwoJICogICAgICAgIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IG9yIHRoZSBiYWNraW5nIHN0b3JlIGlzCgkgKiAgICAgICAgaW5hY2Nlc3NpYmxlLgoJICogQHJldHVybiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4sIG9yIDxjb2RlPmRlZjwvY29kZT4gaWYKCSAqICAgICAgICAgbm8gdmFsdWUgaXMgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uIChBCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGRlZmF1bHQgPGk+aXMgPC9pPiBwZXJtaXR0ZWQuKQoJICovCglwdWJsaWMgU3RyaW5nIGdldChTdHJpbmcga2V5LCBTdHJpbmcgZGVmKTsKCgkvKioKCSAqIFJlbW92ZXMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcwoJICogbm9kZSwgaWYgYW55LgoJICogCgkgKiBAcGFyYW0ga2V5IGtleSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGlzIG5vZGUuCgkgKiBAc2VlICNnZXQoU3RyaW5nLFN0cmluZykKCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSAob3IgYW4gYW5jZXN0b3IpIGhhcyBiZWVuCgkgKiAgICAgICAgIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZC4KCSAqLwoJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBrZXkpOwoKCS8qKgoJICogUmVtb3ZlcyBhbGwgb2YgdGhlIHByb3BlcnRpZXMgKGtleS12YWx1ZSBhc3NvY2lhdGlvbnMpIGluIHRoaXMgbm9kZS4gVGhpcwoJICogY2FsbCBoYXMgbm8gZWZmZWN0IG9uIGFueSBkZXNjZW5kYW50cyBvZiB0aGlzIG5vZGUuCgkgKiAKCSAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQgZHVlCgkgKiAgICAgICAgIHRvIGEgZmFpbHVyZSBpbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgaW5hYmlsaXR5IHRvIGNvbW11bmljYXRlCgkgKiAgICAgICAgIHdpdGggaXQuCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAc2VlICNyZW1vdmUoU3RyaW5nKQoJICovCglwdWJsaWMgdm9pZCBjbGVhcigpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247CgoJLyoqCgkgKiBBc3NvY2lhdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPmludDwvY29kZT4gdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLiBUaGUKCSAqIGFzc29jaWF0ZWQgc3RyaW5nIGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgPGNvZGU+aW50PC9jb2RlPgoJICogdmFsdWUgd2VyZSBwYXNzZWQgdG8gPGNvZGU+SW50ZWdlci50b1N0cmluZyhpbnQpPC9jb2RlPi4gVGhpcyBtZXRob2QgaXMKCSAqIGludGVuZGVkIGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI2dldEludH0gbWV0aG9kLgoJICogCgkgKiA8cD4KCSAqIEltcGxlbWVudG9yJ3Mgbm90ZTogaXQgaXMgPGk+bm90IDwvaT4gbmVjZXNzYXJ5IHRoYXQgdGhlIHByb3BlcnR5IHZhbHVlCgkgKiBiZSByZXByZXNlbnRlZCBieSBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGluIHRoZSBiYWNraW5nIHN0b3JlLiBJZiB0aGUKCSAqIGJhY2tpbmcgc3RvcmUgc3VwcG9ydHMgaW50ZWdlciB2YWx1ZXMsIGl0IGlzIG5vdCB1bnJlYXNvbmFibGUgdG8gdXNlCgkgKiB0aGVtLiBUaGlzIGltcGxlbWVudGF0aW9uIGRldGFpbCBpcyBub3QgdmlzaWJsZSB0aHJvdWdoIHRoZQoJICogPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IEFQSSwgd2hpY2ggYWxsb3dzIHRoZSB2YWx1ZSB0byBiZSByZWFkIGFzIGFuCgkgKiA8Y29kZT5pbnQ8L2NvZGU+ICh3aXRoIDxjb2RlPmdldEludDwvY29kZT4gb3IgYSA8Y29kZT5TdHJpbmc8L2NvZGU+ICh3aXRoCgkgKiA8Y29kZT5nZXQ8L2NvZGU+KSB0eXBlLgoJICogCgkgKiBAcGFyYW0ga2V5IGtleSB3aXRoIHdoaWNoIHRoZSBzdHJpbmcgZm9ybSBvZiB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkLgoJICogQHBhcmFtIHZhbHVlIDxjb2RlPnZhbHVlPC9jb2RlPiB3aG9zZSBzdHJpbmcgZm9ybSBpcyB0byBiZSBhc3NvY2lhdGVkIHdpdGgKCSAqICAgICAgICA8Y29kZT5rZXk8L2NvZGU+LgoJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5rZXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHNlZSAjZ2V0SW50KFN0cmluZyxpbnQpCgkgKi8KCXB1YmxpYyB2b2lkIHB1dEludChTdHJpbmcga2V5LCBpbnQgdmFsdWUpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgoJICogb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLiBUaGUKCSAqIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGlzIGNvbnZlcnRlZCB0byBhbiA8Y29kZT5pbnQ8L2NvZGU+IGFzIGJ5CgkgKiA8Y29kZT5JbnRlZ2VyLnBhcnNlSW50KFN0cmluZyk8L2NvZGU+LiBSZXR1cm5zIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBpZgoJICogdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSA8Y29kZT5rZXk8L2NvZGU+LCB0aGUgYmFja2luZyBzdG9yZQoJICogaXMgaW5hY2Nlc3NpYmxlLCBvciBpZiA8Y29kZT5JbnRlZ2VyLnBhcnNlSW50KFN0cmluZyk8L2NvZGU+IHdvdWxkIHRocm93IGEKCSAqIDxjb2RlPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIGFzc29jaWF0ZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdlcmUKCSAqIHBhc3NlZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQoJICoge0BsaW5rICNwdXRJbnR9IG1ldGhvZC4KCSAqIAoJICogQHBhcmFtIGtleSBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBhcyBhbgoJICogICAgICAgIDxjb2RlPmludDwvY29kZT4uCgkgKiBAcGFyYW0gZGVmIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgZXZlbnQgdGhhdCB0aGlzIG5vZGUgaGFzIG5vCgkgKiAgICAgICAgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4gb3IgdGhlIGFzc29jaWF0ZWQgdmFsdWUKCSAqICAgICAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gPGNvZGU+aW50PC9jb2RlPiBvciB0aGUgYmFja2luZyBzdG9yZSBpcwoJICogICAgICAgIGluYWNjZXNzaWJsZS4KCSAqIEByZXR1cm4gdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IGluIHRoaXMgbm9kZSwgb3IKCSAqICAgICAgICAgPGNvZGU+ZGVmPC9jb2RlPiBpZiB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QKCSAqICAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYW4gPGNvZGU+aW50PC9jb2RlPiB0eXBlLgoJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5rZXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHNlZSAjcHV0SW50KFN0cmluZyxpbnQpCgkgKiBAc2VlICNnZXQoU3RyaW5nLFN0cmluZykKCSAqLwoJcHVibGljIGludCBnZXRJbnQoU3RyaW5nIGtleSwgaW50IGRlZik7CgoJLyoqCgkgKiBBc3NvY2lhdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5rZXk8L2NvZGU+IGluIHRoaXMgbm9kZS4gVGhlCgkgKiBhc3NvY2lhdGVkIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBpZgoJICogdGhlIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlIHdlcmUgcGFzc2VkIHRvIDxjb2RlPkxvbmcudG9TdHJpbmcobG9uZyk8L2NvZGU+LgoJICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgI2dldExvbmd9CgkgKiBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogSW1wbGVtZW50b3IncyBub3RlOiBpdCBpcyA8aT5ub3QgPC9pPiBuZWNlc3NhcnkgdGhhdCB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+CgkgKiBiZSByZXByZXNlbnRlZCBieSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdHlwZSBpbiB0aGUgYmFja2luZyBzdG9yZS4gSWYgdGhlCgkgKiBiYWNraW5nIHN0b3JlIHN1cHBvcnRzIDxjb2RlPmxvbmc8L2NvZGU+IHZhbHVlcywgaXQgaXMgbm90IHVucmVhc29uYWJsZSB0bwoJICogdXNlIHRoZW0uIFRoaXMgaW1wbGVtZW50YXRpb24gZGV0YWlsIGlzIG5vdCB2aXNpYmxlIHRocm91Z2ggdGhlIDxjb2RlPgoJICogUHJlZmVyZW5jZXM8L2NvZGU+IEFQSSwgd2hpY2ggYWxsb3dzIHRoZSB2YWx1ZSB0byBiZSByZWFkIGFzIGEKCSAqIDxjb2RlPmxvbmc8L2NvZGU+ICh3aXRoIDxjb2RlPmdldExvbmc8L2NvZGU+IG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiAod2l0aAoJICogPGNvZGU+Z2V0PC9jb2RlPikgdHlwZS4KCSAqIAoJICogQHBhcmFtIGtleSA8Y29kZT5rZXk8L2NvZGU+IHdpdGggd2hpY2ggdGhlIHN0cmluZyBmb3JtIG9mIDxjb2RlPnZhbHVlPC9jb2RlPgoJICogICAgICAgIGlzIHRvIGJlIGFzc29jaWF0ZWQuCgkgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dmFsdWU8L2NvZGU+IHdob3NlIHN0cmluZyBmb3JtIGlzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAoJICogICAgICAgIDxjb2RlPmtleTwvY29kZT4uCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAc2VlICNnZXRMb25nKFN0cmluZyxsb25nKQoJICovCglwdWJsaWMgdm9pZCBwdXRMb25nKFN0cmluZyBrZXksIGxvbmcgdmFsdWUpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgPGNvZGU+bG9uZzwvY29kZT4gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KCSAqIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCA8Y29kZT5rZXk8L2NvZGU+IGluIHRoaXMgbm9kZS4gVGhlCgkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5sb25nPC9jb2RlPiBhcyBieQoJICogPGNvZGU+TG9uZy5wYXJzZUxvbmcoU3RyaW5nKTwvY29kZT4uIFJldHVybnMgdGhlIHNwZWNpZmllZCBkZWZhdWx0IGlmCgkgKiB0aGVyZSBpcyBubyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIDxjb2RlPmtleTwvY29kZT4sIHRoZSBiYWNraW5nIHN0b3JlCgkgKiBpcyBpbmFjY2Vzc2libGUsIG9yIGlmIDxjb2RlPkxvbmcucGFyc2VMb25nKFN0cmluZyk8L2NvZGU+IHdvdWxkIHRocm93IGEKCSAqIDxjb2RlPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIGFzc29jaWF0ZWQgPGNvZGU+dmFsdWU8L2NvZGU+IHdlcmUKCSAqIHBhc3NlZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQoJICoge0BsaW5rICNwdXRMb25nfSBtZXRob2QuCgkgKiAKCSAqIEBwYXJhbSBrZXkgPGNvZGU+a2V5PC9jb2RlPiB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkIGFzIGEKCSAqICAgICAgICA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZS4KCSAqIEBwYXJhbSBkZWYgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGluIHRoZSBldmVudCB0aGF0IHRoaXMgbm9kZSBoYXMgbm8KCSAqICAgICAgICB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPiBvciB0aGUgYXNzb2NpYXRlZCB2YWx1ZQoJICogICAgICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIDxjb2RlPmxvbmc8L2NvZGU+IHR5cGUgb3IgdGhlIGJhY2tpbmcKCSAqICAgICAgICBzdG9yZSBpcyBpbmFjY2Vzc2libGUuCgkgKiBAcmV0dXJuIHRoZSA8Y29kZT5sb25nPC9jb2RlPiB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgoJICogICAgICAgICBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLCBvcgoJICogICAgICAgICA8Y29kZT5kZWY8L2NvZGU+IGlmIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdAoJICogICAgICAgICBiZSBpbnRlcnByZXRlZCBhcyBhIDxjb2RlPmxvbmc8L2NvZGU+IHR5cGUuCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAc2VlICNwdXRMb25nKFN0cmluZyxsb25nKQoJICogQHNlZSAjZ2V0KFN0cmluZyxTdHJpbmcpCgkgKi8KCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIGtleSwgbG9uZyBkZWYpOwoKCS8qKgoJICogQXNzb2NpYXRlcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCgkgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGluIHRoaXMgbm9kZS4gVGhlCgkgKiBhc3NvY2lhdGVkIHN0cmluZyBpcyAidHJ1ZSIgaWYgdGhlIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+LCBhbmQgImZhbHNlIgoJICogaWYgaXQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCgkgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgI2dldEJvb2xlYW59IG1ldGhvZC4KCSAqIAoJICogPHA+CgkgKiBJbXBsZW1lbnRvcidzIG5vdGU6IGl0IGlzIDxpPm5vdCA8L2k+IG5lY2Vzc2FyeSB0aGF0IHRoZSB2YWx1ZSBiZQoJICogcmVwcmVzZW50ZWQgYnkgYSBzdHJpbmcgaW4gdGhlIGJhY2tpbmcgc3RvcmUuIElmIHRoZSBiYWNraW5nIHN0b3JlCgkgKiBzdXBwb3J0cyA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZXMsIGl0IGlzIG5vdCB1bnJlYXNvbmFibGUgdG8gdXNlIHRoZW0uCgkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRldGFpbCBpcyBub3QgdmlzaWJsZSB0aHJvdWdoIHRoZSA8Y29kZT5QcmVmZXJlbmNlcwoJICogPC9jb2RlPiBBUEksIHdoaWNoIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgcmVhZCBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+CgkgKiAod2l0aCA8Y29kZT5nZXRCb29sZWFuPC9jb2RlPikgb3IgYSA8Y29kZT5TdHJpbmc8L2NvZGU+ICh3aXRoIDxjb2RlPmdldDwvY29kZT4pCgkgKiB0eXBlLgoJICogCgkgKiBAcGFyYW0ga2V5IDxjb2RlPmtleTwvY29kZT4gd2l0aCB3aGljaCB0aGUgc3RyaW5nIGZvcm0gb2YgdmFsdWUgaXMgdG8gYmUKCSAqICAgICAgICBhc3NvY2lhdGVkLgoJICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIHN0cmluZyBmb3JtIGlzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAoJICogICAgICAgIDxjb2RlPmtleTwvY29kZT4uCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAc2VlICNnZXRCb29sZWFuKFN0cmluZyxib29sZWFuKQoJICogQHNlZSAjZ2V0KFN0cmluZyxTdHJpbmcpCgkgKi8KCXB1YmxpYyB2b2lkIHB1dEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiB2YWx1ZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgoJICogb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLiBWYWxpZAoJICogc3RyaW5ncyBhcmUgInRydWUiLCB3aGljaCByZXByZXNlbnRzIDxjb2RlPnRydWU8L2NvZGU+LCBhbmQgImZhbHNlIiwgd2hpY2gKCSAqIHJlcHJlc2VudHMgPGNvZGU+ZmFsc2U8L2NvZGU+LiBDYXNlIGlzIGlnbm9yZWQsIHNvLCBmb3IgZXhhbXBsZSwgIlRSVUUiCgkgKiBhbmQgIkZhbHNlIiBhcmUgYWxzbyB2YWxpZC4gVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbgoJICogY29uanVuY3Rpb24gd2l0aCB0aGUge0BsaW5rICNwdXRCb29sZWFufSBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgaWYgdGhlcmUgaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQoJICogPGNvZGU+a2V5PC9jb2RlPiwgdGhlIGJhY2tpbmcgc3RvcmUgaXMgaW5hY2Nlc3NpYmxlLCBvciBpZiB0aGUgYXNzb2NpYXRlZAoJICogdmFsdWUgaXMgc29tZXRoaW5nIG90aGVyIHRoYW4gInRydWUiIG9yICJmYWxzZSIsIGlnbm9yaW5nIGNhc2UuCgkgKiAKCSAqIEBwYXJhbSBrZXkgPGNvZGU+a2V5PC9jb2RlPiB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkIGFzIGEKCSAqICAgICAgICA8Y29kZT5ib29sZWFuPC9jb2RlPi4KCSAqIEBwYXJhbSBkZWYgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGluIHRoZSBldmVudCB0aGF0IHRoaXMgbm9kZSBoYXMgbm8KCSAqICAgICAgICB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPiBvciB0aGUgYXNzb2NpYXRlZCB2YWx1ZQoJICogICAgICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IG9yIHRoZSBiYWNraW5nIHN0b3JlCgkgKiAgICAgICAgaXMgaW5hY2Nlc3NpYmxlLgoJICogQHJldHVybiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IGluIHRoaXMgbm9kZSwgb3IKCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFzc29jaWF0ZWQgdmFsdWUgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90CgkgKiAgICAgICAgIGJlIGludGVycHJldGVkIGFzIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4uCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAc2VlICNnZXQoU3RyaW5nLFN0cmluZykKCSAqIEBzZWUgI3B1dEJvb2xlYW4oU3RyaW5nLGJvb2xlYW4pCgkgKi8KCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiBkZWYpOwoKCS8qKgoJICogQXNzb2NpYXRlcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWVkCgkgKiA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLgoJICogVGhlIGFzc29jaWF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkCgkgKiBpZiB0aGUgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlIHdlcmUgcGFzc2VkIHRvCgkgKiA8Y29kZT5GbG9hdC50b1N0cmluZyhmbG9hdCk8L2NvZGU+LiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCgkgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgI2dldEZsb2F0fSBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogSW1wbGVtZW50b3IncyBub3RlOiBpdCBpcyA8aT5ub3QgPC9pPiBuZWNlc3NhcnkgdGhhdCB0aGUgdmFsdWUgYmUKCSAqIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nIGluIHRoZSBiYWNraW5nIHN0b3JlLiBJZiB0aGUgYmFja2luZyBzdG9yZQoJICogc3VwcG9ydHMgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlcywgaXQgaXMgbm90IHVucmVhc29uYWJsZSB0byB1c2UgdGhlbS4KCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gZGV0YWlsIGlzIG5vdCB2aXNpYmxlIHRocm91Z2ggdGhlIDxjb2RlPlByZWZlcmVuY2VzCgkgKiA8L2NvZGU+IEFQSSwgd2hpY2ggYWxsb3dzIHRoZSB2YWx1ZSB0byBiZSByZWFkIGFzIGEgPGNvZGU+ZmxvYXQ8L2NvZGU+ICh3aXRoCgkgKiA8Y29kZT5nZXRGbG9hdDwvY29kZT4pIG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiAod2l0aCA8Y29kZT5nZXQ8L2NvZGU+KSB0eXBlLgoJICogCgkgKiBAcGFyYW0ga2V5IDxjb2RlPmtleTwvY29kZT4gd2l0aCB3aGljaCB0aGUgc3RyaW5nIGZvcm0gb2YgdmFsdWUgaXMgdG8gYmUKCSAqICAgICAgICBhc3NvY2lhdGVkLgoJICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIHN0cmluZyBmb3JtIGlzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAoJICogICAgICAgIDxjb2RlPmtleTwvY29kZT4uCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAc2VlICNnZXRGbG9hdChTdHJpbmcsZmxvYXQpCgkgKi8KCXB1YmxpYyB2b2lkIHB1dEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGZsb2F0IDxjb2RlPnZhbHVlPC9jb2RlPiByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgoJICogb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLiBUaGUKCSAqIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGlzIGNvbnZlcnRlZCB0byBhIDxjb2RlPmZsb2F0PC9jb2RlPiB2YWx1ZSBhcyBieQoJICogPGNvZGU+RmxvYXQucGFyc2VGbG9hdChTdHJpbmcpPC9jb2RlPi4gUmV0dXJucyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgaWYKCSAqIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+a2V5PC9jb2RlPiwgdGhlIGJhY2tpbmcgc3RvcmUKCSAqIGlzIGluYWNjZXNzaWJsZSwgb3IgaWYgPGNvZGU+RmxvYXQucGFyc2VGbG9hdChTdHJpbmcpPC9jb2RlPiB3b3VsZCB0aHJvdyBhCgkgKiA8Y29kZT5OdW1iZXJGb3JtYXRFeGNlcHRpb248L2NvZGU+IGlmIHRoZSBhc3NvY2lhdGVkIHZhbHVlIHdlcmUgcGFzc2VkLgoJICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgI3B1dEZsb2F0fQoJICogbWV0aG9kLgoJICogCgkgKiBAcGFyYW0ga2V5IDxjb2RlPmtleTwvY29kZT4gd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBhcyBhCgkgKiAgICAgICAgPGNvZGU+ZmxvYXQ8L2NvZGU+IHZhbHVlLgoJICogQHBhcmFtIGRlZiB0aGUgdmFsdWUgdG8gYmUgcmV0dXJuZWQgaW4gdGhlIGV2ZW50IHRoYXQgdGhpcyBub2RlIGhhcyBubwoJICogICAgICAgIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IG9yIHRoZSBhc3NvY2lhdGVkIHZhbHVlCgkgKiAgICAgICAgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGEgPGNvZGU+ZmxvYXQ8L2NvZGU+IHR5cGUgb3IgdGhlIGJhY2tpbmcKCSAqICAgICAgICBzdG9yZSBpcyBpbmFjY2Vzc2libGUuCgkgKiBAcmV0dXJuIHRoZSA8Y29kZT5mbG9hdDwvY29kZT4gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBhc3NvY2lhdGVkCgkgKiAgICAgICAgIHdpdGggPGNvZGU+a2V5PC9jb2RlPiBpbiB0aGlzIG5vZGUsIG9yIDxjb2RlPmRlZjwvY29kZT4gaWYgdGhlCgkgKiAgICAgICAgIGFzc29jaWF0ZWQgdmFsdWUgZG9lcyBub3QgZXhpc3Qgb3IgY2Fubm90IGJlIGludGVycHJldGVkIGFzIGEKCSAqICAgICAgICAgPGNvZGU+ZmxvYXQ8L2NvZGU+IHR5cGUuCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHtAbGluayAjcmVtb3ZlTm9kZSgpfSBtZXRob2QuCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uCgkgKiBAc2VlICNwdXRGbG9hdChTdHJpbmcsZmxvYXQpCgkgKiBAc2VlICNnZXQoU3RyaW5nLFN0cmluZykKCSAqLwoJcHVibGljIGZsb2F0IGdldEZsb2F0KFN0cmluZyBrZXksIGZsb2F0IGRlZik7CgoJLyoqCgkgKiBBc3NvY2lhdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLgoJICogVGhlIGFzc29jaWF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkCgkgKiBpZiB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSB3ZXJlIHBhc3NlZCB0bwoJICogPGNvZGU+RG91YmxlLnRvU3RyaW5nKGRvdWJsZSk8L2NvZGU+LiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCgkgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgI2dldERvdWJsZX0gbWV0aG9kCgkgKiAKCSAqIDxwPgoJICogSW1wbGVtZW50b3IncyBub3RlOiBpdCBpcyA8aT5ub3QgPC9pPiBuZWNlc3NhcnkgdGhhdCB0aGUgdmFsdWUgYmUKCSAqIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nIGluIHRoZSBiYWNraW5nIHN0b3JlLiBJZiB0aGUgYmFja2luZyBzdG9yZQoJICogc3VwcG9ydHMgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZXMsIGl0IGlzIG5vdCB1bnJlYXNvbmFibGUgdG8gdXNlIHRoZW0uCgkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRldGFpbCBpcyBub3QgdmlzaWJsZSB0aHJvdWdoIHRoZSA8Y29kZT5QcmVmZXJlbmNlcwoJICogPC9jb2RlPiBBUEksIHdoaWNoIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgcmVhZCBhcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gKHdpdGgKCSAqIDxjb2RlPmdldERvdWJsZTwvY29kZT4pIG9yIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiAod2l0aCA8Y29kZT5nZXQ8L2NvZGU+KQoJICogdHlwZS4KCSAqIAoJICogQHBhcmFtIGtleSA8Y29kZT5rZXk8L2NvZGU+IHdpdGggd2hpY2ggdGhlIHN0cmluZyBmb3JtIG9mIHZhbHVlIGlzIHRvIGJlCgkgKiAgICAgICAgYXNzb2NpYXRlZC4KCSAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB3aG9zZSBzdHJpbmcgZm9ybSBpcyB0byBiZSBhc3NvY2lhdGVkIHdpdGgKCSAqICAgICAgICA8Y29kZT5rZXk8L2NvZGU+LgoJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5rZXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHNlZSAjZ2V0RG91YmxlKFN0cmluZyxkb3VibGUpCgkgKi8KCXB1YmxpYyB2b2lkIHB1dERvdWJsZShTdHJpbmcga2V5LCBkb3VibGUgdmFsdWUpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgoJICogb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLiBUaGUKCSAqIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGlzIGNvbnZlcnRlZCB0byBhIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgYXMgYnkKCSAqIDxjb2RlPkRvdWJsZS5wYXJzZURvdWJsZShTdHJpbmcpPC9jb2RlPi4gUmV0dXJucyB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgaWYKCSAqIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgPGNvZGU+a2V5PC9jb2RlPiwgdGhlIGJhY2tpbmcgc3RvcmUKCSAqIGlzIGluYWNjZXNzaWJsZSwgb3IgaWYgPGNvZGU+RG91YmxlLnBhcnNlRG91YmxlKFN0cmluZyk8L2NvZGU+IHdvdWxkIHRocm93CgkgKiBhIDxjb2RlPk51bWJlckZvcm1hdEV4Y2VwdGlvbjwvY29kZT4gaWYgdGhlIGFzc29jaWF0ZWQgdmFsdWUgd2VyZSBwYXNzZWQuCgkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlCgkgKiB7QGxpbmsgI3B1dERvdWJsZX0gbWV0aG9kLgoJICogCgkgKiBAcGFyYW0ga2V5IDxjb2RlPmtleTwvY29kZT4gd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBhcyBhCgkgKiAgICAgICAgPGNvZGU+ZG91YmxlPC9jb2RlPiB2YWx1ZS4KCSAqIEBwYXJhbSBkZWYgdGhlIHZhbHVlIHRvIGJlIHJldHVybmVkIGluIHRoZSBldmVudCB0aGF0IHRoaXMgbm9kZSBoYXMgbm8KCSAqICAgICAgICB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggPGNvZGU+a2V5PC9jb2RlPiBvciB0aGUgYXNzb2NpYXRlZCB2YWx1ZQoJICogICAgICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIDxjb2RlPmRvdWJsZTwvY29kZT4gdHlwZSBvciB0aGUgYmFja2luZwoJICogICAgICAgIHN0b3JlIGlzIGluYWNjZXNzaWJsZS4KCSAqIEByZXR1cm4gdGhlIDxjb2RlPmRvdWJsZTwvY29kZT4gdmFsdWUgcmVwcmVzZW50ZWQgYnkgdGhlIDxjb2RlPlN0cmluZzwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCA8Y29kZT5rZXk8L2NvZGU+IGluIHRoaXMgbm9kZSwgb3IKCSAqICAgICAgICAgPGNvZGU+ZGVmPC9jb2RlPiBpZiB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QKCSAqICAgICAgICAgYmUgaW50ZXJwcmV0ZWQgYXMgYSA8Y29kZT5kb3VibGU8L2NvZGU+IHR5cGUuCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYmVlbgoJICogICAgICAgICByZW1vdmVkIHdpdGggdGhlIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiA8Y29kZT5rZXk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHNlZSAjcHV0RG91YmxlKFN0cmluZyxkb3VibGUpCgkgKiBAc2VlICNnZXQoU3RyaW5nLFN0cmluZykKCSAqLwoJcHVibGljIGRvdWJsZSBnZXREb3VibGUoU3RyaW5nIGtleSwgZG91YmxlIGRlZik7CgoJLyoqCgkgKiBBc3NvY2lhdGVzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPmJ5dGVbXTwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLiBUaGUKCSAqIGFzc29jaWF0ZWQgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgdGhlIDxpPkJhc2U2NCA8L2k+IGVuY29kaW5nIG9mIHRoZQoJICogPGNvZGU+Ynl0ZVtdPC9jb2RlPiwgYXMgZGVmaW5lZCBpbiA8YQoJICogaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0NS50eHQiPlJGQyAyMDQ1IDwvYT4sIFNlY3Rpb24gNi44LAoJICogd2l0aCBvbmUgbWlub3IgY2hhbmdlOiB0aGUgc3RyaW5nIHdpbGwgY29uc2lzdCBzb2xlbHkgb2YgY2hhcmFjdGVycyBmcm9tCgkgKiB0aGUgPGk+QmFzZTY0IEFscGhhYmV0IDwvaT47IGl0IHdpbGwgbm90IGNvbnRhaW4gYW55IG5ld2xpbmUgY2hhcmFjdGVycy4KCSAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB1c2UgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUKCSAqIHtAbGluayAjZ2V0Qnl0ZUFycmF5fSBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogSW1wbGVtZW50b3IncyBub3RlOiBpdCBpcyA8aT5ub3QgPC9pPiBuZWNlc3NhcnkgdGhhdCB0aGUgdmFsdWUgYmUKCSAqIHJlcHJlc2VudGVkIGJ5IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB0eXBlIGluIHRoZSBiYWNraW5nIHN0b3JlLiBJZiB0aGUKCSAqIGJhY2tpbmcgc3RvcmUgc3VwcG9ydHMgPGNvZGU+Ynl0ZVtdPC9jb2RlPiB2YWx1ZXMsIGl0IGlzIG5vdCB1bnJlYXNvbmFibGUKCSAqIHRvIHVzZSB0aGVtLiBUaGlzIGltcGxlbWVudGF0aW9uIGRldGFpbCBpcyBub3QgdmlzaWJsZSB0aHJvdWdoIHRoZSA8Y29kZT4KCSAqIFByZWZlcmVuY2VzPC9jb2RlPiBBUEksIHdoaWNoIGFsbG93cyB0aGUgdmFsdWUgdG8gYmUgcmVhZCBhcyBhbiBhCgkgKiA8Y29kZT5ieXRlW108L2NvZGU+IG9iamVjdCAod2l0aCA8Y29kZT5nZXRCeXRlQXJyYXk8L2NvZGU+KSBvciBhCgkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCAod2l0aCA8Y29kZT5nZXQ8L2NvZGU+KS4KCSAqIAoJICogQHBhcmFtIGtleSA8Y29kZT5rZXk8L2NvZGU+IHdpdGggd2hpY2ggdGhlIHN0cmluZyBmb3JtIG9mIDxjb2RlPnZhbHVlPC9jb2RlPgoJICogICAgICAgIGlzIHRvIGJlIGFzc29jaWF0ZWQuCgkgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dmFsdWU8L2NvZGU+IHdob3NlIHN0cmluZyBmb3JtIGlzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAoJICogICAgICAgIDxjb2RlPmtleTwvY29kZT4uCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gb3IgPGNvZGU+dmFsdWU8L2NvZGU+IGlzCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHNlZSAjZ2V0Qnl0ZUFycmF5KFN0cmluZyxieXRlW10pCgkgKiBAc2VlICNnZXQoU3RyaW5nLFN0cmluZykKCSAqLwoJcHVibGljIHZvaWQgcHV0Qnl0ZUFycmF5KFN0cmluZyBrZXksIGJ5dGVbXSB2YWx1ZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSA8Y29kZT5ieXRlW108L2NvZGU+IHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSA8Y29kZT5TdHJpbmc8L2NvZGU+CgkgKiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgPGNvZGU+a2V5PC9jb2RlPiBpbiB0aGlzIG5vZGUuIFZhbGlkCgkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdHMgYXJlIDxpPkJhc2U2NCA8L2k+IGVuY29kZWQgYmluYXJ5IGRhdGEsIGFzCgkgKiBkZWZpbmVkIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0Ij5SRkMgMjA0NSA8L2E+LAoJICogU2VjdGlvbiA2LjgsIHdpdGggb25lIG1pbm9yIGNoYW5nZTogdGhlIHN0cmluZyBtdXN0IGNvbnNpc3Qgc29sZWx5IG9mCgkgKiBjaGFyYWN0ZXJzIGZyb20gdGhlIDxpPkJhc2U2NCBBbHBoYWJldCA8L2k+OyBubyBuZXdsaW5lIGNoYXJhY3RlcnMgb3IKCSAqIGV4dHJhbmVvdXMgY2hhcmFjdGVycyBhcmUgcGVybWl0dGVkLiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgdXNlIGluCgkgKiBjb25qdW5jdGlvbiB3aXRoIHRoZSB7QGxpbmsgI3B1dEJ5dGVBcnJheX0gbWV0aG9kLgoJICogCgkgKiA8cD4KCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCBkZWZhdWx0IGlmIHRoZXJlIGlzIG5vIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUKCSAqIDxjb2RlPmtleTwvY29kZT4sIHRoZSBiYWNraW5nIHN0b3JlIGlzIGluYWNjZXNzaWJsZSwgb3IgaWYgdGhlIGFzc29jaWF0ZWQKCSAqIHZhbHVlIGlzIG5vdCBhIHZhbGlkIEJhc2U2NCBlbmNvZGVkIGJ5dGUgYXJyYXkgKGFzIGRlZmluZWQgYWJvdmUpLgoJICogCgkgKiBAcGFyYW0ga2V5IDxjb2RlPmtleTwvY29kZT4gd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCBhcyBhCgkgKiAgICAgICAgPGNvZGU+Ynl0ZVtdPC9jb2RlPiBvYmplY3QuCgkgKiBAcGFyYW0gZGVmIHRoZSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpbiB0aGUgZXZlbnQgdGhhdCB0aGlzIG5vZGUgaGFzIG5vCgkgKiAgICAgICAgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4gb3IgdGhlIGFzc29jaWF0ZWQgdmFsdWUKCSAqICAgICAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSA8Y29kZT5ieXRlW108L2NvZGU+IHR5cGUsIG9yIHRoZSBiYWNraW5nCgkgKiAgICAgICAgc3RvcmUgaXMgaW5hY2Nlc3NpYmxlLgoJICogQHJldHVybiB0aGUgPGNvZGU+Ynl0ZVtdPC9jb2RlPiB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPgoJICogICAgICAgICBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIDxjb2RlPmtleTwvY29kZT4gaW4gdGhpcyBub2RlLCBvcgoJICogICAgICAgICA8Y29kZT5kZWY8L2NvZGU+IGlmIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGRvZXMgbm90IGV4aXN0IG9yIGNhbm5vdAoJICogICAgICAgICBiZSBpbnRlcnByZXRlZCBhcyBhIDxjb2RlPmJ5dGVbXTwvY29kZT4uCgkgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIDxjb2RlPmtleTwvY29kZT4gaXMgPGNvZGU+bnVsbDwvY29kZT4uIChBCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIGZvciA8Y29kZT5kZWY8L2NvZGU+IDxpPmlzIDwvaT4gcGVybWl0dGVkLikKCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSAob3IgYW4gYW5jZXN0b3IpIGhhcyBiZWVuCgkgKiAgICAgICAgIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZC4KCSAqIEBzZWUgI2dldChTdHJpbmcsU3RyaW5nKQoJICogQHNlZSAjcHV0Qnl0ZUFycmF5KFN0cmluZyxieXRlW10pCgkgKi8KCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5KFN0cmluZyBrZXksIGJ5dGVbXSBkZWYpOwoKCS8qKgoJICogUmV0dXJucyBhbGwgb2YgdGhlIGtleXMgdGhhdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmFsdWUgaW4gdGhpcyBub2RlLiAoVGhlCgkgKiByZXR1cm5lZCBhcnJheSB3aWxsIGJlIG9mIHNpemUgemVybyBpZiB0aGlzIG5vZGUgaGFzIG5vIHByZWZlcmVuY2VzIGFuZAoJICogbm90IDxjb2RlPm51bGw8L2NvZGU+ISkKCSAqIAoJICogQHJldHVybiBhbiBhcnJheSBvZiB0aGUga2V5cyB0aGF0IGhhdmUgYW4gYXNzb2NpYXRlZCB2YWx1ZSBpbiB0aGlzIG5vZGUuCgkgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkIGR1ZQoJICogICAgICAgICB0byBhIGZhaWx1cmUgaW4gdGhlIGJhY2tpbmcgc3RvcmUsIG9yIGluYWJpbGl0eSB0byBjb21tdW5pY2F0ZQoJICogICAgICAgICB3aXRoIGl0LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICovCglwdWJsaWMgU3RyaW5nW10ga2V5cygpIHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb247CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLiAoVGhlIHJldHVybmVkIGFycmF5IHdpbGwKCSAqIGJlIG9mIHNpemUgemVybyBpZiB0aGlzIG5vZGUgaGFzIG5vIGNoaWxkcmVuIGFuZCBub3QgPGNvZGU+bnVsbDwvY29kZT4hKQoJICogCgkgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLgoJICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZCBkdWUKCSAqICAgICAgICAgdG8gYSBmYWlsdXJlIGluIHRoZSBiYWNraW5nIHN0b3JlLCBvciBpbmFiaWxpdHkgdG8gY29tbXVuaWNhdGUKCSAqICAgICAgICAgd2l0aCBpdC4KCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSAob3IgYW4gYW5jZXN0b3IpIGhhcyBiZWVuCgkgKiAgICAgICAgIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZC4KCSAqLwoJcHVibGljIFN0cmluZ1tdIGNoaWxkcmVuTmFtZXMoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwoKCS8qKgoJICogUmV0dXJucyB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcyB0aGUgcm9vdC4KCSAqIAoJICogQHJldHVybiB0aGUgcGFyZW50IG9mIHRoaXMgbm9kZS4KCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSAob3IgYW4gYW5jZXN0b3IpIGhhcyBiZWVuCgkgKiAgICAgICAgIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZC4KCSAqLwoJcHVibGljIFByZWZlcmVuY2VzIHBhcmVudCgpOwoKCS8qKgoJICogUmV0dXJucyBhIG5hbWVkIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBvYmplY3QgKG5vZGUpLCBjcmVhdGluZyBpdCBhbmQgYW55CgkgKiBvZiBpdHMgYW5jZXN0b3JzIGlmIHRoZXkgZG8gbm90IGFscmVhZHkgZXhpc3QuIEFjY2VwdHMgYSByZWxhdGl2ZSBvcgoJICogYWJzb2x1dGUgcGF0aG5hbWUuIEFic29sdXRlIHBhdGhuYW1lcyAod2hpY2ggYmVnaW4gd2l0aCA8Y29kZT4nLyc8L2NvZGU+KQoJICogYXJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoaXMgbm9kZS4gUmVsYXRpdmUgcGF0aG5hbWVzCgkgKiAod2hpY2ggYmVnaW4gd2l0aCBhbnkgY2hhcmFjdGVyIG90aGVyIHRoYW4gPGNvZGU+Jy8nPC9jb2RlPikgYXJlCgkgKiBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGlzIG5vZGUgaXRzZWxmLiBUaGUgZW1wdHkgc3RyaW5nICg8Y29kZT4iIjwvY29kZT4pCgkgKiBpcyBhIHZhbGlkIHJlbGF0aXZlIHBhdGhuYW1lLCByZWZlcnJpbmcgdG8gdGhpcyBub2RlIGl0c2VsZi4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgcmV0dXJuZWQgbm9kZSBkaWQgbm90IGV4aXN0IHByaW9yIHRvIHRoaXMgY2FsbCwgdGhpcyBub2RlIGFuZCBhbnkKCSAqIGFuY2VzdG9ycyB0aGF0IHdlcmUgY3JlYXRlZCBieSB0aGlzIGNhbGwgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlY29tZQoJICogcGVyc2lzdGVudCB1bnRpbCB0aGUgPGNvZGU+Zmx1c2g8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQgb24gdGhlIHJldHVybmVkCgkgKiBub2RlIChvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4KCSAqIAoJICogQHBhcmFtIHBhdGhOYW1lIHRoZSBwYXRoIG5hbWUgb2YgdGhlIDxjb2RlPlByZWZlcmVuY2VzPC9jb2RlPiBvYmplY3QgdG8KCSAqICAgICAgICByZXR1cm4uCgkgKiBAcmV0dXJuIHRoZSBzcGVjaWZpZWQgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+IG9iamVjdC4KCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBwYXRoIG5hbWUgaXMgaW52YWxpZC4KCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSAob3IgYW4gYW5jZXN0b3IpIGhhcyBiZWVuCgkgKiAgICAgICAgIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZC4KCSAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgcGF0aCBuYW1lIGlzIDxjb2RlPm51bGw8L2NvZGU+LgoJICogQHNlZSAjZmx1c2goKQoJICovCglwdWJsaWMgUHJlZmVyZW5jZXMgbm9kZShTdHJpbmcgcGF0aE5hbWUpOwoKCS8qKgoJICogUmV0dXJucyB0cnVlIGlmIHRoZSBuYW1lZCBub2RlIGV4aXN0cy4gQWNjZXB0cyBhIHJlbGF0aXZlIG9yIGFic29sdXRlCgkgKiBwYXRobmFtZS4gQWJzb2x1dGUgcGF0aG5hbWVzICh3aGljaCBiZWdpbiB3aXRoIDxjb2RlPicvJzwvY29kZT4pIGFyZQoJICogaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhpcyBub2RlLiBSZWxhdGl2ZSBwYXRobmFtZXMgKHdoaWNoCgkgKiBiZWdpbiB3aXRoIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiA8Y29kZT4nLyc8L2NvZGU+KSBhcmUgaW50ZXJwcmV0ZWQKCSAqIHJlbGF0aXZlIHRvIHRoaXMgbm9kZSBpdHNlbGYuIFRoZSBwYXRobmFtZSA8Y29kZT4iIjwvY29kZT4gaXMgdmFsaWQsIGFuZAoJICogcmVmZXJzIHRvIHRoaXMgbm9kZSBpdHNlbGYuCgkgKiAKCSAqIDxwPgoJICogSWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGFscmVhZHkgYmVlbiByZW1vdmVkIHdpdGggdGhlCgkgKiB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLCBpdCA8aT5pcyA8L2k+IGxlZ2FsIHRvIGludm9rZSB0aGlzIG1ldGhvZCwKCSAqIGJ1dCBvbmx5IHdpdGggdGhlIHBhdGhuYW1lIDxjb2RlPiIiPC9jb2RlPjsgdGhlIGludm9jYXRpb24gd2lsbCByZXR1cm4KCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGh1cywgdGhlIGlkaW9tIDxjb2RlPnAubm9kZUV4aXN0cygiIik8L2NvZGU+IG1heSBiZQoJICogdXNlZCB0byB0ZXN0IHdoZXRoZXIgPGNvZGU+cDwvY29kZT4gaGFzIGJlZW4gcmVtb3ZlZC4KCSAqIAoJICogQHBhcmFtIHBhdGhOYW1lIHRoZSBwYXRoIG5hbWUgb2YgdGhlIG5vZGUgd2hvc2UgZXhpc3RlbmNlIGlzIHRvIGJlCgkgKiAgICAgICAgY2hlY2tlZC4KCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgZXhpc3RzLgoJICogQHRocm93cyBCYWNraW5nU3RvcmVFeGNlcHRpb24gaWYgdGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIGNvbXBsZXRlZCBkdWUKCSAqICAgICAgICAgdG8gYSBmYWlsdXJlIGluIHRoZSBiYWNraW5nIHN0b3JlLCBvciBpbmFiaWxpdHkgdG8gY29tbXVuaWNhdGUKCSAqICAgICAgICAgd2l0aCBpdC4KCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbm9kZSAob3IgYW4gYW5jZXN0b3IpIGhhcyBiZWVuCgkgKiAgICAgICAgIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZCBhbmQKCSAqICAgICAgICAgPGNvZGU+cGF0aG5hbWU8L2NvZGU+IGlzIG5vdCB0aGUgZW1wdHkgc3RyaW5nICg8Y29kZT4iIjwvY29kZT4pLgoJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhdGggbmFtZSBpcyBpbnZhbGlkIChpLmUuLCBpdAoJICogICAgICAgICBjb250YWlucyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzbGFzaCBjaGFyYWN0ZXJzLCBvciBlbmRzIHdpdGggYQoJICogICAgICAgICBzbGFzaCBjaGFyYWN0ZXIgYW5kIGlzIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyIGxvbmcpLgoJICovCglwdWJsaWMgYm9vbGVhbiBub2RlRXhpc3RzKFN0cmluZyBwYXRoTmFtZSkKCQkJdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIFJlbW92ZXMgdGhpcyBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLCBpbnZhbGlkYXRpbmcgYW55IHByb3BlcnRpZXMKCSAqIGNvbnRhaW5lZCBpbiB0aGUgcmVtb3ZlZCBub2Rlcy4gT25jZSBhIG5vZGUgaGFzIGJlZW4gcmVtb3ZlZCwgYXR0ZW1wdGluZwoJICogYW55IG1ldGhvZCBvdGhlciB0aGFuIDxjb2RlPm5hbWUoKTwvY29kZT4sPGNvZGU+YWJzb2x1dGVQYXRoKCk8L2NvZGU+IG9yCgkgKiA8Y29kZT5ub2RlRXhpc3RzKCIiKTwvY29kZT4gb24gdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+UHJlZmVyZW5jZXM8L2NvZGU+CgkgKiBpbnN0YW5jZSB3aWxsIGZhaWwgd2l0aCBhbiA8Y29kZT5JbGxlZ2FsU3RhdGVFeGNlcHRpb248L2NvZGU+LiAoVGhlCgkgKiBtZXRob2RzIGRlZmluZWQgb24gPGNvZGU+T2JqZWN0PC9jb2RlPiBjYW4gc3RpbGwgYmUgaW52b2tlZCBvbiBhIG5vZGUgYWZ0ZXIKCSAqIGl0IGhhcyBiZWVuIHJlbW92ZWQ7IHRoZXkgd2lsbCBub3QgdGhyb3cgPGNvZGU+SWxsZWdhbFN0YXRlRXhjZXB0aW9uPC9jb2RlPi4pCgkgKiAKCSAqIDxwPgoJICogVGhlIHJlbW92YWwgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgcGVyc2lzdGVudCB1bnRpbCB0aGUgPGNvZGU+Zmx1c2g8L2NvZGU+CgkgKiBtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlLgoJICogCgkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG5vZGUgKG9yIGFuIGFuY2VzdG9yKSBoYXMgYWxyZWFkeQoJICogICAgICAgICBiZWVuIHJlbW92ZWQgd2l0aCB0aGUge0BsaW5rICNyZW1vdmVOb2RlKCl9IG1ldGhvZC4KCSAqIEB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uIGlmIHRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWQgZHVlCgkgKiAgICAgICAgIHRvIGEgZmFpbHVyZSBpbiB0aGUgYmFja2luZyBzdG9yZSwgb3IgaW5hYmlsaXR5IHRvIGNvbW11bmljYXRlCgkgKiAgICAgICAgIHdpdGggaXQuCgkgKiBAc2VlICNmbHVzaCgpCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZU5vZGUoKSB0aHJvd3MgQmFja2luZ1N0b3JlRXhjZXB0aW9uOwoKCS8qKgoJICogUmV0dXJucyB0aGlzIG5vZGUncyBuYW1lLCByZWxhdGl2ZSB0byBpdHMgcGFyZW50LgoJICogCgkgKiBAcmV0dXJuIHRoaXMgbm9kZSdzIG5hbWUsIHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCgkgKi8KCXB1YmxpYyBTdHJpbmcgbmFtZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGlzIG5vZGUncyBhYnNvbHV0ZSBwYXRoIG5hbWUuIE5vdGUgdGhhdDoKCSAqIDx1bD4KCSAqIDxsaT5Sb290IG5vZGUgLSBUaGUgcGF0aCBuYW1lIG9mIHRoZSByb290IG5vZGUgaXMgPGNvZGU+Ii8iPC9jb2RlPi4KCSAqIDxsaT5TbGFzaCBhdCBlbmQgLSBQYXRoIG5hbWVzIG90aGVyIHRoYW4gdGhhdCBvZiB0aGUgcm9vdCBub2RlIG1heSBub3QKCSAqIGVuZCBpbiBzbGFzaCAoPGNvZGU+Jy8nPC9jb2RlPikuCgkgKiA8bGk+VW51c3VhbCBuYW1lcyAtPGNvZGU+Ii4iPC9jb2RlPiBhbmQgPGNvZGU+Ii4uIjwvY29kZT4gaGF2ZSA8aT5ubyA8L2k+CgkgKiBzcGVjaWFsIHNpZ25pZmljYW5jZSBpbiBwYXRoIG5hbWVzLgoJICogPGxpPklsbGVnYWwgbmFtZXMgLSBUaGUgb25seSBpbGxlZ2FsIHBhdGggbmFtZXMgYXJlIHRob3NlIHRoYXQgY29udGFpbgoJICogbXVsdGlwbGUgY29uc2VjdXRpdmUgc2xhc2hlcywgb3IgdGhhdCBlbmQgaW4gc2xhc2ggYW5kIGFyZSBub3QgdGhlIHJvb3QuCgkgKiA8L3VsPgoJICogCgkgKiBAcmV0dXJuIHRoaXMgbm9kZSdzIGFic29sdXRlIHBhdGggbmFtZS4KCSAqLwoJcHVibGljIFN0cmluZyBhYnNvbHV0ZVBhdGgoKTsKCgkvKioKCSAqIEZvcmNlcyBhbnkgY2hhbmdlcyBpbiB0aGUgY29udGVudHMgb2YgdGhpcyBub2RlIGFuZCBpdHMgZGVzY2VuZGFudHMgdG8KCSAqIHRoZSBwZXJzaXN0ZW50IHN0b3JlLgoJICogCgkgKiA8cD4KCSAqIE9uY2UgdGhpcyBtZXRob2QgcmV0dXJucyBzdWNjZXNzZnVsbHksIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgYWxsCgkgKiBjaGFuZ2VzIG1hZGUgaW4gdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoaXMgbm9kZSBwcmlvciB0byB0aGUgbWV0aG9kCgkgKiBpbnZvY2F0aW9uIGhhdmUgYmVjb21lIHBlcm1hbmVudC4KCSAqIAoJICogPHA+CgkgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gZmx1c2ggY2hhbmdlcyBpbnRvIHRoZSBwZXJzaXN0ZW50IHN0b3JlIGF0CgkgKiBhbnkgdGltZS4gVGhleSBkbyBub3QgbmVlZCB0byB3YWl0IGZvciB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQuCgkgKiAKCSAqIDxwPgoJICogV2hlbiBhIGZsdXNoIG9jY3VycyBvbiBhIG5ld2x5IGNyZWF0ZWQgbm9kZSwgaXQgaXMgbWFkZSBwZXJzaXN0ZW50LCBhcwoJICogYXJlIGFueSBhbmNlc3RvcnMgKGFuZCBkZXNjZW5kYW50cykgdGhhdCBoYXZlIHlldCB0byBiZSBtYWRlIHBlcnNpc3RlbnQuCgkgKiBOb3RlIGhvd2V2ZXIgdGhhdCBhbnkgcHJvcGVydGllcyB2YWx1ZSBjaGFuZ2VzIGluIGFuY2VzdG9ycyBhcmUgPGk+bm90CgkgKiA8L2k+IGd1YXJhbnRlZWQgdG8gYmUgbWFkZSBwZXJzaXN0ZW50LgoJICogCgkgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkIGR1ZQoJICogICAgICAgICB0byBhIGZhaWx1cmUgaW4gdGhlIGJhY2tpbmcgc3RvcmUsIG9yIGluYWJpbGl0eSB0byBjb21tdW5pY2F0ZQoJICogICAgICAgICB3aXRoIGl0LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHNlZSAjc3luYygpCgkgKi8KCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKCgkvKioKCSAqIEVuc3VyZXMgdGhhdCBmdXR1cmUgcmVhZHMgZnJvbSB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyByZWZsZWN0IGFueQoJICogY2hhbmdlcyB0aGF0IHdlcmUgY29tbWl0dGVkIHRvIHRoZSBwZXJzaXN0ZW50IHN0b3JlIChmcm9tIGFueSBWTSkgcHJpb3IKCSAqIHRvIHRoZSA8Y29kZT5zeW5jPC9jb2RlPiBpbnZvY2F0aW9uLiBBcyBhIHNpZGUtZWZmZWN0LCBmb3JjZXMgYW55IGNoYW5nZXMKCSAqIGluIHRoZSBjb250ZW50cyBvZiB0aGlzIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cyB0byB0aGUgcGVyc2lzdGVudCBzdG9yZSwKCSAqIGFzIGlmIHRoZSA8Y29kZT5mbHVzaDwvY29kZT4gbWV0aG9kIGhhZCBiZWVuIGludm9rZWQgb24gdGhpcyBub2RlLgoJICogCgkgKiBAdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBpZiB0aGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgY29tcGxldGVkIGR1ZQoJICogICAgICAgICB0byBhIGZhaWx1cmUgaW4gdGhlIGJhY2tpbmcgc3RvcmUsIG9yIGluYWJpbGl0eSB0byBjb21tdW5pY2F0ZQoJICogICAgICAgICB3aXRoIGl0LgoJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBub2RlIChvciBhbiBhbmNlc3RvcikgaGFzIGJlZW4KCSAqICAgICAgICAgcmVtb3ZlZCB3aXRoIHRoZSB7QGxpbmsgI3JlbW92ZU5vZGUoKX0gbWV0aG9kLgoJICogQHNlZSAjZmx1c2goKQoJICovCglwdWJsaWMgdm9pZCBzeW5jKCkgdGhyb3dzIEJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKfQpQSwMECgAAAAAAa1LuNOFxhiiMBwAAjAcAADsAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcmVmcy9QcmVmZXJlbmNlc1NlcnZpY2UuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UucHJlZnMvc3JjL29yZy9vc2dpL3NlcnZpY2UvcHJlZnMvUHJlZmVyZW5jZXNTZXJ2aWNlLmphdmEsdiAxLjEwIDIwMDYvMDYvMTYgMTY6MzE6MzAgaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5wcmVmczsKCi8qKgogKiBUaGUgUHJlZmVyZW5jZXMgU2VydmljZS4KICogCiAqIDxwPgogKiBFYWNoIGJ1bmRsZSB1c2luZyB0aGlzIHNlcnZpY2UgaGFzIGl0cyBvd24gc2V0IG9mIHByZWZlcmVuY2UgdHJlZXM6IG9uZSBmb3IKICogc3lzdGVtIHByZWZlcmVuY2VzLCBhbmQgb25lIGZvciBlYWNoIHVzZXIuCiAqIAogKiA8cD4KICogQSA8Y29kZT5QcmVmZXJlbmNlc1NlcnZpY2U8L2NvZGU+IG9iamVjdCBpcyBzcGVjaWZpYyB0byB0aGUgYnVuZGxlIHdoaWNoCiAqIG9idGFpbmVkIGl0IGZyb20gdGhlIHNlcnZpY2UgcmVnaXN0cnkuIElmIGEgYnVuZGxlIHdpc2hlcyB0byBhbGxvdyBhbm90aGVyCiAqIGJ1bmRsZSB0byBhY2Nlc3MgaXRzIHByZWZlcmVuY2VzLCBpdCBzaG91bGQgcGFzcyBpdHMKICogPGNvZGU+UHJlZmVyZW5jZXNTZXJ2aWNlPC9jb2RlPiBvYmplY3QgdG8gdGhhdCBidW5kbGUuCiAqICAKICovCnB1YmxpYyBpbnRlcmZhY2UgUHJlZmVyZW5jZXNTZXJ2aWNlIHsKCS8qKgoJICogUmV0dXJucyB0aGUgcm9vdCBzeXN0ZW0gbm9kZSBmb3IgdGhlIGNhbGxpbmcgYnVuZGxlLgoJICogCgkgKiBAcmV0dXJuIFRoZSByb290IHN5c3RlbSBub2RlIGZvciB0aGUgY2FsbGluZyBidW5kbGUuCgkgKi8KCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRTeXN0ZW1QcmVmZXJlbmNlcygpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgcm9vdCBub2RlIGZvciB0aGUgc3BlY2lmaWVkIHVzZXIgYW5kIHRoZSBjYWxsaW5nIGJ1bmRsZS4KCSAqIAoJICogQHBhcmFtIG5hbWUgVGhlIHVzZXIgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUgcHJlZmVyZW5jZSByb290IG5vZGUuIAoJICogQHJldHVybiBUaGUgcm9vdCBub2RlIGZvciB0aGUgc3BlY2lmaWVkIHVzZXIgYW5kIHRoZSBjYWxsaW5nIGJ1bmRsZS4KCSAqLwoJcHVibGljIFByZWZlcmVuY2VzIGdldFVzZXJQcmVmZXJlbmNlcyhTdHJpbmcgbmFtZSk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB1c2VycyBmb3Igd2hpY2ggbm9kZSB0cmVlcyBleGlzdC4KCSAqIAoJICogQHJldHVybiBUaGUgbmFtZXMgb2YgdXNlcnMgZm9yIHdoaWNoIG5vZGUgdHJlZXMgZXhpc3QuCgkgKi8KCXB1YmxpYyBTdHJpbmdbXSBnZXRVc2VycygpOwp9ClBLAwQKAAAAAABrUu40EDS+AocBAACHAQAAMAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5wcmVmcy9zcmMvb3JnL29zZ2kvc2VydmljZS9wcmVmcy9wYWNrYWdlLmh0bWwsdiAxLjQgMjAwNi8wNy8xMiAyMTowNjo1OCBoYXJncmF2ZSBFeHAgJCAtLT4NPEJPRFk+DTxwPlByZWZlcmVuY2VzIFNlcnZpY2UgUGFja2FnZSBWZXJzaW9uIDEuMS4NPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlDWluIHRoZSBJbXBvcnQtUGFja2FnZSBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0Lg1Gb3IgZXhhbXBsZToNPHByZT4NSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnNlcnZpY2UucHJlZnM7IHZlcnNpb249MS4xDTwvcHJlPg08L0JPRFk+DQ1QSwMECgAAAAAAa1LuNISuGrcMAAAADAAAAC8AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcmVmcy9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAKwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3Byb3Zpc2lvbmluZy9QSwMECgAAAAAAa1LuNG7fw3CmIgAApiIAAEMAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcm92aXNpb25pbmcvUHJvdmlzaW9uaW5nU2VydmljZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS5wcm92aXNpb25pbmcvc3JjL29yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1Byb3Zpc2lvbmluZ1NlcnZpY2UuamF2YSx2IDEuMTEgMjAwNi8wNy8xMiAyMToyMTozMSBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS5wcm92aXNpb25pbmc7CgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwppbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKCi8qKgogKiBTZXJ2aWNlIGZvciBtYW5hZ2luZyB0aGUgaW5pdGlhbCBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24uCiAqIDxwPgogKiBJbml0aWFsIHByb3Zpc2lvbmluZyBvZiBhbiBPU0dpIGRldmljZSBpcyBhIG11bHRpIHN0ZXAgcHJvY2VzcyB0aGF0CiAqIGN1bG1pbmF0ZXMgd2l0aCB0aGUgaW5zdGFsbGF0aW9uIGFuZCBleGVjdXRpb24gb2YgdGhlIGluaXRpYWwgbWFuYWdlbWVudAogKiBhZ2VudC4gQXQgZWFjaCBzdGVwIG9mIHRoZSBwcm9jZXNzLCBpbmZvcm1hdGlvbiBpcyBjb2xsZWN0ZWQgZm9yIHRoZSBuZXh0CiAqIHN0ZXAuIE11bHRpcGxlIGJ1bmRsZXMgbWF5IGJlIGludm9sdmVkIGFuZCB0aGlzIHNlcnZpY2UgcHJvdmlkZXMgYSBtZWFucyBmb3IKICogdGhlc2UgYnVuZGxlcyB0byBleGNoYW5nZSBpbmZvcm1hdGlvbi4gSXQgYWxzbyBwcm92aWRlcyBhIG1lYW5zIGZvciB0aGUKICogaW5pdGlhbCBNYW5hZ2VtZW50IEJ1bmRsZSB0byBnZXQgaXRzIGluaXRpYWwgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KICogPHA+CiAqIFRoZSBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24gaXMgY29sbGVjdGVkIGluIGEgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2JqZWN0LAogKiBjYWxsZWQgdGhlIFByb3Zpc2lvbmluZyBEaWN0aW9uYXJ5LiBBbnkgYnVuZGxlIHRoYXQgY2FuIGFjY2VzcyB0aGUgc2VydmljZQogKiBjYW4gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoaXMgb2JqZWN0IGFuZCByZWFkIGFuZCB1cGRhdGUgcHJvdmlzaW9uaW5nCiAqIGluZm9ybWF0aW9uLiBUaGUga2V5IG9mIHRoZSBkaWN0aW9uYXJ5IGlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYW5kIHRoZQogKiB2YWx1ZSBpcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb3IgPGNvZGU+Ynl0ZVtdPC9jb2RlPiBvYmplY3QuIFRoZSBzaW5nbGUKICogZXhjZXB0aW9uIGlzIHRoZSBQUk9WSVNJT05JTkdfVVBEQVRFX0NPVU5UIHZhbHVlIHdoaWNoIGlzIGFuIEludGVnZXIuIFRoZQogKiA8Y29kZT5wcm92aXNpb25pbmc8L2NvZGU+IHByZWZpeCBpcyByZXNlcnZlZCBmb3Iga2V5cyBkZWZpbmVkIGJ5IE9TR2ksIG90aGVyCiAqIGtleSBuYW1lcyBtYXkgYmUgdXNlZCBmb3IgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IHByb3Zpc2lvbmluZyBzeXN0ZW1zLgogKiA8cD4KICogQW55IGNoYW5nZXMgdG8gdGhlIHByb3Zpc2lvbmluZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHJlZmxlY3RlZCBpbW1lZGlhdGVseSBpbgogKiBhbGwgdGhlIGRpY3Rpb25hcnkgb2JqZWN0cyBvYnRhaW5lZCBmcm9tIHRoZSBQcm92aXNpb25pbmcgU2VydmljZS4KICogPHA+CiAqIEJlY2F1c2Ugb2YgdGhlIHNwZWNpZmljIGFwcGxpY2F0aW9uIG9mIHRoZSBQcm92aXNpb25pbmcgU2VydmljZSwgdGhlcmUgc2hvdWxkCiAqIGJlIG9ubHkgb25lIFByb3Zpc2lvbmluZyBTZXJ2aWNlIHJlZ2lzdGVyZWQuIFRoaXMgcmVzdHJpY3Rpb24gd2lsbCBub3QgYmUKICogZW5mb3JjZWQgYnkgdGhlIEZyYW1ld29yay4gR2F0ZXdheSBvcGVyYXRvcnMgb3IgbWFudWZhY3R1cmVzIHNob3VsZCBlbnN1cmUKICogdGhhdCBhIFByb3Zpc2lvbmluZyBTZXJ2aWNlIGJ1bmRsZSBpcyBub3QgaW5zdGFsbGVkIG9uIGEgZGV2aWNlIHRoYXQgYWxyZWFkeQogKiBoYXMgYSBidW5kbGUgcHJvdmlkaW5nIHRoZSBQcm92aXNpb25pbmcgU2VydmljZS4KICogPHA+CiAqIFRoZSBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24gaGFzIHRoZSBwb3RlbnRpYWwgdG8gY29udGFpbiBzZW5zaXRpdmUKICogaW5mb3JtYXRpb24uIEFsc28sIHRoZSBhYmlsaXR5IHRvIG1vZGlmeSBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24gY2FuIGhhdmUKICogZHJhc3RpYyBjb25zZXF1ZW5jZXMuIFRodXMsIG9ubHkgdHJ1c3RlZCBidW5kbGVzIHNob3VsZCBiZSBhbGxvd2VkIHRvCiAqIHJlZ2lzdGVyIGFuZCBnZXQgdGhlIFByb3Zpc2lvbmluZyBTZXJ2aWNlLiBUaGUgPGNvZGU+U2VydmljZVBlcm1pc3Npb248L2NvZGU+CiAqIGlzIHVzZWQgdG8gbGltaXQgdGhlIGJ1bmRsZXMgdGhhdCBjYW4gZ2FpbiBhY2Nlc3MgdG8gdGhlIFByb3Zpc2lvbmluZwogKiBTZXJ2aWNlLiBUaGVyZSBpcyBubyBjaGVjayBvZiA8Y29kZT5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzIHRvIHJlYWQgb3IgbW9kaWZ5CiAqIHRoZSBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24sIHNvIGNhcmUgbXVzdCBiZSB0YWtlbiBub3QgdG8gbGVhayB0aGUKICogUHJvdmlzaW9uaW5nIERpY3Rpb25hcnkgcmVjZWl2ZWQgZnJvbSA8Y29kZT5nZXRJbmZvcm1hdGlvbjwvY29kZT4gbWV0aG9kLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjExICQKICovCnB1YmxpYyBpbnRlcmZhY2UgUHJvdmlzaW9uaW5nU2VydmljZSB7CgkvKioKCSAqIFRoZSBrZXkgdG8gdGhlIHByb3Zpc2lvbmluZyBpbmZvcm1hdGlvbiB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlCgkgKiBTZXJ2aWNlIFBsYXRmb3JtLiBUaGUgdmFsdWUgbXVzdCBiZSBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVBST1ZJU0lPTklOR19TUElECQkJPSAicHJvdmlzaW9uaW5nLnNwaWQiOwoJLyoqCgkgKiBUaGUga2V5IHRvIHRoZSBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24gdGhhdCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlCgkgKiBwcm92aXNpb24gZGF0YSBwcm92aWRlci4gVGhlIHZhbHVlIG11c3QgYmUgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlQUk9WSVNJT05JTkdfUkVGRVJFTkNFCQk9ICJwcm92aXNpb25pbmcucmVmZXJlbmNlIjsKCS8qKgoJICogVGhlIGtleSB0byB0aGUgcHJvdmlzaW9uaW5nIGluZm9ybWF0aW9uIHRoYXQgY29udGFpbnMgdGhlIGluaXRpYWwKCSAqIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gb2YgdGhlIGluaXRpYWwgTWFuYWdlbWVudCBBZ2VudC4gVGhlIHZhbHVlIHdpbGwKCSAqIGJlIG9mIHR5cGUgPGNvZGU+Ynl0ZVtdPC9jb2RlPi4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJUFJPVklTSU9OSU5HX0FHRU5UX0NPTkZJRwk9ICJwcm92aXNpb25pbmcuYWdlbnQuY29uZmlnIjsKCS8qKgoJICogVGhlIGtleSB0byB0aGUgcHJvdmlzaW9uaW5nIGluZm9ybWF0aW9uIHRoYXQgY29udGFpbnMgdGhlIHVwZGF0ZSBjb3VudCBvZgoJICogdGhlIGluZm8gZGF0YS4gRWFjaCBzZXQgb2YgY2hhbmdlcyB0byB0aGUgcHJvdmlzaW9uaW5nIGluZm9ybWF0aW9uIG11c3QKCSAqIGVuZCB3aXRoIHRoaXMgdmFsdWUgYmVpbmcgaW5jcmVtZW50ZWQuIFRoZSB2YWx1ZSBtdXN0IGJlIG9mIHR5cGUKCSAqIDxjb2RlPkludGVnZXI8L2NvZGU+LiBUaGlzIGtleS92YWx1ZSBwYWlyIGlzIGFsc28gcmVmbGVjdGVkIGluIHRoZQoJICogcHJvcGVydGllcyBvZiB0aGUgUHJvdmlzaW9uaW5nU2VydmljZSBpbiB0aGUgc2VydmljZSByZWdpc3RyeS4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJUFJPVklTSU9OSU5HX1VQREFURV9DT1VOVAk9ICJwcm92aXNpb25pbmcudXBkYXRlLmNvdW50IjsKCS8qKgoJICogVGhlIGtleSB0byB0aGUgcHJvdmlzaW9uaW5nIGluZm9ybWF0aW9uIHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZQoJICogYnVuZGxlIHRvIHN0YXJ0IHdpdGggPGNvZGU+QWxsUGVybWlzc2lvbjwvY29kZT4uIFRoZSBidW5kbGUgbXVzdCBoYXZlIGJlCgkgKiBwcmV2aW91c2x5IGluc3RhbGxlZCBmb3IgdGhpcyBlbnRyeSB0byBoYXZlIGFueSBlZmZlY3QuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVBST1ZJU0lPTklOR19TVEFSVF9CVU5ETEUJPSAicHJvdmlzaW9uaW5nLnN0YXJ0LmJ1bmRsZSI7CgkvKioKCSAqIFRoZSBrZXkgdG8gdGhlIHByb3Zpc2lvbmluZyBpbmZvcm1hdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSByb290IFg1MDkKCSAqIGNlcnRpZmljYXRlIHVzZWQgdG8gZXNhdGJsaXNoIHRydXN0IHdpdGggb3BlcmF0b3Igd2hlbiB1c2luZyBIVFRQUy4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJUFJPVklTSU9OSU5HX1JPT1RYNTA5CQk9ICJwcm92aXNpb25pbmcucm9vdHg1MDkiOwoJLyoqCgkgKiBUaGUga2V5IHRvIHRoZSBwcm92aXNpb25pbmcgaW5mb3JtYXRpb24gdGhhdCBjb250YWlucyB0aGUgc2hhcmVkIHNlY3JldAoJICogdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBSU0ggcHJvdG9jb2wuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVBST1ZJU0lPTklOR19SU0hfU0VDUkVUCQk9ICJwcm92aXNpb25pbmcucnNoLnNlY3JldCI7CgkvKioKCSAqIE1JTUUgdHlwZSB0byBiZSBzdG9yZWQgaW4gdGhlIGV4dHJhIGZpZWxkIG9mIGEgPGNvZGU+WmlwRW50cnk8L2NvZGU+IG9iamVjdAoJICogZm9yIFN0cmluZyBkYXRhLgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlNSU1FX1NUUklORwkJCQkJPSAidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04IjsKCS8qKgoJICogTUlNRSB0eXBlIHRvIGJlIHN0b3JlZCBpbiB0aGUgZXh0cmEgZmllbGQgb2YgYSA8Y29kZT5aaXBFbnRyeTwvY29kZT4gb2JqZWN0CgkgKiBmb3IgPGNvZGU+Ynl0ZVtdPC9jb2RlPiBkYXRhLgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlNSU1FX0JZVEVfQVJSQVkJCQkJPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKCS8qKgoJICogTUlNRSB0eXBlIHRvIGJlIHN0b3JlZCBpbiB0aGUgZXh0cmEgZmllbGQgb2YgYSA8Y29kZT5aaXBFbnRyeTwvY29kZT4gb2JqZWN0CgkgKiBmb3IgYW4gaW5zdGFsbGFibGUgYnVuZGxlIGZpbGUuIFppcCBlbnRyaWVzIG9mIHRoaXMgdHlwZSB3aWxsIGJlCgkgKiBpbnN0YWxsZWQgaW4gdGhlIGZyYW1ld29yaywgYnV0IG5vdCBzdGFydGVkLiBUaGUgZW50cnkgd2lsbCBhbHNvIG5vdCBiZQoJICogcHV0IGludG8gdGhlIGluZm9ybWF0aW9uIGRpY3Rpb25hcnkuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCU1JTUVfQlVORExFCQkJCQk9ICJhcHBsaWNhdGlvbi94LW9zZ2ktYnVuZGxlIjsKCS8qKgoJICogTUlNRSB0eXBlIHRvIGJlIHN0b3JlZCBpbiB0aGUgZXh0cmEgZmllbGQgb2YgYSBaaXBFbnRyeSBmb3IgYSBTdHJpbmcgdGhhdAoJICogcmVwcmVzZW50cyBhIFVSTCBmb3IgYSBidW5kbGUuIFppcCBlbnRyaWVzIG9mIHRoaXMgdHlwZSB3aWxsIGJlIHVzZWQgdG8KCSAqIGluc3RhbGwgKGJ1dCBub3Qgc3RhcnQpIGEgYnVuZGxlIGZyb20gdGhlIFVSTC4gVGhlIGVudHJ5IHdpbGwgbm90IGJlIHB1dAoJICogaW50byB0aGUgaW5mb3JtYXRpb24gZGljdGlvbmFyeS4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJTUlNRV9CVU5ETEVfVVJMCQkJCT0gInRleHQveC1vc2dpLWJ1bmRsZS11cmwiOwoKCS8qKgoJICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgUHJvdmlzaW9uaW5nIERpY3Rpb25hcnkuIEFueSBjaGFuZ2Ugb3BlcmF0aW9ucwoJICogKHB1dCBhbmQgcmVtb3ZlKSB0byB0aGUgZGljdGlvbmFyeSB3aWxsIGNhdXNlIGFuCgkgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4gdG8gYmUgdGhyb3duLiBDaGFuZ2VzIG11c3QgYmUKCSAqIGRvbmUgdXNpbmcgdGhlIDxjb2RlPnNldEluZm9ybWF0aW9uPC9jb2RlPiBhbmQgPGNvZGU+YWRkSW5mb3JtYXRpb248L2NvZGU+CgkgKiBtZXRob2RzIG9mIHRoaXMgc2VydmljZS4KCSAqIEByZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIFByb3Zpc2lvbmluZyBEaWN0aW9uYXJ5LgoJICovCglwdWJsaWMgRGljdGlvbmFyeSBnZXRJbmZvcm1hdGlvbigpOwoKCS8qKgoJICogUmVwbGFjZXMgdGhlIFByb3Zpc2lvbmluZyBJbmZvcm1hdGlvbiBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycwoJICogY29udGFpbmVkIGluIDxjb2RlPmluZm88L2NvZGU+LiBBbnkga2V5L3ZhbHVlIHBhaXJzIG5vdCBpbiA8Y29kZT5pbmZvPC9jb2RlPgoJICogd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIFByb3Zpc2lvbmluZyBJbmZvcm1hdGlvbiBkaWN0aW9uYXJ5LiBUaGlzIG1ldGhvZAoJICogY2F1c2VzIHRoZSA8Y29kZT5QUk9WSVNJT05JTkdfVVBEQVRFX0NPVU5UPC9jb2RlPiB0byBiZSBpbmNyZW1lbnRlZC4KCSAqIAoJICogQHBhcmFtIGluZm8gdGhlIG5ldyBzZXQgb2YgUHJvdmlzaW9uaW5nIEluZm9ybWF0aW9uIGtleS92YWx1ZSBwYWlycy4gQW55CgkgKiAgICAgICAga2V5cyBhcmUgdmFsdWVzIHRoYXQgYXJlIG9mIGFuIGludmFsaWQgdHlwZSB3aWxsIGJlIHNpbGVudGx5CgkgKiAgICAgICAgaWdub3JlZC4KCSAqLwoJcHVibGljIHZvaWQgc2V0SW5mb3JtYXRpb24oRGljdGlvbmFyeSBpbmZvKTsKCgkvKioKCSAqIEFkZHMgdGhlIGtleS92YWx1ZSBwYWlycyBjb250YWluZWQgaW4gPGNvZGU+aW5mbzwvY29kZT4gdG8gdGhlIFByb3Zpc2lvbmluZwoJICogSW5mb3JtYXRpb24gZGljdGlvbmFyeS4gVGhpcyBtZXRob2QgY2F1c2VzIHRoZQoJICogPGNvZGU+UFJPVklTSU9OSU5HX1VQREFURV9DT1VOVDwvY29kZT4gdG8gYmUgaW5jcmVtZW50ZWQuCgkgKiAKCSAqIEBwYXJhbSBpbmZvIHRoZSBzZXQgb2YgUHJvdmlzaW9uaW5nIEluZm9ybWF0aW9uIGtleS92YWx1ZSBwYWlycyB0byBhZGQgdG8KCSAqICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIEluZm9ybWF0aW9uIGRpY3Rpb25hcnkuIEFueSBrZXlzIGFyZSB2YWx1ZXMgdGhhdAoJICogICAgICAgIGFyZSBvZiBhbiBpbnZhbGlkIHR5cGUgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLgoJICovCglwdWJsaWMgdm9pZCBhZGRJbmZvcm1hdGlvbihEaWN0aW9uYXJ5IGluZm8pOwoKCS8qKgoJICogUHJvY2Vzc2VzIHRoZSA8Y29kZT5aaXBJbnB1dFN0cmVhbTwvY29kZT4gYW5kIGV4dHJhY3RzIGluZm9ybWF0aW9uIHRvIGFkZAoJICogdG8gdGhlIFByb3Zpc2lvbmluZyBJbmZvcm1hdGlvbiBkaWN0aW9uYXJ5LCBhcyB3ZWxsIGFzLCBpbnN0YWxsL3VwZGF0ZQoJICogYW5kIHN0YXJ0IGJ1bmRsZXMuIFRoaXMgbWV0aG9kIGNhdXNlcyB0aGUKCSAqIDxjb2RlPlBST1ZJU0lPTklOR19VUERBVEVfQ09VTlQ8L2NvZGU+IHRvIGJlIGluY3JlbWVudGVkLgoJICogCgkgKiBAcGFyYW0gemlzIHRoZSA8Y29kZT5aaXBJbnB1dFN0cmVhbTwvY29kZT4gdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWRkCgkgKiAgICAgICAga2V5L3ZhbHVlIHBhaXJzIHRvIHRoZSBQcm92aXNpb25pbmcgSW5mb3JtYXRpb24gZGljdGlvbmFyeSBhbmQKCSAqICAgICAgICBpbnN0YWxsIGFuZCBzdGFydCBidW5kbGVzLiBJZiBhIDxjb2RlPlppcEVudHJ5PC9jb2RlPiBkb2VzIG5vdCBoYXZlCgkgKiAgICAgICAgYW4gPGNvZGU+RXh0cmE8L2NvZGU+IGZpZWxkIHRoYXQgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSBmb3VyCgkgKiAgICAgICAgZGVmaW5lZCBNSU1FIHR5cGVzICg8Y29kZT5NSU1FX1NUUklORzwvY29kZT4sCgkgKiAgICAgICAgPGNvZGU+TUlNRV9CWVRFX0FSUkFZPC9jb2RlPiw8Y29kZT5NSU1FX0JVTkRMRTwvY29kZT4sIGFuZAoJICogICAgICAgIDxjb2RlPk1JTUVfQlVORExFX1VSTDwvY29kZT4pIGluIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIHByb2Nlc3NpbmcgdGhlCgkgKiAgICAgICAgICAgIFppcElucHV0U3RyZWFtLiBObyBhZGRpdGlvbnMgd2lsbCBiZSBtYWRlIHRvIHRoZSBQcm92aXNpb25pbmcKCSAqICAgICAgICAgICAgSW5mb3JtYXRpb24gZGljdGlvbmFyeSBhbmQgbm8gYnVuZGxlcyBtdXN0IGJlIHN0YXJ0ZWQgb3IKCSAqICAgICAgICAgICAgaW5zdGFsbGVkLgoJICovCglwdWJsaWMgdm9pZCBhZGRJbmZvcm1hdGlvbihaaXBJbnB1dFN0cmVhbSB6aXMpIHRocm93cyBJT0V4Y2VwdGlvbjsKfQpQSwMECgAAAAAAa1LuNC+quw+UAQAAlAEAADcAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcm92aXNpb25pbmcvcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLnByb3Zpc2lvbmluZy9zcmMvb3JnL29zZ2kvc2VydmljZS9wcm92aXNpb25pbmcvcGFja2FnZS5odG1sLHYgMS40IDIwMDYvMDcvMTIgMjE6MDc6MDcgaGFyZ3JhdmUgRXhwICQgLS0+CjxCT0RZPgo8cD5Qcm92aXNpb25pbmcgUGFja2FnZSBWZXJzaW9uIDEuMS4KPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlCmluIHRoZSBJbXBvcnQtUGFja2FnZSBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0LgpGb3IgZXhhbXBsZToKPHByZT4KSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnNlcnZpY2UucHJvdmlzaW9uaW5nOyB2ZXJzaW9uPTEuMQo8L3ByZT4KPC9CT0RZPgpQSwMECgAAAAAAa1LuNISuGrcMAAAADAAAADYAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcm92aXNpb25pbmcvcGFja2FnZWluZm92ZXJzaW9uIDEuMQpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAACMAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1BLAwQKAAAAAABrUu40wCVabzoQAAA6EAAAMgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEFjdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51cG5wL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEFjdGlvbi5qYXZhLHYgMS4xMCAyMDA2LzA2LzE2IDE2OjMxOjQ2IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVwbnA7CgppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgovKioKICogQSBVUG5QIGFjdGlvbi4KICogCiAqIEVhY2ggVVBuUCBzZXJ2aWNlIGNvbnRhaW5zIHplcm8gb3IgbW9yZSBhY3Rpb25zLiBFYWNoIGFjdGlvbiBtYXkgaGF2ZSB6ZXJvIG9yCiAqIG1vcmUgVVBuUCBzdGF0ZSB2YXJpYWJsZXMgYXMgYXJndW1lbnRzLgogKiAgCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFVQblBBY3Rpb24gewoJLyoqCgkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gbmFtZS4KCSAqIAoJICogVGhlIGFjdGlvbiBuYW1lIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBmaWVsZCBpbiB0aGUKCSAqIDxjb2RlPmFjdGlvbkxpc3Q8L2NvZGU+IG9mIHRoZSBzZXJ2aWNlIGRlc2NyaXB0aW9uLgoJICogPHVsPgoJICogPGxpPkZvciBzdGFuZGFyZCBhY3Rpb25zIGRlZmluZWQgYnkgYSBVUG5QIEZvcnVtIHdvcmtpbmcgY29tbWl0dGVlLAoJICogYWN0aW9uIG5hbWVzIG11c3Qgbm90IGJlZ2luIHdpdGggPGNvZGU+WF8gPC9jb2RlPiBub3IgPGNvZGU+IEFfPC9jb2RlPi48L2xpPgoJICogPGxpPkZvciBub24tc3RhbmRhcmQgYWN0aW9ucyBzcGVjaWZpZWQgYnkgYSBVUG5QIHZlbmRvciBhbmQgYWRkZWQgdG8gYQoJICogc3RhbmRhcmQgc2VydmljZSwgYWN0aW9uIG5hbWVzIG11c3QgYmVnaW4gd2l0aCA8Y29kZT5YXzwvY29kZT4uPC9saT4KCSAqIDwvdWw+CgkgKiAKCSAqIEByZXR1cm4gTmFtZSBvZiBhY3Rpb24sIG11c3Qgbm90IGNvbnRhaW4gYSBoeXBoZW4gY2hhcmFjdGVyIG9yIGEgaGFzaAoJICogICAgICAgICBjaGFyYWN0ZXIKCSAqLwoJU3RyaW5nIGdldE5hbWUoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGRlc2lnbmF0ZWQgcmV0dXJuIGFyZ3VtZW50LgoJICogPHA+CgkgKiBPbmUgb2YgdGhlIG91dHB1dCBhcmd1bWVudHMgY2FuIGJlIGZsYWdnZWQgYXMgYSBkZXNpZ25hdGVkIHJldHVybgoJICogYXJndW1lbnQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIGRlc2lnbmF0ZWQgcmV0dXJuIGFyZ3VtZW50IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCgkgKiAgICAgICAgIG5vbmUgaXMgbWFya2VkLgoJICovCglTdHJpbmcgZ2V0UmV0dXJuQXJndW1lbnROYW1lKCk7CgoJLyoqCgkgKiBMaXN0cyBhbGwgaW5wdXQgYXJndW1lbnRzIGZvciB0aGlzIGFjdGlvbi4KCSAqIDxwPgoJICogRWFjaCBhY3Rpb24gbWF5IGhhdmUgemVybyBvciBtb3JlIGlucHV0IGFyZ3VtZW50cy4KCSAqIAoJICogQHJldHVybiBBcnJheSBvZiBpbnB1dCBhcmd1bWVudCBuYW1lcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbnB1dAoJICogICAgICAgICBhcmd1bWVudHMuCgkgKiAKCSAqIEBzZWUgVVBuUFN0YXRlVmFyaWFibGUKCSAqLwoJU3RyaW5nW10gZ2V0SW5wdXRBcmd1bWVudE5hbWVzKCk7CgoJLyoqCgkgKiBMaXN0IGFsbCBvdXRwdXQgYXJndW1lbnRzIGZvciB0aGlzIGFjdGlvbi4KCSAqIAoJICogQHJldHVybiBBcnJheSBvZiBvdXRwdXQgYXJndW1lbnQgbmFtZXMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vCgkgKiAgICAgICAgIG91dHB1dCBhcmd1bWVudHMuCgkgKiAKCSAqIEBzZWUgVVBuUFN0YXRlVmFyaWFibGUKCSAqLwoJU3RyaW5nW10gZ2V0T3V0cHV0QXJndW1lbnROYW1lcygpOwoKCS8qKgoJICogRmluZHMgdGhlIHN0YXRlIHZhcmlhYmxlIGFzc29jaWF0ZWQgd2l0aCBhbiBhcmd1bWVudCBuYW1lLgoJICogCgkgKiBIZWxwcyB0byByZXNvbHZlIHRoZSBhc3NvY2lhdGlvbiBvZiBzdGF0ZSB2YXJpYWJsZXMgd2l0aCBhcmd1bWVudCBuYW1lcwoJICogaW4gVVBuUCBhY3Rpb25zLgoJICogCgkgKiBAcGFyYW0gYXJndW1lbnROYW1lIFRoZSBuYW1lIG9mIHRoZSBVUG5QIGFjdGlvbiBhcmd1bWVudC4KCSAqIEByZXR1cm4gU3RhdGUgdmFyaWFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lZCBhcmd1bWVudCBvcgoJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBzdWNoIGFyZ3VtZW50LgoJICogCgkgKiBAc2VlIFVQblBTdGF0ZVZhcmlhYmxlCgkgKi8KCVVQblBTdGF0ZVZhcmlhYmxlIGdldFN0YXRlVmFyaWFibGUoU3RyaW5nIGFyZ3VtZW50TmFtZSk7CgoJLyoqCgkgKiBJbnZva2VzIHRoZSBhY3Rpb24uCgkgKiAKCSAqIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cyBhcmUgYm90aCBwYXNzZWQgYXMgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4KCSAqIG9iamVjdHMuIEVhY2ggZW50cnkgaW4gdGhlIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG9iamVjdCBoYXMgYQoJICogPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgYXMga2V5IHJlcHJlc2VudGluZyB0aGUgYXJndW1lbnQgbmFtZSBhbmQgdGhlCgkgKiB2YWx1ZSBpcyB0aGUgYXJndW1lbnQgaXRzZWxmLiBUaGUgY2xhc3Mgb2YgYW4gYXJndW1lbnQgdmFsdWUgbXVzdCBiZQoJICogYXNzaWduYWJsZSBmcm9tIHRoZSBjbGFzcyBvZiB0aGUgYXNzb2NpYXRlZCBVUG5QIHN0YXRlIHZhcmlhYmxlLgoJICogCgkgKiBUaGUgaW5wdXQgYXJndW1lbnQgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2JqZWN0IG11c3QgY29udGFpbiBleGFjdGx5CgkgKiB0aG9zZSBhcmd1bWVudHMgbGlzdGVkIGJ5IDxjb2RlPmdldElucHV0QXJndW1lbnRzPC9jb2RlPiBtZXRob2QuIFRoZSBvdXRwdXQKCSAqIGFyZ3VtZW50IDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG9iamVjdCB3aWxsIGNvbnRhaW4gZXhhY3RseSB0aG9zZQoJICogYXJndW1lbnRzIGxpc3RlZCBieSA8Y29kZT5nZXRPdXRwdXRBcmd1bWVudHM8L2NvZGU+IG1ldGhvZC4KCSAqCgkgKiBAcGFyYW0gYXJncyBBIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG9mIGFyZ3VtZW50cy4gTXVzdCBjb250YWluIHRoZSBjb3JyZWN0IHNldCBhbmQKCSAqIHR5cGUgb2YgYXJndW1lbnRzIGZvciB0aGlzIGFjdGlvbi4gTWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vCgkgKiBpbnB1dCBhcmd1bWVudHMgZXhpc3QuCgkgKgoJICogQHJldHVybiBBIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IHdpdGggdGhlIG91dHB1dCBhcmd1bWVudHMuCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhY3Rpb24gaGFzIG5vIG91dHB1dCBhcmd1bWVudHMuCgkgKgoJICogQHRocm93cyBVUG5QRXhjZXB0aW9uICBBIFVQblAgZXJyb3IgaGFzIG9jY3VyZWQuCgkgKiBAdGhyb3dzIEV4Y2VwdGlvbiBUaGUgZXhlY3V0aW9uIGZhaWxzIGZvciBzb21lIHJlYXNvbi4KCSAqCgkgKiBAc2VlIFVQblBTdGF0ZVZhcmlhYmxlCgkgKi8KCURpY3Rpb25hcnkgaW52b2tlKERpY3Rpb25hcnkgYXJncykgdGhyb3dzIEV4Y2VwdGlvbjsKfQpQSwMECgAAAAAAa1LuNHqfdyBhKgAAYSoAADIAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBEZXZpY2UuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UudXBucC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBEZXZpY2UuamF2YSx2IDEuOSAyMDA2LzA2LzE2IDE2OjMxOjQ2IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVwbnA7CgppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgovKioKICogUmVwcmVzZW50cyBhIFVQblAgZGV2aWNlLgogKiAKICogRm9yIGVhY2ggVVBuUCByb290IGFuZCBlbWJlZGRlZCBkZXZpY2UsIGFuIG9iamVjdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlCiAqIGZyYW1ld29yayB1bmRlciB0aGUgPGNvZGU+VVBuUERldmljZTwvY29kZT4gaW50ZXJmYWNlLgogKiA8cD4KICogVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgcm9vdCBkZXZpY2UgYW5kIGl0cyBlbWJlZGRlZCBkZXZpY2VzIGNhbiBiZQogKiBkZWR1Y2VkIHVzaW5nIHRoZSA8Y29kZT5VUG5QRGV2aWNlLkNISUxEUkVOX1VETjwvY29kZT4gYW5kCiAqIDxjb2RlPlVQblBEZXZpY2UuUEFSRU5UX1VETjwvY29kZT4gc2VydmljZSByZWdpc3RyYXRpb24gcHJvcGVydGllcy4KICogPHA+CiAqIFRoZSB2YWx1ZXMgb2YgdGhlIFVQblAgcHJvcGVydHkgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIFVQblAgRm9ydW0uCiAqIDxwPgogKiBBbGwgdmFsdWVzIG9mIHRoZSBVUG5QIHByb3BlcnRpZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGRldmljZSB1c2luZyB0aGUKICogZGV2aWNlJ3MgZGVmYXVsdCBsb2NhbGUuCiAqIDxwPgogKiBJZiBhbiBhcHBsaWNhdGlvbiB3YW50cyB0byBxdWVyeSBmb3IgYSBzZXQgb2YgbG9jYWxpemVkIHByb3BlcnR5IHZhbHVlcywgaXQKICogaGFzIHRvIHVzZSB0aGUgbWV0aG9kIDxjb2RlPlVQblBEZXZpY2UuZ2V0RGVzY3JpcHRpb25zKFN0cmluZyBsb2NhbGUpPC9jb2RlPi4KICogIAogKi8KcHVibGljIGludGVyZmFjZSBVUG5QRGV2aWNlIHsKCS8qCgkgKiBDb25zdGFudHMgZm9yIHRoZSBVUG5QIGRldmljZSBtYXRjaCBzY2FsZS4KCSAqLwoJLyoqCgkgKiBDb25zdGFudCBmb3IgdGhlIFVQblAgZGV2aWNlIG1hdGNoIHNjYWxlLCBpbmRpY2F0aW5nIGEgZ2VuZXJpYyBtYXRjaCBmb3IKCSAqIHRoZSBkZXZpY2UuIFZhbHVlIGlzIDEuCgkgKi8KCWludAkJTUFUQ0hfR0VORVJJQwkJCQkJCQkJPSAxOwoJLyoqCgkgKiBDb25zdGFudCBmb3IgdGhlIFVQblAgZGV2aWNlIG1hdGNoIHNjYWxlLCBpbmRpY2F0aW5nIGEgbWF0Y2ggd2l0aCB0aGUKCSAqIGRldmljZSB0eXBlLiBWYWx1ZSBpcyAzLgoJICovCglpbnQJCU1BVENIX1RZUEUJCQkJCQkJCQk9IDM7CgkvKioKCSAqIENvbnN0YW50IGZvciB0aGUgVVBuUCBkZXZpY2UgbWF0Y2ggc2NhbGUsIGluZGljYXRpbmcgYSBtYXRjaCB3aXRoIHRoZQoJICogZGV2aWNlIG1vZGVsLiBWYWx1ZSBpcyA3LgoJICovCglpbnQJCU1BVENIX01BTlVGQUNUVVJFUl9NT0RFTAkJCQkJPSA3OwoJLyoqCgkgKiBDb25zdGFudCBmb3IgdGhlIFVQblAgZGV2aWNlIG1hdGNoIHNjYWxlLCBpbmRpY2F0aW5nIGEgbWF0Y2ggd2l0aCB0aGUKCSAqIGRldmljZSByZXZpc2lvbi4gVmFsdWUgaXMgMTUuCgkgKi8KCWludAkJTUFUQ0hfTUFOVUZBQ1RVUkVSX01PREVMX1JFVklTSU9OCQkJPSAxNTsKCS8qKgoJICogQ29uc3RhbnQgZm9yIHRoZSBVUG5QIGRldmljZSBtYXRjaCBzY2FsZSwgaW5kaWNhdGluZyBhIG1hdGNoIHdpdGggdGhlCgkgKiBkZXZpY2UgcmV2aXNpb24gYW5kIHRoZSBzZXJpYWwgbnVtYmVyLiBWYWx1ZSBpcyAzMS4KCSAqLwoJaW50CQlNQVRDSF9NQU5VRkFDVFVSRVJfTU9ERUxfUkVWSVNJT05fU0VSSUFMCT0gMzE7CgkvKioKCSAqIENvbnN0YW50IGZvciB0aGUgdmFsdWUgb2YgdGhlIHNlcnZpY2UgcHJvcGVydHkgPGNvZGU+REVWSUNFX0NBVEVHT1JZPC9jb2RlPgoJICogdXNlZCBmb3IgYWxsIFVQblAgZGV2aWNlcy4gVmFsdWUgaXMgIlVQblAiLgoJICogCgkgKiBAc2VlICI8Y29kZT5vcmcub3NnaS5zZXJ2aWNlLmRldmljZS5Db25zdGFudHMuREVWSUNFX0NBVEVHT1JZPC9jb2RlPiIKCSAqLwoJU3RyaW5nCURFVklDRV9DQVRFR09SWQkJCQkJCQkJPSAiVVBuUCI7CgkvKioKCSAqIFRoZSA8Y29kZT5VUG5QLmV4cG9ydDwvY29kZT4gc2VydmljZSBwcm9wZXJ0eSBpcyBhIGhpbnQgdGhhdCBtYXJrcyBhIGRldmljZQoJICogdG8gYmUgcGlja2VkIHVwIGFuZCBleHBvcnRlZCBieSB0aGUgVVBuUCBTZXJ2aWNlLiBJbXBvcnRlZCBkZXZpY2VzIGRvIG5vdAoJICogaGF2ZSB0aGlzIHByb3BlcnR5IHNldC4gVGhlIHJlZ2lzdGVyZWQgcHJvcGVydHkgcmVxdWlyZXMgbm8gdmFsdWUuCgkgKiA8cD4KCSAqIFRoZSBVUE5QX0VYUE9SVCBzdHJpbmcgaXMgIlVQblAuZXhwb3J0Ii4KCSAqLwoJU3RyaW5nCVVQTlBfRVhQT1JUCQkJCQkJCQkJPSAiVVBuUC5leHBvcnQiOwoJLyoqCgkgKiBQcm9wZXJ0eSBrZXkgZm9yIHRoZSBVbmlxdWUgRGV2aWNlIE5hbWUgKFVETikgcHJvcGVydHkuIEl0IGlzIHRoZSB1bmlxdWUKCSAqIGlkZW50aWZpZXIgb2YgYW4gaW5zdGFuY2Ugb2YgYSA8Y29kZT5VUG5QRGV2aWNlPC9jb2RlPi4gVGhlIHZhbHVlIG9mIHRoZQoJICogcHJvcGVydHkgaXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCBvZiB0aGUgRGV2aWNlIFVETi4gVmFsdWUgb2YgdGhlCgkgKiBrZXkgaXMgIlVQblAuZGV2aWNlLlVETiIuIFRoaXMgcHJvcGVydHkgbXVzdCBiZSBzZXQuCgkgKi8KCVN0cmluZwlVRE4JCQkJCQkJCQkJCT0gIlVQblAuZGV2aWNlLlVETiI7CgkvKioKCSAqIFByb3BlcnR5IGtleSBmb3IgdGhlIFVuaXF1ZSBEZXZpY2UgSUQgcHJvcGVydHkuIFRoaXMgcHJvcGVydHkgaXMgYW4gYWxpYXMKCSAqIHRvIDxjb2RlPlVQblBEZXZpY2UuVUROPC9jb2RlPi4gSXQgaXMgbWVyZWx5IHByb3ZpZGVkIGZvciByZWFzb25zIG9mCgkgKiBzeW1tZXRyeSB3aXRoIHRoZSA8Y29kZT5VUG5QU2VydmljZS5JRDwvY29kZT4gcHJvcGVydHkuIFRoZSB2YWx1ZSBvZiB0aGUKCSAqIHByb3BlcnR5IGlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3Qgb2YgdGhlIERldmljZSBVRE4uIFRoZSB2YWx1ZSBvZgoJICogdGhlIGtleSBpcyAiVVBuUC5kZXZpY2UuVUROIi4KCSAqLwoJU3RyaW5nCUlECQkJCQkJCQkJCQk9IFVETjsKCS8qKgoJICogUHJvcGVydHkga2V5IGZvciB0aGUgVVBuUCBEZXZpY2UgVHlwZSBwcm9wZXJ0eS4gU29tZSBzdGFuZGFyZCBwcm9wZXJ0eQoJICogdmFsdWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBVbml2ZXJzYWwgUGx1ZyBhbmQgUGxheSBGb3J1bS4gVGhlIHR5cGUgc3RyaW5nCgkgKiBhbHNvIGluY2x1ZGVzIGEgdmVyc2lvbiBudW1iZXIgYXMgZGVmaW5lZCBpbiB0aGUgVVBuUCBzcGVjaWZpY2F0aW9uLiBUaGlzCgkgKiBwcm9wZXJ0eSBtdXN0IGJlIHNldC4KCSAqIDxwPgoJICogRm9yIHN0YW5kYXJkIGRldmljZXMgZGVmaW5lZCBieSBhIFVQblAgRm9ydW0gd29ya2luZyBjb21taXR0ZWUsIHRoaXMgbXVzdAoJICogY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nIGNvbXBvbmVudHMgaW4gdGhlIGdpdmVuIG9yZGVyIHNlcGFyYXRlZCBieQoJICogY29sb25zOgoJICogPHVsPgoJICogPGxpPjxjb2RlPnVybjwvY29kZT48L2xpPgoJICogPGxpPnNjaGVtYXMtdXBucC1vcmc8L2xpPgoJICogPGxpPjxjb2RlPmRldmljZTwvY29kZT48L2xpPgoJICogPGxpPmEgZGV2aWNlIHR5cGUgc3VmZml4PC9saT4KCSAqIDxsaT5hbiBpbnRlZ2VyIGRldmljZSB2ZXJzaW9uPC9saT4KCSAqIDwvdWw+CgkgKiBGb3Igbm9uLXN0YW5kYXJkIGRldmljZXMgc3BlY2lmaWVkIGJ5IFVQblAgdmVuZG9ycyBmb2xsb3dpbmcgY29tcG9uZW50cwoJICogbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGhlIGdpdmVuIG9yZGVyIHNlcGFyYXRlZCBieSBjb2xvbnM6CgkgKiA8dWw+CgkgKiA8bGk+PGNvZGU+dXJuPC9jb2RlPjwvbGk+CgkgKiA8bGk+YW4gSUNBTk4gZG9tYWluIG5hbWUgb3duZWQgYnkgdGhlIHZlbmRvcjwvbGk+CgkgKiA8bGk+PGNvZGU+ZGV2aWNlPC9jb2RlPjwvbGk+CgkgKiA8bGk+YSBkZXZpY2UgdHlwZSBzdWZmaXg8L2xpPgoJICogPGxpPmFuIGludGVnZXIgZGV2aWNlIHZlcnNpb248L2xpPgoJICogPC91bD4KCSAqIDxwPgoJICogVG8gYWxsb3cgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdGhlIFVQblAgZHJpdmVyIG11c3QgYXV0b21hdGljYWxseQoJICogZ2VuZXJhdGUgYWRkaXRpb25hbCBEZXZpY2UgVHlwZSBwcm9wZXJ0eSBlbnRyaWVzIGZvciBzbWFsbGVyIHZlcnNpb25zCgkgKiB0aGFuIHRoZSBjdXJyZW50IG9uZS4gSWYgZm9yIGV4YW1wbGUgYSBkZXZpY2UgYW5ub3VuY2VzIGl0cyB0eXBlIGFzCgkgKiB2ZXJzaW9uIDMsIHRoZW4gcHJvcGVydGllcyBmb3IgdmVyc2lvbnMgMiBhbmQgMSBtdXN0IGJlIGF1dG9tYXRpY2FsbHkKCSAqIGdlbmVyYXRlZC4KCSAqIDxwPgoJICogSW4gdGhlIGNhc2Ugb2YgZXhwb3J0aW5nIGEgVVBuUERldmljZSwgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHZlcnNpb24gbXVzdAoJICogYmUgYW5ub3VuY2VkIG9uIHRoZSBuZXR3b3JrLgoJICogPHA+CgkgKiBTeW50YXggRXhhbXBsZTogPGNvZGU+dXJuOnNjaGVtYXMtdXBucC1vcmc6ZGV2aWNlOmRldmljZVR5cGU6djwvY29kZT4KCSAqIDxwPgoJICogVGhlIHZhbHVlIGlzICJVUG5QLmRldmljZS50eXBlIi4KCSAqLwoJU3RyaW5nCVRZUEUJCQkJCQkJCQkJPSAiVVBuUC5kZXZpY2UudHlwZSI7CgkvKioKCSAqIE1hbmRhdG9yeSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSBkZXZpY2UgbWFudWZhY3R1cmVyJ3MgcHJvcGVydHkuIFRoZQoJICogcHJvcGVydHkgdmFsdWUgaG9sZHMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRldmljZSBtYW51ZmFjdHVyZXIncwoJICogbmFtZS4gVmFsdWUgaXMgIlVQblAuZGV2aWNlLm1hbnVmYWN0dXJlciIuCgkgKi8KCVN0cmluZwlNQU5VRkFDVFVSRVIJCQkJCQkJCT0gIlVQblAuZGV2aWNlLm1hbnVmYWN0dXJlciI7CgkvKioKCSAqIE1hbmRhdG9yeSBwcm9wZXJ0eSBrZXkgZm9yIHRoZSBkZXZpY2UgbW9kZWwgbmFtZS4gVGhlIHByb3BlcnR5IHZhbHVlCgkgKiBob2xkcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IGdpdmluZyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UKCSAqIG1vZGVsLiBWYWx1ZSBpcyAiVVBuUC5kZXZpY2UubW9kZWxOYW1lIi4KCSAqLwoJU3RyaW5nCU1PREVMX05BTUUJCQkJCQkJCQk9ICJVUG5QLmRldmljZS5tb2RlbE5hbWUiOwoJLyoqCgkgKiBNYW5kYXRvcnkgcHJvcGVydHkga2V5IGZvciBhIHNob3J0IHVzZXIgZnJpZW5kbHkgdmVyc2lvbiBvZiB0aGUgZGV2aWNlCgkgKiBuYW1lLiBUaGUgcHJvcGVydHkgdmFsdWUgaG9sZHMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCB3aXRoIHRoZSB1c2VyCgkgKiBmcmllbmRseSBuYW1lIG9mIHRoZSBkZXZpY2UuIFZhbHVlIGlzICJVUG5QLmRldmljZS5mcmllbmRseU5hbWUiLgoJICovCglTdHJpbmcJRlJJRU5ETFlfTkFNRQkJCQkJCQkJPSAiVVBuUC5kZXZpY2UuZnJpZW5kbHlOYW1lIjsKCS8qKgoJICogT3B0aW9uYWwgcHJvcGVydHkga2V5IGZvciBhIFVSTCB0byB0aGUgZGV2aWNlIG1hbnVmYWN0dXJlcnMgV2ViIHNpdGUuIFRoZQoJICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVUkwuCgkgKiBWYWx1ZSBpcyAiVVBuUC5kZXZpY2UubWFudWZhY3R1cmVyVVJMIi4KCSAqLwoJU3RyaW5nCU1BTlVGQUNUVVJFUl9VUkwJCQkJCQkJPSAiVVBuUC5kZXZpY2UubWFudWZhY3R1cmVyVVJMIjsKCS8qKgoJICogT3B0aW9uYWwgKGJ1dCByZWNvbW1lbmRlZCkgcHJvcGVydHkga2V5IGZvciBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0CgkgKiB3aXRoIGEgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgZGV2aWNlIGZvciB0aGUgZW5kIHVzZXIuIFRoZSB2YWx1ZSBpcwoJICogIlVQblAuZGV2aWNlLm1vZGVsRGVzY3JpcHRpb24iLgoJICovCglTdHJpbmcJTU9ERUxfREVTQ1JJUFRJT04JCQkJCQkJPSAiVVBuUC5kZXZpY2UubW9kZWxEZXNjcmlwdGlvbiI7CgkvKioKCSAqIE9wdGlvbmFsIChidXQgcmVjb21tZW5kZWQpIHByb3BlcnR5IGtleSBmb3IgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGNsYXNzCgkgKiB0eXBlZCBwcm9wZXJ0eSBob2xkaW5nIHRoZSBtb2RlbCBudW1iZXIgb2YgdGhlIGRldmljZS4gVmFsdWUgaXMKCSAqICJVUG5QLmRldmljZS5tb2RlbE51bWJlciIuCgkgKi8KCVN0cmluZwlNT0RFTF9OVU1CRVIJCQkJCQkJCT0gIlVQblAuZGV2aWNlLm1vZGVsTnVtYmVyIjsKCS8qKgoJICogT3B0aW9uYWwgcHJvcGVydHkga2V5IGZvciBhIDxjb2RlPlN0cmluZzwvY29kZT4gdHlwZWQgcHJvcGVydHkgaG9sZGluZyBhCgkgKiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBVUkwgdG8gdGhlIFdlYiBzaXRlIGZvciB0aGlzIG1vZGVsLiBWYWx1ZSBpcwoJICogIlVQblAuZGV2aWNlLm1vZGVsVVJMIi4KCSAqLwoJU3RyaW5nCU1PREVMX1VSTAkJCQkJCQkJCT0gIlVQblAuZGV2aWNlLm1vZGVsVVJMIjsKCS8qKgoJICogT3B0aW9uYWwgKGJ1dCByZWNvbW1lbmRlZCkgcHJvcGVydHkga2V5IGZvciBhIDxjb2RlPlN0cmluZzwvY29kZT4gdHlwZWQKCSAqIHByb3BlcnR5IGhvbGRpbmcgdGhlIHNlcmlhbCBudW1iZXIgb2YgdGhlIGRldmljZS4gVmFsdWUgaXMKCSAqICJVUG5QLmRldmljZS5zZXJpYWxOdW1iZXIiLgoJICovCglTdHJpbmcJU0VSSUFMX05VTUJFUgkJCQkJCQkJPSAiVVBuUC5kZXZpY2Uuc2VyaWFsTnVtYmVyIjsKCS8qKgoJICogT3B0aW9uYWwgcHJvcGVydHkga2V5IGZvciBhIDxjb2RlPlN0cmluZzwvY29kZT4gdHlwZWQgcHJvcGVydHkgaG9sZGluZyB0aGUKCSAqIFVuaXZlcnNhbCBQcm9kdWN0IENvZGUgKFVQQykgb2YgdGhlIGRldmljZS4gVmFsdWUgaXMgIlVQblAuZGV2aWNlLlVQQyIuCgkgKi8KCVN0cmluZwlVUEMJCQkJCQkJCQkJCT0gIlVQblAuZGV2aWNlLlVQQyI7CgkvKioKCSAqIE9wdGlvbmFsIChidXQgcmVjb21tZW5kZWQpIHByb3BlcnR5IGtleSBmb3IgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHR5cGVkCgkgKiBwcm9wZXJ0eSBob2xkaW5nIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgVVJMIHRvIGEgZGV2aWNlIHJlcHJlc2VudGF0aW9uCgkgKiBXZWIgcGFnZS4gVmFsdWUgaXMgIlVQblAucHJlc2VudGF0aW9uVVJMIi4KCSAqLwoJU3RyaW5nCVBSRVNFTlRBVElPTl9VUkwJCQkJCQkJPSAiVVBuUC5wcmVzZW50YXRpb25VUkwiOwoJLyoqCgkgKiBUaGUgcHJvcGVydHkga2V5IHRoYXQgbXVzdCBiZSBzZXQgZm9yIGFsbCBlbWJlZGRlZCBkZXZpY2VzLiBJdCBjb250YWlucwoJICogdGhlIFVETiBvZiB0aGUgcGFyZW50IGRldmljZS4gVGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgZm9yIHJvb3QgZGV2aWNlcy4KCSAqIFRoZSB2YWx1ZSBpcyAiVVBuUC5kZXZpY2UucGFyZW50VUROIi4KCSAqLwoJU3RyaW5nCVBBUkVOVF9VRE4JCQkJCQkJCQk9ICJVUG5QLmRldmljZS5wYXJlbnRVRE4iOwoJLyoqCgkgKiBUaGUgcHJvcGVydHkga2V5IHRoYXQgbXVzdCBiZSBzZXQgZm9yIGFsbCBkZXZpY2VzIGNvbnRhaW5pbmcgb3RoZXIKCSAqIGVtYmVkZGVkIGRldmljZXMuCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBpcyBhbiBhcnJheSBvZiBVRE5zIGZvciBlYWNoIG9mIHRoZSBkZXZpY2UncyBjaGlsZHJlbiAoCgkgKiA8Y29kZT5TdHJpbmdbXTwvY29kZT4pLiBUaGUgYXJyYXkgY29udGFpbnMgVUROcyBmb3IgdGhlIGltbWVkaWF0ZQoJICogZGVzY2VuZGFudHMgb25seS4KCSAqIDwvcD4KCSAqIDxwPgoJICogSWYgYW4gZW1iZWRkZWQgZGV2aWNlIGluIHR1cm4gY29udGFpbnMgZW1iZWRkZWQgZGV2aWNlcywgdGhlIGxhdHRlciBhcmUKCSAqIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuCgkgKiA8L3A+CgkgKiBUaGUgVVBuUCBTcGVjaWZpY2F0aW9uIGRvZXMgbm90IGVuY291cmFnZSBtb3JlIHRoYW4gdHdvIGxldmVscyBvZgoJICogbmVzdGluZy4KCSAqIDxwPgoJICogVGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgaWYgdGhlIGRldmljZSBkb2VzIG5vdCBjb250YWluIGVtYmVkZGVkIGRldmljZXMuCgkgKiA8cD4KCSAqIFRoZSBwcm9wZXJ0eSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZ1tdPC9jb2RlPi4gVmFsdWUgaXMKCSAqICJVUG5QLmRldmljZS5jaGlsZHJlblVETiIKCSAqLwoJU3RyaW5nCUNISUxEUkVOX1VETgkJCQkJCQkJPSAiVVBuUC5kZXZpY2UuY2hpbGRyZW5VRE4iOwoKCS8qKgoJICogTG9jYXRlcyBhIHNwZWNpZmljIHNlcnZpY2UgYnkgaXRzIHNlcnZpY2UgaWQuCgkgKiAKCSAqIEBwYXJhbSBzZXJ2aWNlSWQgVGhlIHNlcnZpY2UgaWQKCSAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCBzZXJ2aWNlIG9yIG51bGwgaWYgbm90IGZvdW5kLgoJICovCglVUG5QU2VydmljZSBnZXRTZXJ2aWNlKFN0cmluZyBzZXJ2aWNlSWQpOwoKCS8qKgoJICogTGlzdHMgYWxsIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoaXMgZGV2aWNlLgoJICogCgkgKiBAcmV0dXJuIEFycmF5IG9mIHNlcnZpY2VzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHNlcnZpY2VzIGFyZQoJICogICAgICAgICBhdmFpbGFibGUuCgkgKi8KCVVQblBTZXJ2aWNlW10gZ2V0U2VydmljZXMoKTsKCgkvKioKCSAqIExpc3RzIGFsbCBpY29ucyBmb3IgdGhpcyBkZXZpY2UgaW4gYSBnaXZlbiBsb2NhbGUuCgkgKiAKCSAqIFRoZSBVUG5QIHNwZWNpZmljYXRpb24gYWxsb3dzIGEgZGV2aWNlIHRvIHByZXNlbnQgZGlmZmVyZW50IGljb25zIGJhc2VkCgkgKiBvbiB0aGUgY2xpZW50J3MgbG9jYWxlLgoJICogCgkgKiBAcGFyYW0gbG9jYWxlIEEgbGFuZ3VhZ2UgdGFnIGFzIGRlZmluZWQgYnkgUkZDIDE3NjYgYW5kIG1haW50YWluZWQgYnkgSVNPCgkgKiAgICAgICAgNjM5LiBFeGFtcGxlcyBpbmNsdWRlICI8Y29kZT5kZTwvY29kZT4iLCAiPGNvZGU+ZW48L2NvZGU+IiBvciAiCgkgKiAgICAgICAgPGNvZGU+ZW4tVVM8L2NvZGU+Ii4gVGhlIGRlZmF1bHQgbG9jYWxlIG9mIHRoZSBkZXZpY2UgaXMgc3BlY2lmaWVkCgkgKiAgICAgICAgYnkgcGFzc2luZyBhIDxjb2RlPm51bGw8L2NvZGU+IGFyZ3VtZW50LgoJICogCgkgKiBAcmV0dXJuIEFycmF5IG9mIGljb25zIG9yIG51bGwgaWYgbm8gaWNvbnMgYXJlIGF2YWlsYWJsZS4KCSAqLwoJVVBuUEljb25bXSBnZXRJY29ucyhTdHJpbmcgbG9jYWxlKTsKCgkvKioKCSAqIEdldCBhIHNldCBvZiBsb2NhbGl6ZWQgVVBuUCBwcm9wZXJ0aWVzLgoJICogCgkgKiBUaGUgVVBuUCBzcGVjaWZpY2F0aW9uIGFsbG93cyBhIGRldmljZSB0byBwcmVzZW50IGRpZmZlcmVudCBkZXZpY2UKCSAqIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGNsaWVudCdzIGxvY2FsZS4gVGhlIHByb3BlcnRpZXMgdXNlZCB0byByZWdpc3RlcgoJICogdGhlIFVQblBEZXZpY2Ugc2VydmljZSBpbiB0aGUgT1NHaSByZWdpc3RyeSBhcmUgYmFzZWQgb24gdGhlIGRldmljZSdzCgkgKiBkZWZhdWx0IGxvY2FsZS4gVG8gb2J0YWluIGEgbG9jYWxpemVkIHNldCBvZiB0aGUgcHJvcGVydGllcywgYW4KCSAqIGFwcGxpY2F0aW9uIGNhbiB1c2UgdGhpcyBtZXRob2QuCgkgKiA8cD4KCSAqIE5vdCBhbGwgcHJvcGVydGllcyBtaWdodCBiZSBhdmFpbGFibGUgaW4gYWxsIGxvY2FsZXMuIFRoaXMgbWV0aG9kIGRvZXMKCSAqIDxiPm5vdCA8L2I+IHN1YnN0aXR1dGUgbWlzc2luZyBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgZGVmYXVsdCBsb2NhbGUKCSAqIHZlcnNpb25zLgoJICogPHA+CgkgKiAKCSAqIEBwYXJhbSBsb2NhbGUgQSBsYW5ndWFnZSB0YWcgYXMgZGVmaW5lZCBieSBSRkMgMTc2NiBhbmQgbWFpbnRhaW5lZCBieSBJU08KCSAqICAgICAgICA2MzkuIEV4YW1wbGVzIGluY2x1ZGUgIjxjb2RlPmRlPC9jb2RlPiIsICI8Y29kZT5lbjwvY29kZT4iIG9yICIKCSAqICAgICAgICA8Y29kZT5lbi1VUzwvY29kZT4iLiBUaGUgZGVmYXVsdCBsb2NhbGUgb2YgdGhlIGRldmljZSBpcyBzcGVjaWZpZWQKCSAqICAgICAgICBieSBwYXNzaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gYXJndW1lbnQuCgkgKiBAcmV0dXJuIERpY3Rpb25hcnkgbWFwcGluZyBwcm9wZXJ0eSBuYW1lIFN0cmluZ3MgdG8gcHJvcGVydHkgdmFsdWUKCSAqICAgICAgICAgU3RyaW5ncwoJICogIAoJICovCglEaWN0aW9uYXJ5IGdldERlc2NyaXB0aW9ucyhTdHJpbmcgbG9jYWxlKTsKfQpQSwMECgAAAAAAa1LuNG5uCjMkDgAAJA4AADkAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFdmVudExpc3RlbmVyLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLnVwbnAvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRXZlbnRMaXN0ZW5lci5qYXZhLHYgMS44IDIwMDYvMDYvMTYgMTY6MzE6NDYgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAyLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UudXBucDsKCmltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKCi8qKgogKiBVUG5QIEV2ZW50cyBhcmUgbWFwcGVkIGFuZCBkZWxpdmVyZWQgdG8gYXBwbGljYXRpb25zIGFjY29yZGluZyB0byB0aGUgT1NHaQogKiB3aGl0ZWJvYXJkIG1vZGVsLiBBbiBhcHBsaWNhdGlvbiB0aGF0IHdpc2hlcyB0byBiZSBub3RpZmllZCBvZiBldmVudHMKICogZ2VuZXJhdGVkIGJ5IGEgcGFydGljdWxhciBVUG5QIERldmljZSByZWdpc3RlcnMgYSBzZXJ2aWNlIGV4dGVuZGluZyB0aGlzCiAqIGludGVyZmFjZS4KICogPHA+CiAqIFRoZSBub3RpZmljYXRpb24gY2FsbCBmcm9tIHRoZSBVUG5QIFNlcnZpY2UgdG8gYW55IDxjb2RlPlVQblBFdmVudExpc3RlbmVyPC9jb2RlPgogKiBvYmplY3QgbXVzdCBiZSBkb25lIGFzeW5jaHJvbm91cyB3aXRoIHJlc3BlY3QgdG8gdGhlIG9yaWdpbmF0b3IgKGluIGEKICogc2VwYXJhdGUgdGhyZWFkKS4KICogPHA+CiAqIFVwb24gcmVnaXN0cmF0aW9uIG9mIHRoZSBVUG5QIEV2ZW50IExpc3RlbmVyIHNlcnZpY2Ugd2l0aCB0aGUgRnJhbWV3b3JrLCB0aGUKICogc2VydmljZSBpcyBub3RpZmllZCBmb3IgZWFjaCB2YXJpYWJsZSB3aGljaCBpdCBsaXN0ZW5zIGZvciB3aXRoIGFuIGluaXRpYWwKICogZXZlbnQgY29udGFpbmluZyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuIFN1YnNlcXVlbnQgbm90aWZpY2F0aW9ucwogKiBvbmx5IGhhcHBlbiBvbiBjaGFuZ2VzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUuCiAqIDxwPgogKiBBIFVQblAgRXZlbnQgTGlzdGVuZXIgc2VydmljZSBmaWx0ZXIgdGhlIGV2ZW50cyBpdCByZWNlaXZlcy4gVGhpcyBldmVudCBzZXQKICogaXMgbGltaXRlZCB1c2luZyBhIHN0YW5kYXJkIGZyYW1ld29yayBmaWx0ZXIgZXhwcmVzc2lvbiB3aGljaCBpcyBzcGVjaWZpZWQKICogd2hlbiB0aGUgbGlzdGVuZXIgc2VydmljZSBpcyByZWdpc3RlcmVkLgogKiA8cD4KICogVGhlIGZpbHRlciBpcyBzcGVjaWZpZWQgaW4gYSBwcm9wZXJ0eSBuYW1lZCAidXBucC5maWx0ZXIiIGFuZCBoYXMgYXMgYSB2YWx1ZQogKiBhbiBvYmplY3Qgb2YgdHlwZSA8Y29kZT5vcmcub3NnaS5mcmFtZXdvcmsuRmlsdGVyPC9jb2RlPi4KICogPHA+CiAqIFdoZW4gdGhlIEZpbHRlciBpcyBldmFsdWF0ZWQsIHRoZSBmb2xvd2luZyBrZXl3b3JkcyBhcmUgcmVjb2duaXplZCBhcyBkZWZpbmVkCiAqIGFzIGxpdGVyYWwgY29uc3RhbnRzIGluIHRoZSA8Y29kZT5VUG5QRGV2aWNlPC9jb2RlPiBjbGFzcy4KICogPHA+CiAqIFRoZSB2YWxpZCBzdWJzZXQgb2YgcHJvcGVydGllcyBmb3IgdGhlIHJlZ2lzdHJhdGlvbiBvZiBVUG5QIEV2ZW50IExpc3RlbmVyCiAqIHNlcnZpY2VzIGFyZToKICogPHVsPgogKiA8bGk+PGNvZGU+VVBuUERldmljZS5UWVBFPC9jb2RlPi0tIFdoaWNoIHR5cGUgb2YgZGV2aWNlIHRvIGxpc3RlbiBmb3IgZXZlbnRzLgogKiA8L2xpPgogKiA8bGk+PGNvZGU+VVBuUERldmljZS5JRDwvY29kZT4tLSBUaGUgSUQgb2YgYSBzcGVjaWZpYyBkZXZpY2UgdG8gbGlzdGVuIGZvcgogKiBldmVudHMuPC9saT4KICogPGxpPjxjb2RlPlVQblBTZXJ2aWNlLlRZUEU8L2NvZGU+LS0gVGhlIHR5cGUgb2YgYSBzcGVjaWZpYyBzZXJ2aWNlIHRvIGxpc3RlbgogKiBmb3IgZXZlbnRzLjwvbGk+CiAqIDxsaT48Y29kZT5VUG5QU2VydmljZS5JRDwvY29kZT4tLSBUaGUgSUQgb2YgYSBzcGVjaWZpYyBzZXJ2aWNlIHRvIGxpc3RlbiBmb3IKICogZXZlbnRzLjwvbGk+CiAqIDwvdWw+CiAqLwpwdWJsaWMgaW50ZXJmYWNlIFVQblBFdmVudExpc3RlbmVyIHsKCS8qKgoJICogS2V5IGZvciBhIHNlcnZpY2UgcHJvcGVydHkgaGF2aW5nIGEgdmFsdWUgdGhhdCBpcyBhbiBvYmplY3Qgb2YgdHlwZQoJICogPGNvZGU+b3JnLm9zZ2kuZnJhbWV3b3JrLkZpbHRlcjwvY29kZT4gYW5kIHRoYXQgaXMgdXNlZCB0byBsaW1pdCByZWNlaXZlZAoJICogZXZlbnRzLgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVVQTlBfRklMVEVSCT0gInVwbnAuZmlsdGVyIjsKCgkvKioKCSAqIENhbGxiYWNrIG1ldGhvZCB0aGF0IGlzIGludm9rZWQgZm9yIHJlY2VpdmVkIGV2ZW50cy4KCSAqIAoJICogVGhlIGV2ZW50cyBhcmUgY29sbGVjdGVkIGluIGEgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2JqZWN0LiBFYWNoIGVudHJ5CgkgKiBoYXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGtleSByZXByZXNlbnRpbmcgdGhlIGV2ZW50IG5hbWUgKD0gc3RhdGUgdmFyaWFibGUKCSAqIG5hbWUpIGFuZCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBzdGF0ZSB2YXJpYWJsZS4gVGhlIGNsYXNzIG9mIHRoZSB2YWx1ZQoJICogb2JqZWN0IG11c3QgbWF0Y2ggdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgVVBuUCBTdGF0ZSBWYXJpYWJsZQoJICogYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkKCSAqIAoJICogQHBhcmFtIGRldmljZUlkIElEIG9mIHRoZSBkZXZpY2Ugc2VuZGluZyB0aGUgZXZlbnRzCgkgKiBAcGFyYW0gc2VydmljZUlkIElEIG9mIHRoZSBzZXJ2aWNlIHNlbmRpbmcgdGhlIGV2ZW50cwoJICogQHBhcmFtIGV2ZW50cyA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IHZhbHVlcyBmb3IKCSAqICAgICAgICB0aGUgc3RhdGUgdmFyaWFibGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLgoJICogCgkgKiAgCgkgKi8KCXZvaWQgbm90aWZ5VVBuUEV2ZW50KFN0cmluZyBkZXZpY2VJZCwgU3RyaW5nIHNlcnZpY2VJZCwgRGljdGlvbmFyeSBldmVudHMpOwp9ClBLAwQKAAAAAABrUu40tsRtpsIJAADCCQAANQAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEV4Y2VwdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51cG5wL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEV4Y2VwdGlvbi5qYXZhLHYgMS4xNCAyMDA2LzA3LzEyIDIxOjIxOjM0IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVwbnA7CgoKLyoqCiAqIFRoZXJlIGFyZSBzZXZlcmFsIGRlZmluZWQgZXJyb3Igc2l0dWF0aW9ucyBkZXNjcmliaW5nIFVQblAgcHJvYmxlbXMgd2hpbGUgYQogKiBjb250cm9sIHBvaW50IGludm9rZXMgYWN0aW9ucyB0byBVUG5QRGV2aWNlcy4KICogCiAqIEBzaW5jZSAxLjEKICovCnB1YmxpYyBjbGFzcyBVUG5QRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKCXN0YXRpYyBmaW5hbCBsb25nCQlzZXJpYWxWZXJzaW9uVUlECQk9IC0yNjIwMTMzMTgxMjIxOTUxNDZMOwoKCS8qKgoJICogTm8gQWN0aW9uIGZvdW5kIGJ5IHRoYXQgbmFtZSBhdCB0aGlzIHNlcnZpY2UuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50CUlOVkFMSURfQUNUSU9OCQkJPSA0MDE7CgoJLyoqCgkgKiBOb3QgZW5vdWdoIGFyZ3VtZW50cywgdG9vIG1hbnkgYXJndW1lbnRzIHdpdGggYSBzcGVjaWZpYyBuYW1lLCBvciBvbmUgb2YKCSAqIG1vcmUgb2YgdGhlIGFyZ3VtZW50cyBhcmUgb2YgdGhlIHdyb25nIHR5cGUuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50CUlOVkFMSURfQVJHUwkJCT0gNDAyOwoKCS8qKgoJICogVGhlIGRpZmZlcmVudCBlbmQtcG9pbnRzIGFyZSBubyBsb25nZXIgaW4gc3luY2hyb25pemF0aW9uLgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIGludAlJTlZBTElEX1NFUVVFTkNFX05VTUJFUgk9IDQwMzsKCgkvKioKCSAqIFJlZmVycyB0byBhIG5vbiBleGlzdGluZyB2YXJpYWJsZS4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQJSU5WQUxJRF9WQVJJQUJMRQkJPSA0MDQ7CgoJLyoqCgkgKiBUaGUgaW52b2tlZCBhY3Rpb24gZmFpbGVkIGR1cmluZyBleGVjdXRpb24uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50CURFVklDRV9JTlRFUk5BTF9FUlJPUgk9IDUwMTsKCgkvKioKCSAqIEtleSBmb3IgYW4gZXJyb3IgaW5mb3JtYXRpb24gdGhhdCBpcyBhbiBpbnQgdHlwZSB2YXJpYWJsZSBhbmQgdGhhdCBpcwoJICogdXNlZCB0byBpZGVudGlmeSBvY2N1cmVkIGVycm9ycy4KCSAqLwoJcHJpdmF0ZSBmaW5hbCBpbnQJCQkJZXJyb3JDb2RlOwoKCS8qKgoJICogVGhpcyBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgVVBuUEV4Y2VwdGlvbiBvbiB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUgYW5kCgkgKiBlcnJvciBkZXNjcmlwdGlvbi4KCSAqIAoJICogQHBhcmFtIGVycm9yQ29kZSBlcnJvckNvZGUgd2hpY2ggZGVmaW5lZCBVUG5QIERldmljZSBBcmNoaXRlY3R1cmUgVjEuMC4KCSAqIEBwYXJhbSBlcnJvcmRlc2MgZXJyb3JEZXNjcmlwdGlvbiB3aGljaCBleHBsYWluIHRoZSB0eXBlIG9mIHByb3BibGVtLgoJICovCglwdWJsaWMgVVBuUEV4Y2VwdGlvbihpbnQgZXJyb3JDb2RlLCBTdHJpbmcgZXJyb3JkZXNjKSB7CgkJc3VwZXIoZXJyb3JkZXNjKTsKCQl0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIFVQblBFcnJvciBDb2RlIG9jY3VyZWQgYnkgVVBuUERldmljZXMgZHVyaW5nIGludm9jYXRpb24uCgkgKiAKCSAqIEByZXR1cm4gVGhlIFVQblBFcnJvckNvZGUgZGVmaW5lZCBieSBhIFVQblAgRm9ydW0gd29ya2luZyBjb21taXR0ZWUgb3IKCSAqICAgICAgICAgc3BlY2lmaWVkIGJ5IGEgVVBuUCB2ZW5kb3IuCgkgKi8KCXB1YmxpYyBpbnQgZ2V0VVBuUEVycm9yX0NvZGUoKSB7CgkJcmV0dXJuIGVycm9yQ29kZTsKCX0KfQpQSwMECgAAAAAAa1LuNLEWQMWaDAAAmgwAADAAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBJY29uLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLnVwbnAvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QSWNvbi5qYXZhLHYgMS4xMiAyMDA2LzA3LzEyIDIxOjIxOjM0IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVwbnA7CgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CgovKioKICogQSBVUG5QIGljb24gcmVwcmVzZW50YXRpb24uCiAqIAogKiBFYWNoIFVQblAgZGV2aWNlIGNhbiBjb250YWluIHplcm8gb3IgbW9yZSBpY29ucy4KICovCnB1YmxpYyBpbnRlcmZhY2UgVVBuUEljb24gewoJLyoqCgkgKiBSZXR1cm5zIHRoZSBNSU1FIHR5cGUgb2YgdGhlIGljb24uCgkgKiAKCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGZvcm1hdCBpbiB3aGljaCB0aGUgaWNvbiBncmFwaGljcywgcmVhZCBmcm9tIHRoZQoJICogPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdCBvYnRhaW5lZCBieSB0aGUgPGNvZGU+Z2V0SW5wdXRTdHJlYW0oKTwvY29kZT4KCSAqIG1ldGhvZCwgaXMgZW5jb2RlZC4KCSAqIDxwPgoJICogVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIGluIGFjY29yZGFuY2UgdG8gUkZDMjA0Ni4gQSBsaXN0IG9mCgkgKiB2YWxpZCBNSU1FIHR5cGVzIGlzIG1haW50YWluZWQgYnkgdGhlIDxhCgkgKiBocmVmPSJodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzLyI+SUFOQTwvYT4uCgkgKiA8cD4KCSAqIFR5cGljYWwgdmFsdWVzIHJldHVybmVkIGluY2x1ZGU6ICJpbWFnZS9qcGVnIiBvciAiaW1hZ2UvZ2lmIgoJICogCgkgKiBAcmV0dXJuIFRoZSBNSU1FIHR5cGUgb2YgdGhlIGVuY29kZWQgaWNvbi4KCSAqLwoJU3RyaW5nIGdldE1pbWVUeXBlKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgaWNvbiBpbiBwaXhlbHMuCgkgKiAKCSAqIElmIHRoZSBhY3R1YWwgd2lkdGggb2YgdGhlIGljb24gaXMgdW5rbm93biwgLTEgaXMgcmV0dXJuZWQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIHdpZHRoIGluIHBpeGVscywgb3IgLTEgaWYgdW5rbm93bi4KCSAqLwoJaW50IGdldFdpZHRoKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIGljb24gaW4gcGl4ZWxzLgoJICogCgkgKiBJZiB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaWNvbiBpcyB1bmtub3duLCAtMSBpcyByZXR1cm5lZC4KCSAqIAoJICogQHJldHVybiBUaGUgaGVpZ2h0IGluIHBpeGVscywgb3IgLTEgaWYgdW5rbm93bi4KCSAqLwoJaW50IGdldEhlaWdodCgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgaWNvbiBpbiBieXRlcy4KCSAqIAoJICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBpY29uIGF2YWlsYWJsZSB0byByZWFkCgkgKiBmcm9tIHRoZSA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IG9idGFpbmVkIGJ5IHRoZQoJICogPGNvZGU+Z2V0SW5wdXRTdHJlYW0oKTwvY29kZT4gbWV0aG9kLiBJZiB0aGUgYWN0dWFsIHNpemUgY2FuIG5vdCBiZQoJICogZGV0ZXJtaW5lZCwgLTEgaXMgcmV0dXJuZWQuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGljb24gc2l6ZSBpbiBieXRlcywgb3IgLTEgaWYgdGhlIHNpemUgaXMgdW5rbm93bi4KCSAqLwoJaW50IGdldFNpemUoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGNvbG9yIGRlcHRoIG9mIHRoZSBpY29uIGluIGJpdHMuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGNvbG9yIGRlcHRoIGluIGJpdHMuIElmIHRoZSBhY3R1YWwgY29sb3IgZGVwdGggb2YgdGhlIGljb24gaXMKCSAqICAgICAgICAgdW5rbm93biwgLTEgaXMgcmV0dXJuZWQuCgkgKi8KCWludCBnZXREZXB0aCgpOwoKCS8qKgoJICogUmV0dXJucyBhbiA8Y29kZT5JbnB1dFN0cmVhbTwvY29kZT4gb2JqZWN0IGZvciB0aGUgaWNvbiBkYXRhLgoJICogCgkgKiBUaGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdCBwcm92aWRlcyBhIHdheSBmb3IgYSBjbGllbnQgdG8gcmVhZCB0aGUKCSAqIGFjdHVhbCBpY29uIGdyYXBoaWNzIGRhdGEuIFRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGZyb20gdGhpcwoJICogPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IG9iamVjdCBjYW4gYmUgZGV0ZXJtaW5lZCB2aWEgdGhlCgkgKiA8Y29kZT5nZXRTaXplKCk8L2NvZGU+IG1ldGhvZC4gVGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBlbmNvZGVkIGNhbiBiZQoJICogZGV0ZXJtaW5lZCBieSB0aGUgTUlNRSB0eXBlIGF2YWlsYmxlIHZpYSB0aGUgPGNvZGU+Z2V0TWltZVR5cGUoKTwvY29kZT4KCSAqIG1ldGhvZC4KCSAqIAoJICogQHJldHVybiBBbiBJbnB1dFN0cmVhbSB0byByZWFkIHRoZSBpY29uIGdyYXBoaWNzIGRhdGEgZnJvbS4KCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSWYgdGhlIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBjYW5ub3QgYmUgcmV0dXJuZWQuCgkgKiBAc2VlIFVQblBJY29uI2dldE1pbWVUeXBlKCkKCSAqLwoJSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Cn0KUEsDBAoAAAAAAGtS7jSdkFkjLQYAAC0GAAA+AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QTG9jYWxTdGF0ZVZhcmlhYmxlLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLnVwbnAvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QTG9jYWxTdGF0ZVZhcmlhYmxlLmphdmEsdiAxLjEyIDIwMDYvMDYvMTYgMTY6MzE6NDYgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA1LCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwovKioKICogVG8ga2VlcCB0aGUgY3VycmVudCB2YWx1ZXMgZ2V0dGluZyBmcm9tIHN1YnNjcmliZWQgVVBuUERldmljZXMuIAogKiAKICogVGhlIGFjdHVhbCB2YWx1ZXMgb2YgdGhlIFVQblBTdGF0ZVZhcmFpYmxlIGFyZSBwYXNzZWQgYXMgSmF2YSBvYmplY3QgdHlwZS4gCiAqIAogKiBAc2luY2UgMS4xCiAqKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVwbnA7CgovKioKICogQSBsb2NhbCBVUG5QIHN0YXRlIHZhcmlhYmxlIHdoaWNoIGFsbG93cyB0aGUgdmFsdWUgb2YgdGhlIHN0YXRlIHZhcmlhYmxlIHRvCiAqIGJlIHF1ZXJpZWQuCiAqIAogKiBAc2luY2UgMS4xCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFVQblBMb2NhbFN0YXRlVmFyaWFibGUgZXh0ZW5kcyBVUG5QU3RhdGVWYXJpYWJsZSB7CgkvKioKCSAqIFRoaXMgbWV0aG9kIHdpbGwga2VlcCB0aGUgY3VycmVudCB2YWx1ZXMgb2YgVVBuUFN0YXRlVmFyaWFibGVzIG9mIGEKCSAqIFVQblBEZXZpY2Ugd2hlbmV2ZXIgVVBuUFN0YXRlVmFyaWFibGUncyB2YWx1ZSBpcyBjaGFuZ2VkICwgdGhpcyBtZXRob2QKCSAqIG11c3QgYmUgY2FsbGVkLgoJICogCgkgKiBAcmV0dXJuIDxjb2RlPk9iamVjdDwvY29kZT4gY3VycmVudCB2YWx1ZSBvZiBVUG5QU3RhdGVWYXJpYWJsZS4gaWYgdGhlCgkgKiAgICAgICAgIGN1cnJlbnQgdmFsdWUgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZSBkZWZpbmVkIFVQblAKCSAqICAgICAgICAgc2VydmljZSBkZXNjcmlwdGlvbi4KCSAqLwoJcHVibGljIE9iamVjdCBnZXRDdXJyZW50VmFsdWUoKTsKfQpQSwMECgAAAAAAa1LuNHPBfnNNGAAATRgAADMAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTZXJ2aWNlLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLnVwbnAvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU2VydmljZS5qYXZhLHYgMS44IDIwMDYvMDYvMTYgMTY6MzE6NDYgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAyLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UudXBucDsKCi8qKgogKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgVVBuUCBTZXJ2aWNlLgogKiAKICogRWFjaCBVUG5QIGRldmljZSBjb250YWlucyB6ZXJvIG9yIG1vcmUgc2VydmljZXMuIFRoZSBVUG5QIGRlc2NyaXB0aW9uIGZvciBhCiAqIHNlcnZpY2UgZGVmaW5lcyBhY3Rpb25zLCB0aGVpciBhcmd1bWVudHMsIGFuZCBldmVudCBjaGFyYWN0ZXJpc3RpY3MuCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFVQblBTZXJ2aWNlIHsKCS8qKgoJICogUHJvcGVydHkga2V5IGZvciB0aGUgb3B0aW9uYWwgc2VydmljZSB0eXBlIHVyaS4KCSAqIAoJICogVGhlIHNlcnZpY2UgdHlwZSBwcm9wZXJ0eSBpcyB1c2VkIHdoZW4gcmVnaXN0ZXJpbmcgVVBuUCBEZXZpY2Ugc2VydmljZXMKCSAqIGFuZCBVUG5QIEV2ZW50IExpc3RlbmVyIHNlcnZpY2VzLiBUaGUgcHJvcGVydHkgY29udGFpbnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+CgkgKiBhcnJheSAoPGNvZGU+U3RyaW5nW108L2NvZGU+KSBvZiBzZXJ2aWNlIHR5cGVzLiBBIFVQblAgRGV2aWNlIHNlcnZpY2UgY2FuCgkgKiB0aHVzIGFubm91bmNlIHdoYXQgdHlwZXMgb2Ygc2VydmljZXMgaXQgY29udGFpbnMuIEEgVVBuUCBFdmVudCBMaXN0ZW5lcgoJICogc2VydmljZSBjYW4gYW5ub3VuY2UgZm9yIHdoYXQgdHlwZSBvZiBVUG5QIHNlcnZpY2VzIGl0IHdhbnRzCgkgKiBub3RpZmljYXRpb25zLiBUaGUgc2VydmljZSB2ZXJzaW9uIGlzIGVuY29kZWQgaW4gdGhlIHR5cGUgc3RyaW5nIGFzCgkgKiBzcGVjaWZpZWQgaW4gdGhlIFVQblAgc3BlY2lmaWNhdGlvbi4gQSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSBpcyBhCgkgKiB3aWxkY2FyZCwgbWF0Y2hpbmcgPGI+YWxsIDwvYj4gc2VydmljZSB0eXBlcy4gVmFsdWUgaXMKCSAqICJVUG5QLnNlcnZpY2UudHlwZSIuCgkgKiAKCSAqIEBzZWUgVVBuUFNlcnZpY2UjZ2V0VHlwZSgpCgkgKi8KCVN0cmluZwlUWVBFCT0gIlVQblAuc2VydmljZS50eXBlIjsKCS8qKgoJICogUHJvcGVydHkga2V5IGZvciB0aGUgb3B0aW9uYWwgc2VydmljZSBpZC4KCSAqIAoJICogVGhlIHNlcnZpY2UgaWQgcHJvcGVydHkgaXMgdXNlZCB3aGVuIHJlZ2lzdGVyaW5nIFVQblAgRGV2aWNlIHNlcnZpY2VzIG9yCgkgKiBVUG5QIEV2ZW50IExpc3RlbmVyIHNlcnZpY2VzLiBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNvbnRhaW5zIGEKCSAqIDxjb2RlPlN0cmluZzwvY29kZT4gYXJyYXkgKDxjb2RlPlN0cmluZ1tdPC9jb2RlPikgb2Ygc2VydmljZSBpZHMuIEEgVVBuUAoJICogRGV2aWNlIHNlcnZpY2UgY2FuIHRodXMgYW5ub3VuY2Ugd2hhdCBzZXJ2aWNlIGlkcyBpdCBjb250YWlucy4gQSBVUG5QCgkgKiBFdmVudCBMaXN0ZW5lciBzZXJ2aWNlIGNhbiBhbm5vdW5jZSBmb3Igd2hhdCBVUG5QIHNlcnZpY2UgaWRzIGl0IHdhbnRzCgkgKiBub3RpZmljYXRpb25zLiBBIHNlcnZpY2UgaWQgZG9lcyA8Yj5ub3QgPC9iPiBoYXZlIHRvIGJlIHVuaXZlcnNhbGx5CgkgKiB1bmlxdWUuIEl0IG11c3QgYmUgdW5pcXVlIG9ubHkgd2l0aGluIGEgZGV2aWNlLiBBIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlCgkgKiBpcyBhIHdpbGRjYXJkLCBtYXRjaGluZyA8Yj5hbGwgPC9iPiBzZXJ2aWNlcy4gVGhlIHZhbHVlIGlzCgkgKiAiVVBuUC5zZXJ2aWNlLmlkIi4KCSAqLwoJU3RyaW5nCUlECQk9ICJVUG5QLnNlcnZpY2UuaWQiOwoKCS8qKgoJICogUmV0dXJucyB0aGUgPGNvZGU+c2VydmljZUlkPC9jb2RlPiBmaWVsZCBpbiB0aGUgVVBuUCBzZXJ2aWNlIGRlc2NyaXB0aW9uLgoJICogCgkgKiAKCSAqIDxwPgoJICogRm9yIHN0YW5kYXJkIHNlcnZpY2VzIGRlZmluZWQgYnkgYSBVUG5QIEZvcnVtIHdvcmtpbmcgY29tbWl0dGVlLCB0aGUKCSAqIHNlcnZpY2VJZCBtdXN0IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjb21wb25lbnRzIGluIHRoZSBpbmRpY2F0ZWQgb3JkZXI6CgkgKiA8dWw+CgkgKiA8bGk+PGNvZGU+dXJuOnVwbnAtb3JnOnNlcnZpY2VJZDo8L2NvZGU+PC9saT4KCSAqIDxsaT5zZXJ2aWNlIElEIHN1ZmZpeDwvbGk+CgkgKiA8L3VsPgoJICogRXhhbXBsZTogPGNvZGU+dXJuOnVwbnAtb3JnOnNlcnZpY2VJZDpzZXJ2aWNlSUQ8L2NvZGU+LgoJICogCgkgKiA8cD4KCSAqIE5vdGUgdGhhdCA8Y29kZT51cG5wLW9yZzwvY29kZT4gaXMgdXNlZCBpbnN0ZWFkIG9mCgkgKiA8Y29kZT5zY2hlbWFzLXVwbnAtb3JnPC9jb2RlPiBpbiB0aGlzIGV4YW1wbGUgYmVjYXVzZSBhbiBYTUwgc2NoZW1hIGlzIG5vdAoJICogZGVmaW5lZCBmb3IgZWFjaCBzZXJ2aWNlSWQuCgkgKiA8L3A+CgkgKiAKCSAqIDxwPgoJICogRm9yIG5vbi1zdGFuZGFyZCBzZXJ2aWNlcyBzcGVjaWZpZWQgYnkgVVBuUCB2ZW5kb3JzLCB0aGUgc2VydmljZUlkIG11c3QKCSAqIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjb21wb25lbnRzIGluIHRoZSBpbmRpY2F0ZWQgb3JkZXI6CgkgKiA8dWw+CgkgKiA8bGk+PGNvZGU+dXJuOjwvY29kZT48L2xpPgoJICogPGxpPklDQU5OIGRvbWFpbiBuYW1lIG93bmVkIGJ5IHRoZSB2ZW5kb3I8L2xpPgoJICogPGxpPjxjb2RlPjpzZXJ2aWNlSWQ6PC9jb2RlPjwvbGk+CgkgKiA8bGk+c2VydmljZSBJRCBzdWZmaXg8L2xpPgoJICogPC91bD4KCSAqIEV4YW1wbGU6IDxjb2RlPnVybjpkb21haW4tbmFtZTpzZXJ2aWNlSWQ6c2VydmljZUlEPC9jb2RlPi4KCSAqIAoJICogQHJldHVybiBUaGUgc2VydmljZSBJRCBzdWZmaXggZGVmaW5lZCBieSBhIFVQblAgRm9ydW0gd29ya2luZyBjb21taXR0ZWUKCSAqICAgICAgICAgb3Igc3BlY2lmaWVkIGJ5IGEgVVBuUCB2ZW5kb3IuIE11c3QgYmUgJmx0Oz0gNjQgY2hhcmFjdGVycy4KCSAqICAgICAgICAgU2luZ2xlIFVSSS4KCSAqLwoJU3RyaW5nIGdldElkKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSA8Y29kZT5zZXJ2aWNlVHlwZTwvY29kZT4gZmllbGQgaW4gdGhlIFVQblAgc2VydmljZSBkZXNjcmlwdGlvbi4KCSAqIAoJICogPHA+CgkgKiBGb3Igc3RhbmRhcmQgc2VydmljZXMgZGVmaW5lZCBieSBhIFVQblAgRm9ydW0gd29ya2luZyBjb21taXR0ZWUsIHRoZQoJICogc2VydmljZVR5cGUgbXVzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBpbiB0aGUgaW5kaWNhdGVkIG9yZGVyOgoJICogPHVsPgoJICogPGxpPjxjb2RlPnVybjpzY2hlbWFzLXVwbnAtb3JnOnNlcnZpY2U6PC9jb2RlPjwvbGk+CgkgKiA8bGk+c2VydmljZSB0eXBlIHN1ZmZpeDo8L2xpPgoJICogPGxpPmludGVnZXIgc2VydmljZSB2ZXJzaW9uPC9saT4KCSAqIDwvdWw+CgkgKiBFeGFtcGxlOiA8Y29kZT51cm46c2NoZW1hcy11cG5wLW9yZzpzZXJ2aWNlOnNlcnZpY2VUeXBlOnY8L2NvZGU+LgoJICogCgkgKiA8cD4KCSAqIEZvciBub24tc3RhbmRhcmQgc2VydmljZXMgc3BlY2lmaWVkIGJ5IFVQblAgdmVuZG9ycywgdGhlCgkgKiA8Y29kZT5zZXJ2aWNlVHlwZTwvY29kZT4gbXVzdCBjb250YWluIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50cyBpbiB0aGUKCSAqIGluZGljYXRlZCBvcmRlcjoKCSAqIDx1bD4KCSAqIDxsaT48Y29kZT51cm46PC9jb2RlPjwvbGk+CgkgKiA8bGk+SUNBTk4gZG9tYWluIG5hbWUgb3duZWQgYnkgdGhlIHZlbmRvcjwvbGk+CgkgKiA8bGk+PGNvZGU+OnNlcnZpY2U6PC9jb2RlPjwvbGk+CgkgKiA8bGk+c2VydmljZSB0eXBlIHN1ZmZpeDo8L2xpPgoJICogPGxpPmludGVnZXIgc2VydmljZSB2ZXJzaW9uPC9saT4KCSAqIDwvdWw+CgkgKiBFeGFtcGxlOiA8Y29kZT51cm46ZG9tYWluLW5hbWU6c2VydmljZTpzZXJ2aWNlVHlwZTp2PC9jb2RlPi4KCSAqIAoJICogQHJldHVybiBUaGUgc2VydmljZSB0eXBlIHN1ZmZpeCBkZWZpbmVkIGJ5IGEgVVBuUCBGb3J1bSB3b3JraW5nIGNvbW1pdHRlZQoJICogICAgICAgICBvciBzcGVjaWZpZWQgYnkgYSBVUG5QIHZlbmRvci4gTXVzdCBiZSAmbHQ7PSA2NCBjaGFyYWN0ZXJzLCBub3QKCSAqICAgICAgICAgaW5jbHVkaW5nIHRoZSB2ZXJzaW9uIHN1ZmZpeCBhbmQgc2VwYXJhdGluZyBjb2xvbi4gU2luZ2xlIFVSSS4KCSAqLwoJU3RyaW5nIGdldFR5cGUoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIHZlcnNpb24gc3VmZml4IGVuY29kZWQgaW4gdGhlIDxjb2RlPnNlcnZpY2VUeXBlPC9jb2RlPiBmaWVsZCBpbgoJICogdGhlIFVQblAgc2VydmljZSBkZXNjcmlwdGlvbi4KCSAqIAoJICogQHJldHVybiBUaGUgaW50ZWdlciBzZXJ2aWNlIHZlcnNpb24gZGVmaW5lZCBieSBhIFVQblAgRm9ydW0gd29ya2luZwoJICogICAgICAgICBjb21taXR0ZWUgb3Igc3BlY2lmaWVkIGJ5IGEgVVBuUCB2ZW5kb3IuCgkgKi8KCVN0cmluZyBnZXRWZXJzaW9uKCk7CgoJLyoqCgkgKiBMb2NhdGVzIGEgc3BlY2lmaWMgYWN0aW9uIGJ5IG5hbWUuCgkgKiAKCSAqIExvb2tzIHVwIGFuIGFjdGlvbiBieSBpdHMgbmFtZS4KCSAqIAoJICogQHBhcmFtIG5hbWUgTmFtZSBvZiBhY3Rpb24uIE11c3Qgbm90IGNvbnRhaW4gaHlwaGVuIG9yIGhhc2ggY2hhcmFjdGVycy4KCSAqICAgICAgICBTaG91bGQgYmUgJmx0OyAzMiBjaGFyYWN0ZXJzLgoJICogCgkgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgYWN0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGFjdGlvbiBpcyBmb3VuZC4KCSAqLwoJVVBuUEFjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIG5hbWUpOwoKCS8qKgoJICogTGlzdHMgYWxsIGFjdGlvbnMgcHJvdmlkZWQgYnkgdGhpcyBzZXJ2aWNlLgoJICogCgkgKiBAcmV0dXJuIEFycmF5IG9mIGFjdGlvbnMgKDxjb2RlPlVQblBBY3Rpb25bXTwvY29kZT4gKW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCgkgKiAgICAgICAgIG5vIGFjdGlvbnMgYXJlIGRlZmluZWQgZm9yIHRoaXMgc2VydmljZS4KCSAqLwoJVVBuUEFjdGlvbltdIGdldEFjdGlvbnMoKTsKCgkvKioKCSAqIExpc3RzIGFsbCA8Y29kZT5VUG5QU3RhdGVWYXJpYWJsZTwvY29kZT4gb2JqZWN0cyBwcm92aWRlZCBieSB0aGlzIHNlcnZpY2UuCgkgKiAKCSAqIEByZXR1cm4gQXJyYXkgb2Ygc3RhdGUgdmFyaWFibGVzIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgYXJlIGRlZmluZWQKCSAqICAgICAgICAgZm9yIHRoaXMgc2VydmljZS4KCSAqLwoJVVBuUFN0YXRlVmFyaWFibGVbXSBnZXRTdGF0ZVZhcmlhYmxlcygpOwoKCS8qKgoJICogR2V0cyBhIDxjb2RlPlVQblBTdGF0ZVZhcmlhYmxlPC9jb2RlPiBvYmplY3RzIHByb3ZpZGVkIGJ5IHRoaXMgc2VydmljZSBieQoJICogbmFtZQoJICogCgkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBTdGF0ZSBWYXJpYWJsZQoJICogCgkgKiBAcmV0dXJuIFN0YXRlIHZhcmlhYmxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHN1Y2ggc3RhdGUgdmFyaWFibGUKCSAqICAgICAgICAgZXhpc3RzIGZvciB0aGlzIHNlcnZpY2UuCgkgKi8KCVVQblBTdGF0ZVZhcmlhYmxlIGdldFN0YXRlVmFyaWFibGUoU3RyaW5nIG5hbWUpOwp9ClBLAwQKAAAAAABrUu402sfn9agnAACoJwAAOQAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUFN0YXRlVmFyaWFibGUuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UudXBucC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTdGF0ZVZhcmlhYmxlLmphdmEsdiAxLjggMjAwNi8wNi8xNiAxNjozMTo0NiBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS51cG5wOwoKLyoqCiAqIFRoZSBtZXRhLWluZm9ybWF0aW9uIG9mIGEgVVBuUCBzdGF0ZSB2YXJpYWJsZSBhcyBkZWNsYXJlZCBpbiB0aGUgZGV2aWNlJ3MKICogc2VydmljZSBzdGF0ZSB0YWJsZSAoU1NUKS4KICogPHA+CiAqIE1ldGhvZCBjYWxscyB0byBpbnRlcmFjdCB3aXRoIGEgZGV2aWNlIChlLmcuIDxjb2RlPlVQblBBY3Rpb24uaW52b2tlKC4uLik7PC9jb2RlPikKICogdXNlIHRoaXMgY2xhc3MgdG8gZW5jYXBzdWxhdGUgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5wdXQgYW5kIG91dHB1dAogKiBhcmd1bWVudHMuCiAqIDxwPgogKiBUaGUgYWN0dWFsIHZhbHVlcyBvZiB0aGUgYXJndW1lbnRzIGFyZSBwYXNzZWQgYXMgSmF2YSBvYmplY3RzLiBUaGUgbWFwcGluZyBvZgogKiB0eXBlcyBmcm9tIFVQblAgZGF0YSB0eXBlcyB0byBKYXZhIGRhdGEgdHlwZXMgaXMgZGVzY3JpYmVkIHdpdGggdGhlIGZpZWxkCiAqIGRlZmluaXRpb25zLgogKi8KcHVibGljIGludGVyZmFjZSBVUG5QU3RhdGVWYXJpYWJsZSB7CgkvKioKCSAqIFVuc2lnbmVkIDEgPGNvZGU+Qnl0ZTwvY29kZT4gaW50LgoJICogPHA+CgkgKiBNYXBwZWQgdG8gYW4gPGNvZGU+SW50ZWdlcjwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfVUkxCQkJPSAidWkxIjsKCS8qKgoJICogVW5zaWduZWQgMiBCeXRlIGludC4KCSAqIDxwPgoJICogTWFwcGVkIHRvIDxjb2RlPkludGVnZXI8L2NvZGU+IG9iamVjdC4KCSAqLwoJc3RhdGljIGZpbmFsIFN0cmluZwlUWVBFX1VJMgkJCT0gInVpMiI7CgkvKioKCSAqIFVuc2lnbmVkIDQgQnl0ZSBpbnQuCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5Mb25nPC9jb2RlPiBvYmplY3QuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9VSTQJCQk9ICJ1aTQiOwoJLyoqCgkgKiAxIEJ5dGUgaW50LgoJICogPHA+CgkgKiBNYXBwZWQgdG8gPGNvZGU+SW50ZWdlcjwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfSTEJCQkJPSAiaTEiOwoJLyoqCgkgKiAyIEJ5dGUgaW50LgoJICogPHA+CgkgKiBNYXBwZWQgdG8gPGNvZGU+SW50ZWdlcjwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfSTIJCQkJPSAiaTIiOwoJLyoqCgkgKiA0IEJ5dGUgaW50LgoJICogPHA+CgkgKiBNdXN0IGJlIGJldHdlZW4gLTIxNDc0ODM2NDggYW5kIDIxNDc0ODM2NDcKCSAqIDxwPgoJICogTWFwcGVkIHRvIDxjb2RlPkludGVnZXI8L2NvZGU+IG9iamVjdC4KCSAqLwoJc3RhdGljIGZpbmFsIFN0cmluZwlUWVBFX0k0CQkJCT0gImk0IjsKCS8qKgoJICogSW50ZWdlciBudW1iZXIuCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5JbnRlZ2VyPC9jb2RlPiBvYmplY3QuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9JTlQJCQk9ICJpbnQiOwoJLyoqCgkgKiA0IEJ5dGUgZmxvYXQuCgkgKiA8cD4KCSAqIFNhbWUgZm9ybWF0IGFzIGZsb2F0LiBNdXN0IGJlIGJldHdlZW4gMy40MDI4MjM0N0UrMzggdG8gMS4xNzU0OTQzNUUtMzguCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5GbG9hdDwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfUjQJCQkJPSAicjQiOwoJLyoqCgkgKiA4IEJ5dGUgZmxvYXQuCgkgKiA8cD4KCSAqIFNhbWUgZm9ybWF0IGFzIGZsb2F0LiBNdXN0IGJlIGJldHdlZW4gLTEuNzk3NjkzMTM0ODYyMzJFMzA4IGFuZAoJICogLTQuOTQwNjU2NDU4NDEyNDdFLTMyNCBmb3IgbmVnYXRpdmUgdmFsdWVzLCBhbmQgYmV0d2VlbgoJICogNC45NDA2NTY0NTg0MTI0N0UtMzI0IGFuZCAxLjc5NzY5MzEzNDg2MjMyRTMwOCBmb3IgcG9zaXRpdmUgdmFsdWVzLCBpLmUuLAoJICogSUVFRSA2NC1iaXQgKDgtQnl0ZSkgZG91YmxlLgoJICogPHA+CgkgKiBNYXBwZWQgdG8gPGNvZGU+RG91YmxlPC9jb2RlPiBvYmplY3QuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9SOAkJCQk9ICJyOCI7CgkvKioKCSAqIFNhbWUgYXMgcjguCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5Eb3VibGU8L2NvZGU+IG9iamVjdC4KCSAqLwoJc3RhdGljIGZpbmFsIFN0cmluZwlUWVBFX05VTUJFUgkJCT0gIm51bWJlciI7CgkvKioKCSAqIFNhbWUgYXMgcjggYnV0IG5vIG1vcmUgdGhhbiAxNCBkaWdpdHMgdG8gdGhlIGxlZnQgb2YgdGhlIGRlY2ltYWwgcG9pbnQKCSAqIGFuZCBubyBtb3JlIHRoYW4gNCB0byB0aGUgcmlnaHQuCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5Eb3VibGU8L2NvZGU+IG9iamVjdC4KCSAqLwoJc3RhdGljIGZpbmFsIFN0cmluZwlUWVBFX0ZJWEVEXzE0XzQJCT0gImZpeGVkLjE0LjQiOwoJLyoqCgkgKiBGbG9hdGluZy1wb2ludCBudW1iZXIuCgkgKiA8cD4KCSAqIE1hbnRpc3NhIChsZWZ0IG9mIHRoZSBkZWNpbWFsKSBhbmQvb3IgZXhwb25lbnQgbWF5IGhhdmUgYSBsZWFkaW5nIHNpZ24uCgkgKiBNYW50aXNzYSBhbmQvb3IgZXhwb25lbnQgbWF5IGhhdmUgbGVhZGluZyB6ZXJvcy4gRGVjaW1hbCBjaGFyYWN0ZXIgaW4KCSAqIG1hbnRpc3NhIGlzIGEgcGVyaW9kLCBpLmUuLCB3aG9sZSBkaWdpdHMgaW4gbWFudGlzc2Egc2VwYXJhdGVkIGZyb20KCSAqIGZyYWN0aW9uYWwgZGlnaXRzIGJ5IHBlcmlvZC4gTWFudGlzc2Egc2VwYXJhdGVkIGZyb20gZXhwb25lbnQgYnkgRS4gKE5vCgkgKiBjdXJyZW5jeSBzeW1ib2wuKSAoTm8gZ3JvdXBpbmcgb2YgZGlnaXRzIGluIHRoZSBtYW50aXNzYSwgZS5nLiwgbm8KCSAqIGNvbW1hcy4pCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5GbG9hdDwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfRkxPQVQJCQk9ICJmbG9hdCI7CgkvKioKCSAqIFVuaWNvZGUgc3RyaW5nLgoJICogPHA+CgkgKiBPbmUgY2hhcmFjdGVyIGxvbmcuCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5DaGFyYWN0ZXI8L2NvZGU+IG9iamVjdC4KCSAqLwoJc3RhdGljIGZpbmFsIFN0cmluZwlUWVBFX0NIQVIJCQk9ICJjaGFyIjsKCS8qKgoJICogVW5pY29kZSBzdHJpbmcuCgkgKiA8cD4KCSAqIE5vIGxpbWl0IG9uIGxlbmd0aC4KCSAqIDxwPgoJICogTWFwcGVkIHRvIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfU1RSSU5HCQkJPSAic3RyaW5nIjsKCS8qKgoJICogQSBjYWxlbmRhciBkYXRlLgoJICogPHA+CgkgKiBEYXRlIGluIGEgc3Vic2V0IG9mIElTTyA4NjAxIGZvcm1hdCB3aXRob3V0IHRpbWUgZGF0YS4KCSAqIDxwPgoJICogU2VlIDxhCgkgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZSI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGUKCSAqIDwvYT4uCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT4gb2JqZWN0LiBBbHdheXMgMDA6MDAgaG91cnMuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9EQVRFCQkJPSAiZGF0ZSI7CgkvKioKCSAqIEEgc3BlY2lmaWMgaW5zdGFudCBvZiB0aW1lLgoJICogPHA+CgkgKiBEYXRlIGluIElTTyA4NjAxIGZvcm1hdCB3aXRoIG9wdGlvbmFsIHRpbWUgYnV0IG5vIHRpbWUgem9uZS4KCSAqIDxwPgoJICogU2VlIDxhCgkgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZQoJICogPC9hPi4KCSAqIDxwPgoJICogTWFwcGVkIHRvIDxjb2RlPmphdmEudXRpbC5EYXRlPC9jb2RlPiBvYmplY3QgdXNpbmcgZGVmYXVsdCB0aW1lIHpvbmUuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9EQVRFVElNRQkJPSAiZGF0ZVRpbWUiOwoJLyoqCgkgKiBBIHNwZWNpZmljIGluc3RhbnQgb2YgdGltZS4KCSAqIDxwPgoJICogRGF0ZSBpbiBJU08gODYwMSBmb3JtYXQgd2l0aCBvcHRpb25hbCB0aW1lIGFuZCBvcHRpb25hbCB0aW1lIHpvbmUuCgkgKiA8cD4KCSAqIFNlZSA8YQoJICogaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI2RhdGVUaW1lIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUKCSAqIDwvYT4uCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT4gb2JqZWN0IGFkanVzdGVkIHRvIGRlZmF1bHQgdGltZSB6b25lLgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfREFURVRJTUVfVFoJPSAiZGF0ZVRpbWUudHoiOwoJLyoqCgkgKiBBbiBpbnN0YW50IG9mIHRpbWUgdGhhdCByZWN1cnMgZXZlcnkgZGF5LgoJICogPHA+CgkgKiBUaW1lIGluIGEgc3Vic2V0IG9mIElTTyA4NjAxIGZvcm1hdCB3aXRoIG5vIGRhdGUgYW5kIG5vIHRpbWUgem9uZS4KCSAqIDxwPgoJICogU2VlIDxhCgkgKiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8jZGF0ZVRpbWUiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyN0aW1lCgkgKiA8L2E+LgoJICogPHA+CgkgKiBNYXBwZWQgdG8gPGNvZGU+TG9uZzwvY29kZT4uIENvbnZlcnRlZCB0byBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9USU1FCQkJPSAidGltZSI7CgkvKioKCSAqIEFuIGluc3RhbnQgb2YgdGltZSB0aGF0IHJlY3VycyBldmVyeSBkYXkuCgkgKiA8cD4KCSAqIFRpbWUgaW4gYSBzdWJzZXQgb2YgSVNPIDg2MDEgZm9ybWF0IHdpdGggb3B0aW9uYWwgdGltZSB6b25lIGJ1dCBubyBkYXRlLgoJICogPHA+CgkgKiBTZWUgPGEKCSAqIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yLyNkYXRlVGltZSI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvI3RpbWUKCSAqIDwvYT4uCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5Mb25nPC9jb2RlPiBvYmplY3QuIENvbnZlcnRlZCB0byBtaWxsaXNlY29uZHMgc2luY2UKCSAqIG1pZG5pZ2h0IGFuZCBhZGp1c3RlZCB0byBkZWZhdWx0IHRpbWUgem9uZSwgd3JhcHBpbmcgYXQgMCBhbmQKCSAqIDI0KjYwKjYwKjEwMDAuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9USU1FX1RaCQk9ICJ0aW1lLnR6IjsKCS8qKgoJICogVHJ1ZSBvciBmYWxzZS4KCSAqIDxwPgoJICogTWFwcGVkIHRvIDxjb2RlPkJvb2xlYW48L2NvZGU+IG9iamVjdC4KCSAqLwoJc3RhdGljIGZpbmFsIFN0cmluZwlUWVBFX0JPT0xFQU4JCT0gImJvb2xlYW4iOwoJLyoqCgkgKiBNSU1FLXN0eWxlIEJhc2U2NCBlbmNvZGVkIGJpbmFyeSBCTE9CLgoJICogPHA+CgkgKiBUYWtlcyAzIEJ5dGVzLCBzcGxpdHMgdGhlbSBpbnRvIDQgcGFydHMsIGFuZCBtYXBzIGVhY2ggNiBiaXQgcGllY2UgdG8gYW4KCSAqIG9jdGV0LiAoMyBvY3RldHMgYXJlIGVuY29kZWQgYXMgNC4pIE5vIGxpbWl0IG9uIHNpemUuCgkgKiA8cD4KCSAqIE1hcHBlZCB0byA8Y29kZT5ieXRlW108L2NvZGU+IG9iamVjdC4gVGhlIEphdmEgYnl0ZSBhcnJheSB3aWxsIGhvbGQgdGhlCgkgKiBkZWNvZGVkIGNvbnRlbnQgb2YgdGhlIEJMT0IuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9CSU5fQkFTRTY0CQk9ICJiaW4uYmFzZTY0IjsKCS8qKgoJICogSGV4YWRlY2ltYWwgZGlnaXRzIHJlcHJlc2VudGluZyBvY3RldHMuCgkgKiA8cD4KCSAqIFRyZWF0cyBlYWNoIG5pYmJsZSBhcyBhIGhleCBkaWdpdCBhbmQgZW5jb2RlcyBhcyBhIHNlcGFyYXRlIEJ5dGUuICgxCgkgKiBvY3RldCBpcyBlbmNvZGVkIGFzIDIuKSBObyBsaW1pdCBvbiBzaXplLgoJICogPHA+CgkgKiBNYXBwZWQgdG8gPGNvZGU+Ynl0ZVtdPC9jb2RlPiBvYmplY3QuIFRoZSBKYXZhIGJ5dGUgYXJyYXkgd2lsbCBob2xkIHRoZQoJICogZGVjb2RlZCBjb250ZW50IG9mIHRoZSBCTE9CLgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfQklOX0hFWAkJPSAiYmluLmhleCI7CgkvKioKCSAqIFVuaXZlcnNhbCBSZXNvdXJjZSBJZGVudGlmaWVyLgoJICogPHA+CgkgKiBNYXBwZWQgdG8gPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QuCgkgKi8KCXN0YXRpYyBmaW5hbCBTdHJpbmcJVFlQRV9VUkkJCQk9ICJ1cmkiOwoJLyoqCgkgKiBVbml2ZXJzYWxseSBVbmlxdWUgSUQuCgkgKiA8cD4KCSAqIEhleGFkZWNpbWFsIGRpZ2l0cyByZXByZXNlbnRpbmcgb2N0ZXRzLiBPcHRpb25hbCBlbWJlZGRlZCBoeXBoZW5zIGFyZQoJICogaWdub3JlZC4KCSAqIDxwPgoJICogTWFwcGVkIHRvIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LgoJICovCglzdGF0aWMgZmluYWwgU3RyaW5nCVRZUEVfVVVJRAkJCT0gInV1aWQiOwoKCS8qKgoJICogUmV0dXJucyB0aGUgdmFyaWFibGUgbmFtZS4KCSAqIAoJICogPHVsPgoJICogPGxpPkFsbCBzdGFuZGFyZCB2YXJpYWJsZXMgZGVmaW5lZCBieSBhIFVQblAgRm9ydW0gd29ya2luZyBjb21taXR0ZWUKCSAqIG11c3Qgbm90IGJlZ2luIHdpdGggPGNvZGU+WF88L2NvZGU+IG5vciA8Y29kZT5BXzwvY29kZT4uPC9saT4KCSAqIDxsaT5BbGwgbm9uLXN0YW5kYXJkIHZhcmlhYmxlcyBzcGVjaWZpZWQgYnkgYSBVUG5QIHZlbmRvciBhbmQgYWRkZWQgdG8gYQoJICogc3RhbmRhcmQgc2VydmljZSBtdXN0IGJlZ2luIHdpdGggPGNvZGU+WF88L2NvZGU+LjwvbGk+CgkgKiA8L3VsPgoJICogCgkgKiBAcmV0dXJuIE5hbWUgb2Ygc3RhdGUgdmFyaWFibGUuIE11c3Qgbm90IGNvbnRhaW4gYSBoeXBoZW4gY2hhcmFjdGVyIG5vciBhCgkgKiAgICAgICAgIGhhc2ggY2hhcmFjdGVyLiBTaG91bGQgYmUgJmx0OyAzMiBjaGFyYWN0ZXJzLgoJICovCglTdHJpbmcgZ2V0TmFtZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgSmF2YSBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVQblAgZGF0YSB0eXBlIG9mIHRoaXMgc3RhdGUKCSAqIHZhcmlhYmxlLgoJICogPFA+CgkgKiBNYXBwaW5nIGJldHdlZW4gdGhlIFVQblAgZGF0YSB0eXBlcyBhbmQgSmF2YSBjbGFzc2VzIGlzIHBlcmZvcm1lZAoJICogYWNjb3JkaW5nIHRvIHRoZSBzY2hlbWEgbWVudGlvbmVkIGFib3ZlLgoJICogCgkgKiA8cHJlPgoJICogCgkgKiAgSW50ZWdlciAgICAgICAgICAgICAgdWkxLCB1aTIsIGkxLCBpMiwgaTQsIGludAoJICogIExvbmcgICAgICAgICAgICAgICAgIHVpNCwgdGltZSwgdGltZS50egoJICogIEZsb2F0ICAgICAgICAgICAgICAgIHI0LCBmbG9hdAoJICogIERvdWJsZSAgICAgICAgICAgICAgIHI4LCBudW1iZXIsIGZpeGVkLjE0LjQKCSAqICBDaGFyYWN0ZXIgICAgICAgICAgICBjaGFyCgkgKiAgU3RyaW5nICAgICAgICAgICAgICAgc3RyaW5nLCB1cmksIHV1aWQKCSAqICBEYXRlICAgICAgICAgICAgICAgICBkYXRlLCBkYXRlVGltZSwgZGF0ZVRpbWUudHoKCSAqICBCb29sZWFuICAgICAgICAgICAgICBib29sZWFuCgkgKiAgYnl0ZVtdICAgICAgICAgICAgICAgYmluLmJhc2U2NCwgYmluLmhleAoJICogIAoJICogPC9wcmU+CgkgKiAKCSAqIEByZXR1cm4gQSBjbGFzcyBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgSmF2YSB0eXBlIG9mIHRoaXMgYXJndW1lbnQuCgkgKi8KCUNsYXNzIGdldEphdmFEYXRhVHlwZSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgVVBuUCB0eXBlIG9mIHRoaXMgc3RhdGUgdmFyaWFibGUuIFZhbGlkIHR5cGVzIGFyZSBkZWZpbmVkIGFzCgkgKiBjb25zdGFudHMuCgkgKiAKCSAqIEByZXR1cm4gVGhlIFVQblAgZGF0YSB0eXBlIG9mIHRoaXMgc3RhdGUgdmFyaWFibGUsIGFzIGRlZmluZWQgaW4gYWJvdmUKCSAqICAgICAgICAgY29uc3RhbnRzLgoJICovCglTdHJpbmcgZ2V0VVBuUERhdGFUeXBlKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiBkZWZpbmVkLgoJICogCgkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBkZWZpbmVkLiBUaGUgdHlwZSBvZgoJICogICAgICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IDxjb2RlPmdldEphdmFEYXRhVHlwZTwvY29kZT4uCgkgKi8KCU9iamVjdCBnZXREZWZhdWx0VmFsdWUoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIGFsbG93ZWQgdmFsdWVzLCBpZiBkZWZpbmVkLiBBbGxvd2VkIHZhbHVlcyBjYW4gYmUgZGVmaW5lZAoJICogb25seSBmb3IgU3RyaW5nIHR5cGVzLgoJICogCgkgKiBAcmV0dXJuIFRoZSBhbGxvd2VkIHZhbHVlcyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZGVmaW5lZC4gU2hvdWxkIGJlCgkgKiAgICAgICAgIGxlc3MgdGhhbiAzMiBjaGFyYWN0ZXJzLgoJICovCglTdHJpbmdbXSBnZXRBbGxvd2VkVmFsdWVzKCk7CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLCBpZiBkZWZpbmVkLiBNaW5pbXVtIHZhbHVlcyBjYW4gb25seSBiZSBkZWZpbmVkCgkgKiBmb3IgbnVtZXJpYyB0eXBlcy4KCSAqIAoJICogQHJldHVybiBUaGUgbWluaW11bSB2YWx1ZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZGVmaW5lZC4KCSAqLwoJTnVtYmVyIGdldE1pbmltdW0oKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIG1heGltdW0gdmFsdWUsIGlmIGRlZmluZWQuIE1heGltdW0gdmFsdWVzIGNhbiBvbmx5IGJlIGRlZmluZWQKCSAqIGZvciBudW1lcmljIHR5cGVzLgoJICogCgkgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBkZWZpbmVkLgoJICovCglOdW1iZXIgZ2V0TWF4aW11bSgpOwoKCS8qKgoJICogUmV0dXJucyB0aGUgc2l6ZSBvZiBhbiBpbmNyZW1lbnQgb3BlcmF0aW9uLCBpZiBkZWZpbmVkLiBTdGVwIHNpemVzIGNhbiBiZQoJICogZGVmaW5lZCBvbmx5IGZvciBudW1lcmljIHR5cGVzLgoJICogCgkgKiBAcmV0dXJuIFRoZSBpbmNyZW1lbnQgc2l6ZSBvciBudWxsIGlmIG5vdCBkZWZpbmVkLgoJICovCglOdW1iZXIgZ2V0U3RlcCgpOwoKCS8qKgoJICogVGVsbHMgaWYgdGhpcyBTdGF0ZVZhcmlhYmxlIGNhbiBiZSB1c2VkIGFzIGFuIGV2ZW50IHNvdXJjZS4KCSAqIAoJICogSWYgdGhlIFN0YXRlVmFyaWFibGUgaXMgZXZlbnRhYmxlLCBhbiBldmVudCBsaXN0ZW5lciBzZXJ2aWNlIGNhbiBiZQoJICogcmVnaXN0ZXJlZCB0byBiZSBub3RpZmllZCB3aGVuIGNoYW5nZXMgdG8gdGhlIHZhcmlhYmxlIGFwcGVhci4KCSAqIAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgPGNvZGU+U3RhdGVWYXJpYWJsZTwvY29kZT4gZ2VuZXJhdGVzIGV2ZW50cywKCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KCSAqLwoJYm9vbGVhbiBzZW5kc0V2ZW50cygpOwp9ClBLAwQKAAAAAABrUu40gmRnpXQBAAB0AQAALwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLnVwbnAvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9wYWNrYWdlLmh0bWwsdiAxLjQgMjAwNi8wNy8xMiAyMTowNjo1NSBoYXJncmF2ZSBFeHAgJCAtLT4KPEJPRFk+CjxwPlVQblAgUGFja2FnZSBWZXJzaW9uIDEuMS4KPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlCmluIHRoZSBJbXBvcnQtUGFja2FnZSBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0LgpGb3IgZXhhbXBsZToKPHByZT4KSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnNlcnZpY2UudXBucDsgdmVyc2lvbj0xLjEKPC9wcmU+CjwvQk9EWT4KUEsDBAoAAAAAAGtS7jSErhq3DAAAAAwAAAAuAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAKAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9QSwMECgAAAAAAa1LuNFeUDWeoEQAAqBEAADoAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vQXV0aG9yaXphdGlvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL0F1dGhvcml6YXRpb24uamF2YSx2IDEuOSAyMDA2LzA3LzExIDAwOjU0OjAxIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbjsKCi8qKgogKiBUaGUgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gaW50ZXJmYWNlIGVuY2Fwc3VsYXRlcyBhbiBhdXRob3JpemF0aW9uIGNvbnRleHQKICogb24gd2hpY2ggYnVuZGxlcyBjYW4gYmFzZSBhdXRob3JpemF0aW9uIGRlY2lzaW9ucywgd2hlcmUgYXBwcm9wcmlhdGUuCiAqIDxwPgogKiBCdW5kbGVzIGFzc29jaWF0ZSB0aGUgcHJpdmlsZWdlIHRvIGFjY2VzcyByZXN0cmljdGVkIHJlc291cmNlcyBvciBvcGVyYXRpb25zCiAqIHdpdGggcm9sZXMuIEJlZm9yZSBncmFudGluZyBhY2Nlc3MgdG8gYSByZXN0cmljdGVkIHJlc291cmNlIG9yIG9wZXJhdGlvbiwgYQogKiBidW5kbGUgd2lsbCBjaGVjayBpZiB0aGUgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gb2JqZWN0IHBhc3NlZCB0byBpdCBwb3NzZXNzCiAqIHRoZSByZXF1aXJlZCByb2xlLCBieSBjYWxsaW5nIGl0cyA8Y29kZT5oYXNSb2xlPC9jb2RlPiBtZXRob2QuCiAqIDxwPgogKiBBdXRob3JpemF0aW9uIGNvbnRleHRzIGFyZSBpbnN0YW50aWF0ZWQgYnkgY2FsbGluZyB0aGUKICoge0BsaW5rIFVzZXJBZG1pbiNnZXRBdXRob3JpemF0aW9ufSBtZXRob2QuCiAqIAogKiA8cD4KICogPGk+VHJ1c3RpbmcgQXV0aG9yaXphdGlvbiBvYmplY3RzIDwvaT4KICogPHA+CiAqIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgcmVnYXJkaW5nIHRoZSBjcmVhdGlvbiBvZiA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPgogKiBvYmplY3RzLiBIZW5jZSwgYSBzZXJ2aWNlIG11c3Qgb25seSBhY2NlcHQgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gb2JqZWN0cwogKiBmcm9tIGJ1bmRsZXMgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkIHRvIHVzZSB0aGUgc2VydmljZSB1c2luZyBjb2RlIGJhc2VkIChvcgogKiBKYXZhIDIpIHBlcm1pc3Npb25zLgogKiAKICogPHA+CiAqIEluIHNvbWUgY2FzZXMgaXQgaXMgdXNlZnVsIHRvIHVzZSA8Y29kZT5TZXJ2aWNlUGVybWlzc2lvbjwvY29kZT4gdG8gZG8gdGhlIGNvZGUKICogYmFzZWQgYWNjZXNzIGNvbnRyb2wuIEEgc2VydmljZSBiYXNpbmcgdXNlciBhY2Nlc3MgY29udHJvbCBvbgogKiA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiBvYmplY3RzIHBhc3NlZCB0byBpdCwgd2lsbCB0aGVuIHJlcXVpcmUgdGhhdCBhCiAqIGNhbGxpbmcgYnVuZGxlIGhhcyB0aGUgPGNvZGU+U2VydmljZVBlcm1pc3Npb248L2NvZGU+IHRvIGdldCB0aGUgc2VydmljZSBpbgogKiBxdWVzdGlvbi4gVGhpcyBpcyB0aGUgbW9zdCBjb252ZW5pZW50IHdheS4gVGhlIE9TR2kgZW52aXJvbm1lbnQgd2lsbCBkbyB0aGUKICogY29kZSBiYXNlZCBwZXJtaXNzaW9uIGNoZWNrIHdoZW4gdGhlIGNhbGxpbmcgYnVuZGxlIGF0dGVtcHRzIHRvIGdldCB0aGUKICogc2VydmljZSBmcm9tIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LgogKiA8cD4KICogRXhhbXBsZTogQSBzZXJ2bGV0IHVzaW5nIGEgc2VydmljZSBvbiBhIHVzZXIncyBiZWhhbGYuIFRoZSBidW5kbGUgd2l0aCB0aGUKICogc2VydmxldCBtdXN0IGJlIGdpdmVuIHRoZSA8Y29kZT5TZXJ2aWNlUGVybWlzc2lvbjwvY29kZT4gdG8gZ2V0IHRoZSBIdHRwCiAqIFNlcnZpY2UuCiAqIDxwPgogKiBIb3dldmVyLCBpbiBzb21lIGNhc2VzIHRoZSBjb2RlIGJhc2VkIHBlcm1pc3Npb24gY2hlY2tzIG5lZWQgdG8gYmUgbW9yZQogKiBmaW5lLWdyYWluZWQuIEEgc2VydmljZSBtaWdodCBhbGxvdyBhbGwgYnVuZGxlcyB0byBnZXQgaXQsIGJ1dCByZXF1aXJlCiAqIGNlcnRhaW4gY29kZSBiYXNlZCBwZXJtaXNzaW9ucyBmb3Igc29tZSBvZiBpdHMgbWV0aG9kcy4KICogPHA+CiAqIEV4YW1wbGU6IEEgc2VydmxldCB1c2luZyBhIHNlcnZpY2Ugb24gYSB1c2VyJ3MgYmVoYWxmLCB3aGVyZSBzb21lIHNlcnZpY2UKICogZnVuY3Rpb25hbGl0eSBpcyBvcGVuIHRvIGFueW9uZSwgYW5kIHNvbWUgaXMgcmVzdHJpY3RlZCBieSBjb2RlIGJhc2VkCiAqIHBlcm1pc3Npb25zLiBXaGVuIGEgcmVzdHJpY3RlZCBtZXRob2QgaXMgY2FsbGVkIChlLmcuLCBvbmUgaGFuZGluZyBvdmVyIGFuCiAqIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+IG9iamVjdCksIHRoZSBzZXJ2aWNlIGV4cGxpY2l0bHkgY2hlY2tzIHRoYXQgdGhlCiAqIGNhbGxpbmcgYnVuZGxlIGhhcyBwZXJtaXNzaW9uIHRvIG1ha2UgdGhlIGNhbGwuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIEF1dGhvcml6YXRpb24gewoJLyoqCgkgKiBHZXRzIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgVXNlcn0gdGhhdCB0aGlzIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+CgkgKiBjb250ZXh0IHdhcyBjcmVhdGVkIGZvci4KCSAqIAoJICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUge0BsaW5rIFVzZXJ9IG9iamVjdCB0aGF0IHRoaXMKCSAqICAgICAgICAgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gY29udGV4dCB3YXMgY3JlYXRlZCBmb3IsIG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHVzZXIgd2FzIHNwZWNpZmllZCB3aGVuIHRoaXMKCSAqICAgICAgICAgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gY29udGV4dCB3YXMgY3JlYXRlZC4KCSAqLwoJcHVibGljIFN0cmluZyBnZXROYW1lKCk7CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhlIHJvbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgaW1wbGllZCBieSB0aGlzCgkgKiA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiBjb250ZXh0LgoJICogPHA+CgkgKiAKCSAqIEJ1bmRsZXMgbXVzdCBkZWZpbmUgZ2xvYmFsbHkgdW5pcXVlIHJvbGUgbmFtZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoCgkgKiB0aGUgcHJpdmlsZWdlIG9mIGFjY2Vzc2luZyByZXN0cmljdGVkIHJlc291cmNlcyBvciBvcGVyYXRpb25zLiBPcGVyYXRvcnMKCSAqIHdpbGwgZ3JhbnQgdXNlcnMgYWNjZXNzIHRvIHRoZXNlIHJlc291cmNlcywgYnkgY3JlYXRpbmcgYSB7QGxpbmsgR3JvdXB9CgkgKiBvYmplY3QgZm9yIGVhY2ggcm9sZSBhbmQgYWRkaW5nIHtAbGluayBVc2VyfSBvYmplY3RzIHRvIGl0LgoJICogCgkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcm9sZSB0byBjaGVjayBmb3IuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiBjb250ZXh0IGltcGxpZXMKCSAqICAgICAgICAgdGhlIHNwZWNpZmllZCByb2xlLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgoJICovCglwdWJsaWMgYm9vbGVhbiBoYXNSb2xlKFN0cmluZyBuYW1lKTsKCgkvKioKCSAqIEdldHMgdGhlIG5hbWVzIG9mIGFsbCByb2xlcyBlbmNhcHN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPgoJICogY29udGV4dC4KCSAqIAoJICogQHJldHVybiBUaGUgbmFtZXMgb2YgYWxsIHJvbGVzIGVuY2Fwc3VsYXRlZCBieSB0aGlzCgkgKiAgICAgICAgIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+IGNvbnRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHJvbGVzCgkgKiAgICAgICAgIGFyZSBpbiB0aGUgY29udGV4dC4gVGhlIHByZWRlZmluZWQgcm9sZSA8Y29kZT51c2VyLmFueW9uZTwvY29kZT4KCSAqICAgICAgICAgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LgoJICovCglwdWJsaWMgU3RyaW5nW10gZ2V0Um9sZXMoKTsKfQpQSwMECgAAAAAAa1LuNEWW7P44GAAAOBgAADIAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vR3JvdXAuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Hcm91cC5qYXZhLHYgMS44IDIwMDYvMDYvMTYgMTY6MzE6NDEgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAxLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluOwoKLyoqCiAqIEEgbmFtZWQgZ3JvdXBpbmcgb2Ygcm9sZXMgKDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdHMpLgogKiA8cD4KICogV2hldGhlciBvciBub3QgYSBnaXZlbiA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiBjb250ZXh0IGltcGxpZXMgYQogKiA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0IGRlcGVuZHMgb24gdGhlIG1lbWJlcnMgb2YgdGhhdCA8Y29kZT5Hcm91cDwvY29kZT4KICogb2JqZWN0LgogKiA8cD4KICogQSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0IGNhbiBoYXZlIHR3byBraW5kcyBvZiBtZW1iZXJzOiA8aT5iYXNpYyA8L2k+IGFuZAogKiA8aT5yZXF1aXJlZCA8L2k+LiBBIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QgaXMgaW1wbGllZCBieSBhbgogKiA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiBjb250ZXh0IGlmIGFsbCBvZiBpdHMgcmVxdWlyZWQgbWVtYmVycyBhcmUgaW1wbGllZAogKiBhbmQgYXQgbGVhc3Qgb25lIG9mIGl0cyBiYXNpYyBtZW1iZXJzIGlzIGltcGxpZWQuCiAqIDxwPgogKiBBIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBiYXNpYyBtZW1iZXIgaW4gb3JkZXIgdG8KICogYmUgaW1wbGllZC4gSW4gb3RoZXIgd29yZHMsIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdCB3aXRob3V0IGFueSBiYXNpYwogKiBtZW1iZXIgcm9sZXMgaXMgbmV2ZXIgaW1wbGllZCBieSBhbnkgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gY29udGV4dC4KICogPHA+CiAqIEEgPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0IGFsd2F5cyBpbXBsaWVzIGl0c2VsZi4KICogPHA+CiAqIE5vIGxvb3AgZGV0ZWN0aW9uIGlzIHBlcmZvcm1lZCB3aGVuIGFkZGluZyBtZW1iZXJzIHRvIDxjb2RlPkdyb3VwPC9jb2RlPgogKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBjaXJjdWxhciBpbXBsaWNhdGlvbnMuCiAqIExvb3AgZGV0ZWN0aW9uIGlzIGluc3RlYWQgZG9uZSB3aGVuIHJvbGVzIGFyZSBjaGVja2VkLiBUaGUgc2VtYW50aWNzIGlzIHRoYXQKICogaWYgYSByb2xlIGRlcGVuZHMgb24gaXRzZWxmIChpLmUuLCB0aGVyZSBpcyBhbiBpbXBsaWNhdGlvbiBsb29wKSwgdGhlIHJvbGUgaXMKICogbm90IGltcGxpZWQuCiAqIDxwPgogKiBUaGUgcnVsZSB0aGF0IGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJhc2ljIG1lbWJlcgogKiB0byBiZSBpbXBsaWVkIGlzIG1vdGl2YXRlZCBieSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CiAqIAogKiA8cHJlPgogKiAKICogIGdyb3VwIGZvbwogKiAgICByZXF1aXJlZCBtZW1iZXJzOiBtYXJrZXRpbmcKICogICAgYmFzaWMgbWVtYmVyczogYWxpY2UsIGJvYgogKiAgCiAqIDwvcHJlPgogKiAKICogUHJpdmlsZWdlZCBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBtZW1iZXJzaGlwIGluICJmb28iIGNhbiBiZSBwZXJmb3JtZWQgb25seQogKiBieSAiYWxpY2UiIGFuZCAiYm9iIiwgd2hvIGFyZSBpbiBtYXJrZXRpbmcuCiAqIDxwPgogKiBJZiAiYWxpY2UiIGFuZCAiYm9iIiBldmVyIHRyYW5zZmVyIHRvIGEgZGlmZmVyZW50IGRlcGFydG1lbnQsIGFueWJvZHkgaW4KICogbWFya2V0aW5nIHdpbGwgYmUgYWJsZSB0byBhc3N1bWUgdGhlICJmb28iIHJvbGUsIHdoaWNoIGNlcnRhaW5seSBtdXN0IGJlCiAqIHByZXZlbnRlZC4gUmVxdWlyaW5nIHRoYXQgImZvbyIgKG9yIGFueSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0IGZvciB0aGF0CiAqIG1hdHRlcikgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiYXNpYyBtZW1iZXIgYWNjb21wbGlzaGVzIHRoYXQuCiAqIDxwPgogKiBIb3dldmVyLCB0aGlzIHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgYSA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0IHRvIGJlCiAqIGltcGxpZWQgYnkganVzdCBpdHMgcmVxdWlyZWQgbWVtYmVycy4gQW4gZXhhbXBsZSB3aGVyZSB0aGlzIGltcGxpY2F0aW9uIG1pZ2h0CiAqIGJlIHVzZWZ1bCBpcyB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uOiAiQW55IGNpdGl6ZW4gd2hvIGlzIGFuIGFkdWx0IGlzCiAqIGFsbG93ZWQgdG8gdm90ZS4iIEFuIGludHVpdGl2ZSBjb25maWd1cmF0aW9uIG9mICJ2b3RlciIgd291bGQgYmU6CiAqIAogKiA8cHJlPgogKiAKICogIGdyb3VwIHZvdGVyCiAqICAgIHJlcXVpcmVkIG1lbWJlcnM6IGNpdGl6ZW4sIGFkdWx0CiAqICAgICAgIGJhc2ljIG1lbWJlcnM6CiAqICAKICogPC9wcmU+CiAqIAogKiBIb3dldmVyLCBhY2NvcmRpbmcgdG8gdGhlIGFib3ZlIHJ1bGUsIHRoZSAidm90ZXIiIHJvbGUgY291bGQgbmV2ZXIgYmUgYXNzdW1lZAogKiBieSBhbnlib2R5LCBzaW5jZSBpdCBsYWNrcyBhbnkgYmFzaWMgbWVtYmVycy4gSW4gb3JkZXIgdG8gYWRkcmVzcyB0aGlzIGlzc3VlCiAqIGEgcHJlZGVmaW5lZCByb2xlIG5hbWVkICJ1c2VyLmFueW9uZSIgY2FuIGJlIHNwZWNpZmllZCwgd2hpY2ggaXMgYWx3YXlzCiAqIGltcGxpZWQuIFRoZSBkZXNpcmVkIGltcGxpY2F0aW9uIG9mIHRoZSAidm90ZXIiIGdyb3VwIGNhbiB0aGVuIGJlIGFjaGlldmVkIGJ5CiAqIHNwZWNpZnlpbmcgInVzZXIuYW55b25lIiBhcyBpdHMgYmFzaWMgbWVtYmVyLCBhcyBmb2xsb3dzOgogKiAKICogPHByZT4KICogCiAqICBncm91cCB2b3RlcgogKiAgICByZXF1aXJlZCBtZW1iZXJzOiBjaXRpemVuLCBhZHVsdAogKiAgICAgICBiYXNpYyBtZW1iZXJzOiB1c2VyLmFueW9uZQogKiAgCiAqIDwvcHJlPgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjggJAogKi8KcHVibGljIGludGVyZmFjZSBHcm91cCBleHRlbmRzIFVzZXIgewoJLyoqCgkgKiBBZGRzIHRoZSBzcGVjaWZpZWQgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IGFzIGEgYmFzaWMgbWVtYmVyIHRvIHRoaXMKCSAqIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSByb2xlIFRoZSByb2xlIHRvIGFkZCBhcyBhIGJhc2ljIG1lbWJlci4KCSAqIAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gcm9sZSBjb3VsZCBiZSBhZGRlZCBhcyBhIGJhc2ljCgkgKiAgICAgICAgIG1lbWJlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QKCSAqICAgICAgICAgYWxyZWFkeSBjb250YWlucyBhIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB3aG9zZSBuYW1lIG1hdGNoZXMgdGhhdAoJICogICAgICAgICBvZiB0aGUgc3BlY2lmaWVkIHJvbGUuCgkgKiAKCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlIGNhbGxlcgoJICogICAgICAgICBkb2VzIG5vdCBoYXZlIHRoZSA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiB3aXRoIG5hbWUKCSAqICAgICAgICAgPGNvZGU+YWRtaW48L2NvZGU+LgoJICovCglwdWJsaWMgYm9vbGVhbiBhZGRNZW1iZXIoUm9sZSByb2xlKTsKCgkvKioKCSAqIEFkZHMgdGhlIHNwZWNpZmllZCA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgYXMgYSByZXF1aXJlZCBtZW1iZXIgdG8gdGhpcwoJICogPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHBhcmFtIHJvbGUgVGhlIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB0byBhZGQgYXMgYSByZXF1aXJlZCBtZW1iZXIuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCBjb3VsZCBiZQoJICogICAgICAgICBhZGRlZCBhcyBhIHJlcXVpcmVkIG1lbWJlciwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzCgkgKiAgICAgICAgIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QgYWxyZWFkeSBjb250YWlucyBhIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdAoJICogICAgICAgICB3aG9zZSBuYW1lIG1hdGNoZXMgdGhhdCBvZiB0aGUgc3BlY2lmaWVkIHJvbGUuCgkgKiAKCSAqIEB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24gSWYgYSBzZWN1cml0eSBtYW5hZ2VyIGV4aXN0cyBhbmQgdGhlIGNhbGxlcgoJICogICAgICAgICBkb2VzIG5vdCBoYXZlIHRoZSA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiB3aXRoIG5hbWUKCSAqICAgICAgICAgPGNvZGU+YWRtaW48L2NvZGU+LgoJICovCglwdWJsaWMgYm9vbGVhbiBhZGRSZXF1aXJlZE1lbWJlcihSb2xlIHJvbGUpOwoKCS8qKgoJICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCBmcm9tIHRoaXMgPGNvZGU+R3JvdXA8L2NvZGU+CgkgKiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSByb2xlIFRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgdG8gcmVtb3ZlIGZyb20gdGhpcyA8Y29kZT5Hcm91cDwvY29kZT4KCSAqICAgICAgICBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCBjb3VsZCBiZSByZW1vdmVkLAoJICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LgoJICogCgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHRoZSBjYWxsZXIKCSAqICAgICAgICAgZG9lcyBub3QgaGF2ZSB0aGUgPGNvZGU+VXNlckFkbWluUGVybWlzc2lvbjwvY29kZT4gd2l0aCBuYW1lCgkgKiAgICAgICAgIDxjb2RlPmFkbWluPC9jb2RlPi4KCSAqLwoJcHVibGljIGJvb2xlYW4gcmVtb3ZlTWVtYmVyKFJvbGUgcm9sZSk7CgoJLyoqCgkgKiBHZXRzIHRoZSBiYXNpYyBtZW1iZXJzIG9mIHRoaXMgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiBUaGUgYmFzaWMgbWVtYmVycyBvZiB0aGlzIDxjb2RlPkdyb3VwPC9jb2RlPiBvYmplY3QsIG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdCBkb2VzIG5vdCBjb250YWluCgkgKiAgICAgICAgIGFueSBiYXNpYyBtZW1iZXJzLgoJICovCglwdWJsaWMgUm9sZVtdIGdldE1lbWJlcnMoKTsKCgkvKioKCSAqIEdldHMgdGhlIHJlcXVpcmVkIG1lbWJlcnMgb2YgdGhpcyA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIFRoZSByZXF1aXJlZCBtZW1iZXJzIG9mIHRoaXMgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdCwgb3IKCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyA8Y29kZT5Hcm91cDwvY29kZT4gb2JqZWN0IGRvZXMgbm90IGNvbnRhaW4KCSAqICAgICAgICAgYW55IHJlcXVpcmVkIG1lbWJlcnMuCgkgKi8KCXB1YmxpYyBSb2xlW10gZ2V0UmVxdWlyZWRNZW1iZXJzKCk7Cn0KUEsDBAoAAAAAAGtS7jTy70ObghAAAIIQAAAxAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGUuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Sb2xlLmphdmEsdiAxLjEwIDIwMDYvMDcvMTEgMDA6NTQ6MDEgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAxLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluOwoKaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwoKLyoqCiAqIFRoZSBiYXNlIGludGVyZmFjZSBmb3IgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0cyBtYW5hZ2VkIGJ5IHRoZSBVc2VyIEFkbWluCiAqIHNlcnZpY2UuCiAqIAogKiA8cD4KICogVGhpcyBpbnRlcmZhY2UgZXhwb3NlcyB0aGUgY2hhcmFjdGVyaXN0aWNzIHNoYXJlZCBieSBhbGwgPGNvZGU+Um9sZTwvY29kZT4KICogY2xhc3NlczogYSBuYW1lLCBhIHR5cGUsIGFuZCBhIHNldCBvZiBwcm9wZXJ0aWVzLgogKiA8cD4KICogUHJvcGVydGllcyByZXByZXNlbnQgcHVibGljIGluZm9ybWF0aW9uIGFib3V0IHRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgdGhhdAogKiBjYW4gYmUgcmVhZCBieSBhbnlvbmUuIFNwZWNpZmljIHtAbGluayBVc2VyQWRtaW5QZXJtaXNzaW9ufSBvYmplY3RzIGFyZQogKiByZXF1aXJlZCB0byBjaGFuZ2UgYSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QncyBwcm9wZXJ0aWVzLgogKiA8cD4KICogPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG9iamVjdHMuIENoYW5nZXMKICogdG8gdGhlc2Ugb2JqZWN0cyBhcmUgcHJvcGFnYXRlZCB0byB0aGUgVXNlciBBZG1pbiBzZXJ2aWNlIGFuZCBtYWRlCiAqIHBlcnNpc3RlbnQuCiAqIDxwPgogKiBFdmVyeSBVc2VyIEFkbWluIHNlcnZpY2UgY29udGFpbnMgYSBzZXQgb2YgcHJlZGVmaW5lZCA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3RzCiAqIHRoYXQgYXJlIGFsd2F5cyBwcmVzZW50IGFuZCBjYW5ub3QgYmUgcmVtb3ZlZC4gQWxsIHByZWRlZmluZWQgPGNvZGU+Um9sZTwvY29kZT4KICogb2JqZWN0cyBhcmUgb2YgdHlwZSA8Y29kZT5ST0xFPC9jb2RlPi4gVGhpcyB2ZXJzaW9uIG9mIHRoZQogKiA8Y29kZT5vcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbjwvY29kZT4gcGFja2FnZSBkZWZpbmVzIGEgc2luZ2xlIHByZWRlZmluZWQKICogcm9sZSBuYW1lZCAmcXVvdDt1c2VyLmFueW9uZSZxdW90Oywgd2hpY2ggaXMgaW5oZXJpdGVkIGJ5IGFueSBvdGhlciByb2xlLgogKiBPdGhlciBwcmVkZWZpbmVkIHJvbGVzIG1heSBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlLiBTaW5jZQogKiAmcXVvdDt1c2VyLmFueW9uZSZxdW90OyBpcyBhIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB0aGF0IGhhcyBwcm9wZXJ0aWVzCiAqIGFzc29jaWF0ZWQgd2l0aCBpdCB0aGF0IGNhbiBiZSByZWFkIGFuZCBtb2RpZmllZC4gQWNjZXNzIHRvIHRoZXNlIHByb3BlcnRpZXMKICogYW5kIHRoZWlyIHVzZSBpcyBhcHBsaWNhdGlvbiBzcGVjaWZpYyBhbmQgaXMgY29udHJvbGxlZCB1c2luZwogKiA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBpbiB0aGUgc2FtZSB3YXkgdGhhdCBwcm9wZXJ0aWVzIGZvciBvdGhlcgogKiA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3RzIGFyZS4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFJvbGUgewoJLyoqCgkgKiBUaGUgbmFtZSBvZiB0aGUgcHJlZGVmaW5lZCByb2xlLCB1c2VyLmFueW9uZSwgdGhhdCBhbGwgdXNlcnMgYW5kIGdyb3VwcwoJICogYmVsb25nIHRvLgoJICogQHNpbmNlIDEuMQoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlVU0VSX0FOWU9ORQk9ICJ1c2VyLmFueW9uZSI7CgkvKioKCSAqIFRoZSB0eXBlIG9mIGEgcHJlZGVmaW5lZCByb2xlLgoJICogCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBvZiA8Y29kZT5ST0xFPC9jb2RlPiBpcyAwLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAkJUk9MRQkJPSAwOwoJLyoqCgkgKiBUaGUgdHlwZSBvZiBhIHtAbGluayBVc2VyfSByb2xlLgoJICogCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBvZiA8Y29kZT5VU0VSPC9jb2RlPiBpcyAxLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIGludAkJVVNFUgkJPSAxOwoJLyoqCgkgKiBUaGUgdHlwZSBvZiBhIHtAbGluayBHcm91cH0gcm9sZS4KCSAqIAoJICogPHA+CgkgKiBUaGUgdmFsdWUgb2YgPGNvZGU+R1JPVVA8L2NvZGU+IGlzIDIuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CQlHUk9VUAkJPSAyOwoKCS8qKgoJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJvbGUuCgkgKiAKCSAqIEByZXR1cm4gVGhlIHJvbGUncyBuYW1lLgoJICovCglwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKCgkvKioKCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyByb2xlLgoJICogCgkgKiBAcmV0dXJuIFRoZSByb2xlJ3MgdHlwZS4KCSAqLwoJcHVibGljIGludCBnZXRUeXBlKCk7CgoJLyoqCgkgKiBSZXR1cm5zIGEgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2YgdGhlIChwdWJsaWMpIHByb3BlcnRpZXMgb2YgdGhpcwoJICogPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0LiBBbnkgY2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4KCSAqIHdpbGwgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0LiBUaGlzIHdpbGwKCSAqIGNhdXNlIGEgPGNvZGU+VXNlckFkbWluRXZlbnQ8L2NvZGU+IG9iamVjdCBvZiB0eXBlCgkgKiB7QGxpbmsgVXNlckFkbWluRXZlbnQjUk9MRV9DSEFOR0VEfSB0byBiZSBicm9hZGNhc3QgdG8gYW55CgkgKiA8Y29kZT5Vc2VyQWRtaW5MaXN0ZW5lcjwvY29kZT4gb2JqZWN0cy4KCSAqIAoJICogPHA+CgkgKiBPbmx5IG9iamVjdHMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+IG1heSBiZSB1c2VkIGFzIHByb3BlcnR5IGtleXMsIGFuZAoJICogb25seSBvYmplY3RzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBvciA8Y29kZT5ieXRlW108L2NvZGU+IG1heSBiZSB1c2VkCgkgKiBhcyBwcm9wZXJ0eSB2YWx1ZXMuIEFueSBvdGhlciB0eXBlcyB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiBvZiB0eXBlCgkgKiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IHRvIGJlIHJhaXNlZC4KCSAqIAoJICogPHA+CgkgKiBJbiBvcmRlciB0byBhZGQsIGNoYW5nZSwgb3IgcmVtb3ZlIGEgcHJvcGVydHkgaW4gdGhlIHJldHVybmVkCgkgKiA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiwgYSB7QGxpbmsgVXNlckFkbWluUGVybWlzc2lvbn0gbmFtZWQgYWZ0ZXIgdGhlCgkgKiBwcm9wZXJ0eSBuYW1lIChvciBhIHByZWZpeCBvZiBpdCkgd2l0aCBhY3Rpb24gPGNvZGU+Y2hhbmdlUHJvcGVydHk8L2NvZGU+CgkgKiBpcyByZXF1aXJlZC4KCSAqIAoJICogQHJldHVybiA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiBjb250YWluaW5nIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMKCSAqICAgICAgICAgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgRGljdGlvbmFyeSBnZXRQcm9wZXJ0aWVzKCk7Cn0KUEsDBAoAAAAAAGtS7jQH9m4NKBAAACgQAAAxAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyLmphdmEsdiAxLjkgMjAwNi8wNy8xMSAwMDo1NDowMSBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW47CgppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgovKioKICogQSA8Y29kZT5Vc2VyPC9jb2RlPiByb2xlIG1hbmFnZWQgYnkgYSBVc2VyIEFkbWluIHNlcnZpY2UuCiAqIAogKiA8cD4KICogSW4gdGhpcyBjb250ZXh0LCB0aGUgdGVybSAmcXVvdDt1c2VyJnF1b3Q7IGlzIG5vdCBsaW1pdGVkIHRvIGp1c3QgaHVtYW4KICogYmVpbmdzLiBJbnN0ZWFkLCBpdCByZWZlcnMgdG8gYW55IGVudGl0eSB0aGF0IG1heSBoYXZlIGFueSBudW1iZXIgb2YKICogY3JlZGVudGlhbHMgYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgaXQgbWF5IHVzZSB0byBhdXRoZW50aWNhdGUgaXRzZWxmLgogKiA8cD4KICogSW4gZ2VuZXJhbCwgPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0cyBhcmUgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgVXNlciBBZG1pbgogKiBzZXJ2aWNlIChuYW1lbHkgdGhlIG9uZSB0aGF0IGNyZWF0ZWQgdGhlbSksIGFuZCBjYW5ub3QgYmUgdXNlZCB3aXRoIG90aGVyCiAqIFVzZXIgQWRtaW4gc2VydmljZXMuCiAqIDxwPgogKiBBIDxjb2RlPlVzZXI8L2NvZGU+IG9iamVjdCBtYXkgaGF2ZSBjcmVkZW50aWFscyAoYW5kIHByb3BlcnRpZXMsIGluaGVyaXRlZCBmcm9tCiAqIHRoZSB7QGxpbmsgUm9sZX0gY2xhc3MpIGFzc29jaWF0ZWQgd2l0aCBpdC4gU3BlY2lmaWMKICoge0BsaW5rIFVzZXJBZG1pblBlcm1pc3Npb259IG9iamVjdHMgYXJlIHJlcXVpcmVkIHRvIHJlYWQgb3IgY2hhbmdlIGEKICogPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0J3MgY3JlZGVudGlhbHMuCiAqIDxwPgogKiBDcmVkZW50aWFscyBhcmUgPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2JqZWN0cyBhbmQgaGF2ZSBzZW1hbnRpY3MgdGhhdCBhcmUKICogc2ltaWxhciB0byB0aGUgcHJvcGVydGllcyBpbiB0aGUgPGNvZGU+Um9sZTwvY29kZT4gY2xhc3MuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBSb2xlIHsKCS8qKgoJICogUmV0dXJucyBhIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG9mIHRoZSBjcmVkZW50aWFscyBvZiB0aGlzIDxjb2RlPlVzZXI8L2NvZGU+CgkgKiBvYmplY3QuIEFueSBjaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiBvYmplY3Qgd2lsbAoJICogY2hhbmdlIHRoZSBjcmVkZW50aWFscyBvZiB0aGlzIDxjb2RlPlVzZXI8L2NvZGU+IG9iamVjdC4gVGhpcyB3aWxsIGNhdXNlIGEKCSAqIDxjb2RlPlVzZXJBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3Qgb2YgdHlwZQoJICoge0BsaW5rIFVzZXJBZG1pbkV2ZW50I1JPTEVfQ0hBTkdFRH0gdG8gYmUgYnJvYWRjYXN0IHRvIGFueQoJICogPGNvZGU+VXNlckFkbWluTGlzdGVuZXJzPC9jb2RlPiBvYmplY3RzLgoJICogCgkgKiA8cD4KCSAqIE9ubHkgb2JqZWN0cyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4gbWF5IGJlIHVzZWQgYXMgY3JlZGVudGlhbCBrZXlzLAoJICogYW5kIG9ubHkgb2JqZWN0cyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4gb3Igb2YgdHlwZSA8Y29kZT5ieXRlW108L2NvZGU+CgkgKiBtYXkgYmUgdXNlZCBhcyBjcmVkZW50aWFsIHZhbHVlcy4gQW55IG90aGVyIHR5cGVzIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uCgkgKiBvZiB0eXBlIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gdG8gYmUgcmFpc2VkLgoJICogCgkgKiA8cD4KCSAqIEluIG9yZGVyIHRvIHJldHJpZXZlIGEgY3JlZGVudGlhbCBmcm9tIHRoZSByZXR1cm5lZCA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPgoJICogb2JqZWN0LCBhIHtAbGluayBVc2VyQWRtaW5QZXJtaXNzaW9ufSBuYW1lZCBhZnRlciB0aGUgY3JlZGVudGlhbCBuYW1lIChvcgoJICogYSBwcmVmaXggb2YgaXQpIHdpdGggYWN0aW9uIDxjb2RlPmdldENyZWRlbnRpYWw8L2NvZGU+IGlzIHJlcXVpcmVkLgoJICogPHA+CgkgKiBJbiBvcmRlciB0byBhZGQgb3IgcmVtb3ZlIGEgY3JlZGVudGlhbCBmcm9tIHRoZSByZXR1cm5lZAoJICogPGNvZGU+RGljdGlvbmFyeTwvY29kZT4gb2JqZWN0LCBhIHtAbGluayBVc2VyQWRtaW5QZXJtaXNzaW9ufSBuYW1lZCBhZnRlcgoJICogdGhlIGNyZWRlbnRpYWwgbmFtZSAob3IgYSBwcmVmaXggb2YgaXQpIHdpdGggYWN0aW9uCgkgKiA8Y29kZT5jaGFuZ2VDcmVkZW50aWFsPC9jb2RlPiBpcyByZXF1aXJlZC4KCSAqIAoJICogQHJldHVybiA8Y29kZT5EaWN0aW9uYXJ5PC9jb2RlPiBvYmplY3QgY29udGFpbmluZyB0aGUgY3JlZGVudGlhbHMgb2YgdGhpcwoJICogICAgICAgICA8Y29kZT5Vc2VyPC9jb2RlPiBvYmplY3QuCgkgKi8KCXB1YmxpYyBEaWN0aW9uYXJ5IGdldENyZWRlbnRpYWxzKCk7CgoJLyoqCgkgKiBDaGVja3MgdG8gc2VlIGlmIHRoaXMgPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0IGhhcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUKCSAqIHNwZWNpZmllZCA8Y29kZT5rZXk8L2NvZGU+IHNldCB0byB0aGUgc3BlY2lmaWVkIDxjb2RlPnZhbHVlPC9jb2RlPi4KCSAqIAoJICogPHA+CgkgKiBJZiB0aGUgc3BlY2lmaWVkIGNyZWRlbnRpYWwgPGNvZGU+dmFsdWU8L2NvZGU+IGlzIG5vdCBvZiB0eXBlCgkgKiA8Y29kZT5TdHJpbmc8L2NvZGU+IG9yIDxjb2RlPmJ5dGVbXTwvY29kZT4sIGl0IGlzIGlnbm9yZWQsIHRoYXQgaXMsCgkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaXMgcmV0dXJuZWQgKGFzIG9wcG9zZWQgdG8gYW4KCSAqIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gYmVpbmcgcmFpc2VkKS4KCSAqIAoJICogQHBhcmFtIGtleSBUaGUgY3JlZGVudGlhbCA8Y29kZT5rZXk8L2NvZGU+LgoJICogQHBhcmFtIHZhbHVlIFRoZSBjcmVkZW50aWFsIDxjb2RlPnZhbHVlPC9jb2RlPi4KCSAqIAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIHVzZXIgaGFzIHRoZSBzcGVjaWZpZWQgY3JlZGVudGlhbDsKCSAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KCSAqIAoJICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCB0aGUgY2FsbGVyCgkgKiAgICAgICAgIGRvZXMgbm90IGhhdmUgdGhlIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IG5hbWVkIGFmdGVyIHRoZQoJICogICAgICAgICBjcmVkZW50aWFsIGtleSAob3IgYSBwcmVmaXggb2YgaXQpIHdpdGggYWN0aW9uCgkgKiAgICAgICAgIDxjb2RlPmdldENyZWRlbnRpYWw8L2NvZGU+LgoJICovCglwdWJsaWMgYm9vbGVhbiBoYXNDcmVkZW50aWFsKFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSk7Cn0KUEsDBAoAAAAAAGtS7jT+MOcI/xkAAP8ZAAA2AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbi5qYXZhLHYgMS4xMiAyMDA2LzA3LzEyIDIxOjIxOjMzIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbjsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuSW52YWxpZFN5bnRheEV4Y2VwdGlvbjsKCi8qKgogKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIG1hbmFnZSBhIGRhdGFiYXNlIG9mIG5hbWVkIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdHMsCiAqIHdoaWNoIGNhbiBiZSB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiBwdXJwb3Nlcy4KICogCiAqIDxwPgogKiBUaGlzIHZlcnNpb24gb2YgdGhlIFVzZXIgQWRtaW4gc2VydmljZSBkZWZpbmVzIHR3byB0eXBlcyBvZiA8Y29kZT5Sb2xlPC9jb2RlPgogKiBvYmplY3RzOiAiVXNlciIgYW5kICJHcm91cCIuIEVhY2ggdHlwZSBvZiByb2xlIGlzIHJlcHJlc2VudGVkIGJ5IGFuCiAqIDxjb2RlPmludDwvY29kZT4gY29uc3RhbnQgYW5kIGFuIGludGVyZmFjZS4gVGhlIHJhbmdlIG9mIHBvc2l0aXZlIGludGVnZXJzIGlzCiAqIHJlc2VydmVkIGZvciBuZXcgdHlwZXMgb2Ygcm9sZXMgdGhhdCBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4gV2hlbgogKiBkZWZpbmluZyBwcm9wcmlldGFyeSByb2xlIHR5cGVzLCBuZWdhdGl2ZSBjb25zdGFudCB2YWx1ZXMgbXVzdCBiZSB1c2VkLgogKiAKICogPHA+CiAqIEV2ZXJ5IHJvbGUgaGFzIGEgbmFtZSBhbmQgYSB0eXBlLgogKiAKICogPHA+CiAqIEEge0BsaW5rIFVzZXJ9IG9iamVjdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGNyZWRlbnRpYWxzIChlLmcuLCBhIHBhc3N3b3JkKQogKiBhbmQgcHJvcGVydGllcyAoZS5nLiwgYSBzdHJlZXQgYWRkcmVzcywgcGhvbmUgbnVtYmVyLCBldGMuKS4KICogPHA+CiAqIEEge0BsaW5rIEdyb3VwfSBvYmplY3QgcmVwcmVzZW50cyBhbiBhZ2dyZWdhdGlvbiBvZiB7QGxpbmsgVXNlcn0gYW5kCiAqIHtAbGluayBHcm91cH0gb2JqZWN0cy4gSW4gb3RoZXIgd29yZHMsIHRoZSBtZW1iZXJzIG9mIGEgPGNvZGU+R3JvdXA8L2NvZGU+CiAqIG9iamVjdCBhcmUgcm9sZXMgdGhlbXNlbHZlcy4KICogPHA+CiAqIEV2ZXJ5IFVzZXIgQWRtaW4gc2VydmljZSBtYW5hZ2VzIGFuZCBtYWludGFpbnMgaXRzIG93biBuYW1lc3BhY2Ugb2YKICogPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0cywgaW4gd2hpY2ggZWFjaCA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgaGFzIGEgdW5pcXVlCiAqIG5hbWUuCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTIgJAogKi8KcHVibGljIGludGVyZmFjZSBVc2VyQWRtaW4gewoJLyoqCgkgKiBDcmVhdGVzIGEgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG9mIHRoZSBnaXZlbgoJICogdHlwZS4KCSAqIAoJICogPHA+CgkgKiBJZiBhIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB3YXMgY3JlYXRlZCwgYSA8Y29kZT5Vc2VyQWRtaW5FdmVudDwvY29kZT4KCSAqIG9iamVjdCBvZiB0eXBlIHtAbGluayBVc2VyQWRtaW5FdmVudCNST0xFX0NSRUFURUR9IGlzIGJyb2FkY2FzdCB0byBhbnkKCSAqIDxjb2RlPlVzZXJBZG1pbkxpc3RlbmVyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSA8Y29kZT5uYW1lPC9jb2RlPiBvZiB0aGUgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHRvIGNyZWF0ZS4KCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgdG8gY3JlYXRlLiBNdXN0IGJlCgkgKiAgICAgICAgZWl0aGVyIGEge0BsaW5rIFJvbGUjVVNFUn0gdHlwZSBvciB7QGxpbmsgUm9sZSNHUk9VUH0gdHlwZS4KCSAqIAoJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEKCSAqICAgICAgICAgcm9sZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFscmVhZHkgZXhpc3RzLgoJICogCgkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiA8Y29kZT50eXBlPC9jb2RlPiBpcyBpbnZhbGlkLgoJICogCgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIGEgc2VjdXJpdHkgbWFuYWdlciBleGlzdHMgYW5kIHRoZSBjYWxsZXIKCSAqICAgICAgICAgZG9lcyBub3QgaGF2ZSB0aGUgPGNvZGU+VXNlckFkbWluUGVybWlzc2lvbjwvY29kZT4gd2l0aCBuYW1lCgkgKiAgICAgICAgIDxjb2RlPmFkbWluPC9jb2RlPi4KCSAqLwoJcHVibGljIFJvbGUgY3JlYXRlUm9sZShTdHJpbmcgbmFtZSwgaW50IHR5cGUpOwoKCS8qKgoJICogUmVtb3ZlcyB0aGUgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGlzIFVzZXIKCSAqIEFkbWluIHNlcnZpY2UuCgkgKiAKCSAqIDxwPgoJICogSWYgdGhlIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB3YXMgcmVtb3ZlZCwgYSA8Y29kZT5Vc2VyQWRtaW5FdmVudDwvY29kZT4KCSAqIG9iamVjdCBvZiB0eXBlIHtAbGluayBVc2VyQWRtaW5FdmVudCNST0xFX1JFTU9WRUR9IGlzIGJyb2FkY2FzdCB0byBhbnkKCSAqIDxjb2RlPlVzZXJBZG1pbkxpc3RlbmVyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgdG8gcmVtb3ZlLgoJICogCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IElmIGEgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUKCSAqICAgICAgICAgaXMgcHJlc2VudCBpbiB0aGlzIFVzZXIgQWRtaW4gc2VydmljZSBhbmQgY291bGQgYmUgcmVtb3ZlZCwKCSAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KCSAqIAoJICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiBhIHNlY3VyaXR5IG1hbmFnZXIgZXhpc3RzIGFuZCB0aGUgY2FsbGVyCgkgKiAgICAgICAgIGRvZXMgbm90IGhhdmUgdGhlIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IHdpdGggbmFtZQoJICogICAgICAgICA8Y29kZT5hZG1pbjwvY29kZT4uCgkgKi8KCXB1YmxpYyBib29sZWFuIHJlbW92ZVJvbGUoU3RyaW5nIG5hbWUpOwoKCS8qKgoJICogR2V0cyB0aGUgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIDxjb2RlPm5hbWU8L2NvZGU+IGZyb20gdGhpcwoJICogVXNlciBBZG1pbiBzZXJ2aWNlLgoJICogCgkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IHRvIGdldC4KCSAqIAoJICogQHJldHVybiBUaGUgcmVxdWVzdGVkIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcwoJICogICAgICAgICBVc2VyIEFkbWluIHNlcnZpY2UgZG9lcyBub3QgaGF2ZSBhIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB3aXRoCgkgKiAgICAgICAgIHRoZSBnaXZlbiA8Y29kZT5uYW1lPC9jb2RlPi4KCSAqLwoJcHVibGljIFJvbGUgZ2V0Um9sZShTdHJpbmcgbmFtZSk7CgoJLyoqCgkgKiBHZXRzIHRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3RzIG1hbmFnZWQgYnkgdGhpcyBVc2VyIEFkbWluIHNlcnZpY2UgdGhhdAoJICogaGF2ZSBwcm9wZXJ0aWVzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgTERBUCBmaWx0ZXIgY3JpdGVyaWEuIFNlZQoJICogPGNvZGU+b3JnLm9zZ2kuZnJhbWV3b3JrLkZpbHRlcjwvY29kZT4gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZpbHRlcgoJICogc3ludGF4LiBJZiBhIDxjb2RlPm51bGw8L2NvZGU+IGZpbHRlciBpcyBzcGVjaWZpZWQsIGFsbCBSb2xlIG9iamVjdHMKCSAqIG1hbmFnZWQgYnkgdGhpcyBVc2VyIEFkbWluIHNlcnZpY2UgYXJlIHJldHVybmVkLgoJICogCgkgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgY3JpdGVyaWEgdG8gbWF0Y2guCgkgKiAKCSAqIEByZXR1cm4gVGhlIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdHMgbWFuYWdlZCBieSB0aGlzIFVzZXIgQWRtaW4gc2VydmljZQoJICogICAgICAgICB3aG9zZSBwcm9wZXJ0aWVzIG1hdGNoIHRoZSBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLCBvciBhbGwKCSAqICAgICAgICAgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0cyBpZiBhIDxjb2RlPm51bGw8L2NvZGU+IGZpbHRlciBpcyBzcGVjaWZpZWQuCgkgKiAgICAgICAgIElmIG5vIHJvbGVzIG1hdGNoIHRoZSBmaWx0ZXIsIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcmV0dXJuZWQuCgkgKiBAdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gSWYgdGhlIGZpbHRlciBpcyBub3Qgd2VsbCBmb3JtZWQuCgkgKiAgCgkgKi8KCXB1YmxpYyBSb2xlW10gZ2V0Um9sZXMoU3RyaW5nIGZpbHRlcikgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb247CgoJLyoqCgkgKiBHZXRzIHRoZSB1c2VyIHdpdGggdGhlIGdpdmVuIHByb3BlcnR5IDxjb2RlPmtleTwvY29kZT4tPGNvZGU+dmFsdWU8L2NvZGU+CgkgKiBwYWlyIGZyb20gdGhlIFVzZXIgQWRtaW4gc2VydmljZSBkYXRhYmFzZS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZAoJICogZm9yIHJldHJpZXZpbmcgYSA8Y29kZT5Vc2VyPC9jb2RlPiBvYmplY3QgYmFzZWQgb24gYSBwcm9wZXJ0eSBmb3Igd2hpY2gKCSAqIGV2ZXJ5IDxjb2RlPlVzZXI8L2NvZGU+IG9iamVjdCBpcyBzdXBwb3NlZCB0byBoYXZlIGEgdW5pcXVlIHZhbHVlICh3aXRoaW4KCSAqIHRoZSBzY29wZSBvZiB0aGlzIFVzZXIgQWRtaW4gc2VydmljZSksIHN1Y2ggYXMgZm9yIGV4YW1wbGUgYSBYLjUwMAoJICogZGlzdGluZ3Vpc2hlZCBuYW1lLgoJICogCgkgKiBAcGFyYW0ga2V5IFRoZSBwcm9wZXJ0eSBrZXkgdG8gbG9vayBmb3IuCgkgKiBAcGFyYW0gdmFsdWUgVGhlIHByb3BlcnR5IHZhbHVlIHRvIGNvbXBhcmUgd2l0aC4KCSAqIAoJICogQHJldHVybiBBIG1hdGNoaW5nIHVzZXIsIGlmIDxlbT5leGFjdGx5PC9lbT4gb25lIGlzIGZvdW5kLiBJZiB6ZXJvIG9yCgkgKiAgICAgICAgIG1vcmUgdGhhbiBvbmUgbWF0Y2hpbmcgdXNlcnMgYXJlIGZvdW5kLCA8Y29kZT5udWxsPC9jb2RlPiBpcwoJICogICAgICAgICByZXR1cm5lZC4KCSAqLwoJcHVibGljIFVzZXIgZ2V0VXNlcihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwoKCS8qKgoJICogQ3JlYXRlcyBhbiA8Y29kZT5BdXRob3JpemF0aW9uPC9jb2RlPiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlCgkgKiBzcGVjaWZpZWQgPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0IGFuZCB0aGUgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0cyBpdAoJICogcG9zc2Vzc2VzLiBUaGUgPGNvZGU+bnVsbDwvY29kZT4gdXNlciBpcyBpbnRlcnByZXRlZCBhcyB0aGUgYW5vbnltb3VzIHVzZXIuCgkgKiBUaGUgYW5vbnltb3VzIHVzZXIgcmVwcmVzZW50cyBhIHVzZXIgdGhhdCBoYXMgbm90IGJlZW4gYXV0aGVudGljYXRlZC4gQW4KCSAqIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+IG9iamVjdCBmb3IgYW4gYW5vbnltb3VzIHVzZXIgd2lsbCBiZSB1bm5hbWVkLAoJICogYW5kIHdpbGwgb25seSBpbXBseSBncm91cHMgdGhhdCB1c2VyLmFueW9uZSBpbXBsaWVzLgoJICogCgkgKiBAcGFyYW0gdXNlciBUaGUgPGNvZGU+VXNlcjwvY29kZT4gb2JqZWN0IHRvIGNyZWF0ZSBhbgoJICogICAgICAgIDxjb2RlPkF1dGhvcml6YXRpb248L2NvZGU+IG9iamVjdCBmb3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0aGUKCSAqICAgICAgICBhbm9ueW1vdXMgdXNlci4KCSAqIAoJICogQHJldHVybiB0aGUgPGNvZGU+QXV0aG9yaXphdGlvbjwvY29kZT4gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkCgkgKiAgICAgICAgIDxjb2RlPlVzZXI8L2NvZGU+IG9iamVjdC4KCSAqLwoJcHVibGljIEF1dGhvcml6YXRpb24gZ2V0QXV0aG9yaXphdGlvbihVc2VyIHVzZXIpOwp9ClBLAwQKAAAAAABrUu40iYq1BxkNAAAZDQAAOwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5FdmVudC5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbkV2ZW50LmphdmEsdiAxLjkgMjAwNi8wNy8xMSAwMDo1NDowMSBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW47CgppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7CgovKioKICogPGNvZGU+Um9sZTwvY29kZT4gY2hhbmdlIGV2ZW50LgogKiA8cD4KICogPGNvZGU+VXNlckFkbWluRXZlbnQ8L2NvZGU+IG9iamVjdHMgYXJlIGRlbGl2ZXJlZCBhc3luY2hyb25vdXNseSB0byBhbnkKICogPGNvZGU+VXNlckFkbWluTGlzdGVuZXI8L2NvZGU+IG9iamVjdHMgd2hlbiBhIGNoYW5nZSBvY2N1cnMgaW4gYW55IG9mIHRoZQogKiA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3RzIG1hbmFnZWQgYnkgYSBVc2VyIEFkbWluIHNlcnZpY2UuCiAqIAogKiA8cD4KICogQSB0eXBlIGNvZGUgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgZXZlbnQuIFRoZSBmb2xsb3dpbmcgZXZlbnQgdHlwZXMgYXJlCiAqIGRlZmluZWQ6IHtAbGluayAjUk9MRV9DUkVBVEVEfSB0eXBlLCB7QGxpbmsgI1JPTEVfQ0hBTkdFRH0gdHlwZSwgYW5kCiAqIHtAbGluayAjUk9MRV9SRU1PVkVEfSB0eXBlLiBBZGRpdGlvbmFsIGV2ZW50IHR5cGVzIG1heSBiZSBkZWZpbmVkIGluIHRoZQogKiBmdXR1cmUuCiAqIAogKiBAc2VlIFVzZXJBZG1pbgogKiBAc2VlIFVzZXJBZG1pbkxpc3RlbmVyCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOSAkCiAqLwpwdWJsaWMgY2xhc3MgVXNlckFkbWluRXZlbnQgewoJcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlCXJlZjsKCXByaXZhdGUgaW50CQkJCQl0eXBlOwoJcHJpdmF0ZSBSb2xlCQkJCXJvbGU7CgkvKioKCSAqIEEgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIDxjb2RlPlJPTEVfQ1JFQVRFRDwvY29kZT4gaXMgMHgwMDAwMDAwMS4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQJCVJPTEVfQ1JFQVRFRAk9IDB4MDAwMDAwMDE7CgkvKioKCSAqIEEgPGNvZGU+Um9sZTwvY29kZT4gb2JqZWN0IGhhcyBiZWVuIG1vZGlmaWVkLgoJICogCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBvZiA8Y29kZT5ST0xFX0NIQU5HRUQ8L2NvZGU+IGlzIDB4MDAwMDAwMDIuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CQlST0xFX0NIQU5HRUQJPSAweDAwMDAwMDAyOwoJLyoqCgkgKiBBIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCBoYXMgYmVlbiByZW1vdmVkLgoJICogCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBvZiA8Y29kZT5ST0xFX1JFTU9WRUQ8L2NvZGU+IGlzIDB4MDAwMDAwMDQuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50CQlST0xFX1JFTU9WRUQJPSAweDAwMDAwMDA0OwoKCS8qKgoJICogQ29uc3RydWN0cyBhIDxjb2RlPlVzZXJBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4KCSAqIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCwgZXZlbnQgdHlwZSwgYW5kIDxjb2RlPlJvbGU8L2NvZGU+CgkgKiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSByZWYgVGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUgVXNlciBBZG1pbgoJICogICAgICAgIHNlcnZpY2UgdGhhdCBnZW5lcmF0ZWQgdGhpcyBldmVudC4KCSAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlLgoJICogQHBhcmFtIHJvbGUgVGhlIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCBvbiB3aGljaCB0aGlzIGV2ZW50IG9jY3VycmVkLgoJICovCglwdWJsaWMgVXNlckFkbWluRXZlbnQoU2VydmljZVJlZmVyZW5jZSByZWYsIGludCB0eXBlLCBSb2xlIHJvbGUpIHsKCQl0aGlzLnJlZiA9IHJlZjsKCQl0aGlzLnR5cGUgPSB0eXBlOwoJCXRoaXMucm9sZSA9IHJvbGU7Cgl9CgoJLyoqCgkgKiBHZXRzIHRoZSA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3Qgb2YgdGhlIFVzZXIgQWRtaW4gc2VydmljZQoJICogdGhhdCBnZW5lcmF0ZWQgdGhpcyBldmVudC4KCSAqIAoJICogQHJldHVybiBUaGUgVXNlciBBZG1pbiBzZXJ2aWNlJ3MgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgU2VydmljZVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmZXJlbmNlKCkgewoJCXJldHVybiByZWY7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZXZlbnQuCgkgKiAKCSAqIDxwPgoJICogVGhlIHR5cGUgdmFsdWVzIGFyZSB7QGxpbmsgI1JPTEVfQ1JFQVRFRH0gdHlwZSwge0BsaW5rICNST0xFX0NIQU5HRUR9CgkgKiB0eXBlLCBhbmQge0BsaW5rICNST0xFX1JFTU9WRUR9IHR5cGUuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGV2ZW50IHR5cGUuCgkgKi8KCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKCQlyZXR1cm4gdHlwZTsKCX0KCgkvKioKCSAqIEdldHMgdGhlIDxjb2RlPlJvbGU8L2NvZGU+IG9iamVjdCB0aGlzIGV2ZW50IHdhcyBnZW5lcmF0ZWQgZm9yLgoJICogCgkgKiBAcmV0dXJuIFRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgdGhpcyBldmVudCB3YXMgZ2VuZXJhdGVkIGZvci4KCSAqLwoJcHVibGljIFJvbGUgZ2V0Um9sZSgpIHsKCQlyZXR1cm4gcm9sZTsKCX0KfQpQSwMECgAAAAAAa1LuNBeZ2HOLBgAAiwYAAD4AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluTGlzdGVuZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5MaXN0ZW5lci5qYXZhLHYgMS44IDIwMDYvMDYvMTYgMTY6MzE6NDEgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAxLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluOwoKLyoqCiAqIExpc3RlbmVyIGZvciBVc2VyQWRtaW5FdmVudHMuCiAqIAogKiA8cD4KICogPGNvZGU+VXNlckFkbWluTGlzdGVuZXI8L2NvZGU+IG9iamVjdHMgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgRnJhbWV3b3JrCiAqIHNlcnZpY2UgcmVnaXN0cnkgYW5kIG5vdGlmaWVkIHdpdGggYSA8Y29kZT5Vc2VyQWRtaW5FdmVudDwvY29kZT4gb2JqZWN0IHdoZW4gYQogKiA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwgcmVtb3ZlZCwgb3IgbW9kaWZpZWQuCiAqIDxwPgogKiA8Y29kZT5Vc2VyQWRtaW5MaXN0ZW5lcjwvY29kZT4gb2JqZWN0cyBjYW4gZnVydGhlciBpbnNwZWN0IHRoZSByZWNlaXZlZAogKiA8Y29kZT5Vc2VyQWRtaW5FdmVudDwvY29kZT4gb2JqZWN0IHRvIGRldGVybWluZSBpdHMgdHlwZSwgdGhlIDxjb2RlPlJvbGU8L2NvZGU+CiAqIG9iamVjdCBpdCBvY2N1cnJlZCBvbiwgYW5kIHRoZSBVc2VyIEFkbWluIHNlcnZpY2UgdGhhdCBnZW5lcmF0ZWQgaXQuCiAqIAogKiBAc2VlIFVzZXJBZG1pbgogKiBAc2VlIFVzZXJBZG1pbkV2ZW50CiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFVzZXJBZG1pbkxpc3RlbmVyIHsKCS8qKgoJICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIHRoYXQgYSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCwKCSAqIHJlbW92ZWQsIG9yIG1vZGlmaWVkLgoJICogCgkgKiBAcGFyYW0gZXZlbnQgVGhlIDxjb2RlPlVzZXJBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3QuCgkgKi8KCXB1YmxpYyB2b2lkIHJvbGVDaGFuZ2VkKFVzZXJBZG1pbkV2ZW50IGV2ZW50KTsKfQpQSwMECgAAAAAAa1LuNICP3e05TgAAOU4AAEAAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluUGVybWlzc2lvbi5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb24uamF2YSx2IDEuMTMgMjAwNi8wNy8xMiAyMToyMTozMyBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDEsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW47CgppbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CgovKioKICogUGVybWlzc2lvbiB0byBjb25maWd1cmUgYW5kIGFjY2VzcyB0aGUge0BsaW5rIFJvbGV9IG9iamVjdHMgbWFuYWdlZCBieSBhIFVzZXIKICogQWRtaW4gc2VydmljZS4KICogCiAqIDxwPgogKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYWNjZXNzIHRvIHRoZSA8Y29kZT5Sb2xlPC9jb2RlPiBvYmplY3RzIG1hbmFnZWQgYnkgYSBVc2VyCiAqIEFkbWluIHNlcnZpY2UgYW5kIHRoZWlyIHByb3BlcnRpZXMgYW5kIGNyZWRlbnRpYWxzIChpbiB0aGUgY2FzZSBvZgogKiB7QGxpbmsgVXNlcn0gb2JqZWN0cykuCiAqIDxwPgogKiBUaGUgcGVybWlzc2lvbiBuYW1lIGlzIHRoZSBuYW1lIChvciBuYW1lIHByZWZpeCkgb2YgYSBwcm9wZXJ0eSBvciBjcmVkZW50aWFsLgogKiBUaGUgbmFtaW5nIGNvbnZlbnRpb24gZm9sbG93cyB0aGUgaGllcmFyY2hpY2FsIHByb3BlcnR5IG5hbWluZyBjb252ZW50aW9uLgogKiBBbHNvLCBhbiBhc3RlcmlzayBtYXkgYXBwZWFyIGF0IHRoZSBlbmQgb2YgdGhlIG5hbWUsIGZvbGxvd2luZyBhCiAqICZxdW90Oy4mcXVvdDssIG9yIGJ5IGl0c2VsZiwgdG8gc2lnbmlmeSBhIHdpbGRjYXJkIG1hdGNoLiBGb3IgZXhhbXBsZToKICogJnF1b3Q7b3JnLm9zZ2kuc2VjdXJpdHkucHJvdG9jb2wuKiZxdW90OyBvciAmcXVvdDsqJnF1b3Q7IGlzIHZhbGlkLCBidXQKICogJnF1b3Q7KnByb3RvY29sJnF1b3Q7IG9yICZxdW90O2EqYiZxdW90OyBhcmUgbm90IHZhbGlkLgogKiAKICogPHA+CiAqIFRoZSA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiB3aXRoIHRoZSByZXNlcnZlZCBuYW1lICZxdW90O2FkbWluJnF1b3Q7CiAqIHJlcHJlc2VudHMgdGhlIHBlcm1pc3Npb24gcmVxdWlyZWQgZm9yIGNyZWF0aW5nIGFuZCByZW1vdmluZyA8Y29kZT5Sb2xlPC9jb2RlPgogKiBvYmplY3RzIGluIHRoZSBVc2VyIEFkbWluIHNlcnZpY2UsIGFzIHdlbGwgYXMgYWRkaW5nIGFuZCByZW1vdmluZyBtZW1iZXJzIGluCiAqIGEgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdC4gVGhpcyA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBkb2VzIG5vdCBoYXZlCiAqIGFueSBhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBpdC4KICogCiAqIDxwPgogKiBUaGUgYWN0aW9ucyB0byBiZSBncmFudGVkIGFyZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGluIGEgc3RyaW5nCiAqIGNvbnRhaW5pbmcgYSBsaXN0IG9mIG9uZSBvciBtb3JlIGNvbW1hLXNlcGFyYXRlZCBrZXl3b3Jkcy4gVGhlIHBvc3NpYmxlCiAqIGtleXdvcmRzIGFyZTogPGNvZGU+Y2hhbmdlUHJvcGVydHk8L2NvZGU+LDxjb2RlPmNoYW5nZUNyZWRlbnRpYWw8L2NvZGU+LCBhbmQKICogPGNvZGU+Z2V0Q3JlZGVudGlhbDwvY29kZT4uIFRoZWlyIG1lYW5pbmcgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgogKiAKICogPHByZT4KICogCiAqICBhY3Rpb24KICogIGNoYW5nZVByb3BlcnR5ICAgIFBlcm1pc3Npb24gdG8gY2hhbmdlIChpLmUuLCBhZGQgYW5kIHJlbW92ZSkKICogICAgICAgICAgICAgICAgICAgIFJvbGUgb2JqZWN0IHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aAogKiAgICAgICAgICAgICAgICAgICAgdGhlIG5hbWUgYXJndW1lbnQgc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3Rvci4KICogIGNoYW5nZUNyZWRlbnRpYWwgIFBlcm1pc3Npb24gdG8gY2hhbmdlIChpLmUuLCBhZGQgYW5kIHJlbW92ZSkKICogICAgICAgICAgICAgICAgICAgIFVzZXIgb2JqZWN0IGNyZWRlbnRpYWxzIHdob3NlIG5hbWVzIHN0YXJ0CiAqICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBuYW1lIGFyZ3VtZW50IHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IuCiAqICBnZXRDcmVkZW50aWFsICAgICBQZXJtaXNzaW9uIHRvIHJldHJpZXZlIGFuZCBjaGVjayBmb3IgdGhlCiAqICAgICAgICAgICAgICAgICAgICBleGlzdGVuY2Ugb2YgVXNlciBvYmplY3QgY3JlZGVudGlhbHMgd2hvc2UgbmFtZXMKICogICAgICAgICAgICAgICAgICAgIHN0YXJ0IHdpdGggdGhlIG5hbWUgYXJndW1lbnQgc3BlY2lmaWVkIGluIHRoZQogKiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3IuCiAqICAKICogPC9wcmU+CiAqIAogKiBUaGUgYWN0aW9uIHN0cmluZyBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGJlZm9yZSBwcm9jZXNzaW5nLgogKiAKICogPHA+CiAqIEZvbGxvd2luZyBpcyBhIFBlcm1pc3Npb25JbmZvIHN0eWxlIHBvbGljeSBlbnRyeSB3aGljaCBncmFudHMgYSB1c2VyCiAqIGFkbWluaXN0cmF0aW9uIGJ1bmRsZSBhIG51bWJlciBvZiA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3Q6CiAqIAogKiA8cHJlPgogKiAKICogIChvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbi5Vc2VyQWRtaW5QZXJtaXNzaW9uICZxdW90O2FkbWluJnF1b3Q7KQogKiAgKG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLlVzZXJBZG1pblBlcm1pc3Npb24gJnF1b3Q7Y29tLmZvby4qJnF1b3Q7ICZxdW90O2NoYW5nZVByb3BlcnR5LGdldENyZWRlbnRpYWwsY2hhbmdlQ3JlZGVudGlhbCZxdW90OykKICogIChvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbi5Vc2VyQWRtaW5QZXJtaXNzaW9uICZxdW90O3VzZXIuKiZxdW90OywgJnF1b3Q7Y2hhbmdlUHJvcGVydHksY2hhbmdlQ3JlZGVudGlhbCZxdW90OykKICogIAogKiA8L3ByZT4KICogCiAqIFRoZSBmaXJzdCBwZXJtaXNzaW9uIHN0YXRlbWVudCBncmFudHMgdGhlIGJ1bmRsZSB0aGUgcGVybWlzc2lvbiB0byBwZXJmb3JtCiAqIGFueSBVc2VyIEFkbWluIHNlcnZpY2Ugb3BlcmF0aW9ucyBvZiB0eXBlICJhZG1pbiIsIHRoYXQgaXMsIGNyZWF0ZSBhbmQgcmVtb3ZlCiAqIHJvbGVzIGFuZCBjb25maWd1cmUgPGNvZGU+R3JvdXA8L2NvZGU+IG9iamVjdHMuCiAqIAogKiA8cD4KICogVGhlIHNlY29uZCBwZXJtaXNzaW9uIHN0YXRlbWVudCBncmFudHMgdGhlIGJ1bmRsZSB0aGUgcGVybWlzc2lvbiB0byBjaGFuZ2UKICogYW55IHByb3BlcnRpZXMgYXMgd2VsbCBhcyBnZXQgYW5kIGNoYW5nZSBhbnkgY3JlZGVudGlhbHMgd2hvc2UgbmFtZXMgc3RhcnQKICogd2l0aCA8Y29kZT5jb20uZm9vLjwvY29kZT4uCiAqIAogKiA8cD4KICogVGhlIHRoaXJkIHBlcm1pc3Npb24gc3RhdGVtZW50IGdyYW50cyB0aGUgYnVuZGxlIHRoZSBwZXJtaXNzaW9uIHRvIGNoYW5nZSBhbnkKICogcHJvcGVydGllcyBhbmQgY3JlZGVudGlhbHMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCA8Y29kZT51c2VyLjwvY29kZT4uIFRoaXMKICogbWVhbnMgdGhhdCB0aGUgYnVuZGxlIGlzIGFsbG93ZWQgdG8gY2hhbmdlLCBidXQgbm90IHJldHJpZXZlIGFueSBjcmVkZW50aWFscwogKiB3aXRoIHRoZSBnaXZlbiBwcmVmaXguCiAqIAogKiA8cD4KICogVGhlIGZvbGxvd2luZyBwb2xpY3kgZW50cnkgZW1wb3dlcnMgdGhlIEh0dHAgU2VydmljZSBidW5kbGUgdG8gcGVyZm9ybSB1c2VyCiAqIGF1dGhlbnRpY2F0aW9uOgogKiAKICogPHByZT4KICogCiAqICBncmFudCBjb2RlQmFzZSAmcXVvdDske2phcnN9aHR0cC5qYXImcXVvdDsgewogKiAgICBwZXJtaXNzaW9uIG9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluLlVzZXJBZG1pblBlcm1pc3Npb24KICogICAgICAmcXVvdDt1c2VyLnBhc3N3b3JkJnF1b3Q7LCAmcXVvdDtnZXRDcmVkZW50aWFsJnF1b3Q7OwogKiAgfTsKICogIAogKiA8L3ByZT4KICogCiAqIDxwPgogKiBUaGUgcGVybWlzc2lvbiBzdGF0ZW1lbnQgZ3JhbnRzIHRoZSBIdHRwIFNlcnZpY2UgYnVuZGxlIHRoZSBwZXJtaXNzaW9uIHRvCiAqIHZhbGlkYXRlIGFueSBwYXNzd29yZCBjcmVkZW50aWFscyAoZm9yIGF1dGhlbnRpY2F0aW9uIHB1cnBvc2VzKSwgYnV0IHRoZQogKiBidW5kbGUgaXMgbm90IGFsbG93ZWQgdG8gY2hhbmdlIGFueSBwcm9wZXJ0aWVzIG9yIGNyZWRlbnRpYWxzLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEzICQKICovCnB1YmxpYyBmaW5hbCBjbGFzcyBVc2VyQWRtaW5QZXJtaXNzaW9uIGV4dGVuZHMgQmFzaWNQZXJtaXNzaW9uIHsKICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTE3OTk3MTY5MjQwMTYwMzc4OUw7CgkvKioKCSAqIFRoZSBwZXJtaXNzaW9uIG5hbWUgJnF1b3Q7YWRtaW4mcXVvdDsuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCUFETUlOCQkJCQkJPSAiYWRtaW4iOwoJLyoqCgkgKiBUaGUgYWN0aW9uIHN0cmluZyAmcXVvdDtjaGFuZ2VQcm9wZXJ0eSZxdW90Oy4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJQ0hBTkdFX1BST1BFUlRZCQkJCT0gImNoYW5nZVByb3BlcnR5IjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAlBQ1RJT05fQ0hBTkdFX1BST1BFUlRZCQk9IDB4MTsKCS8qKgoJICogVGhlIGFjdGlvbiBzdHJpbmcgJnF1b3Q7Y2hhbmdlQ3JlZGVudGlhbCZxdW90Oy4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJQ0hBTkdFX0NSRURFTlRJQUwJCQk9ICJjaGFuZ2VDcmVkZW50aWFsIjsKCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAlBQ1RJT05fQ0hBTkdFX0NSRURFTlRJQUwJPSAweDI7CgkvKioKCSAqIFRoZSBhY3Rpb24gc3RyaW5nICZxdW90O2dldENyZWRlbnRpYWwmcXVvdDsuCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCUdFVF9DUkVERU5USUFMCQkJCT0gImdldENyZWRlbnRpYWwiOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50CUFDVElPTl9HRVRfQ1JFREVOVElBTAkJPSAweDQ7CgkvKioKCSAqIEFsbCBhY3Rpb25zCgkgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIGludAlBQ1RJT05fQUxMCQkJCQk9IEFDVElPTl9DSEFOR0VfUFJPUEVSVFkKCQkJCQkJCQkJCQkJCQkJCQl8IEFDVElPTl9DSEFOR0VfQ1JFREVOVElBTAoJCQkJCQkJCQkJCQkJCQkJCXwgQUNUSU9OX0dFVF9DUkVERU5USUFMOwoJLyoqCgkgKiBObyBhY3Rpb25zLgoJICovCglzdGF0aWMgZmluYWwgaW50CQkJQUNUSU9OX05PTkUJCQkJCT0gMHgwOwoJLyoqCgkgKiBUaGUgYWN0aW9ucyBpbiBjYW5vbmljYWwgZm9ybS4KCSAqIAoJICogQHNlcmlhbAoJICovCglwcml2YXRlIFN0cmluZwkJCQlhY3Rpb25zCQkJCQkJPSBudWxsOwoJLyoqCgkgKiBUaGUgYWN0aW9ucyBtYXNrLgoJICovCglwcml2YXRlIHRyYW5zaWVudCBpbnQJCWFjdGlvbl9tYXNrCQkJCQk9IEFDVElPTl9OT05FOwoJLyoKCSAqIERlc2NyaXB0aW9uIG9mIHRoaXMgPGNvZGU+IFVzZXJBZG1pblBlcm1pc3Npb24gPC9jb2RlPiAocmV0dXJuZWQgYnkgPGNvZGU+CgkgKiB0b1N0cmluZyA8L2NvZGU+ICkKCSAqLwoJcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nCWRlc2NyaXB0aW9uOwoKCS8qKgoJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKCSAqIGFjdGlvbnMuIDxjb2RlPm5hbWU8L2NvZGU+IGlzIGVpdGhlciB0aGUgcmVzZXJ2ZWQgc3RyaW5nICZxdW90O2FkbWluJnF1b3Q7CgkgKiBvciB0aGUgbmFtZSBvZiBhIGNyZWRlbnRpYWwgb3IgcHJvcGVydHksIGFuZCA8Y29kZT5hY3Rpb25zPC9jb2RlPiBjb250YWlucwoJICogYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgYWN0aW9ucyBncmFudGVkIG9uIHRoZSBzcGVjaWZpZWQgbmFtZS4KCSAqIFZhbGlkIGFjdGlvbnMgYXJlIDxjb2RlPmNoYW5nZVByb3BlcnR5PC9jb2RlPiw8Y29kZT5jaGFuZ2VDcmVkZW50aWFsPC9jb2RlPiwKCSAqIGFuZCBnZXRDcmVkZW50aWFsLgoJICogCgkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGlzIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+CgkgKiBAcGFyYW0gYWN0aW9ucyB0aGUgYWN0aW9uIHN0cmluZy4KCSAqIAoJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgPGNvZGU+bmFtZTwvY29kZT4gZXF1YWxzCgkgKiAgICAgICAgICZxdW90O2FkbWluJnF1b3Q7IGFuZCA8Y29kZT5hY3Rpb25zPC9jb2RlPiBhcmUgc3BlY2lmaWVkLgoJICovCglwdWJsaWMgVXNlckFkbWluUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKCQl0aGlzKG5hbWUsIGdldE1hc2soYWN0aW9ucykpOwoJfQoKCS8qKgoJICogUGFja2FnZSBwcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkKCSAqIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb25Db2xsZWN0aW9uPC9jb2RlPi4KCSAqIAoJICogQHBhcmFtIG5hbWUgY2xhc3MgbmFtZQoJICogQHBhcmFtIG1hc2sgYWN0aW9uIG1hc2sKCSAqLwoJVXNlckFkbWluUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgaW50IG1hc2spIHsKCQlzdXBlcihuYW1lKTsKCQlpbml0KG1hc2spOwoJfQoKCS8qKgoJICogQ2FsbGVkIGJ5IGNvbnN0cnVjdG9ycyBhbmQgd2hlbiBkZXNlcmlhbGl6ZWQuCgkgKiAKCSAqIEBwYXJhbSBtYXNrIGFjdGlvbiBtYXNrCgkgKi8KCXByaXZhdGUgdm9pZCBpbml0KGludCBtYXNrKSB7CgkJaWYgKGdldE5hbWUoKS5lcXVhbHMoQURNSU4pKSB7CgkJCWlmIChtYXNrICE9IEFDVElPTl9OT05FKSB7CgkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBY3Rpb25zIHNwZWNpZmllZCBmb3IgIgoJCQkJCQkrICJuby1hY3Rpb24gIiArICJVc2VyQWRtaW5QZXJtaXNzaW9uIik7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCWlmICgobWFzayA9PSBBQ1RJT05fTk9ORSkgfHwgKChtYXNrICYgQUNUSU9OX0FMTCkgIT0gbWFzaykpIHsKCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgYWN0aW9uIHN0cmluZyIpOwoJCQl9CgkJfQoJCWFjdGlvbl9tYXNrID0gbWFzazsKCX0KCgkvKioKCSAqIFBhcnNlcyB0aGUgYWN0aW9uIHN0cmluZyBpbnRvIHRoZSBhY3Rpb24gbWFzay4KCSAqIAoJICogQHBhcmFtIGFjdGlvbnMgQWN0aW9uIHN0cmluZy4KCSAqIEByZXR1cm4gYWN0aW9uIG1hc2suCgkgKi8KCXByaXZhdGUgc3RhdGljIGludCBnZXRNYXNrKFN0cmluZyBhY3Rpb25zKSB7CgkJYm9vbGVhbiBzZWVuY29tbWEgPSBmYWxzZTsKCQlpbnQgbWFzayA9IEFDVElPTl9OT05FOwoJCWlmIChhY3Rpb25zID09IG51bGwpIHsKCQkJcmV0dXJuIChtYXNrKTsKCQl9CgkJY2hhcltdIGEgPSBhY3Rpb25zLnRvQ2hhckFycmF5KCk7CgkJaW50IGkgPSBhLmxlbmd0aCAtIDE7CgkJaWYgKGkgPCAwKQoJCQlyZXR1cm4gKG1hc2spOwoJCXdoaWxlIChpICE9IC0xKSB7CgkJCWNoYXIgYzsKCQkJLy8gc2tpcCB3aGl0ZXNwYWNlCgkJCXdoaWxlICgoaSAhPSAtMSkKCQkJCQkmJiAoKGMgPSBhW2ldKSA9PSAnICcgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1xuJwoJCQkJCQkJfHwgYyA9PSAnXGYnIHx8IGMgPT0gJ1x0JykpCgkJCQlpLS07CgkJCS8vIGNoZWNrIGZvciB0aGUga25vd24gc3RyaW5ncwoJCQlpbnQgbWF0Y2hsZW47CgkJCWlmIChpID49IDEyICYmIG1hdGNoX2dldChhLCBpIC0gMTApICYmIG1hdGNoX2NyZWRlbnRpYWwoYSwgaSkpIHsKCQkJCW1hdGNobGVuID0gMTM7CgkJCQltYXNrIHw9IEFDVElPTl9HRVRfQ1JFREVOVElBTDsKCQkJfQoJCQllbHNlCgkJCQlpZiAoaSA+PSAxMyAmJiBtYXRjaF9jaGFuZ2UoYSwgaSAtIDgpICYmIG1hdGNoX3Byb3BlcnR5KGEsIGkpKSB7CgkJCQkJbWF0Y2hsZW4gPSAxNDsKCQkJCQltYXNrIHw9IEFDVElPTl9DSEFOR0VfUFJPUEVSVFk7CgkJCQl9CgkJCQllbHNlCgkJCQkJaWYgKGkgPj0gMTUgJiYgbWF0Y2hfY2hhbmdlKGEsIGkgLSAxMCkKCQkJCQkJCSYmIG1hdGNoX2NyZWRlbnRpYWwoYSwgaSkpIHsKCQkJCQkJbWF0Y2hsZW4gPSAxNjsKCQkJCQkJbWFzayB8PSBBQ1RJT05fQ0hBTkdFX0NSRURFTlRJQUw7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQkvLyBwYXJzZSBlcnJvcgoJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAoJCQkJCQkJCSJpbnZhbGlkIHBlcm1pc3Npb246ICIgKyBhY3Rpb25zKTsKCQkJCQl9CgkJCS8vIG1ha2Ugc3VyZSB3ZSBkaWRuJ3QganVzdCBtYXRjaCB0aGUgdGFpbCBvZiBhIHdvcmQKCQkJLy8gbGlrZSAiYWNrYmFyZmltcG9ydCIuIEFsc28sIHNraXAgdG8gdGhlIGNvbW1hLgoJCQlzZWVuY29tbWEgPSBmYWxzZTsKCQkJd2hpbGUgKGkgPj0gbWF0Y2hsZW4gJiYgIXNlZW5jb21tYSkgewoJCQkJc3dpdGNoIChhW2kgLSBtYXRjaGxlbl0pIHsKCQkJCQljYXNlICcsJyA6CgkJCQkJCXNlZW5jb21tYSA9IHRydWU7CgkJCQkJLyogRkFMTFRIUk9VR0ggKi8KCQkJCQljYXNlICcgJyA6CgkJCQkJY2FzZSAnXHInIDoKCQkJCQljYXNlICdcbicgOgoJCQkJCWNhc2UgJ1xmJyA6CgkJCQkJY2FzZSAnXHQnIDoKCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdCA6CgkJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCgkJCQkJCQkJImludmFsaWQgcGVybWlzc2lvbjogIiArIGFjdGlvbnMpOwoJCQkJfQoJCQkJaS0tOwoJCQl9CgkJCS8vIHBvaW50IGkgYXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBjb21tYSBtaW51cyBvbmUgKG9yIC0xKS4KCQkJaSAtPSBtYXRjaGxlbjsKCQl9CgkJaWYgKHNlZW5jb21tYSkgewoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHBlcm1pc3Npb246ICIgKyBhY3Rpb25zKTsKCQl9CgkJcmV0dXJuIChtYXNrKTsKCX0KCglwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoX2NoYW5nZShjaGFyW10gYSwgaW50IGkpIHsKCQlyZXR1cm4gKChhW2kgLSA1XSA9PSAnYycgfHwgYVtpIC0gNV0gPT0gJ0MnKQoJCQkJJiYgKGFbaSAtIDRdID09ICdoJyB8fCBhW2kgLSA0XSA9PSAnSCcpCgkJCQkmJiAoYVtpIC0gM10gPT0gJ2EnIHx8IGFbaSAtIDNdID09ICdBJykKCQkJCSYmIChhW2kgLSAyXSA9PSAnbicgfHwgYVtpIC0gMl0gPT0gJ04nKQoJCQkJJiYgKGFbaSAtIDFdID09ICdnJyB8fCBhW2kgLSAxXSA9PSAnRycpICYmIChhW2kgLSAwXSA9PSAnZScgfHwgYVtpIC0gMF0gPT0gJ0UnKSk7Cgl9CgoJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaF9nZXQoY2hhcltdIGEsIGludCBpKSB7CgkJcmV0dXJuICgoYVtpIC0gMl0gPT0gJ2cnIHx8IGFbaSAtIDJdID09ICdHJykKCQkJCSYmIChhW2kgLSAxXSA9PSAnZScgfHwgYVtpIC0gMV0gPT0gJ0UnKSAmJiAoYVtpIC0gMF0gPT0gJ3QnIHx8IGFbaSAtIDBdID09ICdUJykpOwoJfQoKCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2hfcHJvcGVydHkoY2hhcltdIGEsIGludCBpKSB7CgkJcmV0dXJuICgoYVtpIC0gN10gPT0gJ3AnIHx8IGFbaSAtIDddID09ICdQJykKCQkJCSYmIChhW2kgLSA2XSA9PSAncicgfHwgYVtpIC0gNl0gPT0gJ1InKQoJCQkJJiYgKGFbaSAtIDVdID09ICdvJyB8fCBhW2kgLSA1XSA9PSAnTycpCgkJCQkmJiAoYVtpIC0gNF0gPT0gJ3AnIHx8IGFbaSAtIDRdID09ICdQJykKCQkJCSYmIChhW2kgLSAzXSA9PSAnZScgfHwgYVtpIC0gM10gPT0gJ0UnKQoJCQkJJiYgKGFbaSAtIDJdID09ICdyJyB8fCBhW2kgLSAyXSA9PSAnUicpCgkJCQkmJiAoYVtpIC0gMV0gPT0gJ3QnIHx8IGFbaSAtIDFdID09ICdUJykgJiYgKGFbaSAtIDBdID09ICd5JyB8fCBhW2kgLSAwXSA9PSAnWScpKTsKCX0KCglwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoX2NyZWRlbnRpYWwoY2hhcltdIGEsIGludCBpKSB7CgkJcmV0dXJuICgoYVtpIC0gOV0gPT0gJ2MnIHx8IGFbaSAtIDldID09ICdDJykKCQkJCSYmIChhW2kgLSA4XSA9PSAncicgfHwgYVtpIC0gOF0gPT0gJ1InKQoJCQkJJiYgKGFbaSAtIDddID09ICdlJyB8fCBhW2kgLSA3XSA9PSAnRScpCgkJCQkmJiAoYVtpIC0gNl0gPT0gJ2QnIHx8IGFbaSAtIDZdID09ICdEJykKCQkJCSYmIChhW2kgLSA1XSA9PSAnZScgfHwgYVtpIC0gNV0gPT0gJ0UnKQoJCQkJJiYgKGFbaSAtIDRdID09ICduJyB8fCBhW2kgLSA0XSA9PSAnTicpCgkJCQkmJiAoYVtpIC0gM10gPT0gJ3QnIHx8IGFbaSAtIDNdID09ICdUJykKCQkJCSYmIChhW2kgLSAyXSA9PSAnaScgfHwgYVtpIC0gMl0gPT0gJ0knKQoJCQkJJiYgKGFbaSAtIDFdID09ICdhJyB8fCBhW2kgLSAxXSA9PSAnQScpICYmIChhW2kgLSAwXSA9PSAnbCcgfHwgYVtpIC0gMF0gPT0gJ0wnKSk7Cgl9CgoJLyoqCgkgKiBDaGVja3MgaWYgdGhpcyA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QgJnF1b3Q7aW1wbGllcyZxdW90OwoJICogdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uLgoJICogPFA+CgkgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZjoKCSAqIDxwPgoJICogPHVsPgoJICogPGxpPjxpPnAgPC9pPiBpcyBhbiBpbnN0YW5jZW9mIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+LAoJICogPGxpPjxpPnAgPC9pPidzIGFjdGlvbnMgYXJlIGEgcHJvcGVyIHN1YnNldCBvZiB0aGlzIG9iamVjdCdzIGFjdGlvbnMsCgkgKiBhbmQKCSAqIDxsaT48aT5wIDwvaT4ncyBuYW1lIGlzIGltcGxpZWQgYnkgdGhpcyBvYmplY3QncyBuYW1lLiBGb3IgZXhhbXBsZSwKCSAqICZxdW90O2phdmEuKiZxdW90OyBpbXBsaWVzICZxdW90O2phdmEuaG9tZSZxdW90Oy4KCSAqIDwvdWw+CgkgKiAKCSAqIEBwYXJhbSBwIHRoZSBwZXJtaXNzaW9uIHRvIGNoZWNrIGFnYWluc3QuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcwoJICogICAgICAgICBvYmplY3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBib29sZWFuIGltcGxpZXMoUGVybWlzc2lvbiBwKSB7CgkJaWYgKHAgaW5zdGFuY2VvZiBVc2VyQWRtaW5QZXJtaXNzaW9uKSB7CgkJCVVzZXJBZG1pblBlcm1pc3Npb24gdGFyZ2V0ID0gKFVzZXJBZG1pblBlcm1pc3Npb24pIHA7CgkJCXJldHVybiAoLy8gQ2hlY2sgdGhhdCB0aGUgd2UgaGF2ZSB0aGUgcmVxdWVzdGVkIGFjdGlvbgoJCQkoKHRhcmdldC5hY3Rpb25fbWFzayAmIGFjdGlvbl9tYXNrKSA9PSB0YXJnZXQuYWN0aW9uX21hc2spCgkJCQkJJiYKCQkJCQkvLyBJZiB0aGUgdGFyZ2V0IGFjdGlvbiBtYXNrIGlzIEFDVElPTl9OT05FLCBpdCBtdXN0IGJlIGFuCgkJCQkJLy8gYWRtaW4gcGVybWlzc2lvbiwgYW5kIHRoZW4gd2UgbXVzdCBiZSB0aGF0IHRvbwoJCQkJCSh0YXJnZXQuYWN0aW9uX21hc2sgIT0gQUNUSU9OX05PTkUgfHwgYWN0aW9uX21hc2sgPT0gQUNUSU9OX05PTkUpICYmCgkJCS8vIENoZWNrIHRoYXQgbmFtZSBuYW1lIG1hdGNoZXMKCQkJc3VwZXIuaW1wbGllcyhwKSk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gKGZhbHNlKTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhY3Rpb25zLCBzZXBhcmF0ZWQgYnkKCSAqIGNvbW1hLgoJICogCgkgKiBAcmV0dXJuIHRoZSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhY3Rpb25zLgoJICovCglwdWJsaWMgU3RyaW5nIGdldEFjdGlvbnMoKSB7CgkJaWYgKGFjdGlvbnMgPT0gbnVsbCkgewoJCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgkJCWJvb2xlYW4gY29tbWEgPSBmYWxzZTsKCQkJaWYgKChhY3Rpb25fbWFzayAmIEFDVElPTl9DSEFOR0VfQ1JFREVOVElBTCkgPT0gQUNUSU9OX0NIQU5HRV9DUkVERU5USUFMKSB7CgkJCQlzYi5hcHBlbmQoQ0hBTkdFX0NSRURFTlRJQUwpOwoJCQkJY29tbWEgPSB0cnVlOwoJCQl9CgkJCWlmICgoYWN0aW9uX21hc2sgJiBBQ1RJT05fQ0hBTkdFX1BST1BFUlRZKSA9PSBBQ1RJT05fQ0hBTkdFX1BST1BFUlRZKSB7CgkJCQlpZiAoY29tbWEpCgkJCQkJc2IuYXBwZW5kKCcsJyk7CgkJCQlzYi5hcHBlbmQoQ0hBTkdFX1BST1BFUlRZKTsKCQkJCWNvbW1hID0gdHJ1ZTsKCQkJfQoJCQlpZiAoKGFjdGlvbl9tYXNrICYgQUNUSU9OX0dFVF9DUkVERU5USUFMKSA9PSBBQ1RJT05fR0VUX0NSRURFTlRJQUwpIHsKCQkJCWlmIChjb21tYSkKCQkJCQlzYi5hcHBlbmQoJywnKTsKCQkJCXNiLmFwcGVuZChHRVRfQ1JFREVOVElBTCk7CgkJCX0KCQkJYWN0aW9ucyA9IHNiLnRvU3RyaW5nKCk7CgkJfQoJCXJldHVybiAoYWN0aW9ucyk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPlBlcm1pc3Npb25Db2xsZWN0aW9uPC9jb2RlPiBvYmplY3QgZm9yIHN0b3JpbmcKCSAqIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IG9iamVjdHMuCgkgKiAKCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+UGVybWlzc2lvbkNvbGxlY3Rpb248L2NvZGU+IG9iamVjdCBzdWl0YWJsZSBmb3Igc3RvcmluZwoJICogICAgICAgICA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzLgoJICovCglwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CgkJcmV0dXJuIChuZXcgVXNlckFkbWluUGVybWlzc2lvbkNvbGxlY3Rpb24oKSk7Cgl9CgoJLyoqCgkgKiBDaGVja3MgdHdvIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IG9iamVjdHMgZm9yIGVxdWFsaXR5LiBDaGVja3MKCSAqIHRoYXQgPGNvZGU+b2JqPC9jb2RlPiBpcyBhIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+LCBhbmQgaGFzIHRoZQoJICogc2FtZSBuYW1lIGFuZCBhY3Rpb25zIGFzIHRoaXMgb2JqZWN0LgoJICogCgkgKiBAcGFyYW0gb2JqIHRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+b2JqPC9jb2RlPiBpcyBhCgkgKiAgICAgICAgIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IG9iamVjdCwgYW5kIGhhcyB0aGUgc2FtZSBuYW1lIGFuZAoJICogICAgICAgICBhY3Rpb25zIGFzIHRoaXMgPGNvZGU+VXNlckFkbWluUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewoJCWlmIChvYmogPT0gdGhpcykgewoJCQlyZXR1cm4gKHRydWUpOwoJCX0KCQlpZiAob2JqIGluc3RhbmNlb2YgVXNlckFkbWluUGVybWlzc2lvbikgewoJCQlVc2VyQWRtaW5QZXJtaXNzaW9uIHVhcCA9IChVc2VyQWRtaW5QZXJtaXNzaW9uKSBvYmo7CgkJCXJldHVybiAoKGFjdGlvbl9tYXNrID09IHVhcC5hY3Rpb25fbWFzaykgJiYgZ2V0TmFtZSgpLmVxdWFscygKCQkJCQl1YXAuZ2V0TmFtZSgpKSk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gKGZhbHNlKTsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QuCgkgKi8KCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CgkJcmV0dXJuIChnZXROYW1lKCkuaGFzaENvZGUoKSBeIGdldEFjdGlvbnMoKS5oYXNoQ29kZSgpKTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWN0aW9uIG1hc2suIFVzZWQgYnkgdGhlCgkgKiA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gY2xhc3MuCgkgKiAKCSAqIEByZXR1cm4gdGhlIGFjdGlvbnMgbWFzay4KCSAqLwoJaW50IGdldE1hc2soKSB7CgkJcmV0dXJuIChhY3Rpb25fbWFzayk7Cgl9CgoJLyoqCgkgKiB3cml0ZU9iamVjdCBpcyBjYWxsZWQgdG8gc2F2ZSB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QgdG8gYSBzdHJlYW0uIFRoZQoJICogYWN0aW9ucyBhcmUgc2VyaWFsaXplZCwgYW5kIHRoZSBzdXBlcmNsYXNzIHRha2VzIGNhcmUgb2YgdGhlIG5hbWUuCgkgKi8KCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKCQkvLyBXcml0ZSBvdXQgdGhlIGFjdGlvbnMuIFRoZSBzdXBlcmNsYXNzIHRha2VzIGNhcmUgb2YgdGhlIG5hbWUKCQkvLyBjYWxsIGdldEFjdGlvbnMgdG8gbWFrZSBzdXJlIGFjdGlvbnMgZmllbGQgaXMgaW5pdGlhbGl6ZWQKCQlpZiAoYWN0aW9ucyA9PSBudWxsKQoJCQlnZXRBY3Rpb25zKCk7CgkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKCX0KCgkvKgoJICogUmVzdG9yZXMgdGhpcyBvYmplY3QgZnJvbSBhIHN0cmVhbSAoaS5lLiwgZGVzZXJpYWxpemVzIGl0KS4KCSAqLwoJcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gb2lzKQoJCQl0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewoJCW9pcy5kZWZhdWx0UmVhZE9iamVjdCgpOwoJCWluaXQoZ2V0TWFzayhhY3Rpb25zKSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QuCgkgKiBUaGlzIHN0cmluZyBtdXN0IGJlIGluIDxjb2RlPlBlcm1pc3Npb25JbmZvPC9jb2RlPiBlbmNvZGVkIGZvcm1hdC4KCSAqIAoJICogQHJldHVybiBUaGUgPGNvZGU+UGVybWlzc2lvbkluZm88L2NvZGU+IGVuY29kZWQgc3RyaW5nIGZvciB0aGlzCgkgKiAgICAgICAgIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IG9iamVjdC4KCSAqIEBzZWUgIjxjb2RlPm9yZy5vc2dpLnNlcnZpY2UucGVybWlzc2lvbmFkbWluLlBlcm1pc3Npb25JbmZvLmdldEVuY29kZWQ8L2NvZGU+IgoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7CgkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCQkJc2IuYXBwZW5kKCcoJyk7CgkJCXNiLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSk7CgkJCXNiLmFwcGVuZCgiIFwiIik7CgkJCXNiLmFwcGVuZChnZXROYW1lKCkpOwoJCQlTdHJpbmcgYWN0aW9ucyA9IGdldEFjdGlvbnMoKTsKCQkJaWYgKGFjdGlvbnMubGVuZ3RoKCkgPiAwKSB7CgkJCQlzYi5hcHBlbmQoIlwiIFwiIik7CgkJCQlzYi5hcHBlbmQoYWN0aW9ucyk7CgkJCX0KCQkJc2IuYXBwZW5kKCJcIikiKTsKCQkJZGVzY3JpcHRpb24gPSBzYi50b1N0cmluZygpOwoJCX0KCQlyZXR1cm4gKGRlc2NyaXB0aW9uKTsKCX0KfQovKioKICogQSA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gc3RvcmVzIGEgc2V0IG9mCiAqIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+IHBlcm1pc3Npb25zLgogKi8KCmZpbmFsIGNsYXNzIFVzZXJBZG1pblBlcm1pc3Npb25Db2xsZWN0aW9uIGV4dGVuZHMgUGVybWlzc2lvbkNvbGxlY3Rpb24gewogICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MjIyMTExODg1MjMwMTIwNTgxTDsKCS8qKgoJICogVGFibGUgb2YgcGVybWlzc2lvbnMuCgkgKiAKCSAqIEBzZXJpYWwKCSAqLwoJcHJpdmF0ZSBIYXNodGFibGUJcGVybWlzc2lvbnM7CgkvKioKCSAqIEJvb2xlYW4gc2F5aW5nIGlmICIqIiBpcyBpbiB0aGUgY29sbGVjdGlvbi4KCSAqIAoJICogQHNlcmlhbAoJICovCglwcml2YXRlIGJvb2xlYW4JCWFsbF9hbGxvd2VkOwoKCS8qKgoJICogQ3JlYXRlcyBhbiBlbXB0eSA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgVXNlckFkbWluUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CgkJcGVybWlzc2lvbnMgPSBuZXcgSGFzaHRhYmxlKCk7CgkJYWxsX2FsbG93ZWQgPSBmYWxzZTsKCX0KCgkvKioKCSAqIEFkZHMgdGhlIGdpdmVuIHBlcm1pc3Npb24gdG8gdGhpcyA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4uCgkgKiBUaGUga2V5IGZvciB0aGUgaGFzaCBpcyB0aGUgbmFtZS4KCSAqIAoJICogQHBhcmFtIHBlcm1pc3Npb24gdGhlIDxjb2RlPlBlcm1pc3Npb248L2NvZGU+IG9iamVjdCB0byBhZGQuCgkgKiAKCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBnaXZlbiBwZXJtaXNzaW9uIGlzIG5vdCBhCgkgKiAgICAgICAgIDxjb2RlPlVzZXJBZG1pblBlcm1pc3Npb248L2NvZGU+CgkgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIElmIHRoaXMgPGNvZGU+VXNlckFkbWluUGVybWlzc2lvbkNvbGxlY3Rpb248L2NvZGU+CgkgKiAgICAgICAgIG9iamVjdCBoYXMgYmVlbiBtYXJrZWQgcmVhZG9ubHkKCSAqLwoJcHVibGljIHZvaWQgYWRkKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewoJCWlmICghKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBVc2VyQWRtaW5QZXJtaXNzaW9uKSkKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwZXJtaXNzaW9uOiAiCgkJCQkJKyBwZXJtaXNzaW9uKTsKCQlpZiAoaXNSZWFkT25seSgpKSB7CgkJCXRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiQXR0ZW1wdCB0byBhZGQgYSBQZXJtaXNzaW9uIHRvIGEgIgoJCQkJCSsgInJlYWRvbmx5IFBlcm1pc3Npb25Db2xsZWN0aW9uIik7CgkJfQoJCVVzZXJBZG1pblBlcm1pc3Npb24gdWFwID0gKFVzZXJBZG1pblBlcm1pc3Npb24pIHBlcm1pc3Npb247CgkJU3RyaW5nIG5hbWUgPSB1YXAuZ2V0TmFtZSgpOwoJCVVzZXJBZG1pblBlcm1pc3Npb24gZXhpc3RpbmcgPSAoVXNlckFkbWluUGVybWlzc2lvbikgcGVybWlzc2lvbnMKCQkJCS5nZXQobmFtZSk7CgkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKCQkJaW50IG9sZE1hc2sgPSBleGlzdGluZy5nZXRNYXNrKCk7CgkJCWludCBuZXdNYXNrID0gdWFwLmdldE1hc2soKTsKCQkJaWYgKG9sZE1hc2sgIT0gbmV3TWFzaykgewoJCQkJcGVybWlzc2lvbnMucHV0KG5hbWUsIG5ldyBVc2VyQWRtaW5QZXJtaXNzaW9uKG5hbWUsIG9sZE1hc2sKCQkJCQkJfCBuZXdNYXNrKSk7CgkJCX0KCQl9CgkJZWxzZSB7CgkJCXBlcm1pc3Npb25zLnB1dChuYW1lLCBwZXJtaXNzaW9uKTsKCQl9CgkJaWYgKCFhbGxfYWxsb3dlZCkgewoJCQlpZiAobmFtZS5lcXVhbHMoIioiKSkKCQkJCWFsbF9hbGxvd2VkID0gdHJ1ZTsKCQl9Cgl9CgoJLyoqCgkgKiBDaGVja3MgdG8gc2VlIGlmIHRoaXMgPGNvZGU+UGVybWlzc2lvbkNvbGxlY3Rpb248L2NvZGU+IGltcGxpZXMgdGhlIGdpdmVuCgkgKiBwZXJtaXNzaW9uLgoJICogCgkgKiBAcGFyYW0gcGVybWlzc2lvbiB0aGUgPGNvZGU+UGVybWlzc2lvbjwvY29kZT4gb2JqZWN0IHRvIGNoZWNrIGFnYWluc3QKCSAqIAoJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwZXJtaXNzaW9uIGlzIGltcGxpZWQgYnkgdGhpcwoJICogICAgICAgICA8Y29kZT5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4sIGZhbHNlIG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGJvb2xlYW4gaW1wbGllcyhQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKCQlpZiAoIShwZXJtaXNzaW9uIGluc3RhbmNlb2YgVXNlckFkbWluUGVybWlzc2lvbikpIHsKCQkJcmV0dXJuIChmYWxzZSk7CgkJfQoJCVVzZXJBZG1pblBlcm1pc3Npb24gdWFwID0gKFVzZXJBZG1pblBlcm1pc3Npb24pIHBlcm1pc3Npb247CgkJVXNlckFkbWluUGVybWlzc2lvbiB4OwoJCWludCBkZXNpcmVkID0gdWFwLmdldE1hc2soKTsKCQlpbnQgZWZmZWN0aXZlID0gMDsKCQkvLyBTaG9ydCBjaXJjdWl0IGlmIHRoZSAiKiIgUGVybWlzc2lvbiB3YXMgYWRkZWQuCgkJLy8gZGVzaXJlZCBjYW4gb25seSBiZSBBQ1RJT05fTk9ORSB3aGVuIG5hbWUgaXMgImFkbWluIi4KCQlpZiAoYWxsX2FsbG93ZWQgJiYgZGVzaXJlZCAhPSBVc2VyQWRtaW5QZXJtaXNzaW9uLkFDVElPTl9OT05FKSB7CgkJCXggPSAoVXNlckFkbWluUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KCIqIik7CgkJCWlmICh4ICE9IG51bGwpIHsKCQkJCWVmZmVjdGl2ZSB8PSB4LmdldE1hc2soKTsKCQkJCWlmICgoZWZmZWN0aXZlICYgZGVzaXJlZCkgPT0gZGVzaXJlZCkgewoJCQkJCXJldHVybiAodHJ1ZSk7CgkJCQl9CgkJCX0KCQl9CgkJLy8gc3RyYXRlZ3k6CgkJLy8gQ2hlY2sgZm9yIGZ1bGwgbWF0Y2ggZmlyc3QuIFRoZW4gd29yayBvdXIgd2F5IHVwIHRoZQoJCS8vIG5hbWUgbG9va2luZyBmb3IgbWF0Y2hlcyBvbiBhLmIuKgoJCVN0cmluZyBuYW1lID0gdWFwLmdldE5hbWUoKTsKCQl4ID0gKFVzZXJBZG1pblBlcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChuYW1lKTsKCQlpZiAoeCAhPSBudWxsKSB7CgkJCS8vIHdlIGhhdmUgYSBkaXJlY3QgaGl0IQoJCQllZmZlY3RpdmUgfD0geC5nZXRNYXNrKCk7CgkJCWlmICgoZWZmZWN0aXZlICYgZGVzaXJlZCkgPT0gZGVzaXJlZCkgewoJCQkJcmV0dXJuICh0cnVlKTsKCQkJfQoJCX0KCQkvLyB3b3JrIG91ciB3YXkgdXAgdGhlIHRyZWUuLi4KCQlpbnQgbGFzdDsKCQlpbnQgb2Zmc2V0ID0gbmFtZS5sZW5ndGgoKSAtIDE7CgkJd2hpbGUgKChsYXN0ID0gbmFtZS5sYXN0SW5kZXhPZigiLiIsIG9mZnNldCkpICE9IC0xKSB7CgkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBsYXN0ICsgMSkgKyAiKiI7CgkJCXggPSAoVXNlckFkbWluUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KG5hbWUpOwoJCQlpZiAoeCAhPSBudWxsKSB7CgkJCQllZmZlY3RpdmUgfD0geC5nZXRNYXNrKCk7CgkJCQlpZiAoKGVmZmVjdGl2ZSAmIGRlc2lyZWQpID09IGRlc2lyZWQpIHsKCQkJCQlyZXR1cm4gKHRydWUpOwoJCQkJfQoJCQl9CgkJCW9mZnNldCA9IGxhc3QgLSAxOwoJCX0KCQkvLyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciAiKiIgYXMgaXQgd2FzIGFscmVhZHkgY2hlY2tlZAoJCS8vIGF0IHRoZSB0b3AgKGFsbF9hbGxvd2VkKSwgc28gd2UganVzdCByZXR1cm4gZmFsc2UKCQlyZXR1cm4gKGZhbHNlKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIHRoZSA8Y29kZT5Vc2VyQWRtaW5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzCgkgKiBpbiB0aGUgY29udGFpbmVyLgoJICogCgkgKiBAcmV0dXJuIGFuIGVudW1lcmF0aW9uIG9mIGFsbCB0aGUgPGNvZGU+VXNlckFkbWluUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0cy4KCSAqLwoJcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewoJCXJldHVybiAocGVybWlzc2lvbnMuZWxlbWVudHMoKSk7Cgl9Cn0KUEsDBAoAAAAAAGtS7jSx/7FHiQEAAIkBAAA0AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL3BhY2thZ2UuaHRtbCx2IDEuNCAyMDA2LzA3LzEyIDIxOjA3OjA4IGhhcmdyYXZlIEV4cCAkIC0tPgo8Qk9EWT4KPHA+VXNlciBBZG1pbiBQYWNrYWdlIFZlcnNpb24gMS4xLgo8cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UKaW4gdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuCkZvciBleGFtcGxlOgo8cHJlPgpJbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuc2VydmljZS51c2VyYWRtaW47IHZlcnNpb249MS4xCjwvcHJlPgo8L0JPRFk+ClBLAwQKAAAAAABrUu40hK4atwwAAAAMAAAAMwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAKAAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9QSwMECgAAAAAAa1LuNPVprT9uBwAAbgcAADoAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQmFzaWNFbnZlbG9wZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0Jhc2ljRW52ZWxvcGUuamF2YSx2IDEuOSAyMDA2LzA2LzE2IDE2OjMxOjQzIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbjsKCi8qKgogKiA8Y29kZT5CYXNpY0VudmVsb3BlPC9jb2RlPiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEVudmVsb3BlfQogKiBpbnRlcmZhY2UKICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS45ICQKICovCnB1YmxpYyBjbGFzcyBCYXNpY0VudmVsb3BlIGltcGxlbWVudHMgRW52ZWxvcGUgewoJT2JqZWN0CXZhbHVlOwoJT2JqZWN0CWlkZW50aWZpY2F0aW9uOwoJU3RyaW5nCXNjb3BlOwoKCS8qKgoJICogQ29uc3RydWN0b3IuCgkgKiAKCSAqIEBwYXJhbSB2YWx1ZSBDb250ZW50IG9mIHRoaXMgZW52ZWxvcGUsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIEBwYXJhbSBpZGVudGlmaWNhdGlvbiBJZGVudGlmeWluZyBvYmplY3QgZm9yIHRoaXMgPGNvZGU+RW52ZWxvcGU8L2NvZGU+CgkgKiAgICAgICAgb2JqZWN0LCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgoJICogQHBhcmFtIHNjb3BlIFNjb3BlIG5hbWUgZm9yIHRoaXMgb2JqZWN0LCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgoJICogQHNlZSBFbnZlbG9wZQoJICovCglwdWJsaWMgQmFzaWNFbnZlbG9wZShPYmplY3QgdmFsdWUsIE9iamVjdCBpZGVudGlmaWNhdGlvbiwgU3RyaW5nIHNjb3BlKSB7CgkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCXRoaXMuaWRlbnRpZmljYXRpb24gPSBpZGVudGlmaWNhdGlvbjsKCQl0aGlzLnNjb3BlID0gc2NvcGU7Cgl9CgoJLyoqCgkgKiBAc2VlIG9yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluLkVudmVsb3BlI2dldFZhbHVlKCkKCSAqLwoJcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CgoJLyoqCgkgKiBAc2VlIG9yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluLkVudmVsb3BlI2dldElkZW50aWZpY2F0aW9uKCkKCSAqLwoJcHVibGljIE9iamVjdCBnZXRJZGVudGlmaWNhdGlvbigpIHsKCQlyZXR1cm4gaWRlbnRpZmljYXRpb247Cgl9CgoJLyoqCgkgKiBAc2VlIG9yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluLkVudmVsb3BlI2dldFNjb3BlKCkKCSAqLwoJcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKCQlyZXR1cm4gc2NvcGU7Cgl9Cn0KUEsDBAoAAAAAAGtS7jRDSyruOhIAADoSAAA1AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0NvbnN1bWVyLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbi9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQ29uc3VtZXIuamF2YSx2IDEuMTAgMjAwNi8wNy8xMSAwMDo1NDoxMCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW47CgovKioKICogRGF0YSBDb25zdW1lciwgYSBzZXJ2aWNlIHRoYXQgY2FuIHJlY2VpdmUgdWRwYXRlZCB2YWx1ZXMgZnJvbQogKiB7QGxpbmsgUHJvZHVjZXJ9IHNlcnZpY2VzLgogKiAKICogPHA+CiAqIFNlcnZpY2Ugb2JqZWN0cyByZWdpc3RlcmVkIHVuZGVyIHRoZSA8Y29kZT5Db25zdW1lcjwvY29kZT4gaW50ZXJmYWNlIGFyZQogKiBleHBlY3RlZCB0byBjb25zdW1lIHZhbHVlcyBmcm9tIGEgUHJvZHVjZXIgc2VydmljZSB2aWEgYSA8Y29kZT5XaXJlPC9jb2RlPgogKiBvYmplY3QuIEEgQ29uc3VtZXIgc2VydmljZSBtYXkgcG9sbCB0aGUgUHJvZHVjZXIgc2VydmljZSBieSBjYWxsaW5nIHRoZQogKiB7QGxpbmsgV2lyZSNwb2xsfSBtZXRob2QuIFRoZSBDb25zdW1lciBzZXJ2aWNlIHdpbGwgYWxzbyByZWNlaXZlIGFuIHVwZGF0ZWQKICogdmFsdWUgd2hlbiBjYWxsZWQgYXQgaXQncyB7QGxpbmsgI3VwZGF0ZWR9IG1ldGhvZC4gVGhlIFByb2R1Y2VyIHNlcnZpY2UKICogc2hvdWxkIGhhdmUgY29lcmNlZCB0aGUgdmFsdWUgdG8gYmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSB0eXBlcyBzcGVjaWZpZWQKICogYnkgdGhlIHtAbGluayBXaXJlI2dldEZsYXZvcnN9IG1ldGhvZCwgb3Igb25lIG9mIHRoZWlyIHN1YmNsYXNzZXMuCiAqIAogKiA8cD4KICogQ29uc3VtZXIgc2VydmljZSBvYmplY3RzIG11c3QgcmVnaXN0ZXIgd2l0aCBhIDxjb2RlPnNlcnZpY2UucGlkPC9jb2RlPiBhbmQgYQogKiB7QGxpbmsgV2lyZUNvbnN0YW50cyNXSVJFQURNSU5fQ09OU1VNRVJfRkxBVk9SU30gcHJvcGVydHkuIEl0IGlzIHJlY29tbWVuZGVkCiAqIHRoYXQgQ29uc3VtZXIgc2VydmljZSBvYmplY3RzIGFsc28gcmVnaXN0ZXIgd2l0aCBhCiAqIDxjb2RlPnNlcnZpY2UuZGVzY3JpcHRpb248L2NvZGU+IHByb3BlcnR5LgogKiAKICogPHA+CiAqIElmIGFuIDxjb2RlPkV4Y2VwdGlvbjwvY29kZT4gaXMgdGhyb3duIGJ5IGFueSBvZiB0aGUgPGNvZGU+Q29uc3VtZXI8L2NvZGU+CiAqIG1ldGhvZHMsIGEgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9mIHR5cGUKICoge0BsaW5rIFdpcmVBZG1pbkV2ZW50I0NPTlNVTUVSX0VYQ0VQVElPTn0gaXMgYnJvYWRjYXN0IGJ5IHRoZSBXaXJlIEFkbWluCiAqIHNlcnZpY2UuCiAqIAogKiA8cD4KICogU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMgLSBEYXRhIGNvbnN1bWluZyBidW5kbGVzIHdpbGwgcmVxdWlyZQogKiA8Y29kZT5TZXJ2aWNlUGVybWlzc2lvbltDb25zdW1lcixSRUdJU1RFUl08L2NvZGU+LiBJbiBnZW5lcmFsLCBvbmx5IHRoZSBXaXJlCiAqIEFkbWluIHNlcnZpY2UgYnVuZGxlIHNob3VsZCBoYXZlIHRoaXMgcGVybWlzc2lvbi4gVGh1cyBvbmx5IHRoZSBXaXJlIEFkbWluCiAqIHNlcnZpY2UgbWF5IGRpcmVjdGx5IGNhbGwgYSBDb25zdW1lciBzZXJ2aWNlLiBDYXJlIG11c3QgYmUgdGFrZW4gaW4gdGhlCiAqIHNoYXJpbmcgb2YgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyB3aXRoIG90aGVyIGJ1bmRsZXMuCiAqIDxwPgogKiBDb25zdW1lciBzZXJ2aWNlcyBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGVpciBzY29wZSB3aGVuIHRoZXkgY2FuIHJlY2VpdmUKICogZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdHMgZnJvbSB0aGUgUHJvZHVjZXIgc2VydmljZS4gVGhlIENvbnN1bWVyIHNlcnZpY2UKICogc2hvdWxkIGhhdmUgPGNvZGU+V2lyZVBlcm1pc3Npb248L2NvZGU+IGZvciBlYWNoIG9mIHRoZXNlIHNjb3BlIG5hbWVzLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEwICQKICovCnB1YmxpYyBpbnRlcmZhY2UgQ29uc3VtZXIgewoJLyoqCgkgKiBVcGRhdGUgdGhlIHZhbHVlLiBUaGlzIENvbnN1bWVyIHNlcnZpY2UgaXMgY2FsbGVkIGJ5IHRoZSA8Y29kZT5XaXJlPC9jb2RlPgoJICogb2JqZWN0IHdpdGggYW4gdXBkYXRlZCB2YWx1ZSBmcm9tIHRoZSBQcm9kdWNlciBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYnkgYSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgcHJpb3IgdG8gdGhpcwoJICogb2JqZWN0IGJlaW5nIG5vdGlmaWVkIHRoYXQgaXQgaXMgY29ubmVjdGVkIHRvIHRoYXQgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0CgkgKiAodmlhIHRoZSB7QGxpbmsgI3Byb2R1Y2Vyc0Nvbm5lY3RlZH0gbWV0aG9kKS4KCSAqIDxwPgoJICogV2hlbiB0aGUgQ29uc3VtZXIgc2VydmljZSBjYW4gcmVjZWl2ZSA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0cywgaXQKCSAqIG11c3QgaGF2ZSByZWdpc3RlcmVkIGFsbCBzY29wZSBuYW1lcyB0b2dldGhlciB3aXRoIHRoZSBzZXJ2aWNlIG9iamVjdCwKCSAqIGFuZCBlYWNoIG9mIHRob3NlIG5hbWVzIG11c3QgYmUgcGVybWl0dGVkIGJ5IHRoZSBidW5kbGUncwoJICogPGNvZGU+V2lyZVBlcm1pc3Npb248L2NvZGU+LiBJZiBhbiA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0IGlzIGRlbGl2ZXJlZAoJICogd2l0aCB0aGUgPGNvZGU+dXBkYXRlZDwvY29kZT4gbWV0aG9kLCB0aGVuIHRoZSBDb25zdW1lciBzZXJ2aWNlIHNob3VsZAoJICogYXNzdW1lIHRoYXQgdGhlIHNlY3VyaXR5IGNoZWNrIGhhcyBiZWVuIHBlcmZvcm1lZC4KCSAqIAoJICogQHBhcmFtIHdpcmUgVGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCB3aGljaCBpcyBkZWxpdmVyaW5nIHRoZSB1cGRhdGVkCgkgKiAgICAgICAgdmFsdWUuCgkgKiBAcGFyYW0gdmFsdWUgVGhlIHVwZGF0ZWQgdmFsdWUuIFRoZSB2YWx1ZSBzaG91bGQgYmUgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mCgkgKiAgICAgICAgdGhlIHR5cGVzIHNwZWNpZmllZCBieSB0aGUge0BsaW5rIFdpcmUjZ2V0Rmxhdm9yc30gbWV0aG9kLgoJICovCglwdWJsaWMgdm9pZCB1cGRhdGVkKFdpcmUgd2lyZSwgT2JqZWN0IHZhbHVlKTsKCgkvKioKCSAqIFVwZGF0ZSB0aGUgbGlzdCBvZiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzIHRvIHdoaWNoIHRoaXMgQ29uc3VtZXIgc2VydmljZQoJICogaXMgY29ubmVjdGVkLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBDb25zdW1lciBzZXJ2aWNlIGlzIGZpcnN0IHJlZ2lzdGVyZWQgYW5kCgkgKiBzdWJzZXF1ZW50bHkgd2hlbmV2ZXIgYSA8Y29kZT5XaXJlPC9jb2RlPiBhc3NvY2lhdGVkIHdpdGggdGhpcyBDb25zdW1lcgoJICogc2VydmljZSBiZWNvbWVzIGNvbm5lY3RlZCwgaXMgbW9kaWZpZWQgb3IgYmVjb21lcyBkaXNjb25uZWN0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIFdpcmUgQWRtaW4gc2VydmljZSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuIFRoaXMgaW1wbGllcwoJICogdGhhdCBpbXBsZW1lbnRvcnMgb2YgQ29uc3VtZXIgY2FuIGJlIGFzc3VyZWQgdGhhdCB0aGUgY2FsbGJhY2sgd2lsbCBub3QKCSAqIHRha2UgcGxhY2UgZHVyaW5nIHJlZ2lzdHJhdGlvbiB3aGVuIHRoZXkgZXhlY3V0ZSB0aGUgcmVnaXN0cmF0aW9uIGluIGEKCSAqIHN5bmNocm9uaXplZCBtZXRob2QuCgkgKiAKCSAqIEBwYXJhbSB3aXJlcyBBbiBhcnJheSBvZiB0aGUgY3VycmVudCBhbmQgY29tcGxldGUgbGlzdCBvZiA8Y29kZT5XaXJlPC9jb2RlPgoJICogICAgICAgIG9iamVjdHMgdG8gd2hpY2ggdGhpcyBDb25zdW1lciBzZXJ2aWNlIGlzIGNvbm5lY3RlZC4gTWF5IGJlCgkgKiAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIENvbnN1bWVyIHNlcnZpY2UgaXMgbm90IGN1cnJlbnRseSBjb25uZWN0ZWQKCSAqICAgICAgICB0byBhbnkgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cy4KCSAqLwoJcHVibGljIHZvaWQgcHJvZHVjZXJzQ29ubmVjdGVkKFdpcmVbXSB3aXJlcyk7Cn0KUEsDBAoAAAAAAGtS7jRCA3Jb8Q0AAPENAAA1AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0VudmVsb3BlLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbi9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vRW52ZWxvcGUuamF2YSx2IDEuOCAyMDA2LzA2LzE2IDE2OjMxOjQzIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbjsKCi8qKgogKiBJZGVudGlmaWVzIGEgY29udGFpbmVkIHZhbHVlLgogKiAKICogQW4gPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdCBjb21iaW5lcyBhIHN0YXR1cyB2YWx1ZSwgYW4gaWRlbnRpZmljYXRpb24KICogb2JqZWN0IGFuZCBhIHNjb3BlIG5hbWUuIFRoZSA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0IGFsbG93cyB0aGUgdXNlIG9mCiAqIHN0YW5kYXJkIEphdmEgdHlwZXMgd2hlbiBhIFByb2R1Y2VyIHNlcnZpY2UgY2FuIHByb2R1Y2UgbW9yZSB0aGFuIG9uZSBraW5kIG9mCiAqIG9iamVjdC4gVGhlIDxjb2RlPkVudmVsb3BlPC9jb2RlPiBvYmplY3QgYWxsb3dzIHRoZSBDb25zdW1lciBzZXJ2aWNlIHRvCiAqIHJlY29nbml6ZSB0aGUga2luZCBvZiBvYmplY3QgdGhhdCBpcyByZWNlaXZlZC4gRm9yIGV4YW1wbGUsIGEgZG9vciBsb2NrIGNvdWxkCiAqIGJlIHJlcHJlc2VudGVkIGJ5IGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4gb2JqZWN0LiBJZiB0aGUgPGNvZGU+UHJvZHVjZXI8L2NvZGU+CiAqIHNlcnZpY2Ugd291bGQgc2VuZCBzdWNoIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4gb2JqZWN0LCB0aGVuIHRoZSBDb25zdW1lcgogKiBzZXJ2aWNlIHdvdWxkIG5vdCBrbm93IHdoYXQgZG9vciB0aGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGVkLgogKiBUaGUgPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdCBjb250YWlucyBhbiBpZGVudGlmaWNhdGlvbiBvYmplY3Qgc28gdGhlCiAqIENvbnN1bWVyIHNlcnZpY2UgY2FuIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIGRpZmZlcmVudCBraW5kcyBvZiB2YWx1ZXMuIFRoZQogKiBpZGVudGlmaWNhdGlvbiBvYmplY3QgbWF5IGJlIGEgc2ltcGxlIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0LCBidXQgaXQgY2FuCiAqIGFsc28gYmUgYSBkb21haW4gc3BlY2lmaWMgb2JqZWN0IHRoYXQgaXMgbXV0dWFsbHkgYWdyZWVkIGJ5IHRoZSBQcm9kdWNlciBhbmQKICogdGhlIENvbnN1bWVyIHNlcnZpY2UuIFRoaXMgb2JqZWN0IGNhbiB0aGVuIGNvbnRhaW4gcmVsZXZhbnQgaW5mb3JtYXRpb24gdGhhdAogKiBtYWtlcyB0aGUgaWRlbnRpZmljYXRpb24gZWFzaWVyLgogKiA8cD4KICogVGhlIHNjb3BlIG5hbWUgb2YgdGhlIGVudmVsb3BlIGlzIHVzZWQgZm9yIHNlY3VyaXR5LiBUaGUgV2lyZSBvYmplY3QgbXVzdAogKiB2ZXJpZnkgdGhhdCBhbnkgPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdCBzZW5kIHRocm91Z2ggdGhlIDxjb2RlPnVwZGF0ZTwvY29kZT4KICogbWV0aG9kIG9yIGNvbWluZyBmcm9tIHRoZSA8Y29kZT5wb2xsPC9jb2RlPiBtZXRob2QgaGFzIGEgc2NvcGUgbmFtZSB0aGF0CiAqIG1hdGNoZXMgdGhlIHBlcm1pc3Npb25zIG9mIGJvdGggdGhlIFByb2R1Y2VyIHNlcnZpY2UgYW5kIHRoZSBDb25zdW1lciBzZXJ2aWNlCiAqIGludm9sdmVkLiBUaGUgd2lyZWFkbWluIHBhY2thZ2UgYWxzbyBjb250YWlucyBhIGNsYXNzIDxjb2RlPkJhc2ljRW52ZWxvcGU8L2NvZGU+CiAqIHRoYXQgaW1wbGVtZW50cyB0aGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZS4KICogCiAqIEBzZWUgV2lyZVBlcm1pc3Npb24KICogQHNlZSBCYXNpY0VudmVsb3BlCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuOCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIEVudmVsb3BlIHsKCS8qKgoJICogUmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhpcyA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3RhdHVzIGl0ZW0sIG9yIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gbm8gaXRlbSBpcwoJICogICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgaWRlbnRpZmljYXRpb24gb2YgdGhpcyA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBBbiBpZGVudGlmaWNhdGlvbiBtYXkgYmUgb2YgYW55IEphdmEgdHlwZS4gVGhlIHR5cGUgbXVzdCBiZSBtdXR1YWxseQoJICogYWdyZWVkIGJldHdlZW4gdGhlIENvbnN1bWVyIGFuZCBQcm9kdWNlciBzZXJ2aWNlcy4KCSAqIAoJICogQHJldHVybiBhbiBvYmplY3Qgd2hpY2ggaWRlbnRpZmllcyB0aGUgc3RhdHVzIGl0ZW0gaW4gdGhlIGFkZHJlc3Mgc3BhY2UKCSAqICAgICAgICAgb2YgdGhlIGNvbXBvc2l0ZSBwcm9kdWNlciwgbXVzdCBub3QgYmUgbnVsbC4KCSAqLwoJcHVibGljIE9iamVjdCBnZXRJZGVudGlmaWNhdGlvbigpOwoKCS8qKgoJICogUmV0dXJuIHRoZSBzY29wZSBuYW1lIG9mIHRoaXMgPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogU2NvcGUgbmFtZXMgYXJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgUHJvZHVjZXIKCSAqIGFuZCBDb25zdW1lciBzZXJ2aWNlcy4gT25seSA8Y29kZT5FbnZlbG9wZXM8L2NvZGU+IG9iamVjdHMgd2l0aCBhIHNjb3BlCgkgKiBuYW1lIHRoYXQgaXMgcGVybWl0dGVkIGZvciB0aGUgUHJvZHVjZXIgYW5kIHRoZSBDb25zdW1lciBzZXJ2aWNlcyBtdXN0IGJlCgkgKiBwYXNzZWQgdGhyb3VnaCBhIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiB0aGUgc2VjdXJpdHkgc2NvcGUgZm9yIHRoZSBzdGF0dXMgaXRlbSwgbXVzdCBub3QgYmUgbnVsbC4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRTY29wZSgpOwp9ClBLAwQKAAAAAABrUu40j1VC8r4WAAC+FgAANQAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Qcm9kdWNlci5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1Byb2R1Y2VyLmphdmEsdiAxLjEwIDIwMDYvMDcvMTEgMDA6NTQ6MTAgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAyLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluOwoKLyoqCiAqIERhdGEgUHJvZHVjZXIsIGEgc2VydmljZSB0aGF0IGNhbiBnZW5lcmF0ZSB2YWx1ZXMgdG8gYmUgdXNlZCBieQogKiB7QGxpbmsgQ29uc3VtZXJ9IHNlcnZpY2VzLgogKiAKICogPHA+CiAqIFNlcnZpY2Ugb2JqZWN0cyByZWdpc3RlcmVkIHVuZGVyIHRoZSBQcm9kdWNlciBpbnRlcmZhY2UgYXJlIGV4cGVjdGVkIHRvCiAqIHByb2R1Y2UgdmFsdWVzIChpbnRlcm5hbGx5IGdlbmVyYXRlZCBvciBmcm9tIGV4dGVybmFsIHNlbnNvcnMpLiBUaGUgdmFsdWUgY2FuCiAqIGJlIG9mIGRpZmZlcmVudCB0eXBlcy4gV2hlbiBkZWxpdmVyaW5nIGEgdmFsdWUgdG8gYSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QsCiAqIHRoZSBQcm9kdWNlciBzZXJ2aWNlIHNob3VsZCBjb2VyY2UgdGhlIHZhbHVlIHRvIGJlIGFuIGluc3RhbmNlIG9mIG9uZSBvZiB0aGUKICogdHlwZXMgc3BlY2lmaWVkIGJ5IHtAbGluayBXaXJlI2dldEZsYXZvcnN9LiBUaGUgY2xhc3NlcyBhcmUgc3BlY2lmaWVkIGluCiAqIG9yZGVyIG9mIHByZWZlcmVuY2UuCiAqIAogKiA8cD4KICogV2hlbiB0aGUgZGF0YSByZXByZXNlbnRlZCBieSB0aGUgUHJvZHVjZXIgb2JqZWN0IGNoYW5nZXMsIHRoaXMgb2JqZWN0IHNob3VsZAogKiBzZW5kIHRoZSB1cGRhdGVkIHZhbHVlIGJ5IGNhbGxpbmcgdGhlIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIG9uIGVhY2ggb2YKICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyBwYXNzZWQgaW4gdGhlIG1vc3QgcmVjZW50IGNhbGwgdG8gdGhpcyBvYmplY3QncwogKiB7QGxpbmsgI2NvbnN1bWVyc0Nvbm5lY3RlZH0gbWV0aG9kLiBUaGVzZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzIHdpbGwgcGFzcwogKiB0aGUgdmFsdWUgb24gdG8gdGhlIGFzc29jaWF0ZWQgPGNvZGU+Q29uc3VtZXI8L2NvZGU+IHNlcnZpY2Ugb2JqZWN0LgogKiAKICogPHA+CiAqIFRoZSBQcm9kdWNlciBzZXJ2aWNlIG1heSB1c2UgdGhlIGluZm9ybWF0aW9uIGluIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncwogKiBwcm9wZXJ0aWVzIHRvIHNjaGVkdWxlIHRoZSBkZWxpdmVyeSBvZiB2YWx1ZXMgdG8gdGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBQcm9kdWNlciBzZXJ2aWNlIG9iamVjdHMgbXVzdCByZWdpc3RlciB3aXRoIGEgPGNvZGU+c2VydmljZS5waWQ8L2NvZGU+IGFuZCBhCiAqIHtAbGluayBXaXJlQ29uc3RhbnRzI1dJUkVBRE1JTl9QUk9EVUNFUl9GTEFWT1JTfSBwcm9wZXJ0eS4gSXQgaXMgcmVjb21tZW5kZWQKICogdGhhdCBhIFByb2R1Y2VyIHNlcnZpY2Ugb2JqZWN0IGFsc28gcmVnaXN0ZXJzIHdpdGggYQogKiA8Y29kZT5zZXJ2aWNlLmRlc2NyaXB0aW9uPC9jb2RlPiBwcm9wZXJ0eS4gUHJvZHVjZXIgc2VydmljZSBvYmplY3RzIG11c3QKICogcmVnaXN0ZXIgd2l0aCBhIHtAbGluayBXaXJlQ29uc3RhbnRzI1dJUkVBRE1JTl9QUk9EVUNFUl9GSUxURVJTfSBwcm9wZXJ0eSBpZgogKiB0aGUgUHJvZHVjZXIgc2VydmljZSB3aWxsIGJlIHBlcmZvcm1pbmcgZmlsdGVyaW5nIGluc3RlYWQgb2YgdGhlCiAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4KICogCiAqIDxwPgogKiBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGJ5IGEgUHJvZHVjZXIgb2JqZWN0IG1ldGhvZCwgYQogKiA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gb2YgdHlwZSB7QGxpbmsgV2lyZUFkbWluRXZlbnQjUFJPRFVDRVJfRVhDRVBUSU9OfQogKiBpcyBicm9hZGNhc3QgYnkgdGhlIFdpcmUgQWRtaW4gc2VydmljZS4KICogCiAqIDxwPgogKiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucy4gRGF0YSBwcm9kdWNpbmcgYnVuZGxlcyB3aWxsIHJlcXVpcmUKICogPGNvZGU+U2VydmljZVBlcm1pc3Npb25bUHJvZHVjZXIsUkVHSVNURVJdPC9jb2RlPiB0byByZWdpc3RlciBhIFByb2R1Y2VyCiAqIHNlcnZpY2UuIEluIGdlbmVyYWwsIG9ubHkgdGhlIFdpcmUgQWRtaW4gc2VydmljZSBzaG91bGQgaGF2ZQogKiA8Y29kZT5TZXJ2aWNlUGVybWlzc2lvbltQcm9kdWNlcixHRVRdPC9jb2RlPi4gVGh1cyBvbmx5IHRoZSBXaXJlIEFkbWluIHNlcnZpY2UKICogbWF5IGRpcmVjdGx5IGNhbGwgYSBQcm9kdWNlciBzZXJ2aWNlLiBDYXJlIG11c3QgYmUgdGFrZW4gaW4gdGhlIHNoYXJpbmcgb2YKICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyB3aXRoIG90aGVyIGJ1bmRsZXMuCiAqIDxwPgogKiBQcm9kdWNlciBzZXJ2aWNlcyBtdXN0IGJlIHJlZ2lzdGVyZWQgd2l0aCBzY29wZSBuYW1lcyB3aGVuIHRoZXkgY2FuIHNlbmQKICogZGlmZmVyZW50IHR5cGVzIG9mIG9iamVjdHMgKGNvbXBvc2l0ZSkgdG8gdGhlIENvbnN1bWVyIHNlcnZpY2UuIFRoZSBQcm9kdWNlcgogKiBzZXJ2aWNlIHNob3VsZCBoYXZlIDxjb2RlPldpcmVQZXJtaXNzaW9uPC9jb2RlPiBmb3IgZWFjaCBvZiB0aGVzZSBzY29wZSBuYW1lcy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFByb2R1Y2VyIHsKCS8qKgoJICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoaXMgPGNvZGU+UHJvZHVjZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgYSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgaW4gcmVzcG9uc2UgdG8gdGhlCgkgKiBDb25zdW1lciBzZXJ2aWNlIGNhbGxpbmcgdGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIDxjb2RlPnBvbGw8L2NvZGU+CgkgKiBtZXRob2QuIFRoZSBQcm9kdWNlciBzaG91bGQgY29lcmNlIHRoZSB2YWx1ZSB0byBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YKCSAqIHRoZSB0eXBlcyBzcGVjaWZpZWQgYnkge0BsaW5rIFdpcmUjZ2V0Rmxhdm9yc30uIFRoZSB0eXBlcyBhcmUgc3BlY2lmaWVkCgkgKiBpbiBvcmRlciBvZiBvZiBwcmVmZXJlbmNlLiBUaGUgcmV0dXJuZWQgdmFsdWUgc2hvdWxkIGJlIGFzIG5ldyBvciBuZXdlcgoJICogdGhhbiB0aGUgbGFzdCB2YWx1ZSBmdXJuaXNoZWQgYnkgdGhpcyBvYmplY3QuCgkgKiAKCSAqIDxwPgoJICogTm90ZTogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBieSBhIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBwcmlvciB0byB0aGlzCgkgKiBvYmplY3QgYmVpbmcgbm90aWZpZWQgdGhhdCBpdCBpcyBjb25uZWN0ZWQgdG8gdGhhdCA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QKCSAqICh2aWEgdGhlIHtAbGluayAjY29uc3VtZXJzQ29ubmVjdGVkfSBtZXRob2QpLgoJICogPHA+CgkgKiBJZiB0aGUgUHJvZHVjZXIgc2VydmljZSByZXR1cm5zIGFuIDxjb2RlPkVudmVsb3BlPC9jb2RlPiBvYmplY3QgdGhhdCBoYXMgYW4KCSAqIHVucGVybWl0dGVkIHNjb3BlIG5hbWUsIHRoZW4gdGhlIFdpcmUgb2JqZWN0IG11c3QgaWdub3JlIChvciByZW1vdmUpIHRoZQoJICogdHJhbnNmZXIuCgkgKiA8cD4KCSAqIElmIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgaGFzIGEgc2NvcGUgc2V0LCB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUKCSAqIGFuIGFycmF5IG9mIDxjb2RlPkVudmVsb3BlPC9jb2RlPiBvYmplY3RzICg8Y29kZT5FbnZlbG9wZVtdPC9jb2RlPikuIFRoZQoJICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IG11c3QgaGF2ZSByZW1vdmVkIGFueSA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0cwoJICogdGhhdCBoYXZlIGEgc2NvcGUgbmFtZSB0aGF0IGlzIG5vdCBpbiB0aGUgV2lyZSBvYmplY3QncyBzY29wZS4KCSAqIAoJICogQHBhcmFtIHdpcmUgVGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCB3aGljaCBpcyBwb2xsaW5nIHRoaXMgc2VydmljZS4KCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFByb2R1Y2VyIHNlcnZpY2Ugb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKCSAqICAgICAgICAgdGhlIHZhbHVlIGNhbm5vdCBiZSBjb2VyY2VkIGludG8gYSBjb21wYXRpYmxlIHR5cGUuIE9yIGFuIGFycmF5CgkgKiAgICAgICAgIG9mIDxjb2RlPkVudmVsb3BlPC9jb2RlPiBvYmplY3RzLgoJICovCglwdWJsaWMgT2JqZWN0IHBvbGxlZChXaXJlIHdpcmUpOwoKCS8qKgoJICogVXBkYXRlIHRoZSBsaXN0IG9mIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdHMgdG8gd2hpY2ggdGhpcwoJICogPGNvZGU+UHJvZHVjZXI8L2NvZGU+IG9iamVjdCBpcyBjb25uZWN0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIFByb2R1Y2VyIHNlcnZpY2UgaXMgZmlyc3QgcmVnaXN0ZXJlZCBhbmQKCSAqIHN1YnNlcXVlbnRseSB3aGVuZXZlciBhIDxjb2RlPldpcmU8L2NvZGU+IGFzc29jaWF0ZWQgd2l0aCB0aGlzIFByb2R1Y2VyCgkgKiBiZWNvbWVzIGNvbm5lY3RlZCwgaXMgbW9kaWZpZWQgb3IgYmVjb21lcyBkaXNjb25uZWN0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIFdpcmUgQWRtaW4gc2VydmljZSBtdXN0IGNhbGwgdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuIFRoaXMgaW1wbGllcwoJICogdGhhdCBpbXBsZW1lbnRvcnMgb2YgYSBQcm9kdWNlciBzZXJ2aWNlIGNhbiBiZSBhc3N1cmVkIHRoYXQgdGhlIGNhbGxiYWNrCgkgKiB3aWxsIG5vdCB0YWtlIHBsYWNlIGR1cmluZyByZWdpc3RyYXRpb24gd2hlbiB0aGV5IGV4ZWN1dGUgdGhlCgkgKiByZWdpc3RyYXRpb24gaW4gYSBzeW5jaHJvbml6ZWQgbWV0aG9kLgoJICogCgkgKiBAcGFyYW0gd2lyZXMgQW4gYXJyYXkgb2YgdGhlIGN1cnJlbnQgYW5kIGNvbXBsZXRlIGxpc3Qgb2YgPGNvZGU+V2lyZTwvY29kZT4KCSAqICAgICAgICBvYmplY3RzIHRvIHdoaWNoIHRoaXMgUHJvZHVjZXIgc2VydmljZSBpcyBjb25uZWN0ZWQuIE1heSBiZQoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBQcm9kdWNlciBpcyBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byBhbnkKCSAqICAgICAgICA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzLgoJICovCglwdWJsaWMgdm9pZCBjb25zdW1lcnNDb25uZWN0ZWQoV2lyZVtdIHdpcmVzKTsKfQpQSwMECgAAAAAAa1LuNF50NekHMAAABzAAADEAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZS5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmUuamF2YSx2IDEuMTAgMjAwNi8wNy8xMSAwMDo1NDoxMCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW47CgppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgovKioKICogQSBjb25uZWN0aW9uIGJldHdlZW4gYSBQcm9kdWNlciBzZXJ2aWNlIGFuZCBhIENvbnN1bWVyIHNlcnZpY2UuCiAqIAogKiA8cD4KICogQSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgY29ubmVjdHMgYSBQcm9kdWNlciBzZXJ2aWNlIHRvIGEgQ29uc3VtZXIgc2VydmljZS4KICogQm90aCB0aGUgUHJvZHVjZXIgYW5kIENvbnN1bWVyIHNlcnZpY2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIHVuaXF1ZQogKiA8Y29kZT5zZXJ2aWNlLnBpZDwvY29kZT4gdmFsdWVzLiBUaGUgUHJvZHVjZXIgYW5kIENvbnN1bWVyIHNlcnZpY2VzIG1heQogKiBjb21tdW5pY2F0ZSB3aXRoIGVhY2ggb3RoZXIgdmlhIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdHMgdGhhdCBjb25uZWN0IHRoZW0uCiAqIFRoZSBQcm9kdWNlciBzZXJ2aWNlIG1heSBzZW5kIHVwZGF0ZWQgdmFsdWVzIHRvIHRoZSBDb25zdW1lciBzZXJ2aWNlIGJ5CiAqIGNhbGxpbmcgdGhlIHtAbGluayAjdXBkYXRlfSBtZXRob2QuIFRoZSBDb25zdW1lciBzZXJ2aWNlIG1heSByZXF1ZXN0IGFuCiAqIHVwZGF0ZWQgdmFsdWUgZnJvbSB0aGUgUHJvZHVjZXIgc2VydmljZSBieSBjYWxsaW5nIHRoZSB7QGxpbmsgI3BvbGx9IG1ldGhvZC4KICogCiAqIDxwPgogKiBBIFByb2R1Y2VyIHNlcnZpY2UgYW5kIGEgQ29uc3VtZXIgc2VydmljZSBtYXkgYmUgY29ubmVjdGVkIHRocm91Z2ggbXVsdGlwbGUKICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cy4KICogCiAqIDxwPgogKiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucy4gPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyBhcmUgYXZhaWxhYmxlIHRvIFByb2R1Y2VyCiAqIGFuZCBDb25zdW1lciBzZXJ2aWNlcyBjb25uZWN0ZWQgdG8gYSBnaXZlbiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgYW5kIHRvCiAqIGJ1bmRsZXMgd2hpY2ggY2FuIGFjY2VzcyB0aGUgPGNvZGU+V2lyZUFkbWluPC9jb2RlPiBzZXJ2aWNlLiBBIGJ1bmRsZSBtdXN0IGhhdmUKICogPGNvZGU+U2VydmljZVBlcm1pc3Npb25bV2lyZUFkbWluLEdFVF08L2NvZGU+IHRvIGdldCB0aGUgPGNvZGU+V2lyZUFkbWluPC9jb2RlPgogKiBzZXJ2aWNlIHRvIGFjY2VzcyBhbGwgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cy4gQSBidW5kbGUgcmVnaXN0ZXJpbmcgYQogKiBQcm9kdWNlciBzZXJ2aWNlIG9yIGEgQ29uc3VtZXIgc2VydmljZSBtdXN0IGhhdmUgdGhlIGFwcHJvcHJpYXRlCiAqIDxjb2RlPlNlcnZpY2VQZXJtaXNzaW9uW0NvbnN1bWVyfFByb2R1Y2VyLFJFR0lTVEVSXTwvY29kZT4gdG8gcmVnaXN0ZXIgdGhlCiAqIHNlcnZpY2UgYW5kIHdpbGwgYmUgcGFzc2VkIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdHMgd2hlbiB0aGUgc2VydmljZSBvYmplY3QncwogKiA8Y29kZT5jb25zdW1lcnNDb25uZWN0ZWQ8L2NvZGU+IG9yIDxjb2RlPnByb2R1Y2Vyc0Nvbm5lY3RlZDwvY29kZT4gbWV0aG9kIGlzCiAqIGNhbGxlZC4KICogCiAqIDxwPgogKiBTY29wZS4gRWFjaCBXaXJlIG9iamVjdCBjYW4gaGF2ZSBhIHNjb3BlIHNldCB3aXRoIHRoZSA8Y29kZT5zZXRTY29wZTwvY29kZT4KICogbWV0aG9kLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5IGEgQ29uc3VtZXIgc2VydmljZSB3aGVuIGl0IGFzc3VtZXMgYQogKiBQcm9kdWNlciBzZXJ2aWNlIHRoYXQgaXMgY29tcG9zaXRlIChzdXBwb3J0cyBtdWx0aXBsZSBpbmZvcm1hdGlvbiBpdGVtcykuIFRoZQogKiBuYW1lcyBpbiB0aGUgc2NvcGUgbXVzdCBiZSB2ZXJpZmllZCBieSB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGJlZm9yZSBpdAogKiBpcyB1c2VkIGluIGNvbW11bmljYXRpb24uIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIG5hbWVzIGRlcGVuZCBvbiB0aGUgUHJvZHVjZXIKICogc2VydmljZSBhbmQgbXVzdCBub3QgYmUgaW50ZXJwcmV0ZWQgYnkgdGhlIFdpcmUgQWRtaW4gc2VydmljZS4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFdpcmUgewoJLyoqCgkgKiBSZXR1cm4gdGhlIHN0YXRlIG9mIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIEEgY29ubmVjdGVkIDxjb2RlPldpcmU8L2NvZGU+IG11c3QgYWx3YXlzIGJlIGRpc2Nvbm5lY3RlZCBiZWZvcmUgYmVjb21pbmcKCSAqIGludmFsaWQuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGlzIGludmFsaWQKCSAqICAgICAgICAgYmVjYXVzZSBpdCBoYXMgYmVlbiBkZWxldGVkIHZpYSB7QGxpbmsgV2lyZUFkbWluI2RlbGV0ZVdpcmV9OwoJICogICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBvdGhlcndpc2UuCgkgKi8KCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBBIDxjb2RlPldpcmU8L2NvZGU+IGlzIGNvbm5lY3RlZCBhZnRlciB0aGUgV2lyZSBBZG1pbiBzZXJ2aWNlIHJlY2VpdmVzCgkgKiBub3RpZmljYXRpb24gdGhhdCB0aGUgUHJvZHVjZXIgc2VydmljZSBhbmQgdGhlIENvbnN1bWVyIHNlcnZpY2UgZm9yIHRoaXMKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBhcmUgYm90aCByZWdpc3RlcmVkLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybgoJICogPGNvZGU+dHJ1ZTwvY29kZT4gcHJpb3IgdG8gbm90aWZ5aW5nIHRoZSBQcm9kdWNlciBhbmQgQ29uc3VtZXIgc2VydmljZXMgdmlhCgkgKiBjYWxscyB0byB0aGVpciByZXNwZWN0aXZlIDxjb2RlPmNvbnN1bWVyc0Nvbm5lY3RlZDwvY29kZT4gYW5kCgkgKiA8Y29kZT5wcm9kdWNlcnNDb25uZWN0ZWQ8L2NvZGU+IG1ldGhvZHMuCgkgKiA8cD4KCSAqIEEgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9mIHR5cGUge0BsaW5rIFdpcmVBZG1pbkV2ZW50I1dJUkVfQ09OTkVDVEVEfQoJICogbXVzdCBiZSBicm9hZGNhc3QgYnkgdGhlIFdpcmUgQWRtaW4gc2VydmljZSB3aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgoJICogYmVjb21lcyBjb25uZWN0ZWQuCgkgKiAKCSAqIDxwPgoJICogQSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgaXMgZGlzY29ubmVjdGVkIHdoZW4gZWl0aGVyIHRoZSBDb25zdW1lciBvcgoJICogUHJvZHVjZXIgc2VydmljZSBpcyB1bnJlZ2lzdGVyZWQgb3IgdGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBpcwoJICogZGVsZXRlZC4KCSAqIDxwPgoJICogQSA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gb2YgdHlwZQoJICoge0BsaW5rIFdpcmVBZG1pbkV2ZW50I1dJUkVfRElTQ09OTkVDVEVEfSBtdXN0IGJlIGJyb2FkY2FzdCBieSB0aGUgV2lyZQoJICogQWRtaW4gc2VydmljZSB3aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBiZWNvbWVzIGRpc2Nvbm5lY3RlZC4KCSAqIAoJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBib3RoIHRoZSBQcm9kdWNlciBhbmQgQ29uc3VtZXIgZm9yIHRoaXMKCSAqICAgICAgICAgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGFyZSBjb25uZWN0ZWQgdG8gdGhlIDxjb2RlPldpcmU8L2NvZGU+CgkgKiAgICAgICAgIG9iamVjdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KCSAqLwoJcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgbGlzdCBvZiBkYXRhIHR5cGVzIHVuZGVyc3Rvb2QgYnkgdGhlIENvbnN1bWVyIHNlcnZpY2UKCSAqIGNvbm5lY3RlZCB0byB0aGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4gTm90ZSB0aGF0IHN1YmNsYXNzZXMgb2YgdGhlCgkgKiBjbGFzc2VzIGluIHRoaXMgbGlzdCBhcmUgYWNjZXB0YWJsZSBkYXRhIHR5cGVzIGFzIHdlbGwuCgkgKiAKCSAqIDxwPgoJICogVGhlIGxpc3QgaXMgdGhlIHZhbHVlIG9mIHRoZQoJICoge0BsaW5rIFdpcmVDb25zdGFudHMjV0lSRUFETUlOX0NPTlNVTUVSX0ZMQVZPUlN9IHNlcnZpY2UgcHJvcGVydHkgb2YgdGhlCgkgKiBDb25zdW1lciBzZXJ2aWNlIG9iamVjdCBjb25uZWN0ZWQgdG8gdGhpcyBvYmplY3QuIElmIG5vIHN1Y2ggcHJvcGVydHkgd2FzCgkgKiByZWdpc3RlcmVkIG9yIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBub3QgPGNvZGU+Q2xhc3NbXTwvY29kZT4sCgkgKiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KCSAqIAoJICogQHJldHVybiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBsaXN0IG9mIGNsYXNzZXMgdW5kZXJzdG9vZCBieSB0aGUKCSAqICAgICAgICAgQ29uc3VtZXIgc2VydmljZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgPGNvZGU+V2lyZTwvY29kZT4gaXMgbm90CgkgKiAgICAgICAgIGNvbm5lY3RlZCwgb3IgdGhlIGNvbnN1bWVyIGRpZCBub3QgcmVnaXN0ZXIgYQoJICogICAgICAgICB7QGxpbmsgV2lyZUNvbnN0YW50cyNXSVJFQURNSU5fQ09OU1VNRVJfRkxBVk9SU30gcHJvcGVydHkgb3IgdGhlCgkgKiAgICAgICAgIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBub3Qgb2YgdHlwZSA8Y29kZT5DbGFzc1tdPC9jb2RlPi4KCSAqLwoJcHVibGljIENsYXNzW10gZ2V0Rmxhdm9ycygpOwoKCS8qKgoJICogVXBkYXRlIHRoZSB2YWx1ZS4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZHMgaXMgY2FsbGVkIGJ5IHRoZSBQcm9kdWNlciBzZXJ2aWNlIHRvIG5vdGlmeSB0aGUgQ29uc3VtZXIKCSAqIHNlcnZpY2UgY29ubmVjdGVkIHRvIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IG9mIGFuIHVwZGF0ZWQgdmFsdWUuCgkgKiA8cD4KCSAqIElmIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGNvbnRhaW4gYQoJICoge0BsaW5rIFdpcmVDb25zdGFudHMjV0lSRUFETUlOX0ZJTFRFUn0gcHJvcGVydHksIHRoZW4gZmlsdGVyaW5nIGlzCgkgKiBwZXJmb3JtZWQuIElmIHRoZSBQcm9kdWNlciBzZXJ2aWNlIGNvbm5lY3RlZCB0byB0aGlzIDxjb2RlPldpcmU8L2NvZGU+CgkgKiBvYmplY3Qgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmljZSBwcm9wZXJ0eQoJICoge0BsaW5rIFdpcmVDb25zdGFudHMjV0lSRUFETUlOX1BST0RVQ0VSX0ZJTFRFUlN9LCB0aGUgUHJvZHVjZXIgc2VydmljZQoJICogd2lsbCBwZXJmb3JtIHRoZSBmaWx0ZXJpbmcgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBzcGVjaWZpZWQgZm9yIHRoZQoJICogZmlsdGVyLiBPdGhlcndpc2UsIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IHdpbGwgcGVyZm9ybSB0aGUgZmlsdGVyaW5nCgkgKiBvZiB0aGUgdmFsdWUuCgkgKiA8cD4KCSAqIElmIG5vIGZpbHRlcmluZyBpcyBkb25lLCBvciB0aGUgZmlsdGVyIGluZGljYXRlcyB0aGUgdXBkYXRlZCB2YWx1ZSBzaG91bGQKCSAqIGJlIGRlbGl2ZXJlZCB0byB0aGUgQ29uc3VtZXIgc2VydmljZSwgdGhlbiB0aGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdAoJICogbXVzdCBjYWxsIHRoZSB7QGxpbmsgQ29uc3VtZXIjdXBkYXRlZH0gbWV0aG9kIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuIElmCgkgKiB0aGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBpcyBub3QgY29ubmVjdGVkLCB0aGVuIHRoZSBDb25zdW1lciBzZXJ2aWNlCgkgKiBtdXN0IG5vdCBiZSBjYWxsZWQgYW5kIHRoZSB2YWx1ZSBpcyBpZ25vcmVkLgoJICogPHA+CgkgKiBJZiB0aGUgdmFsdWUgaXMgYW4gPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdCwgYW5kIHRoZSBzY29wZSBuYW1lIGlzIG5vdAoJICogcGVybWl0dGVkLCB0aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgbXVzdCBpZ25vcmUgdGhpcyBjYWxsIGFuZCBub3QKCSAqIHRyYW5zZmVyIHRoZSBvYmplY3QgdG8gdGhlIENvbnN1bWVyIHNlcnZpY2UuCgkgKiAKCSAqIDxwPgoJICogQSA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gb2YgdHlwZSB7QGxpbmsgV2lyZUFkbWluRXZlbnQjV0lSRV9UUkFDRX0KCSAqIG11c3QgYmUgYnJvYWRjYXN0IGJ5IHRoZSBXaXJlIEFkbWluIHNlcnZpY2UgYWZ0ZXIgdGhlIENvbnN1bWVyIHNlcnZpY2UKCSAqIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjYWxsZWQuCgkgKiAKCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdXBkYXRlZCB2YWx1ZS4gVGhlIHZhbHVlIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZiBvbmUgb2YKCSAqICAgICAgICB0aGUgdHlwZXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRGbGF2b3JzfS4KCSAqIEBzZWUgV2lyZUNvbnN0YW50cyNXSVJFQURNSU5fRklMVEVSCgkgKi8KCXB1YmxpYyB2b2lkIHVwZGF0ZShPYmplY3QgdmFsdWUpOwoKCS8qKgoJICogUG9sbCBmb3IgYW4gdXBkYXRlZCB2YWx1ZS4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZHMgaXMgbm9ybWFsbHkgY2FsbGVkIGJ5IHRoZSBDb25zdW1lciBzZXJ2aWNlIHRvIHJlcXVlc3QgYW4KCSAqIHVwZGF0ZWQgdmFsdWUgZnJvbSB0aGUgUHJvZHVjZXIgc2VydmljZSBjb25uZWN0ZWQgdG8gdGhpcyA8Y29kZT5XaXJlPC9jb2RlPgoJICogb2JqZWN0LiBUaGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCB3aWxsIGNhbGwgdGhlIHtAbGluayBQcm9kdWNlciNwb2xsZWR9CgkgKiBtZXRob2QgdG8gb2J0YWluIGFuIHVwZGF0ZWQgdmFsdWUuIElmIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGlzIG5vdAoJICogY29ubmVjdGVkLCB0aGVuIHRoZSBQcm9kdWNlciBzZXJ2aWNlIG11c3Qgbm90IGJlIGNhbGxlZC4KCSAqIDxwPgoJICogCgkgKiBJZiB0aGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBoYXMgYSBzY29wZSwgdGhlbiB0aGlzIG1ldGhvZCBtdXN0IHJldHVybgoJICogYW4gYXJyYXkgb2YgPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdHMuIFRoZSBvYmplY3RzIHJldHVybmVkIG11c3QgbWF0Y2gKCSAqIHRoZSBzY29wZSBvZiB0aGlzIG9iamVjdC4gVGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBtdXN0IHJlbW92ZSBhbGwKCSAqIDxjb2RlPkVudmVsb3BlPC9jb2RlPiBvYmplY3RzIHdpdGggYSBzY29wZSBuYW1lIHRoYXQgaXMgbm90IGluIHRoZQoJICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0J3Mgc2NvcGUuIFRodXMsIHRoZSBsaXN0IG9mIG9iamVjdHMgcmV0dXJuZWQgbXVzdAoJICogb25seSBjb250YWluIDxjb2RlPkVudmVsb3BlPC9jb2RlPiBvYmplY3RzIHdpdGggYSBwZXJtaXR0ZWQgc2NvcGUgbmFtZS4gSWYKCSAqIHRoZSBhcnJheSBiZWNvbWVzIGVtcHR5LCA8Y29kZT5udWxsPC9jb2RlPiBtdXN0IGJlIHJldHVybmVkLgoJICogCgkgKiA8cD4KCSAqIEEgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9mIHR5cGUge0BsaW5rIFdpcmVBZG1pbkV2ZW50I1dJUkVfVFJBQ0V9CgkgKiBtdXN0IGJlIGJyb2FkY2FzdCBieSB0aGUgV2lyZSBBZG1pbiBzZXJ2aWNlIGFmdGVyIHRoZSBQcm9kdWNlciBzZXJ2aWNlCgkgKiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgY2FsbGVkLgoJICogCgkgKiBAcmV0dXJuIEEgdmFsdWUgd2hvc2UgdHlwZSBzaG91bGQgYmUgb25lIG9mIHRoZSB0eXBlcyByZXR1cm5lZCBieQoJICogICAgICAgICB7QGxpbmsgI2dldEZsYXZvcnN9LDxjb2RlPkVudmVsb3BlW108L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPgoJICogICAgICAgICBpZiB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGlzIG5vdCBjb25uZWN0ZWQsIHRoZSBQcm9kdWNlcgoJICogICAgICAgICBzZXJ2aWNlIHRocmV3IGFuIGV4Y2VwdGlvbiwgb3IgdGhlIFByb2R1Y2VyIHNlcnZpY2UgcmV0dXJuZWQgYQoJICogICAgICAgICB2YWx1ZSB3aGljaCBpcyBub3QgYW4gaW5zdGFuY2Ugb2Ygb25lIG9mIHRoZSB0eXBlcyByZXR1cm5lZCBieQoJICogICAgICAgICB7QGxpbmsgI2dldEZsYXZvcnN9LgoJICovCglwdWJsaWMgT2JqZWN0IHBvbGwoKTsKCgkvKioKCSAqIFJldHVybiB0aGUgbGFzdCB2YWx1ZSBzZW50IHRocm91Z2ggdGhpcyA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIDxwPgoJICogVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBtb3N0IHJlY2VudCwgdmFsaWQgdmFsdWUgcGFzc2VkIHRvIHRoZQoJICoge0BsaW5rICN1cGRhdGV9IG1ldGhvZCBvciByZXR1cm5lZCBieSB0aGUge0BsaW5rICNwb2xsfSBtZXRob2Qgb2YgdGhpcwoJICogb2JqZWN0LiBJZiBmaWx0ZXJpbmcgaXMgcGVyZm9ybWVkIGJ5IHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LCB0aGlzCgkgKiBtZXRob2RzIHJldHVybnMgdGhlIGxhc3QgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIFByb2R1Y2VyIHNlcnZpY2UuIFRoaXMKCSAqIHZhbHVlIG1heSBiZSBhbiA8Y29kZT5FbnZlbG9wZVtdPC9jb2RlPiB3aGVuIHRoZSBQcm9kdWNlciBzZXJ2aWNlIHVzZXMKCSAqIHNjb3BpbmcuIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYW4gRW52ZWxvcGUgb2JqZWN0IChvciBhcnJheSksIGl0IG11c3QgYmUKCSAqIHZlcmlmaWVkIHRoYXQgdGhlIENvbnN1bWVyIHNlcnZpY2UgaGFzIHRoZSBwcm9wZXIgV2lyZVBlcm1pc3Npb24gdG8gc2VlCgkgKiBpdC4KCSAqIAoJICogQHJldHVybiBUaGUgbGFzdCB2YWx1ZSBwYXNzZWQgdGhvdWdoIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHZhbGlkIHZhbHVlcyBoYXZlIGJlZW4gcGFzc2VkIG9yIHRoZQoJICogICAgICAgICBDb25zdW1lciBzZXJ2aWNlIGhhcyBubyBwZXJtaXNzaW9uLgoJICovCglwdWJsaWMgT2JqZWN0IGdldExhc3RWYWx1ZSgpOwoKCS8qKgoJICogUmV0dXJuIHRoZSB3aXJlIHByb3BlcnRpZXMgZm9yIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIFRoZSBwcm9wZXJ0aWVzIGZvciB0aGlzIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4gVGhlIHJldHVybmVkCgkgKiAgICAgICAgIDxjb2RlPkRpY3Rpb25hcnk8L2NvZGU+IG11c3QgYmUgcmVhZCBvbmx5LgoJICovCglwdWJsaWMgRGljdGlvbmFyeSBnZXRQcm9wZXJ0aWVzKCk7CgoJLyoqCgkgKiBSZXR1cm4gdGhlIGNhbGN1bGF0ZWQgc2NvcGUgb2YgdGhpcyA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIFRoZSBwdXJwb3NlIG9mIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBzY29wZSBpcyB0byBhbGxvdyBhIFByb2R1Y2VyCgkgKiBhbmQvb3IgQ29uc3VtZXIgc2VydmljZSB0byBwcm9kdWNlL2NvbnN1bWUgZGlmZmVyZW50IHR5cGVzIG92ZXIgYSBzaW5nbGUKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCAodGhpcyB3YXMgZGVlbWVkIG5lY2Vzc2FyeSBmb3IgZWZmaWNpZW5jeQoJICogcmVhc29ucykuIEJvdGggdGhlIENvbnN1bWVyIHNlcnZpY2UgYW5kIHRoZSBQcm9kdWNlciBzZXJ2aWNlIG11c3Qgc2V0IGFuCgkgKiBhcnJheSBvZiBzY29wZSBuYW1lcyAodGhlaXIgc2NvcGUpIHdpdGggdGhlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIHByb3BlcnR5CgkgKiA8Y29kZT5XSVJFQURNSU5fUFJPRFVDRVJfU0NPUEU8L2NvZGU+LCBvcgoJICogPGNvZGU+V0lSRUFETUlOX0NPTlNVTUVSX1NDT1BFPC9jb2RlPiB3aGVuIHRoZXkgY2FuIHByb2R1Y2UgbXVsdGlwbGUgdHlwZXMuCgkgKiBJZiBhIFByb2R1Y2VyIHNlcnZpY2UgY2FuIHByb2R1Y2UgZGlmZmVyZW50IHR5cGVzLCBpdCBzaG91bGQgc2V0IHRoaXMKCSAqIHByb3BlcnR5IHRvIHRoZSBhcnJheSBvZiBzY29wZSBuYW1lcyBpdCBjYW4gcHJvZHVjZSwgdGhlIENvbnN1bWVyIHNlcnZpY2UKCSAqIG11c3Qgc2V0IHRoZSBhcnJheSBvZiBzY29wZSBuYW1lcyBpdCBjYW4gY29uc3VtZS4gVGhlIHNjb3BlIG9mIGEKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBpcyBkZWZpbmVkIGFzIHRoZSBpbnRlcnNlY3Rpb24gb2YgcGVybWl0dGVkIHNjb3BlCgkgKiBuYW1lcyBvZiB0aGUgUHJvZHVjZXIgc2VydmljZSBhbmQgQ29uc3VtZXIgc2VydmljZS4KCSAqIDxwPgoJICogSWYgbmVpdGhlciB0aGUgQ29uc3VtZXIsIG9yIHRoZSBQcm9kdWNlciBzZXJ2aWNlIHJlZ2lzdGVycyBzY29wZSBuYW1lcwoJICogd2l0aCBpdHMgc2VydmljZSByZWdpc3RyYXRpb24sIHRoZW4gdGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIHNjb3BlCgkgKiBtdXN0IGJlIDxjb2RlPm51bGw8L2NvZGU+LgoJICogPHA+CgkgKiBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0J3Mgc2NvcGUgbXVzdCBub3QgY2hhbmdlIHdoZW4gYSBQcm9kdWNlciBvcgoJICogQ29uc3VtZXIgc2VydmljZXMgbW9kaWZpZXMgaXRzIHNjb3BlLgoJICogPHA+CgkgKiBBIHNjb3BlIG5hbWUgaXMgcGVybWl0dGVkIGZvciBhIFByb2R1Y2VyIHNlcnZpY2Ugd2hlbiB0aGUgcmVnaXN0ZXJpbmcKCSAqIGJ1bmRsZSBoYXMgPGNvZGU+V2lyZVBlcm1pc3Npb25bbmFtZSxQUk9EVUNFXTwvY29kZT4sIGFuZCBmb3IgYSBDb25zdW1lcgoJICogc2VydmljZSB3aGVuIHRoZSByZWdpc3RlcmluZyBidW5kbGUgaGFzIDxjb2RlPldpcmVQZXJtaXNzaW9uW25hbWUsQ09OU1VNRV08L2NvZGU+LgoJICogPHA+CgkgKiBJZiBlaXRoZXIgQ29uc3VtZXIgc2VydmljZSBvciBQcm9kdWNlciBzZXJ2aWNlIGhhcyBub3Qgc2V0IGEKCSAqIDxjb2RlPldJUkVBRE1JTl8qX1NDT1BFPC9jb2RlPiBwcm9wZXJ0eSwgdGhlbiB0aGUgcmV0dXJuZWQgdmFsdWUgbXVzdCBiZQoJICogPGNvZGU+bnVsbDwvY29kZT4uCgkgKiA8cD4KCSAqIElmIHRoZSBzY29wZSBpcyBzZXQsIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgbXVzdCBlbmZvcmNlIHRoZSBzY29wZQoJICogbmFtZXMgd2hlbiA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0cyBhcmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byB1cGRhdGUKCSAqIG9yIHJldHVybmVkIGZyb20gdGhlIDxjb2RlPnBvbGw8L2NvZGU+IG1ldGhvZC4gVGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdAoJICogbXVzdCB0aGVuIHJlbW92ZSBhbGwgPGNvZGU+RW52ZWxvcGU8L2NvZGU+IG9iamVjdHMgd2l0aCBhIHNjb3BlIG5hbWUgdGhhdAoJICogaXMgbm90IHBlcm1pdHRlZC4KCSAqIAoJICogQHJldHVybiBBIGxpc3Qgb2YgcGVybWl0dGVkIHNjb3BlIG5hbWVzIG9yIG51bGwgaWYgdGhlIFByb2R1Y2Ugb3IKCSAqICAgICAgICAgQ29uc3VtZXIgc2VydmljZSBoYXMgc2V0IG5vIHNjb3BlIG5hbWVzLgoJICovCglwdWJsaWMgU3RyaW5nW10gZ2V0U2NvcGUoKTsKCgkvKioKCSAqIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBuYW1lIGlzIGluIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0J3Mgc2NvcGUuCgkgKiAKCSAqIEBwYXJhbSBuYW1lIFRoZSBzY29wZSBuYW1lCgkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWUgaXMgbGlzdGVkIGluIHRoZSBwZXJtaXR0ZWQgc2NvcGUgbmFtZXMKCSAqLwoJcHVibGljIGJvb2xlYW4gaGFzU2NvcGUoU3RyaW5nIG5hbWUpOwp9ClBLAwQKAAAAAABrUu40oTrV9X8cAAB/HAAANgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW4uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW4uamF2YSx2IDEuMTEgMjAwNi8wNy8xMiAyMToyMjoxNCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW47CgppbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7CgppbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkludmFsaWRTeW50YXhFeGNlcHRpb247CgovKioKICogV2lyZSBBZG1pbmlzdHJhdGlvbiBzZXJ2aWNlLgogKiAKICogPHA+CiAqIFRoaXMgc2VydmljZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyBjb25uZWN0aW5nIGEKICogUHJvZHVjZXIgc2VydmljZSBhbmQgYSBDb25zdW1lciBzZXJ2aWNlLiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzIGFsc28gaGF2ZQogKiB3aXJlIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIHdoZW4gYSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgaXMKICogY3JlYXRlZC4gVGhlIFByb2R1Y2VyIGFuZCBDb25zdW1lciBzZXJ2aWNlcyBtYXkgdXNlIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgogKiBvYmplY3QncyBwcm9wZXJ0aWVzIHRvIG1hbmFnZSBvciBjb250cm9sIHRoZWlyIGludGVyYWN0aW9uLiBUaGUgdXNlIG9mCiAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIHByb3BlcnRpZXMgYnkgYSBQcm9kdWNlciBvciBDb25zdW1lciBzZXJ2aWNlcyBpcwogKiBvcHRpb25hbC4KICogCiAqIDxwPgogKiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucy4gQSBidW5kbGUgbXVzdCBoYXZlCiAqIDxjb2RlPlNlcnZpY2VQZXJtaXNzaW9uW1dpcmVBZG1pbixHRVRdPC9jb2RlPiB0byBnZXQgdGhlIFdpcmUgQWRtaW4gc2VydmljZSB0bwogKiBjcmVhdGUsIG1vZGlmeSwgZmluZCwgYW5kIGRlbGV0ZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjExICQKICovCnB1YmxpYyBpbnRlcmZhY2UgV2lyZUFkbWluIHsKCS8qKgoJICogQ3JlYXRlIGEgbmV3IDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCB0aGF0IGNvbm5lY3RzIGEgUHJvZHVjZXIgc2VydmljZSB0byBhCgkgKiBDb25zdW1lciBzZXJ2aWNlLgoJICogCgkgKiBUaGUgUHJvZHVjZXIgc2VydmljZSBhbmQgQ29uc3VtZXIgc2VydmljZSBkbyBub3QgaGF2ZSB0byBiZSByZWdpc3RlcmVkCgkgKiB3aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QgaXMgY3JlYXRlZC4KCSAqIAoJICogPHA+CgkgKiBUaGUgPGNvZGU+V2lyZTwvY29kZT4gY29uZmlndXJhdGlvbiBkYXRhIG11c3QgYmUgcGVyc2lzdGVudGx5IHN0b3JlZC4gQWxsCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBjb25uZWN0aW9ucyBhcmUgcmVlc3RhYmxpc2hlZCB3aGVuIHRoZSA8Y29kZT5XaXJlQWRtaW48L2NvZGU+CgkgKiBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQuIEEgPGNvZGU+V2lyZTwvY29kZT4gY2FuIGJlIHBlcm1hbmVudGx5IHJlbW92ZWQgYnkKCSAqIHVzaW5nIHRoZSB7QGxpbmsgI2RlbGV0ZVdpcmV9IG1ldGhvZC4KCSAqIAoJICogPHA+CgkgKiBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0J3MgcHJvcGVydGllcyBtdXN0IGhhdmUgY2FzZSBpbnNlbnNpdGl2ZQoJICogPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzIGFzIGtleXMgKGxpa2UgdGhlIEZyYW1ld29yaykuIEhvd2V2ZXIsIHRoZSBjYXNlCgkgKiBvZiB0aGUga2V5IG11c3QgYmUgcHJlc2VydmVkLgoJICogCgkgKiA8cD4KCSAqIFRoZSA8Y29kZT5XaXJlQWRtaW48L2NvZGU+IHNlcnZpY2UgbXVzdCBhdXRvbWF0aWNhbGx5IGFkZCB0aGUgZm9sbG93aW5nCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBwcm9wZXJ0aWVzOgoJICogPHVsPgoJICogPGxpPntAbGluayBXaXJlQ29uc3RhbnRzI1dJUkVBRE1JTl9QSUR9IHNldCB0byB0aGUgdmFsdWUgb2YgdGhlCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBwZXJzaXN0ZW50IGlkZW50aXR5IChQSUQpLiBUaGlzIHZhbHVlIGlzCgkgKiBnZW5lcmF0ZWQgYnkgdGhlIFdpcmUgQWRtaW4gc2VydmljZSB3aGVuIGEgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGlzCgkgKiBjcmVhdGVkLjwvbGk+CgkgKiA8bGk+e0BsaW5rIFdpcmVDb25zdGFudHMjV0lSRUFETUlOX1BST0RVQ0VSX1BJRH0gc2V0IHRvIHRoZSB2YWx1ZSBvZgoJICogUHJvZHVjZXIgc2VydmljZSdzIFBJRC48L2xpPgoJICogPGxpPntAbGluayBXaXJlQ29uc3RhbnRzI1dJUkVBRE1JTl9DT05TVU1FUl9QSUR9IHNldCB0byB0aGUgdmFsdWUgb2YKCSAqIENvbnN1bWVyIHNlcnZpY2UncyBQSUQuPC9saT4KCSAqIDwvdWw+CgkgKiBJZiB0aGUgPGNvZGU+cHJvcGVydGllczwvY29kZT4gYXJndW1lbnQgYWxyZWFkeSBjb250YWlucyBhbnkgb2YgdGhlc2Uga2V5cywKCSAqIHRoZW4gdGhlIHN1cHBsaWVkIHZhbHVlcyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHRoZQoJICogV2lyZSBBZG1pbiBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIFRoZSBXaXJlIEFkbWluIHNlcnZpY2UgbXVzdCBicm9hZGNhc3QgYSA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gb2YgdHlwZQoJICoge0BsaW5rIFdpcmVBZG1pbkV2ZW50I1dJUkVfQ1JFQVRFRH0gYWZ0ZXIgdGhlIG5ldyA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QKCSAqIGJlY29tZXMgYXZhaWxhYmxlIGZyb20ge0BsaW5rICNnZXRXaXJlc30uCgkgKiAKCSAqIEBwYXJhbSBwcm9kdWNlclBJRCBUaGUgPGNvZGU+c2VydmljZS5waWQ8L2NvZGU+IG9mIHRoZSBQcm9kdWNlciBzZXJ2aWNlIHRvCgkgKiAgICAgICAgYmUgY29ubmVjdGVkIHRvIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuCgkgKiBAcGFyYW0gY29uc3VtZXJQSUQgVGhlIDxjb2RlPnNlcnZpY2UucGlkPC9jb2RlPiBvZiB0aGUgQ29uc3VtZXIgc2VydmljZSB0bwoJICogICAgICAgIGJlIGNvbm5lY3RlZCB0byB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LgoJICogQHBhcmFtIHByb3BlcnRpZXMgVGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIHByb3BlcnRpZXMuIFRoaXMgYXJndW1lbnQKCSAqICAgICAgICBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGNhbGxlciBkb2VzIG5vdCB3aXNoIHRvIGRlZmluZSBhbnkKCSAqICAgICAgICA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBwcm9wZXJ0aWVzLgoJICogQHJldHVybiBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGZvciB0aGlzIGNvbm5lY3Rpb24uCgkgKiAKCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBJZiA8Y29kZT5wcm9wZXJ0aWVzPC9jb2RlPgoJICogICAgICAgICBjb250YWlucyBpbnZhbGlkIHdpcmUgdHlwZXMgb3IgY2FzZSB2YXJpYW50cyBvZiB0aGUgc2FtZSBrZXkKCSAqICAgICAgICAgbmFtZS4KCSAqLwoJcHVibGljIFdpcmUgY3JlYXRlV2lyZShTdHJpbmcgcHJvZHVjZXJQSUQsIFN0cmluZyBjb25zdW1lclBJRCwKCQkJRGljdGlvbmFyeSBwcm9wZXJ0aWVzKTsKCgkvKioKCSAqIERlbGV0ZSBhIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhIFByb2R1Y2VyCgkgKiBzZXJ2aWNlIGFuZCBhIENvbnN1bWVyIHNlcnZpY2UgbXVzdCBiZSByZW1vdmVkLiBUaGUgcGVyc2lzdGVudGx5IHN0b3JlZAoJICogY29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IG11c3QgZGVzdHJveWVkLiBUaGUKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIG1ldGhvZCB7QGxpbmsgV2lyZSNpc1ZhbGlkfSB3aWxsIHJldHVybgoJICogPGNvZGU+ZmFsc2U8L2NvZGU+IGFmdGVyIGl0IGlzIGRlbGV0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIFdpcmUgQWRtaW4gc2VydmljZSBtdXN0IGJyb2FkY2FzdCBhIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiBvZiB0eXBlCgkgKiB7QGxpbmsgV2lyZUFkbWluRXZlbnQjV0lSRV9ERUxFVEVEfSBhZnRlciB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0CgkgKiBiZWNvbWVzIGludmFsaWQuCgkgKiAKCSAqIEBwYXJhbSB3aXJlIFRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3Qgd2hpY2ggaXMgdG8gYmUgZGVsZXRlZC4KCSAqLwoJcHVibGljIHZvaWQgZGVsZXRlV2lyZShXaXJlIHdpcmUpOwoKCS8qKgoJICogVXBkYXRlIHRoZSBwcm9wZXJ0aWVzIG9mIGEgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBUaGUgcGVyc2lzdGVudGx5IHN0b3JlZCBjb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QKCSAqIGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IHByb3BlcnRpZXMgYW5kIHRoZW4gdGhlIENvbnN1bWVyIGFuZCBQcm9kdWNlcgoJICogc2VydmljZXMgd2lsbCBiZSBjYWxsZWQgYXQgdGhlIHJlc3BlY3RpdmUKCSAqIHtAbGluayBDb25zdW1lciNwcm9kdWNlcnNDb25uZWN0ZWR9IGFuZAoJICoge0BsaW5rIFByb2R1Y2VyI2NvbnN1bWVyc0Nvbm5lY3RlZH0gbWV0aG9kcy4KCSAqIAoJICogPHA+CgkgKiBUaGUgV2lyZSBBZG1pbiBzZXJ2aWNlIG11c3QgYnJvYWRjYXN0IGEgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9mIHR5cGUKCSAqIHtAbGluayBXaXJlQWRtaW5FdmVudCNXSVJFX1VQREFURUR9IGFmdGVyIHRoZSB1cGRhdGVkIHByb3BlcnRpZXMgYXJlCgkgKiBhdmFpbGFibGUgZnJvbSB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAcGFyYW0gd2lyZSBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IHdoaWNoIGlzIHRvIGJlIHVwZGF0ZWQuCgkgKiBAcGFyYW0gcHJvcGVydGllcyBUaGUgbmV3IDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIHByb3BlcnRpZXMgb3IKCSAqICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9wZXJ0aWVzIGFyZSByZXF1aXJlZC4KCSAqIAoJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIDxjb2RlPnByb3BlcnRpZXM8L2NvZGU+CgkgKiAgICAgICAgIGNvbnRhaW5zIGludmFsaWQgd2lyZSB0eXBlcyBvciBjYXNlIHZhcmlhbnRzIG9mIHRoZSBzYW1lIGtleQoJICogICAgICAgICBuYW1lLgoJICovCglwdWJsaWMgdm9pZCB1cGRhdGVXaXJlKFdpcmUgd2lyZSwgRGljdGlvbmFyeSBwcm9wZXJ0aWVzKTsKCgkvKioKCSAqIFJldHVybiB0aGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiA8Y29kZT5maWx0ZXI8L2NvZGU+LgoJICogCgkgKiA8cD4KCSAqIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUKCSAqIHNwZWNpZmllZCA8Y29kZT5maWx0ZXI8L2NvZGU+Ljxjb2RlPldpcmU8L2NvZGU+IG9iamVjdHMgd2hpY2ggbWF0Y2ggdGhlCgkgKiA8Y29kZT5maWx0ZXI8L2NvZGU+IG11c3QgYmUgcmV0dXJuZWQuIFRoZXNlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdHMgYXJlIG5vdAoJICogbmVjZXNzYXJpbHkgY29ubmVjdGVkLiBUaGUgV2lyZSBBZG1pbiBzZXJ2aWNlIHNob3VsZCBub3QgcmV0dXJuIGludmFsaWQKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdHMsIGJ1dCBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0CgkgKiBpcyBkZWxldGVkIGFmdGVyIGl0IHdhcyBwbGFjZWQgaW4gdGhlIGxpc3QuCgkgKiAKCSAqIDxwPgoJICogVGhlIGZpbHRlciBtYXRjaGVzIGFnYWluc3QgdGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIHByb3BlcnRpZXMKCSAqIGluY2x1ZGluZyB7QGxpbmsgV2lyZUNvbnN0YW50cyNXSVJFQURNSU5fUFJPRFVDRVJfUElEfSwKCSAqIHtAbGluayBXaXJlQ29uc3RhbnRzI1dJUkVBRE1JTl9DT05TVU1FUl9QSUR9IGFuZAoJICoge0BsaW5rIFdpcmVDb25zdGFudHMjV0lSRUFETUlOX1BJRH0uCgkgKiAKCSAqIEBwYXJhbSBmaWx0ZXIgRmlsdGVyIHN0cmluZyB0byBzZWxlY3QgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyBvcgoJICogICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHRvIHNlbGVjdCBhbGwgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cy4KCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cyB3aGljaCBtYXRjaCB0aGUKCSAqICAgICAgICAgPGNvZGU+ZmlsdGVyPC9jb2RlPiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyA8Y29kZT5XaXJlPC9jb2RlPgoJICogICAgICAgICBvYmplY3RzIG1hdGNoIHRoZSA8Y29kZT5maWx0ZXI8L2NvZGU+LgoJICogQHRocm93cyBvcmcub3NnaS5mcmFtZXdvcmsuSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBJZiB0aGUgc3BlY2lmaWVkCgkgKiAgICAgICAgIDxjb2RlPmZpbHRlcjwvY29kZT4gaGFzIGFuIGludmFsaWQgc3ludGF4LgoJICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuRmlsdGVyCgkgKi8KCXB1YmxpYyBXaXJlW10gZ2V0V2lyZXMoU3RyaW5nIGZpbHRlcikgdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb247Cn0KUEsDBAoAAAAAAGtS7jRYF17QCiQAAAokAAA7AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVBZG1pbkV2ZW50LmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbi9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluRXZlbnQuamF2YSx2IDEuOSAyMDA2LzA3LzExIDAwOjU0OjEwIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbjsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKCi8qKgogKiBBIFdpcmUgQWRtaW4gRXZlbnQuCiAqIAogKiA8cD4KICogPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9iamVjdHMgYXJlIGRlbGl2ZXJlZCB0byBhbGwgcmVnaXN0ZXJlZAogKiA8Y29kZT5XaXJlQWRtaW5MaXN0ZW5lcjwvY29kZT4gc2VydmljZSBvYmplY3RzIHdoaWNoIHNwZWNpZnkgYW4gaW50ZXJlc3QgaW4gdGhlCiAqIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiB0eXBlLiBFdmVudHMgbXVzdCBiZSBkZWxpdmVyZWQgaW4gY2hyb25vbG9naWNhbAogKiBvcmRlciB3aXRoIHJlc3BlY3QgdG8gZWFjaCBsaXN0ZW5lci4gRm9yIGV4YW1wbGUsIGEgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+CiAqIG9mIHR5cGUge0BsaW5rICNXSVJFX0NPTk5FQ1RFRH0gbXVzdCBiZSBkZWxpdmVyZWQgYmVmb3JlIGEKICogPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9mIHR5cGUge0BsaW5rICNXSVJFX0RJU0NPTk5FQ1RFRH0gZm9yIGEgcGFydGljdWxhcgogKiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuCiAqIAogKiA8cD4KICogQSB0eXBlIGNvZGUgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBldmVudC4gVGhlIGZvbGxvd2luZyBldmVudCB0eXBlcwogKiBhcmUgZGVmaW5lZDoKICogPHVsPgogKiA8bGk+e0BsaW5rICNXSVJFX0NSRUFURUR9CiAqIDxsaT57QGxpbmsgI1dJUkVfQ09OTkVDVEVEfQogKiA8bGk+e0BsaW5rICNXSVJFX1VQREFURUR9CiAqIDxsaT57QGxpbmsgI1dJUkVfVFJBQ0V9CiAqIDxsaT57QGxpbmsgI1dJUkVfRElTQ09OTkVDVEVEfQogKiA8bGk+e0BsaW5rICNXSVJFX0RFTEVURUR9CiAqIDxsaT57QGxpbmsgI1BST0RVQ0VSX0VYQ0VQVElPTn0KICogPGxpPntAbGluayAjQ09OU1VNRVJfRVhDRVBUSU9OfQogKiA8L3VsPgogKiBBZGRpdGlvbmFsIGV2ZW50IHR5cGVzIG1heSBiZSBkZWZpbmVkIGluIHRoZSBmdXR1cmUuCiAqIAogKiA8cD4KICogRXZlbnQgdHlwZSB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUgYW5kIGRpc2pvaW50IGJpdCB2YWx1ZXMuIEV2ZW50IHR5cGVzIG11c3QgYmUKICogZGVmaW5lZCBhcyBhIGJpdCBpbiBhIDMyIGJpdCBpbnRlZ2VyIGFuZCBjYW4gdGh1cyBiZSBiaXR3aXNlIE9SJ2VkIHRvZ2V0aGVyLgogKiA8cD4KICogU2VjdXJpdHkgQ29uc2lkZXJhdGlvbnMuIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3RzIGNvbnRhaW4KICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0cy4gQ2FyZSBtdXN0IGJlIHRha2VuIGluIHRoZSBzaGFyaW5nIG9mIDxjb2RlPldpcmU8L2NvZGU+CiAqIG9iamVjdHMgd2l0aCBvdGhlciBidW5kbGVzLgogKiAKICogQHNlZSBXaXJlQWRtaW5MaXN0ZW5lcgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjkgJAogKi8KcHVibGljIGNsYXNzIFdpcmVBZG1pbkV2ZW50IHsKCS8qKgoJICogVGhlIFdpcmVBZG1pbiBzZXJ2aWNlIHdoaWNoIGNyZWF0ZWQgdGhpcyBldmVudC4KCSAqLwoJcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlCXJlZmVyZW5jZTsKCS8qKgoJICogVGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KCSAqLwoJcHJpdmF0ZSBXaXJlCQkJCXdpcmU7CgkvKioKCSAqIFR5cGUgb2YgdGhpcyBldmVudC4KCSAqIAoJICogQHNlZSAjZ2V0VHlwZQoJICovCglwcml2YXRlIGludAkJCQkJdHlwZTsKCS8qKgoJICogRXhjZXB0aW9uIGFzc29jaWF0ZXMgd2l0aCB0aGlzIHRoZSBldmVudC4KCSAqLwoJcHJpdmF0ZSBUaHJvd2FibGUJCQl0aHJvd2FibGU7CgkvKioKCSAqIEEgUHJvZHVjZXIgc2VydmljZSBtZXRob2QgaGFzIHRocm93biBhbiBleGNlcHRpb24uCgkgKiAKCSAqIDxwPgoJICogVGhpcyA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCBhIFByb2R1Y2VyIHNlcnZpY2UKCSAqIG1ldGhvZCBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbi4gVGhlIHtAbGluayBXaXJlQWRtaW5FdmVudCNnZXRUaHJvd2FibGV9CgkgKiBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBQcm9kdWNlciBzZXJ2aWNlIG1ldGhvZCByYWlzZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIDxjb2RlPlBST0RVQ0VSX0VYQ0VQVElPTjwvY29kZT4gaXMgMHgwMDAwMDAwMS4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQJCVBST0RVQ0VSX0VYQ0VQVElPTgk9IDB4MDAwMDAwMDE7CgkvKioKCSAqIEEgQ29uc3VtZXIgc2VydmljZSBtZXRob2QgaGFzIHRocm93biBhbiBleGNlcHRpb24uCgkgKiAKCSAqIDxwPgoJICogVGhpcyA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gdHlwZSBpbmRpY2F0ZXMgdGhhdCBhIENvbnN1bWVyIHNlcnZpY2UKCSAqIG1ldGhvZCBoYXMgdGhyb3duIGFuIGV4Y2VwdGlvbi4gVGhlIHtAbGluayBXaXJlQWRtaW5FdmVudCNnZXRUaHJvd2FibGV9CgkgKiBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBDb25zdW1lciBzZXJ2aWNlIG1ldGhvZCByYWlzZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIDxjb2RlPkNPTlNVTUVSX0VYQ0VQVElPTjwvY29kZT4gaXMgMHgwMDAwMDAwMi4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQJCUNPTlNVTUVSX0VYQ0VQVElPTgk9IDB4MDAwMDAwMDI7CgkvKioKCSAqIEEgPGNvZGU+V2lyZTwvY29kZT4gaGFzIGJlZW4gY3JlYXRlZC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgYSBuZXcKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLgoJICogCgkgKiBBbiBldmVudCBpcyBicm9hZGNhc3Qgd2hlbiB7QGxpbmsgV2lyZUFkbWluI2NyZWF0ZVdpcmV9IGlzIGNhbGxlZC4gVGhlCgkgKiB7QGxpbmsgV2lyZUFkbWluRXZlbnQjZ2V0V2lyZX0gbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgoJICogb2JqZWN0IHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkLgoJICogCgkgKiA8cD4KCSAqIFRoZSB2YWx1ZSBvZiA8Y29kZT5XSVJFX0NSRUFURUQ8L2NvZGU+IGlzIDB4MDAwMDAwMDQuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50CQlXSVJFX0NSRUFURUQJCT0gMHgwMDAwMDAwNDsKCS8qKgoJICogQSA8Y29kZT5XaXJlPC9jb2RlPiBoYXMgYmVlbiB1cGRhdGVkLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBleGlzdGluZwoJICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBuZXcgcHJvcGVydGllcy4KCSAqIAoJICogQW4gZXZlbnQgaXMgYnJvYWRjYXN0IHdoZW4ge0BsaW5rIFdpcmVBZG1pbiN1cGRhdGVXaXJlfSBpcyBjYWxsZWQgd2l0aCBhCgkgKiB2YWxpZCB3aXJlLiBUaGUge0BsaW5rIFdpcmVBZG1pbkV2ZW50I2dldFdpcmV9IG1ldGhvZCB3aWxsIHJldHVybiB0aGUKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCB0aGF0IGhhcyBqdXN0IGJlZW4gdXBkYXRlZC4KCSAqIAoJICogPHA+CgkgKiBUaGUgdmFsdWUgb2YgPGNvZGU+V0lSRV9VUERBVEVEPC9jb2RlPiBpcyAweDAwMDAwMDA4LgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIGludAkJV0lSRV9VUERBVEVECQk9IDB4MDAwMDAwMDg7CgkvKioKCSAqIEEgPGNvZGU+V2lyZTwvY29kZT4gaGFzIGJlZW4gZGVsZXRlZC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gZXhpc3Rpbmcgd2lyZQoJICogaGFzIGJlZW4gZGVsZXRlZC4KCSAqIAoJICogQW4gZXZlbnQgaXMgYnJvYWRjYXN0IHdoZW4ge0BsaW5rIFdpcmVBZG1pbiNkZWxldGVXaXJlfSBpcyBjYWxsZWQgd2l0aCBhCgkgKiB2YWxpZCB3aXJlLiB7QGxpbmsgV2lyZUFkbWluRXZlbnQjZ2V0V2lyZX0gd2lsbCByZXR1cm4gdGhlIDxjb2RlPldpcmU8L2NvZGU+CgkgKiBvYmplY3QgdGhhdCBoYXMganVzdCBiZWVuIGRlbGV0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIDxjb2RlPldJUkVfREVMRVRFRDwvY29kZT4gaXMgMHgwMDAwMDAxMC4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQJCVdJUkVfREVMRVRFRAkJPSAweDAwMDAwMDEwOwoJLyoqCgkgKiBUaGUgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IHR5cGUgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhbiBleGlzdGluZwoJICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGhhcyBiZWNvbWUgY29ubmVjdGVkLgoJICogCgkgKiBUaGUgQ29uc3VtZXIgb2JqZWN0IGFuZCB0aGUgUHJvZHVjZXIgb2JqZWN0IHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBoYXZlIGJvdGggYmVlbiByZWdpc3RlcmVkIGFuZCB0aGUgPGNvZGU+V2lyZTwvY29kZT4KCSAqIG9iamVjdCBpcyBjb25uZWN0ZWQuIFNlZSB7QGxpbmsgV2lyZSNpc0Nvbm5lY3RlZH0gZm9yIGEgZGVzY3JpcHRpb24gb2YKCSAqIHRoZSBjb25uZWN0ZWQgc3RhdGUuIFRoaXMgZXZlbnQgbWF5IGNvbWUgYmVmb3JlIHRoZQoJICogPGNvZGU+cHJvZHVjZXJzQ29ubmVjdGVkPC9jb2RlPiBhbmQgPGNvZGU+Y29uc3VtZXJzQ29ubmVjdGVkPC9jb2RlPiBtZXRob2QKCSAqIGhhdmUgcmV0dXJuZWQgb3IgY2FsbGVkIHRvIGFsbG93IHN5bmNocm9ub3VzIGRlbGl2ZXJ5IG9mIHRoZSBldmVudHMuIEJvdGgKCSAqIG1ldGhvZHMgY2FuIGNhdXNlIG90aGVyIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiBzIHRvIHRha2UgcGxhY2UgYW5kCgkgKiByZXF1aXJpbmcgdGhpcyBldmVudCB0byBiZSBzZW5kIGJlZm9yZSB0aGVzZSBtZXRob2RzIGFyZSByZXR1cm5lZCB3b3VsZAoJICogbWFuZGF0ZSBhc3luY2hyb25vdXMgZGVsaXZlcnkuCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIDxjb2RlPldJUkVfQ09OTkVDVEVEPC9jb2RlPiBpcyAweDAwMDAwMDIwLgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIGludAkJV0lSRV9DT05ORUNURUQJCT0gMHgwMDAwMDAyMDsKCS8qKgoJICogVGhlIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgYW4gZXhpc3RpbmcKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBoYXMgYmVjb21lIGRpc2Nvbm5lY3RlZC4KCSAqIAoJICogVGhlIENvbnN1bWVyIG9iamVjdCBvci9hbmQgUHJvZHVjZXIgb2JqZWN0IGlzL2FyZSB1bnJlZ2lzdGVyZWQgYnJlYWtpbmcKCSAqIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHR3by4gU2VlIHtAbGluayBXaXJlI2lzQ29ubmVjdGVkfSBmb3IgYQoJICogZGVzY3JpcHRpb24gb2YgdGhlIGNvbm5lY3RlZCBzdGF0ZS4KCSAqIAoJICogPHA+CgkgKiBUaGUgdmFsdWUgb2YgPGNvZGU+V0lSRV9ESVNDT05ORUNURUQ8L2NvZGU+IGlzIDB4MDAwMDAwNDAuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50CQlXSVJFX0RJU0NPTk5FQ1RFRAk9IDB4MDAwMDAwNDA7CgkvKioKCSAqIFRoZSA8Y29kZT5XaXJlQWRtaW5FdmVudDwvY29kZT4gdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IGEgbmV3IHZhbHVlIGlzCgkgKiB0cmFuc2ZlcnJlZCBvdmVyIHRoZSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIFRoaXMgZXZlbnQgaXMgc2VudCBhZnRlciB0aGUgQ29uc3VtZXIgc2VydmljZSBoYXMgYmVlbiBub3RpZmllZCBieQoJICogY2FsbGluZyB0aGUge0BsaW5rIENvbnN1bWVyI3VwZGF0ZWR9IG1ldGhvZCBvciB0aGUgQ29uc3VtZXIgc2VydmljZQoJICogcmVxdWVzdGVkIGEgbmV3IHZhbHVlIHdpdGggdGhlIHtAbGluayBXaXJlI3BvbGx9IG1ldGhvZC4gVGhpcyBpcyBhbgoJICogYWR2aXNvcnkgZXZlbnQgbWVhbmluZyB0aGF0IHdoZW4gdGhpcyBldmVudCBpcyByZWNlaXZlZCwgYW5vdGhlciB1cGRhdGUKCSAqIG1heSBhbHJlYWR5IGhhdmUgb2NjdXJyZWQgYW5kIHRoaXMgdGhlIHtAbGluayBXaXJlI2dldExhc3RWYWx1ZX0gbWV0aG9kCgkgKiByZXR1cm5zIGEgbmV3ZXIgdmFsdWUgdGhlbiB0aGUgdmFsdWUgdGhhdCB3YXMgY29tbXVuaWNhdGVkIGZvciB0aGlzCgkgKiBldmVudC4KCSAqIAoJICogPHA+CgkgKiBUaGUgdmFsdWUgb2YgPGNvZGU+V0lSRV9UUkFDRTwvY29kZT4gaXMgMHgwMDAwMDA4MC4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBpbnQJCVdJUkVfVFJBQ0UJCQk9IDB4MDAwMDAwODA7CgoJLyoqCgkgKiBDb25zdHJ1Y3RzIGEgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9iamVjdCBmcm9tIHRoZSBnaXZlbgoJICogPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0LCBldmVudCB0eXBlLCA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QKCSAqIGFuZCBleGNlcHRpb24uCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgVGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUgV2lyZSBBZG1pbgoJICogICAgICAgIHNlcnZpY2UgdGhhdCBjcmVhdGVkIHRoaXMgZXZlbnQuCgkgKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS4gU2VlIHtAbGluayAjZ2V0VHlwZX0uCgkgKiBAcGFyYW0gd2lyZSBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgoJICogQHBhcmFtIGV4Y2VwdGlvbiBBbiBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuIFRoaXMgbWF5IGJlCgkgKiAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gZXhjZXB0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgoJICovCglwdWJsaWMgV2lyZUFkbWluRXZlbnQoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIGludCB0eXBlLCBXaXJlIHdpcmUsCgkJCVRocm93YWJsZSBleGNlcHRpb24pIHsKCQl0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKCQl0aGlzLndpcmUgPSB3aXJlOwoJCXRoaXMudHlwZSA9IHR5cGU7CgkJdGhpcy50aHJvd2FibGUgPSBleGNlcHRpb247Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBvZiB0aGUgV2lyZSBBZG1pbiBzZXJ2aWNlCgkgKiB0aGF0IGNyZWF0ZWQgdGhpcyBldmVudC4KCSAqIAoJICogQHJldHVybiBUaGUgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IGZvciB0aGUgV2lyZSBBZG1pbiBzZXJ2aWNlCgkgKiAgICAgICAgIHRoYXQgY3JlYXRlZCB0aGlzIGV2ZW50LgoJICovCglwdWJsaWMgU2VydmljZVJlZmVyZW5jZSBnZXRTZXJ2aWNlUmVmZXJlbmNlKCkgewoJCXJldHVybiByZWZlcmVuY2U7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBldmVudC4KCSAqIAoJICogQHJldHVybiBUaGUgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50IG9yCgkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gbm8gPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aAoJICogICAgICAgICB0aGUgZXZlbnQuCgkgKi8KCXB1YmxpYyBXaXJlIGdldFdpcmUoKSB7CgkJcmV0dXJuIHdpcmU7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBldmVudC4KCSAqIDxwPgoJICogVGhlIHR5cGUgdmFsdWVzIGFyZToKCSAqIDx1bD4KCSAqIDxsaT57QGxpbmsgI1dJUkVfQ1JFQVRFRH0KCSAqIDxsaT57QGxpbmsgI1dJUkVfQ09OTkVDVEVEfQoJICogPGxpPntAbGluayAjV0lSRV9VUERBVEVEfQoJICogPGxpPntAbGluayAjV0lSRV9UUkFDRX0KCSAqIDxsaT57QGxpbmsgI1dJUkVfRElTQ09OTkVDVEVEfQoJICogPGxpPntAbGluayAjV0lSRV9ERUxFVEVEfQoJICogPGxpPntAbGluayAjUFJPRFVDRVJfRVhDRVBUSU9OfQoJICogPGxpPntAbGluayAjQ09OU1VNRVJfRVhDRVBUSU9OfQoJICogPC91bD4KCSAqIAoJICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGlzIGV2ZW50LgoJICovCglwdWJsaWMgaW50IGdldFR5cGUoKSB7CgkJcmV0dXJuIHR5cGU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudCwgaWYgYW55LgoJICogCgkgKiBAcmV0dXJuIEFuIGV4Y2VwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBleGNlcHRpb24gaXMgYXNzb2NpYXRlZAoJICogICAgICAgICB3aXRoIHRoaXMgZXZlbnQuCgkgKi8KCXB1YmxpYyBUaHJvd2FibGUgZ2V0VGhyb3dhYmxlKCkgewoJCXJldHVybiB0aHJvd2FibGU7Cgl9Cn0KUEsDBAoAAAAAAGtS7jQ3Jq/wVwsAAFcLAAA+AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVBZG1pbkxpc3RlbmVyLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbi9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluTGlzdGVuZXIuamF2YSx2IDEuMTAgMjAwNi8wNy8xMSAwMDo1NDoxMCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW47CgovKioKICogTGlzdGVuZXIgZm9yIFdpcmUgQWRtaW4gRXZlbnRzLgogKiAKICogPHA+CiAqIDxjb2RlPldpcmVBZG1pbkxpc3RlbmVyPC9jb2RlPiBvYmplY3RzIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEZyYW1ld29yawogKiBzZXJ2aWNlIHJlZ2lzdHJ5IGFuZCBhcmUgbm90aWZpZWQgd2l0aCBhIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3QKICogd2hlbiBhbiBldmVudCBpcyBicm9hZGNhc3QuCiAqIDxwPgogKiA8Y29kZT5XaXJlQWRtaW5MaXN0ZW5lcjwvY29kZT4gb2JqZWN0cyBjYW4gaW5zcGVjdCB0aGUgcmVjZWl2ZWQKICogPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9iamVjdCB0byBkZXRlcm1pbmUgaXRzIHR5cGUsIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgogKiBvYmplY3Qgd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLCBhbmQgdGhlIFdpcmUgQWRtaW4gc2VydmljZSB0aGF0CiAqIGJyb2FkY2FzdHMgdGhlIGV2ZW50LgogKiAKICogPHA+CiAqIDxjb2RlPldpcmVBZG1pbkxpc3RlbmVyPC9jb2RlPiBvYmplY3RzIG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIGEgc2VydmljZQogKiBwcm9wZXJ0eSB7QGxpbmsgV2lyZUNvbnN0YW50cyNXSVJFQURNSU5fRVZFTlRTfSB3aG9zZSB2YWx1ZSBpcyBhIGJpdHdpc2UgT1IKICogb2YgYWxsIHRoZSBldmVudCB0eXBlcyB0aGUgbGlzdGVuZXIgaXMgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcuCiAqIDxwPgogKiBGb3IgZXhhbXBsZToKICogCiAqIDxwcmU+CiAqIEludGVnZXIgbWFzayA9IG5ldyBJbnRlZ2VyKFdJUkVfVFJBQ0UgfCBXSVJFX0NPTk5FQ1RFRCB8IFdJUkVfRElTQ09OTkVDVEVEKTsKICogSGFzaHRhYmxlIGh0ID0gbmV3IEhhc2h0YWJsZSgpOwogKiBodC5wdXQoV0lSRUFETUlOX0VWRU5UUywgbWFzayk7CiAqIGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKFdpcmVBZG1pbkxpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSwgdGhpcywgaHQpOwogKiA8L3ByZT4KICogCiAqIElmIGEgPGNvZGU+V2lyZUFkbWluTGlzdGVuZXI8L2NvZGU+IG9iamVjdCBpcyByZWdpc3RlcmVkIHdpdGhvdXQgYSBzZXJ2aWNlCiAqIHByb3BlcnR5IHtAbGluayBXaXJlQ29uc3RhbnRzI1dJUkVBRE1JTl9FVkVOVFN9LCB0aGVuIHRoZQogKiA8Y29kZT5XaXJlQWRtaW5MaXN0ZW5lcjwvY29kZT4gd2lsbCByZWNlaXZlIG5vIGV2ZW50cy4KICogCiAqIDxwPgogKiBTZWN1cml0eSBDb25zaWRlcmF0aW9ucy4gQnVuZGxlcyB3aXNoaW5nIHRvIG1vbml0b3IgPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+CiAqIG9iamVjdHMgd2lsbCByZXF1aXJlIDxjb2RlPlNlcnZpY2VQZXJtaXNzaW9uW1dpcmVBZG1pbkxpc3RlbmVyLFJFR0lTVEVSXTwvY29kZT4KICogdG8gcmVnaXN0ZXIgYSA8Y29kZT5XaXJlQWRtaW5MaXN0ZW5lcjwvY29kZT4gc2VydmljZS4gU2luY2UKICogPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IG9iamVjdHMgY29udGFpbiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3RzLCBjYXJlIG11c3QKICogYmUgdGFrZW4gaW4gYXNzaWduaW5nIHBlcm1pc3Npb24gdG8gcmVnaXN0ZXIgYSA8Y29kZT5XaXJlQWRtaW5MaXN0ZW5lcjwvY29kZT4KICogc2VydmljZS4KICogCiAqIEBzZWUgV2lyZUFkbWluRXZlbnQKICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMCAkCiAqLwpwdWJsaWMgaW50ZXJmYWNlIFdpcmVBZG1pbkxpc3RlbmVyIHsKCS8qKgoJICogUmVjZWl2ZXMgbm90aWZpY2F0aW9uIG9mIGEgYnJvYWRjYXN0IDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIFRoZSBldmVudCBvYmplY3Qgd2lsbCBiZSBvZiBhbiBldmVudCB0eXBlIHNwZWNpZmllZCBpbiB0aGlzCgkgKiA8Y29kZT5XaXJlQWRtaW5MaXN0ZW5lcjwvY29kZT4gc2VydmljZSdzCgkgKiB7QGxpbmsgV2lyZUNvbnN0YW50cyNXSVJFQURNSU5fRVZFTlRTfSBzZXJ2aWNlIHByb3BlcnR5LgoJICogCgkgKiBAcGFyYW0gZXZlbnQgVGhlIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiBvYmplY3QuCgkgKi8KCXZvaWQgd2lyZUFkbWluRXZlbnQoV2lyZUFkbWluRXZlbnQgZXZlbnQpOwp9ClBLAwQKAAAAAABrUu40zSzjCgopAAAKKQAAOgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQ29uc3RhbnRzLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbi9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUNvbnN0YW50cy5qYXZhLHYgMS4xMCAyMDA2LzA3LzExIDAwOjU0OjEwIGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbjsKCi8qKgogKiBEZWZpbmVzIHN0YW5kYXJkIG5hbWVzIGZvciA8Y29kZT5XaXJlPC9jb2RlPiBwcm9wZXJ0aWVzLCB3aXJlIGZpbHRlcgogKiBhdHRyaWJ1dGVzLCBDb25zdW1lciBhbmQgUHJvZHVjZXIgc2VydmljZSBwcm9wZXJ0aWVzLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEwICQKICovCnB1YmxpYyBpbnRlcmZhY2UgV2lyZUNvbnN0YW50cyB7CgkvKioKCSAqIDxjb2RlPldpcmU8L2NvZGU+IHByb3BlcnR5IGtleSAobmFtZWQgPGNvZGU+d2lyZWFkbWluLnBpZDwvY29kZT4pIHNwZWNpZnlpbmcKCSAqIHRoZSBwZXJzaXN0ZW50IGlkZW50aXR5IChQSUQpIG9mIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIEVhY2ggPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0IGhhcyBhIFBJRCB0byBhbGxvdyB1bmlxdWUgYW5kIHBlcnNpc3RlbnQKCSAqIGlkZW50aWZpY2F0aW9uIG9mIGEgc3BlY2lmaWMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LiBUaGUgUElEIG11c3QgYmUKCSAqIGdlbmVyYXRlZCBieSB0aGUge0BsaW5rIFdpcmVBZG1pbn0gc2VydmljZSB3aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgoJICogb2JqZWN0IGlzIGNyZWF0ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhpcyB3aXJlIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBXaXJlIEFkbWluIHNlcnZpY2UuIFRoZQoJICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlXSVJFQURNSU5fUElECQkJCQk9ICJ3aXJlYWRtaW4ucGlkIjsKCS8qKgoJICogQSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBmb3IgYSBQcm9kdWNlciBzZXJ2aWNlIHRoYXQgaXMgY29tcG9zaXRlLgoJICogSXQgY29udGFpbnMgdGhlIG5hbWVzIG9mIHRoZSBjb21wb3NpdGUgQ29uc3VtZXIgc2VydmljZXMgaXQgY2FuCgkgKiBpbnRlci1vcGVyYXRlIHdpdGguIEludGVyLW9wZXJhYmlsaXR5IGV4aXN0cyB3aGVuIGFueSBuYW1lIGluIHRoaXMgYXJyYXkKCSAqIG1hdGNoZXMgYW55IG5hbWUgaW4gdGhlIGFycmF5IHNldCBieSB0aGUgQ29uc3VtZXIgc2VydmljZS4gVGhlIHR5cGUgb2YKCSAqIHRoaXMgcHJvcGVydHkgbXVzdCBiZSA8Y29kZT5TdHJpbmdbXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVBRE1JTl9QUk9EVUNFUl9DT01QT1NJVEUJPSAid2lyZWFkbWluLnByb2R1Y2VyLmNvbXBvc2l0ZSI7CgkvKioKCSAqIEEgc2VydmljZSByZWdpc3RyYXRpb24gcHJvcGVydHkgZm9yIGEgQ29uc3VtZXIgc2VydmljZSB0aGF0IGlzIGNvbXBvc2l0ZS4KCSAqIEl0IGNvbnRhaW5zIHRoZSBuYW1lcyBvZiB0aGUgY29tcG9zaXRlIFByb2R1Y2VyIHNlcnZpY2VzIGl0IGNhbiBjb29wZXJhdGUKCSAqIHdpdGguIEludGVyLW9wZXJhYmlsaXR5IGV4aXN0cyB3aGVuIGFueSBuYW1lIGluIHRoaXMgYXJyYXkgbWF0Y2hlcyBhbnkKCSAqIG5hbWUgaW4gdGhlIGFycmF5IHNldCBieSB0aGUgUHJvZHVjZXIgc2VydmljZS4gVGhlIHR5cGUgb2YgdGhpcyBwcm9wZXJ0eQoJICogbXVzdCBiZSA8Y29kZT5TdHJpbmdbXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVBRE1JTl9DT05TVU1FUl9DT01QT1NJVEUJPSAid2lyZWFkbWluLmNvbnN1bWVyLmNvbXBvc2l0ZSI7CgkvKioKCSAqIFNlcnZpY2UgcmVnaXN0cmF0aW9uIHByb3BlcnR5IGtleSAobmFtZWQKCSAqIDxjb2RlPndpcmVhZG1pbi5wcm9kdWNlci5zY29wZTwvY29kZT4pIHNwZWNpZnlpbmcgYSBsaXN0IG9mIG5hbWVzIHRoYXQgbWF5CgkgKiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgc2NvcGUgb2YgdGhpcyA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuIEEgUHJvZHVjZXIKCSAqIHNlcnZpY2Ugc2hvdWxkIHNldCB0aGlzIHNlcnZpY2UgcHJvcGVydHkgd2hlbiBpdCBjYW4gcHJvZHVjZSBtb3JlIHRoYW4KCSAqIG9uZSBraW5kIG9mIHZhbHVlLiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgdXNlZCBkdXJpbmcgcmVnaXN0cmF0aW9uLAoJICogbW9kaWZ5aW5nIHRoZSBwcm9wZXJ0eSBtdXN0IG5vdCBoYXZlIGFueSBlZmZlY3Qgb2YgdGhlIDxjb2RlPldpcmU8L2NvZGU+CgkgKiBvYmplY3QncyBzY29wZS4gRWFjaCBuYW1lIGluIHRoZSBnaXZlbiBsaXN0IG1pc3QgaGF2ZQoJICogPGNvZGU+V2lyZVBlcm1pc3Npb25bbmFtZSxQUk9EVUNFXTwvY29kZT4gb3IgZWxzZSBpcyBpZ25vcmVkLiBUaGUgdHlwZSBvZgoJICogdGhpcyBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBtdXN0IGJlIDxjb2RlPlN0cmluZ1tdPC9jb2RlPi4KCSAqIAoJICogQHNlZSBXaXJlI2dldFNjb3BlCgkgKiBAc2VlICNXSVJFQURNSU5fQ09OU1VNRVJfU0NPUEUKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJV0lSRUFETUlOX1BST0RVQ0VSX1NDT1BFCQk9ICJ3aXJlYWRtaW4ucHJvZHVjZXIuc2NvcGUiOwoJLyoqCgkgKiBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBrZXkgKG5hbWVkCgkgKiA8Y29kZT53aXJlYWRtaW4uY29uc3VtZXIuc2NvcGU8L2NvZGU+KSBzcGVjaWZ5aW5nIGEgbGlzdCBvZiBuYW1lcyB0aGF0IG1heQoJICogYmUgdXNlZCB0byBkZWZpbmUgdGhlIHNjb3BlIG9mIHRoaXMgPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0LiBBCgkgKiA8Y29kZT5Db25zdW1lcjwvY29kZT4gc2VydmljZSBzaG91bGQgc2V0IHRoaXMgc2VydmljZSBwcm9wZXJ0eSB3aGVuIGl0IGNhbgoJICogcHJvZHVjZSBtb3JlIHRoYW4gb25lIGtpbmQgb2YgdmFsdWUuIFRoaXMgcHJvcGVydHkgaXMgb25seSB1c2VkIGR1cmluZwoJICogcmVnaXN0cmF0aW9uLCBtb2RpZnlpbmcgdGhlIHByb3BlcnR5IG11c3Qgbm90IGhhdmUgYW55IGVmZmVjdCBvZiB0aGUKCSAqIDxjb2RlPldpcmU8L2NvZGU+IG9iamVjdCdzIHNjb3BlLiBFYWNoIG5hbWUgaW4gdGhlIGdpdmVuIGxpc3QgbWlzdCBoYXZlCgkgKiA8Y29kZT5XaXJlUGVybWlzc2lvbltuYW1lLENPTlNVTUVdPC9jb2RlPiBvciBlbHNlIGlzIGlnbm9yZWQuIFRoZSB0eXBlIG9mIHRoaXMKCSAqIHNlcnZpY2UgcmVnaXN0cmF0aW9uIHByb3BlcnR5IG11c3QgYmUgPGNvZGU+U3RyaW5nW108L2NvZGU+LgoJICogCgkgKiBAc2VlIFdpcmUjZ2V0U2NvcGUKCSAqIEBzZWUgI1dJUkVBRE1JTl9QUk9EVUNFUl9TQ09QRQoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlXSVJFQURNSU5fQ09OU1VNRVJfU0NPUEUJCT0gIndpcmVhZG1pbi5jb25zdW1lci5zY29wZSI7CgkvKioKCSAqIE1hdGNoZXMgYWxsIHNjb3BlIG5hbWVzLgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlXSVJFQURNSU5fU0NPUEVfQUxMW10JCQk9IHsiKiJ9OwoJLyoqCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgKG5hbWVkIDxjb2RlPndpcmVhZG1pbi5wcm9kdWNlci5waWQ8L2NvZGU+KQoJICogc3BlY2lmeWluZyB0aGUgPGNvZGU+c2VydmljZS5waWQ8L2NvZGU+IG9mIHRoZSBhc3NvY2lhdGVkIFByb2R1Y2VyIHNlcnZpY2UuCgkgKiAKCSAqIDxwPgoJICogVGhpcyB3aXJlIHByb3BlcnR5IGlzIGF1dG9tYXRpY2FsbHkgc2V0IGJ5IHRoZSBXaXJlQWRtaW4gc2VydmljZS4gVGhlCgkgKiB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVBRE1JTl9QUk9EVUNFUl9QSUQJCQk9ICJ3aXJlYWRtaW4ucHJvZHVjZXIucGlkIjsKCS8qKgoJICogPGNvZGU+V2lyZTwvY29kZT4gcHJvcGVydHkga2V5IChuYW1lZCA8Y29kZT53aXJlYWRtaW4uY29uc3VtZXIucGlkPC9jb2RlPikKCSAqIHNwZWNpZnlpbmcgdGhlIDxjb2RlPnNlcnZpY2UucGlkPC9jb2RlPiBvZiB0aGUgYXNzb2NpYXRlZCBDb25zdW1lciBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgd2lyZSBwcm9wZXJ0eSBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSB0aGUgV2lyZSBBZG1pbiBzZXJ2aWNlLiBUaGUKCSAqIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJV0lSRUFETUlOX0NPTlNVTUVSX1BJRAkJCT0gIndpcmVhZG1pbi5jb25zdW1lci5waWQiOwoJLyoqCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBwcm9wZXJ0eSBrZXkgKG5hbWVkIDxjb2RlPndpcmVhZG1pbi5maWx0ZXI8L2NvZGU+KQoJICogc3BlY2lmeWluZyBhIGZpbHRlciB1c2VkIHRvIGNvbnRyb2wgdGhlIGRlbGl2ZXJ5IHJhdGUgb2YgZGF0YSBiZXR3ZWVuIHRoZQoJICogUHJvZHVjZXIgYW5kIHRoZSBDb25zdW1lciBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGNvbnRhaW4gYSBmaWx0ZXIgYXMgZGVzY3JpYmVkIGluIHRoZSA8Y29kZT5GaWx0ZXI8L2NvZGU+CgkgKiBjbGFzcy4gVGhlIGZpbHRlciBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZW4gYW4gdXBkYXRlZCB2YWx1ZSBmcm9tIHRoZQoJICogUHJvZHVjZXIgc2VydmljZSBzaG91bGQgYmUgZGVsaXZlcmVkIHRvIHRoZSBDb25zdW1lciBzZXJ2aWNlLiBJbiBtYW55CgkgKiBjYXNlcyB0aGUgQ29uc3VtZXIgc2VydmljZSBkb2VzIG5vdCBuZWVkIHRvIHJlY2VpdmUgdGhlIGRhdGEgd2l0aCB0aGUKCSAqIHNhbWUgcmF0ZSB0aGF0IHRoZSBQcm9kdWNlciBzZXJ2aWNlIGNhbiBnZW5lcmF0ZSBkYXRhLiBUaGlzIHByb3BlcnR5IGNhbgoJICogYmUgdXNlZCB0byBjb250cm9sIHRoZSBkZWxpdmVyeSByYXRlLgoJICogPHA+CgkgKiBUaGUgZmlsdGVyIGNhbiB1c2UgYSBudW1iZXIgb2YgcHJlLWRlZmluZWQgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSB1c2VkIHRvCgkgKiBjb250cm9sIHRoZSBkZWxpdmVyeSBvZiBuZXcgZGF0YSB2YWx1ZXMuIElmIHRoZSBmaWx0ZXIgcHJvZHVjZXMgYSBtYXRjaAoJICogdXBvbiB0aGUgd2lyZSBmaWx0ZXIgYXR0cmlidXRlcywgdGhlIENvbnN1bWVyIHNlcnZpY2Ugc2hvdWxkIGJlIG5vdGlmZWQKCSAqIG9mIHRoZSB1cGRhdGVkIGRhdGEgdmFsdWUuCgkgKiA8cD4KCSAqIElmIHRoZSBQcm9kdWNlciBzZXJ2aWNlIHdhcyByZWdpc3RlcmVkIHdpdGggdGhlCgkgKiB7QGxpbmsgI1dJUkVBRE1JTl9QUk9EVUNFUl9GSUxURVJTfSBzZXJ2aWNlIHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCB0aGUKCSAqIFByb2R1Y2VyIHNlcnZpY2Ugd2lsbCBwZXJmb3JtIHRoZSBkYXRhIGZpbHRlcmluZyB0aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgoJICogb2JqZWN0IHdpbGwgbm90IHBlcmZvcm0gZGF0YSBmaWx0ZXJpbmcuIE90aGVyd2lzZSwgdGhlIDxjb2RlPldpcmU8L2NvZGU+CgkgKiBvYmplY3QgbXVzdCBwZXJmb3JtIGJhc2ljIGZpbHRlcmluZy4gQmFzaWMgZmlsdGVyaW5nIGluY2x1ZGVzIHN1cHBvcnRpbmcKCSAqIHRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgd2lyZSBmaWx0ZXIgYXR0cmlidXRlczoKCSAqIDx1bD4KCSAqIDxsaT57QGxpbmsgI1dJUkVWQUxVRV9DVVJSRU5UfS0gQ3VycmVudCB2YWx1ZQoJICogPGxpPntAbGluayAjV0lSRVZBTFVFX1BSRVZJT1VTfS0gUHJldmlvdXMgdmFsdWUKCSAqIDxsaT57QGxpbmsgI1dJUkVWQUxVRV9ERUxUQV9BQlNPTFVURX0tIEFic29sdXRlIGRlbHRhCgkgKiA8bGk+e0BsaW5rICNXSVJFVkFMVUVfREVMVEFfUkVMQVRJVkV9LSBSZWxhdGl2ZSBkZWx0YQoJICogPGxpPntAbGluayAjV0lSRVZBTFVFX0VMQVBTRUR9LSBFbGFwc2VkIHRpbWUKCSAqIDwvdWw+CgkgKiAKCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkZpbHRlcgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlXSVJFQURNSU5fRklMVEVSCQkJCT0gIndpcmVhZG1pbi5maWx0ZXIiOwoJLyogV2lyZSBmaWx0ZXIgYXR0cmlidXRlIG5hbWVzLiAqLwoJLyoqCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBmaWx0ZXIgYXR0cmlidXRlIChuYW1lZAoJICogPGNvZGU+d2lyZXZhbHVlLmN1cnJlbnQ8L2NvZGU+KSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdmFsdWUuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVWQUxVRV9DVVJSRU5UCQkJCT0gIndpcmV2YWx1ZS5jdXJyZW50IjsKCS8qKgoJICogPGNvZGU+V2lyZTwvY29kZT4gb2JqZWN0J3MgZmlsdGVyIGF0dHJpYnV0ZSAobmFtZWQKCSAqIDxjb2RlPndpcmV2YWx1ZS5wcmV2aW91czwvY29kZT4pIHJlcHJlc2VudGluZyB0aGUgcHJldmlvdXMgdmFsdWUuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVWQUxVRV9QUkVWSU9VUwkJCQk9ICJ3aXJldmFsdWUucHJldmlvdXMiOwoJLyoqCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBmaWx0ZXIgYXR0cmlidXRlIChuYW1lZAoJICogPGNvZGU+d2lyZXZhbHVlLmRlbHRhLmFic29sdXRlPC9jb2RlPikgcmVwcmVzZW50aW5nIHRoZSBhYnNvbHV0ZSBkZWx0YS4KCSAqIFRoZSBhYnNvbHV0ZSAoYWx3YXlzIHBvc2l0aXZlKSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3QgdXBkYXRlIGFuZCB0aGUKCSAqIGN1cnJlbnQgdmFsdWUgKG9ubHkgd2hlbiBudW1lcmljKS4gVGhpcyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZCB3aGVuCgkgKiB0aGUgdmFsdWVzIGFyZSBub3QgbnVtZXJpYy4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJV0lSRVZBTFVFX0RFTFRBX0FCU09MVVRFCQk9ICJ3aXJldmFsdWUuZGVsdGEuYWJzb2x1dGUiOwoJLyoqCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBmaWx0ZXIgYXR0cmlidXRlIChuYW1lZAoJICogPGNvZGU+d2lyZXZhbHVlLmRlbHRhLnJlbGF0aXZlPC9jb2RlPikgcmVwcmVzZW50aW5nIHRoZSByZWxhdGl2ZSBkZWx0YS4KCSAqIFRoZSByZWxhdGl2ZSBkaWZmZXJlbmNlIGlzIHw8Y29kZT5wcmV2aW91czwvY29kZT4tPGNvZGU+Y3VycmVudDwvY29kZT4gfC98CgkgKiA8Y29kZT5jdXJyZW50PC9jb2RlPnwgKG9ubHkgd2hlbiBudW1lcmljKS4gVGhpcyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZAoJICogd2hlbiB0aGUgdmFsdWVzIGFyZSBub3QgbnVtZXJpYy4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJV0lSRVZBTFVFX0RFTFRBX1JFTEFUSVZFCQk9ICJ3aXJldmFsdWUuZGVsdGEucmVsYXRpdmUiOwoJLyoqCgkgKiA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QncyBmaWx0ZXIgYXR0cmlidXRlIChuYW1lZAoJICogPGNvZGU+d2lyZXZhbHVlLmVsYXBzZWQ8L2NvZGU+KSByZXByZXNlbnRpbmcgdGhlIGVsYXBzZWQgdGltZSwgaW4gbXMsCgkgKiBiZXR3ZWVuIHRoaXMgZmlsdGVyIGV2YWx1YXRpb24gYW5kIHRoZSBsYXN0IHVwZGF0ZSBvZiB0aGUKCSAqIDxjb2RlPkNvbnN1bWVyPC9jb2RlPiBzZXJ2aWNlLgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZwlXSVJFVkFMVUVfRUxBUFNFRAkJCQk9ICJ3aXJldmFsdWUuZWxhcHNlZCI7CgkvKiBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBwcm9wZXJ0eSBrZXkgbmFtZXMuICovCgkvKioKCSAqIFNlcnZpY2UgUmVnaXN0cmF0aW9uIHByb3BlcnR5IChuYW1lZCA8Y29kZT53aXJlYWRtaW4ucHJvZHVjZXIuZmlsdGVyczwvY29kZT4pLgoJICogQSA8Y29kZT5Qcm9kdWNlcjwvY29kZT4gc2VydmljZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdG8KCSAqIHRoZSBXaXJlIEFkbWluIHNlcnZpY2UgdGhhdCB0aGUgUHJvZHVjZXIgc2VydmljZSBpbXBsZW1lbnRzIGF0IGxlYXN0IHRoZQoJICogZmlsdGVyaW5nIGFzIGRlc2NyaWJlZCBmb3IgdGhlIHtAbGluayAjV0lSRUFETUlOX0ZJTFRFUn0gcHJvcGVydHkuIElmIHRoZQoJICogUHJvZHVjZXIgc2VydmljZSBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcHJvcGVydHksIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgoJICogb2JqZWN0IG11c3QgcGVyZm9ybSB0aGUgYmFzaWMgZmlsdGVyaW5nIGFzIGRlc2NyaWJlZCBpbgoJICoge0BsaW5rICNXSVJFQURNSU5fRklMVEVSfS4KCSAqIAoJICogPHA+CgkgKiBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgbm90IHJlbGV2YW50LiBPbmx5IGl0cyBwcmVzZW5jZSBpcwoJICogcmVsZXZhbnQuCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVBRE1JTl9QUk9EVUNFUl9GSUxURVJTCQk9ICJ3aXJlYWRtaW4ucHJvZHVjZXIuZmlsdGVycyI7CgkvKioKCSAqIFNlcnZpY2UgUmVnaXN0cmF0aW9uIHByb3BlcnR5IChuYW1lZCA8Y29kZT53aXJlYWRtaW4uY29uc3VtZXIuZmxhdm9yczwvY29kZT4pCgkgKiBzcGVjaWZ5aW5nIHRoZSBsaXN0IG9mIGRhdGEgdHlwZXMgdW5kZXJzdG9vZCBieSB0aGlzIENvbnN1bWVyIHNlcnZpY2UuCgkgKiAKCSAqIDxwPgoJICogVGhlIENvbnN1bWVyIHNlcnZpY2Ugb2JqZWN0IG11c3QgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgc2VydmljZQoJICogcHJvcGVydHkuIFRoZSBsaXN0IG11c3QgYmUgaW4gdGhlIG9yZGVyIG9mIHByZWZlcmVuY2Ugd2l0aCB0aGUgZmlyc3QgdHlwZQoJICogYmVpbmcgdGhlIG1vc3QgcHJlZmVycmVkLiBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZQoJICogPGNvZGU+Q2xhc3NbXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVBRE1JTl9DT05TVU1FUl9GTEFWT1JTCQk9ICJ3aXJlYWRtaW4uY29uc3VtZXIuZmxhdm9ycyI7CgkvKioKCSAqIFNlcnZpY2UgUmVnaXN0cmF0aW9uIHByb3BlcnR5IChuYW1lZCA8Y29kZT53aXJlYWRtaW4ucHJvZHVjZXIuZmxhdm9yczwvY29kZT4pCgkgKiBzcGVjaWZ5aW5nIHRoZSBsaXN0IG9mIGRhdGEgdHlwZXMgYXZhaWxhYmxlIGZyb20gdGhpcyBQcm9kdWNlciBzZXJ2aWNlLgoJICogCgkgKiA8cD4KCSAqIFRoZSBQcm9kdWNlciBzZXJ2aWNlIG9iamVjdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgc2VydmljZQoJICogcHJvcGVydHkuCgkgKiAKCSAqIDxwPgoJICogVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgPGNvZGU+Q2xhc3NbXTwvY29kZT4uCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nCVdJUkVBRE1JTl9QUk9EVUNFUl9GTEFWT1JTCQk9ICJ3aXJlYWRtaW4ucHJvZHVjZXIuZmxhdm9ycyI7CgkvKioKCSAqIFNlcnZpY2UgUmVnaXN0cmF0aW9uIHByb3BlcnR5IChuYW1lZCA8Y29kZT53aXJlYWRtaW4uZXZlbnRzPC9jb2RlPikKCSAqIHNwZWNpZnlpbmcgdGhlIDxjb2RlPldpcmVBZG1pbkV2ZW50PC9jb2RlPiB0eXBlIG9mIGludGVyZXN0IHRvIGEgV2lyZSBBZG1pbgoJICogTGlzdGVuZXIgc2VydmljZS4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhIGJpdHdpc2UgT1Igb2YgYWxsIHRoZQoJICogPGNvZGU+V2lyZUFkbWluRXZlbnQ8L2NvZGU+IHR5cGVzIHRoZSBXaXJlIEFkbWluIExpc3RlbmVyIHNlcnZpY2Ugd2lzaGVzIHRvCgkgKiByZWNlaXZlIGFuZCBtdXN0IGJlIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uCgkgKiAKCSAqIEBzZWUgV2lyZUFkbWluRXZlbnQKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcJV0lSRUFETUlOX0VWRU5UUwkJCQk9ICJ3aXJlYWRtaW4uZXZlbnRzIjsKfQpQSwMECgAAAAAAa1LuNKG5UpWjNAAAozQAADsAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb24uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnNlcnZpY2Uud2lyZWFkbWluL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlUGVybWlzc2lvbi5qYXZhLHYgMS4xMyAyMDA2LzA3LzEyIDIxOjIyOjE0IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbjsKCmltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwppbXBvcnQgamF2YS5zZWN1cml0eS4qOwppbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwppbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKCi8qKgogKiBQZXJtaXNzaW9uIGZvciB0aGUgc2NvcGUgb2YgYSA8Y29kZT5XaXJlPC9jb2RlPiBvYmplY3QuIFdoZW4gYQogKiA8Y29kZT5FbnZlbG9wZTwvY29kZT4gb2JqZWN0IGlzIHVzZWQgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgPGNvZGU+cG9sbDwvY29kZT4KICogb3IgPGNvZGU+dXBkYXRlPC9jb2RlPiBtZXRob2QsIGFuZCB0aGUgc2NvcGUgaXMgc2V0LCB0aGVuIHRoZSA8Y29kZT5XaXJlPC9jb2RlPgogKiBvYmplY3QgbXVzdCB2ZXJpZnkgdGhhdCB0aGUgQ29uc3VtZXIgc2VydmljZSBoYXMKICogPGNvZGU+V2lyZVBlcm1pc3Npb25bbmFtZSxDT05TVU1FXTwvY29kZT4gYW5kIHRoZSBQcm9kdWNlciBzZXJ2aWNlIGhhcwogKiA8Y29kZT5XaXJlUGVybWlzc2lvbltuYW1lLFBST0RVQ0VdPC9jb2RlPiBmb3IgYWxsIG5hbWVzIGluIHRoZSBzY29wZS4KICogPHA+CiAqIFRoZSBuYW1lcyBhcmUgY29tcGFyZWQgd2l0aCB0aGUgbm9ybWFsIHJ1bGVzIGZvciBwZXJtaXNzaW9uIG5hbWVzLiBUaGlzIG1lYW5zCiAqIHRoYXQgdGhleSBtYXkgZW5kIHdpdGggYSAiKiIgdG8gaW5kaWNhdGUgd2lsZGNhcmRzLiBFLmcuIERvb3IuKiBpbmRpY2F0ZXMgYWxsCiAqIHNjb3BlIG5hbWVzIHN0YXJ0aW5nIHdpdGggdGhlIHN0cmluZyAiRG9vciIuIFRoZSBsYXN0IHBlcmlvZCBpcyByZXF1aXJlZCBkdWUKICogdG8gdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgPGNvZGU+QmFzaWNQZXJtaXNzaW9uPC9jb2RlPiBjbGFzcy4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMyAkCiAqLwpmaW5hbCBwdWJsaWMgY2xhc3MgV2lyZVBlcm1pc3Npb24gZXh0ZW5kcyBCYXNpY1Blcm1pc3Npb24gewogICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NTgzNzA5MzkxNTE2NTY5MzIxTDsKCS8qKgoJICogVGhlIGFjdGlvbiBzdHJpbmcgZm9yIHRoZSA8Y29kZT5QUk9EVUNFPC9jb2RlPiBhY3Rpb246IHZhbHVlIGlzICJwcm9kdWNlIi4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJUFJPRFVDRQkJCT0gInByb2R1Y2UiOwoJLyoqCgkgKiBUaGUgYWN0aW9uIHN0cmluZyBmb3IgdGhlIDxjb2RlPkNPTlNVTUU8L2NvZGU+IGFjdGlvbjogdmFsdWUgaXMgImNvbnN1bWUiLgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlDT05TVU1FCQkJPSAiY29uc3VtZSI7Cglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJQUNUSU9OX1BST0RVQ0UJPSAweDAwMDAwMDAxOwoJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50CUFDVElPTl9DT05TVU1FCT0gMHgwMDAwMDAwMjsKCXByaXZhdGUgZmluYWwgc3RhdGljIGludAlBQ1RJT05fQUxMCQk9IEFDVElPTl9QUk9EVUNFCgkJCQkJCQkJCQkJCQkJfCBBQ1RJT05fQ09OU1VNRTsKCXByaXZhdGUgZmluYWwgc3RhdGljIGludAlBQ1RJT05fTk9ORQkJPSAwOwoJLyoqCgkgKiBUaGUgYWN0aW9ucyBtYXNrLgoJICovCglwcml2YXRlIHRyYW5zaWVudCBpbnQJCWFjdGlvbl9tYXNrCQk9IEFDVElPTl9OT05FOwoJLyoqCgkgKiBUaGUgYWN0aW9ucyBpbiBjYW5vbmljYWwgZm9ybS4KCSAqIAoJICogQHNlcmlhbAoJICovCglwcml2YXRlIFN0cmluZwkJCQlhY3Rpb25zCQkJPSBudWxsOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IFdpcmVQZXJtaXNzaW9uIHdpdGggdGhlIGdpdmVuIG5hbWUgKG1heSBiZSB3aWxkY2FyZCkgYW5kCgkgKiBhY3Rpb25zLgoJICogQHBhcmFtIG5hbWUgV2lyZSBuYW1lLgoJICogQHBhcmFtIGFjdGlvbnMgPGNvZGU+cHJvZHVjZTwvY29kZT4sIDxjb2RlPmNvbnN1bWU8L2NvZGU+CgkgKiAgICAgICAgKGNhbm9uaWNhbCBvcmRlcikuCgkgKi8KCXB1YmxpYyBXaXJlUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgU3RyaW5nIGFjdGlvbnMpIHsKCQl0aGlzKG5hbWUsIGdldE1hc2soYWN0aW9ucykpOwoJfQoKCS8qKgoJICogUGFja2FnZSBwcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgV2lyZVBlcm1pc3Npb25Db2xsZWN0aW9uLgoJICogCgkgKiBAcGFyYW0gbmFtZSBjbGFzcyBuYW1lCgkgKiBAcGFyYW0gbWFzayBhY3Rpb24gbWFzawoJICovCglXaXJlUGVybWlzc2lvbihTdHJpbmcgbmFtZSwgaW50IG1hc2spIHsKCQlzdXBlcihuYW1lKTsKCQlpbml0KG1hc2spOwoJfQoKCS8qKgoJICogQ2FsbGVkIGJ5IGNvbnN0cnVjdG9ycyBhbmQgd2hlbiBkZXNlcmlhbGl6ZWQuCgkgKiAKCSAqIEBwYXJhbSBtYXNrIGFjdGlvbiBtYXNrCgkgKi8KCXByaXZhdGUgdm9pZCBpbml0KGludCBtYXNrKSB7CgkJaWYgKChtYXNrID09IEFDVElPTl9OT05FKSB8fCAoKG1hc2sgJiBBQ1RJT05fQUxMKSAhPSBtYXNrKSkgewoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGFjdGlvbiBzdHJpbmciKTsKCQl9CgkJYWN0aW9uX21hc2sgPSBtYXNrOwoJfQoKCS8qKgoJICogUGFyc2UgYWN0aW9uIHN0cmluZyBpbnRvIGFjdGlvbiBtYXNrLgoJICogCgkgKiBAcGFyYW0gYWN0aW9ucyBBY3Rpb24gc3RyaW5nLgoJICogQHJldHVybiBhY3Rpb24gbWFzay4KCSAqLwoJcHJpdmF0ZSBzdGF0aWMgaW50IGdldE1hc2soU3RyaW5nIGFjdGlvbnMpIHsKCQlib29sZWFuIHNlZW5jb21tYSA9IGZhbHNlOwoJCWludCBtYXNrID0gQUNUSU9OX05PTkU7CgkJaWYgKGFjdGlvbnMgPT0gbnVsbCkgewoJCQlyZXR1cm4gbWFzazsKCQl9CgkJY2hhcltdIGEgPSBhY3Rpb25zLnRvQ2hhckFycmF5KCk7CgkJaW50IGkgPSBhLmxlbmd0aCAtIDE7CgkJaWYgKGkgPCAwKQoJCQlyZXR1cm4gbWFzazsKCQl3aGlsZSAoaSAhPSAtMSkgewoJCQljaGFyIGM7CgkJCS8vIHNraXAgd2hpdGVzcGFjZQoJCQl3aGlsZSAoKGkgIT0gLTEpCgkJCQkJJiYgKChjID0gYVtpXSkgPT0gJyAnIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcbicKCQkJCQkJCXx8IGMgPT0gJ1xmJyB8fCBjID09ICdcdCcpKQoJCQkJaS0tOwoJCQkvLyBjaGVjayBmb3IgdGhlIGtub3duIHN0cmluZ3MKCQkJaW50IG1hdGNobGVuOwoJCQlpZiAoaSA+PSA2ICYmIChhW2kgLSA2XSA9PSAncCcgfHwgYVtpIC0gNl0gPT0gJ1AnKQoJCQkJCSYmIChhW2kgLSA1XSA9PSAncicgfHwgYVtpIC0gNV0gPT0gJ1InKQoJCQkJCSYmIChhW2kgLSA0XSA9PSAnbycgfHwgYVtpIC0gNF0gPT0gJ08nKQoJCQkJCSYmIChhW2kgLSAzXSA9PSAnZCcgfHwgYVtpIC0gM10gPT0gJ0QnKQoJCQkJCSYmIChhW2kgLSAyXSA9PSAndScgfHwgYVtpIC0gMl0gPT0gJ1UnKQoJCQkJCSYmIChhW2kgLSAxXSA9PSAnYycgfHwgYVtpIC0gMV0gPT0gJ0MnKQoJCQkJCSYmIChhW2ldID09ICdlJyB8fCBhW2ldID09ICdFJykpIHsKCQkJCW1hdGNobGVuID0gNzsKCQkJCW1hc2sgfD0gQUNUSU9OX1BST0RVQ0U7CgkJCX0KCQkJZWxzZQoJCQkJaWYgKGkgPj0gNiAmJiAoYVtpIC0gNl0gPT0gJ2MnIHx8IGFbaSAtIDZdID09ICdDJykKCQkJCQkJJiYgKGFbaSAtIDVdID09ICdvJyB8fCBhW2kgLSA1XSA9PSAnTycpCgkJCQkJCSYmIChhW2kgLSA0XSA9PSAnbicgfHwgYVtpIC0gNF0gPT0gJ04nKQoJCQkJCQkmJiAoYVtpIC0gM10gPT0gJ3MnIHx8IGFbaSAtIDNdID09ICdTJykKCQkJCQkJJiYgKGFbaSAtIDJdID09ICd1JyB8fCBhW2kgLSAyXSA9PSAnVScpCgkJCQkJCSYmIChhW2kgLSAxXSA9PSAnbScgfHwgYVtpIC0gMV0gPT0gJ00nKQoJCQkJCQkmJiAoYVtpXSA9PSAnZScgfHwgYVtpXSA9PSAnRScpKSB7CgkJCQkJbWF0Y2hsZW4gPSA3OwoJCQkJCW1hc2sgfD0gQUNUSU9OX0NPTlNVTUU7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQkvLyBwYXJzZSBlcnJvcgoJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgcGVybWlzc2lvbjogIgoJCQkJCQkJKyBhY3Rpb25zKTsKCQkJCX0KCQkJLy8gbWFrZSBzdXJlIHdlIGRpZG4ndCBqdXN0IG1hdGNoIHRoZSB0YWlsIG9mIGEgd29yZAoJCQkvLyBsaWtlICJhY2tiYXJmcmVnaXN0ZXIiLiBBbHNvLCBza2lwIHRvIHRoZSBjb21tYS4KCQkJc2VlbmNvbW1hID0gZmFsc2U7CgkJCXdoaWxlIChpID49IG1hdGNobGVuICYmICFzZWVuY29tbWEpIHsKCQkJCXN3aXRjaCAoYVtpIC0gbWF0Y2hsZW5dKSB7CgkJCQkJY2FzZSAnLCcgOgoJCQkJCQlzZWVuY29tbWEgPSB0cnVlOwoJCQkJCS8qIEZBTExUSFJPVUdIICovCgkJCQkJY2FzZSAnICcgOgoJCQkJCWNhc2UgJ1xyJyA6CgkJCQkJY2FzZSAnXG4nIDoKCQkJCQljYXNlICdcZicgOgoJCQkJCWNhc2UgJ1x0JyA6CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQgOgoJCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAoJCQkJCQkJCSJpbnZhbGlkIHBlcm1pc3Npb246ICIgKyBhY3Rpb25zKTsKCQkJCX0KCQkJCWktLTsKCQkJfQoJCQkvLyBwb2ludCBpIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tbWEgbWludXMgb25lIChvciAtMSkuCgkJCWkgLT0gbWF0Y2hsZW47CgkJfQoJCWlmIChzZWVuY29tbWEpIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBwZXJtaXNzaW9uOiAiICsgYWN0aW9ucyk7CgkJfQoJCXJldHVybiBtYXNrOwoJfQoKCS8qKgoJICogQ2hlY2tzIGlmIHRoaXMgPGNvZGU+V2lyZVBlcm1pc3Npb248L2NvZGU+IG9iamVjdCA8Y29kZT5pbXBsaWVzPC9jb2RlPiB0aGUKCSAqIHNwZWNpZmllZCBwZXJtaXNzaW9uLgoJICogPFA+CgkgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZjoKCSAqIDxwPgoJICogPHVsPgoJICogPGxpPjxpPnAgPC9pPiBpcyBhbiBpbnN0YW5jZW9mIHRoZSA8Y29kZT5XaXJlUGVybWlzc2lvbjwvY29kZT4gY2xhc3MsCgkgKiA8bGk+PGk+cCA8L2k+J3MgYWN0aW9ucyBhcmUgYSBwcm9wZXIgc3Vic2V0IG9mIHRoaXMgb2JqZWN0J3MgYWN0aW9ucywKCSAqIGFuZAoJICogPGxpPjxpPnAgPC9pPidzIG5hbWUgaXMgaW1wbGllZCBieSB0aGlzIG9iamVjdCdzIG5hbWUuIEZvciBleGFtcGxlLAoJICogPGNvZGU+amF2YS4qPC9jb2RlPiBpbXBsaWVzIDxjb2RlPmphdmEuaG9tZTwvY29kZT4uCgkgKiA8L3VsPgoJICogCgkgKiBAcGFyYW0gcCBUaGUgcGVybWlzc2lvbiB0byBjaGVjayBhZ2FpbnN0LgoJICogCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgcGVybWlzc2lvbiBpcyBpbXBsaWVkIGJ5IHRoaXMKCSAqICAgICAgICAgb2JqZWN0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcCkgewoJCWlmIChwIGluc3RhbmNlb2YgV2lyZVBlcm1pc3Npb24pIHsKCQkJV2lyZVBlcm1pc3Npb24gdGFyZ2V0ID0gKFdpcmVQZXJtaXNzaW9uKSBwOwoJCQlyZXR1cm4gKChhY3Rpb25fbWFzayAmIHRhcmdldC5hY3Rpb25fbWFzaykgPT0gdGFyZ2V0LmFjdGlvbl9tYXNrKQoJCQkJCSYmIHN1cGVyLmltcGxpZXMocCk7CgkJfQoJCXJldHVybiBmYWxzZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFjdGlvbnMuIEFsd2F5cwoJICogcmV0dXJucyBwcmVzZW50IGFjdGlvbnMgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogPGNvZGU+cHJvZHVjZTwvY29kZT4sCgkgKiA8Y29kZT5jb25zdW1lPC9jb2RlPi4KCSAqIAoJICogQHJldHVybiBUaGUgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWN0aW9ucy4KCSAqLwoJcHVibGljIFN0cmluZyBnZXRBY3Rpb25zKCkgewoJCWlmIChhY3Rpb25zID09IG51bGwpIHsKCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoJCQlib29sZWFuIGNvbW1hID0gZmFsc2U7CgkJCWlmICgoYWN0aW9uX21hc2sgJiBBQ1RJT05fUFJPRFVDRSkgPT0gQUNUSU9OX1BST0RVQ0UpIHsKCQkJCXNiLmFwcGVuZChQUk9EVUNFKTsKCQkJCWNvbW1hID0gdHJ1ZTsKCQkJfQoJCQlpZiAoKGFjdGlvbl9tYXNrICYgQUNUSU9OX0NPTlNVTUUpID09IEFDVElPTl9DT05TVU1FKSB7CgkJCQlpZiAoY29tbWEpCgkJCQkJc2IuYXBwZW5kKCcsJyk7CgkJCQlzYi5hcHBlbmQoQ09OU1VNRSk7CgkJCX0KCQkJYWN0aW9ucyA9IHNiLnRvU3RyaW5nKCk7CgkJfQoJCXJldHVybiBhY3Rpb25zOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5ldyA8Y29kZT5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gb2JqZWN0IGZvciBzdG9yaW5nCgkgKiA8Y29kZT5XaXJlUGVybWlzc2lvbjwvY29kZT4gb2JqZWN0cy4KCSAqIAoJICogQHJldHVybiBBIG5ldyA8Y29kZT5QZXJtaXNzaW9uQ29sbGVjdGlvbjwvY29kZT4gb2JqZWN0IHN1aXRhYmxlIGZvciBzdG9yaW5nCgkgKiAgICAgICAgIDxjb2RlPldpcmVQZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzLgoJICovCglwdWJsaWMgUGVybWlzc2lvbkNvbGxlY3Rpb24gbmV3UGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CgkJcmV0dXJuIG5ldyBXaXJlUGVybWlzc2lvbkNvbGxlY3Rpb24oKTsKCX0KCgkvKioKCSAqIERldGVybWluZXMgdGhlIGVxdWFsdHkgb2YgdHdvIDxjb2RlPldpcmVQZXJtaXNzaW9uPC9jb2RlPiBvYmplY3RzLgoJICogCgkgKiBDaGVja3MgdGhhdCBzcGVjaWZpZWQgb2JqZWN0IGhhcyB0aGUgc2FtZSBuYW1lIGFuZCBhY3Rpb25zIGFzIHRoaXMKCSAqIDxjb2RlPldpcmVQZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byB0ZXN0IGZvciBlcXVhbGl0eS4KCSAqIEByZXR1cm4gdHJ1ZSBpZiA8Y29kZT5vYmo8L2NvZGU+IGlzIGEgPGNvZGU+V2lyZVBlcm1pc3Npb248L2NvZGU+LCBhbmQgaGFzCgkgKiAgICAgICAgIHRoZSBzYW1lIG5hbWUgYW5kIGFjdGlvbnMgYXMgdGhpcyA8Y29kZT5XaXJlUGVybWlzc2lvbjwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewoJCWlmIChvYmogPT0gdGhpcykgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKCEob2JqIGluc3RhbmNlb2YgV2lyZVBlcm1pc3Npb24pKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJV2lyZVBlcm1pc3Npb24gcCA9IChXaXJlUGVybWlzc2lvbikgb2JqOwoJCXJldHVybiAoYWN0aW9uX21hc2sgPT0gcC5hY3Rpb25fbWFzaykgJiYgZ2V0TmFtZSgpLmVxdWFscyhwLmdldE5hbWUoKSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgoJICogCgkgKiBAcmV0dXJuIEhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCgkgKi8KCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CgkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpIF4gZ2V0QWN0aW9ucygpLmhhc2hDb2RlKCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFjdGlvbiBtYXNrLiBVc2VkIGJ5IHRoZSBXaXJlUGVybWlzc2lvbkNvbGxlY3Rpb24KCSAqIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBUaGUgYWN0aW9ucyBtYXNrLgoJICovCglpbnQgZ2V0TWFzaygpIHsKCQlyZXR1cm4gYWN0aW9uX21hc2s7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhpcyA8Y29kZT5XaXJlUGVybWlzc2lvbjwvY29kZT4uIFRoZQoJICogY29udmVudGlvbiBpcyB0byBzcGVjaWZ5IHRoZSBjbGFzcyBuYW1lLCB0aGUgcGVybWlzc2lvbiBuYW1lLCBhbmQgdGhlCgkgKiBhY3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgoJICogJyhvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbi5XaXJlUGVybWlzc2lvbiAmcXVvdDtuYW1lJnF1b3Q7CgkgKiAmcXVvdDthY3Rpb25zJnF1b3Q7KScuCgkgKiAKCSAqIEByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyA8Y29kZT5QZXJtaXNzaW9uPC9jb2RlPiBvYmplY3QuCgkgKi8KCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoJCXNiLmFwcGVuZCgnKCcpOwoJCXNiLmFwcGVuZChnZXRDbGFzcygpLmdldE5hbWUoKSk7CgkJc2IuYXBwZW5kKCIgXCIiKTsKCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKCQlzYi5hcHBlbmQoIlwiIFwiIik7CgkJc2IuYXBwZW5kKGdldEFjdGlvbnMoKSk7CgkJc2IuYXBwZW5kKCJcIikiKTsKCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKCX0KCgkvKioKCSAqIFdyaXRlT2JqZWN0IGlzIGNhbGxlZCB0byBzYXZlIHRoZSBzdGF0ZSBvZiB0aGUgU2VydmljZVBlcm1pc3Npb24gdG8gYQoJICogc3RyZWFtLiBUaGUgYWN0aW9ucyBhcmUgc2VyaWFsaXplZCwgYW5kIHRoZSBzdXBlcmNsYXNzIHRha2VzIGNhcmUgb2YgdGhlCgkgKiBuYW1lLgoJICovCglwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCgkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CgkJLy8gV3JpdGUgb3V0IHRoZSBhY3Rpb25zLiBUaGUgc3VwZXJjbGFzcyB0YWtlcyBjYXJlIG9mIHRoZSBuYW1lCgkJLy8gY2FsbCBnZXRBY3Rpb25zIHRvIG1ha2Ugc3VyZSBhY3Rpb25zIGZpZWxkIGlzIGluaXRpYWxpemVkCgkJaWYgKGFjdGlvbnMgPT0gbnVsbCkKCQkJZ2V0QWN0aW9ucygpOwoJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Cgl9CgoJLyoqCgkgKiByZWFkT2JqZWN0IGlzIGNhbGxlZCB0byByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgU2VydmljZVBlcm1pc3Npb24gZnJvbSBhCgkgKiBzdHJlYW0uCgkgKi8KCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCgkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CgkJLy8gUmVhZCBpbiB0aGUgYWN0aW9uLCB0aGVuIGluaXRpYWxpemUgdGhlIHJlc3QKCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7CgkJaW5pdChnZXRNYXNrKGFjdGlvbnMpKTsKCX0KfQovKioKICogQSA8Y29kZT5XaXJlUGVybWlzc2lvbkNvbGxlY3Rpb248L2NvZGU+IHN0b3JlcyBhIHNldCBvZiA8Y29kZT5XaXJlUGVybWlzc2lvbjwvY29kZT4KICogcGVybWlzc2lvbnMuCiAqLwoKZmluYWwgY2xhc3MgV2lyZVBlcm1pc3Npb25Db2xsZWN0aW9uIGV4dGVuZHMgUGVybWlzc2lvbkNvbGxlY3Rpb24gewogICAgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDI2MTc1MjEwOTQ5MDk4MjYwMTZMOwoJLyoqCgkgKiBUYWJsZSBvZiBwZXJtaXNzaW9ucy4KCSAqIAoJICogQHNlcmlhbAoJICovCglwcml2YXRlIEhhc2h0YWJsZQlwZXJtaXNzaW9uczsKCS8qKgoJICogQm9vbGVhbiBzYXlpbmcgaWYgIioiIGlzIGluIHRoZSBjb2xsZWN0aW9uLgoJICogCgkgKiBAc2VyaWFsCgkgKi8KCXByaXZhdGUgYm9vbGVhbgkJYWxsX2FsbG93ZWQ7CgoJLyoqCgkgKiBDcmVhdGVzIGFuIGVtcHR5IFdpcmVQZXJtaXNzaW9uQ29sbGVjdGlvbiBvYmplY3QuCgkgKiAgCgkgKi8KCXB1YmxpYyBXaXJlUGVybWlzc2lvbkNvbGxlY3Rpb24oKSB7CgkJcGVybWlzc2lvbnMgPSBuZXcgSGFzaHRhYmxlKCk7CgkJYWxsX2FsbG93ZWQgPSBmYWxzZTsKCX0KCgkvKioKCSAqIEFkZHMgYSBwZXJtaXNzaW9uIHRvIHRoaXMgUGVybWlzc2lvbkNvbGxlY3Rpb24uCgkgKiAKCSAqIEBwYXJhbSBwZXJtaXNzaW9uIFRoZSBQZXJtaXNzaW9uIG9iamVjdCB0byBhZGQuCgkgKiAKCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSBwZXJtaXNzaW9uIGlzIG5vdCBhCgkgKiAgICAgICAgICAgIFdpcmVQZXJtaXNzaW9uIG9iamVjdC4KCSAqIAoJICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBJZiB0aGlzIFBlcm1pc3Npb25Db2xsZWN0aW9uIGhhcyBiZWVuIG1hcmtlZAoJICogICAgICAgICAgICByZWFkLW9ubHkuCgkgKi8KCXB1YmxpYyB2b2lkIGFkZChQZXJtaXNzaW9uIHBlcm1pc3Npb24pIHsKCQlpZiAoIShwZXJtaXNzaW9uIGluc3RhbmNlb2YgV2lyZVBlcm1pc3Npb24pKQoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHBlcm1pc3Npb246ICIKCQkJCQkrIHBlcm1pc3Npb24pOwoJCWlmIChpc1JlYWRPbmx5KCkpCgkJCXRocm93IG5ldyBTZWN1cml0eUV4Y2VwdGlvbigiYXR0ZW1wdCB0byBhZGQgYSBQZXJtaXNzaW9uIHRvIGEgIgoJCQkJCSsgInJlYWRvbmx5IFBlcm1pc3Npb25Db2xsZWN0aW9uIik7CgkJV2lyZVBlcm1pc3Npb24gcCA9IChXaXJlUGVybWlzc2lvbikgcGVybWlzc2lvbjsKCQlTdHJpbmcgbmFtZSA9IHAuZ2V0TmFtZSgpOwoJCVdpcmVQZXJtaXNzaW9uIGV4aXN0aW5nID0gKFdpcmVQZXJtaXNzaW9uKSBwZXJtaXNzaW9ucy5nZXQobmFtZSk7CgkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKCQkJaW50IG9sZE1hc2sgPSBleGlzdGluZy5nZXRNYXNrKCk7CgkJCWludCBuZXdNYXNrID0gcC5nZXRNYXNrKCk7CgkJCWlmIChvbGRNYXNrICE9IG5ld01hc2spIHsKCQkJCXBlcm1pc3Npb25zLnB1dChuYW1lLCBuZXcgV2lyZVBlcm1pc3Npb24obmFtZSwgb2xkTWFzawoJCQkJCQl8IG5ld01hc2spKTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJcGVybWlzc2lvbnMucHV0KG5hbWUsIHBlcm1pc3Npb24pOwoJCX0KCQlpZiAoIWFsbF9hbGxvd2VkKSB7CgkJCWlmIChuYW1lLmVxdWFscygiKiIpKQoJCQkJYWxsX2FsbG93ZWQgPSB0cnVlOwoJCX0KCX0KCgkvKioKCSAqIERldGVybWluZXMgaWYgYSBzZXQgb2YgcGVybWlzc2lvbnMgaW1wbGllcyB0aGUgcGVybWlzc2lvbnMgZXhwcmVzc2VkIGluCgkgKiA8Y29kZT5wZXJtaXNzaW9uPC9jb2RlPi4KCSAqIAoJICogQHBhcmFtIHBlcm1pc3Npb24gVGhlIFBlcm1pc3Npb24gb2JqZWN0IHRvIGNvbXBhcmUuCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cGVybWlzc2lvbjwvY29kZT4gaXMgYSBwcm9wZXIgc3Vic2V0IG9mIGEKCSAqICAgICAgICAgcGVybWlzc2lvbiBpbiB0aGUgc2V0OyA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBpbXBsaWVzKFBlcm1pc3Npb24gcGVybWlzc2lvbikgewoJCWlmICghKHBlcm1pc3Npb24gaW5zdGFuY2VvZiBXaXJlUGVybWlzc2lvbikpCgkJCXJldHVybiBmYWxzZTsKCQlXaXJlUGVybWlzc2lvbiBwID0gKFdpcmVQZXJtaXNzaW9uKSBwZXJtaXNzaW9uOwoJCVdpcmVQZXJtaXNzaW9uIHg7CgkJaW50IGRlc2lyZWQgPSBwLmdldE1hc2soKTsKCQlpbnQgZWZmZWN0aXZlID0gMDsKCQkvLyBzaG9ydCBjaXJjdWl0IGlmIHRoZSAiKiIgUGVybWlzc2lvbiB3YXMgYWRkZWQKCQlpZiAoYWxsX2FsbG93ZWQpIHsKCQkJeCA9IChXaXJlUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KCIqIik7CgkJCWlmICh4ICE9IG51bGwpIHsKCQkJCWVmZmVjdGl2ZSB8PSB4LmdldE1hc2soKTsKCQkJCWlmICgoZWZmZWN0aXZlICYgZGVzaXJlZCkgPT0gZGVzaXJlZCkKCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCQkvLyBzdHJhdGVneToKCQkvLyBDaGVjayBmb3IgZnVsbCBtYXRjaCBmaXJzdC4gVGhlbiB3b3JrIG91ciB3YXkgdXAgdGhlCgkJLy8gbmFtZSBsb29raW5nIGZvciBtYXRjaGVzIG9uIGEuYi4qCgkJU3RyaW5nIG5hbWUgPSBwLmdldE5hbWUoKTsKCQl4ID0gKFdpcmVQZXJtaXNzaW9uKSBwZXJtaXNzaW9ucy5nZXQobmFtZSk7CgkJaWYgKHggIT0gbnVsbCkgewoJCQkvLyB3ZSBoYXZlIGEgZGlyZWN0IGhpdCEKCQkJZWZmZWN0aXZlIHw9IHguZ2V0TWFzaygpOwoJCQlpZiAoKGVmZmVjdGl2ZSAmIGRlc2lyZWQpID09IGRlc2lyZWQpCgkJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJLy8gd29yayBvdXIgd2F5IHVwIHRoZSB0cmVlLi4uCgkJaW50IGxhc3QsIG9mZnNldDsKCQlvZmZzZXQgPSBuYW1lLmxlbmd0aCgpIC0gMTsKCQl3aGlsZSAoKGxhc3QgPSBuYW1lLmxhc3RJbmRleE9mKCIuIiwgb2Zmc2V0KSkgIT0gLTEpIHsKCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIGxhc3QgKyAxKSArICIqIjsKCQkJeCA9IChXaXJlUGVybWlzc2lvbikgcGVybWlzc2lvbnMuZ2V0KG5hbWUpOwoJCQlpZiAoeCAhPSBudWxsKSB7CgkJCQllZmZlY3RpdmUgfD0geC5nZXRNYXNrKCk7CgkJCQlpZiAoKGVmZmVjdGl2ZSAmIGRlc2lyZWQpID09IGRlc2lyZWQpCgkJCQkJcmV0dXJuICh0cnVlKTsKCQkJfQoJCQlvZmZzZXQgPSBsYXN0IC0gMTsKCQl9CgkJLy8gd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgIioiIGFzIGl0IHdhcyBhbHJlYWR5IGNoZWNrZWQKCQkvLyBhdCB0aGUgdG9wIChhbGxfYWxsb3dlZCksIHNvIHdlIGp1c3QgcmV0dXJuIGZhbHNlCgkJcmV0dXJuIGZhbHNlOwoJfQoKCS8qKgoJICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgdGhlIFBlcm1pc3Npb24gb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLgoJICogCgkgKiBAcmV0dXJuIEVudW1lcmF0aW9uIG9mIGFsbCB0aGUgUGVybWlzc2lvbiBvYmplY3RzLgoJICovCglwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7CgkJcmV0dXJuIHBlcm1pc3Npb25zLmVsZW1lbnRzKCk7Cgl9Cn0KUEsDBAoAAAAAAGtS7jTMewDCigEAAIoBAAA0AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW4vc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL3BhY2thZ2UuaHRtbCx2IDEuMyAyMDA2LzA3LzEyIDIxOjA3OjA2IGhhcmdyYXZlIEV4cCAkIC0tPg08Qk9EWT4NPHA+V2lyZSBBZG1pbiBQYWNrYWdlIFZlcnNpb24gMS4wLg08cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UNaW4gdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuDUZvciBleGFtcGxlOg08cHJlPg1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW47IHZlcnNpb249MS4wDTwvcHJlPg08L0JPRFk+DQ1QSwMECgAAAAAAa1LuNMWfAa4MAAAADAAAADMAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vcGFja2FnZWluZm92ZXJzaW9uIDEuMApQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAABsAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9QSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAACcAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9QSwMECgAAAAAAa1LuNKAOUY6XQgAAl0IAADcAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudC5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kudXRpbC5tZWFzdXJlbWVudC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudC5qYXZhLHYgMS4xNCAyMDA2LzA3LzExIDAwOjU0OjA2IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS51dGlsLm1lYXN1cmVtZW50OwoKCi8qKgogKiBSZXByZXNlbnRzIGEgdmFsdWUgd2l0aCBhbiBlcnJvciwgYSB1bml0IGFuZCBhIHRpbWUtc3RhbXAuCiAqIAogKiA8cD4KICogQSA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IGlzIHVzZWQgZm9yIG1haW50YWluaW5nIHRoZSB0dXBsZSBvZiB2YWx1ZSwKICogZXJyb3IsIHVuaXQgYW5kIHRpbWUtc3RhbXAuIFRoZSB2YWx1ZSBhbmQgZXJyb3IgYXJlIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMKICogYW5kIHRoZSB0aW1lIGlzIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIFVUQy4KICogCiAqIDxwPgogKiBNYXRoZW1hdGljIG1ldGhvZHMgYXJlIHByb3ZpZGVkIHRoYXQgY29ycmVjdGx5IGNhbGN1bGF0ZSB0YWtpbmcgdGhlIGVycm9yCiAqIGludG8gYWNjb3VudC4gQSBydW50aW1lIGVycm9yIHdpbGwgb2NjdXIgd2hlbiB0d28gbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGluIGFuCiAqIGluY29tcGF0aWJsZSB3YXkuIEUuZy4sIHdoZW4gYSBzcGVlZCAobS9zKSBpcyBhZGRlZCB0byBhIGRpc3RhbmNlIChtKS4gVGhlCiAqIG1lYXN1cmVtZW50IGNsYXNzIHdpbGwgY29ycmVjdGx5IHRyYWNrIGNoYW5nZXMgaW4gdW5pdCBkdXJpbmcgbXVsdGlwbGljYXRpb24KICogYW5kIGRpdmlzaW9uLCBhbHdheXMgY29lcmNpbmcgdGhlIHJlc3VsdCB0byB0aGUgbW9zdCBzaW1wbGUgZm9ybS4gU2VlCiAqIHtAbGluayBVbml0fSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3VwcG9ydGVkIHVuaXRzLgogKiAKICogPHA+CiAqIEVycm9ycyBpbiB0aGUgbWVhc3VyZW1lbnQgY2xhc3MgYXJlIGFic29sdXRlIGVycm9ycy4gTWVhc3VyZW1lbnQgZXJyb3JzCiAqIHNob3VsZCB1c2UgdGhlIFA5NSBydWxlLiBBY3R1YWwgdmFsdWVzIG11c3QgZmFsbCBpbiB0aGUgcmFuZ2UgdmFsdWUgKy8tIGVycm9yCiAqIDk1JSBvciBtb3JlIG9mIHRoZSB0aW1lLgogKiAKICogPHA+CiAqIEEgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBpcyBpbW11dGFibGUgaW4gb3JkZXIgdG8gYmUgZWFzaWx5IHNoYXJlZC4KICogCiAqIDxwPgogKiBOb3RlOiBUaGlzIGNsYXNzIGhhcyBhIG5hdHVyYWwgb3JkZXJpbmcgdGhhdCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBlcXVhbHMuIFNlZQogKiB7QGxpbmsgI2NvbXBhcmVUb30uCiAqIAogKiBAdmVyc2lvbiAkUmV2aXNpb246IDEuMTQgJAogKi8KcHVibGljIGNsYXNzIE1lYXN1cmVtZW50IGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CgkvKiBwYWNrYWdlIHByaXZhdGUgc28gaXQgY2FuIGJlIGFjY2Vzc2VkIGJ5IFVuaXQgKi8KCWZpbmFsIGRvdWJsZQl2YWx1ZTsKCWZpbmFsIGRvdWJsZQllcnJvcjsKCWZpbmFsIGxvbmcJCXRpbWU7CglmaW5hbCBVbml0CQl1bml0OwoJcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nCW5hbWU7CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+LgoJICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBvZiB0aGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+LgoJICogQHBhcmFtIHVuaXQgVGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdCBpbiB3aGljaCB0aGUgdmFsdWUgaXMgbWVhc3VyZWQuIElmCgkgKiAgICAgICAgdGhpcyBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgdW5pdCB3aWxsIGJlIHNldCB0bwoJICogICAgICAgIHtAbGluayBVbml0I3VuaXR5fS4KCSAqIEBwYXJhbSB0aW1lIFRoZSB0aW1lIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFudWFyeSAxLAoJICogICAgICAgIDE5NzAgVVRDLgoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQoZG91YmxlIHZhbHVlLCBkb3VibGUgZXJyb3IsIFVuaXQgdW5pdCwgbG9uZyB0aW1lKSB7CgkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCXRoaXMuZXJyb3IgPSBNYXRoLmFicyhlcnJvcik7CgkJdGhpcy51bml0ID0gKHVuaXQgIT0gbnVsbCkgPyB1bml0IDogVW5pdC51bml0eTsKCQl0aGlzLnRpbWUgPSB0aW1lOwoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3Qgd2l0aCBhIHRpbWUgb2YgemVyby4KCSAqIAoJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+LgoJICogQHBhcmFtIGVycm9yIFRoZSBlcnJvciBvZiB0aGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+LgoJICogQHBhcmFtIHVuaXQgVGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdCBpbiB3aGljaCB0aGUgdmFsdWUgaXMgbWVhc3VyZWQuIElmCgkgKiAgICAgICAgdGhpcyBhcmd1bWVudCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgdW5pdCB3aWxsIGJlIHNldCB0bwoJICogICAgICAgIHtAbGluayBVbml0I3VuaXR5fS4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50KGRvdWJsZSB2YWx1ZSwgZG91YmxlIGVycm9yLCBVbml0IHVuaXQpIHsKCQl0aGlzKHZhbHVlLCBlcnJvciwgdW5pdCwgMGwpOwoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3Qgd2l0aCBhbiBlcnJvciBvZiAwLjAgYW5kIGEKCSAqIHRpbWUgb2YgemVyby4KCSAqIAoJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+LgoJICogQHBhcmFtIHVuaXQgVGhlIDxjb2RlPlVuaXQ8L2NvZGU+IGluIHdoaWNoIHRoZSB2YWx1ZSBpcyBtZWFzdXJlZC4gSWYgdGhpcwoJICogICAgICAgIGFyZ3VtZW50IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoZSB1bml0IHdpbGwgYmUgc2V0IHRvCgkgKiAgICAgICAge0BsaW5rIFVuaXQjdW5pdHl9LgoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQoZG91YmxlIHZhbHVlLCBVbml0IHVuaXQpIHsKCQl0aGlzKHZhbHVlLCAwLjBkLCB1bml0LCAwbCk7Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB3aXRoIGFuIGVycm9yIG9mIDAuMCwgYSB1bml0CgkgKiBvZiB7QGxpbmsgVW5pdCN1bml0eX0gYW5kIGEgdGltZSBvZiB6ZXJvLgoJICogCgkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4uCgkgKi8KCXB1YmxpYyBNZWFzdXJlbWVudChkb3VibGUgdmFsdWUpIHsKCQl0aGlzKHZhbHVlLCAwLjBkLCBudWxsLCAwbCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gVGhlIHZhbHVlIG9mIHRoaXMgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBhcyBhIGRvdWJsZS4KCSAqLwoJcHVibGljIGZpbmFsIGRvdWJsZSBnZXRWYWx1ZSgpIHsKCQlyZXR1cm4gdmFsdWU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBlcnJvciBvZiB0aGlzIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QuIFRoZSBlcnJvciBpcwoJICogYWx3YXlzIGEgcG9zaXRpdmUgdmFsdWUuCgkgKiAKCSAqIEByZXR1cm4gVGhlIGVycm9yIG9mIHRoaXMgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IGFzIGEgZG91YmxlLgoJICovCglwdWJsaWMgZmluYWwgZG91YmxlIGdldEVycm9yKCkgewoJCXJldHVybiBlcnJvcjsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdCBvZiB0aGlzIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gVGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdCBvZiB0aGlzIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBzZWUgVW5pdAoJICovCglwdWJsaWMgZmluYWwgVW5pdCBnZXRVbml0KCkgewoJCXJldHVybiB1bml0OwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdGltZSBhdCB3aGljaCB0aGlzIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3Qgd2FzIHRha2VuLgoJICogVGhlIHRpbWUgaXMgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAgVVRDLAoJICogb3IgemVybyB3aGVuIG5vdCBkZWZpbmVkLgoJICogCgkgKiBAcmV0dXJuIFRoZSB0aW1lIGF0IHdoaWNoIHRoaXMgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB3YXMgdGFrZW4gb3IKCSAqICAgICAgICAgemVyby4KCSAqLwoJcHVibGljIGZpbmFsIGxvbmcgZ2V0VGltZSgpIHsKCQlyZXR1cm4gdGltZTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBwcm9kdWN0IG9mIHRoaXMKCSAqIG9iamVjdCBtdWx0aXBsaWVkIGJ5IHRoZSBzcGVjaWZpZWQgb2JqZWN0LgoJICogCgkgKiBAcGFyYW0gbSBUaGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoCgkgKiAgICAgICAgdGhpcyBvYmplY3QuCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiB0aGF0IGlzIHRoZSBwcm9kdWN0IG9mIHRoaXMgb2JqZWN0CgkgKiAgICAgICAgIG11bHRpcGxpZWQgYnkgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZSBlcnJvciBhbmQgdW5pdCBvZiB0aGUgbmV3CgkgKiAgICAgICAgIG9iamVjdCBhcmUgY29tcHV0ZWQuIFRoZSB0aW1lIG9mIHRoZSBuZXcgb2JqZWN0IGlzIHNldCB0byB0aGUKCSAqICAgICAgICAgdGltZSBvZiB0aGlzIG9iamVjdC4KCSAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbiBJZiB0aGUgPGNvZGU+VW5pdDwvY29kZT4gb2JqZWN0cyBvZiB0aGlzIG9iamVjdAoJICogICAgICAgICBhbmQgdGhlIHNwZWNpZmllZCBvYmplY3QgY2Fubm90IGJlIG11bHRpcGxpZWQuCgkgKiBAc2VlIFVuaXQKCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IG11bChNZWFzdXJlbWVudCBtKSB7CgkJZG91YmxlIG12YWx1ZSA9IG0udmFsdWU7CgkJcmV0dXJuIG5ldyBNZWFzdXJlbWVudCh2YWx1ZSAqIG12YWx1ZSwgTWF0aC5hYnModmFsdWUpICogbS5lcnJvcgoJCQkJKyBlcnJvciAqIE1hdGguYWJzKG12YWx1ZSksIHVuaXQubXVsKG0udW5pdCksIHRpbWUpOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5ldyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHByb2R1Y3Qgb2YgdGhpcwoJICogb2JqZWN0IG11bHRpcGxpZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KCSAqIAoJICogQHBhcmFtIGQgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhpcyBvYmplY3QuCgkgKiBAcGFyYW0gdSBUaGUgPGNvZGU+VW5pdDwvY29kZT4gb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4KCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBwcm9kdWN0IG9mIHRoaXMKCSAqICAgICAgICAgb2JqZWN0IG11bHRpcGxpZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4gVGhlIGVycm9yIGFuZCB1bml0IG9mCgkgKiAgICAgICAgIHRoZSBuZXcgb2JqZWN0IGFyZSBjb21wdXRlZC4gVGhlIHRpbWUgb2YgdGhlIG5ldyBvYmplY3QgaXMgc2V0IHRvCgkgKiAgICAgICAgIHRoZSB0aW1lIG9mIHRoaXMgb2JqZWN0LgoJICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uIElmIHRoZSB1bml0cyBvZiB0aGlzIG9iamVjdCBhbmQgdGhlIHNwZWNpZmllZAoJICogICAgICAgICB2YWx1ZSBjYW5ub3QgYmUgbXVsdGlwbGllZC4KCSAqIEBzZWUgVW5pdAoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQgbXVsKGRvdWJsZSBkLCBVbml0IHUpIHsKCQlyZXR1cm4gbmV3IE1lYXN1cmVtZW50KHZhbHVlICogZCwgZXJyb3IgKiBNYXRoLmFicyhkKSwgdW5pdC5tdWwodSksCgkJCQl0aW1lKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBwcm9kdWN0IG9mIHRoaXMKCSAqIG9iamVjdCBtdWx0aXBsaWVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCgkgKiAKCSAqIEBwYXJhbSBkIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoIHRoaXMgb2JqZWN0LgoJICogQHJldHVybiBBIG5ldyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHByb2R1Y3Qgb2YgdGhpcwoJICogICAgICAgICBvYmplY3QgbXVsdGlwbGllZCBieSB0aGUgc3BlY2lmaWVkIHZhbHVlLiBUaGUgZXJyb3Igb2YgdGhlIG5ldwoJICogICAgICAgICBvYmplY3QgaXMgY29tcHV0ZWQuIFRoZSB1bml0IGFuZCB0aW1lIG9mIHRoZSBuZXcgb2JqZWN0IGlzIHNldCB0bwoJICogICAgICAgICB0aGUgdW5pdCBhbmQgdGltZSBvZiB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IG11bChkb3VibGUgZCkgewoJCXJldHVybiBuZXcgTWVhc3VyZW1lbnQodmFsdWUgKiBkLCBlcnJvciAqIE1hdGguYWJzKGQpLCB1bml0LCB0aW1lKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBxdW90aWVudCBvZiB0aGlzCgkgKiBvYmplY3QgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkIG9iamVjdC4KCSAqIAoJICogQHBhcmFtIG0gVGhlIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCB3aWxsIGJlIHRoZSBkaXZpc29yIG9mCgkgKiAgICAgICAgdGhpcyBvYmplY3QuCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCBpcyB0aGUgcXVvdGllbnQgb2YgdGhpcwoJICogICAgICAgICBvYmplY3QgZGl2aWRlZCBieSB0aGUgc3BlY2lmaWVkIG9iamVjdC4gVGhlIGVycm9yIGFuZCB1bml0IG9mIHRoZQoJICogICAgICAgICBuZXcgb2JqZWN0IGFyZSBjb21wdXRlZC4gVGhlIHRpbWUgb2YgdGhlIG5ldyBvYmplY3QgaXMgc2V0IHRvIHRoZQoJICogICAgICAgICB0aW1lIG9mIHRoaXMgb2JqZWN0LgoJICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uIElmIHRoZSA8Y29kZT5Vbml0PC9jb2RlPiBvYmplY3RzIG9mIHRoaXMgb2JqZWN0CgkgKiAgICAgICAgIGFuZCB0aGUgc3BlY2lmaWVkIG9iamVjdCBjYW5ub3QgYmUgZGl2aWRlZC4KCSAqIEBzZWUgVW5pdAoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQgZGl2KE1lYXN1cmVtZW50IG0pIHsKCQlkb3VibGUgbXZhbHVlID0gbS52YWx1ZTsKCQlyZXR1cm4gbmV3IE1lYXN1cmVtZW50KHZhbHVlIC8gbXZhbHVlLAoJCQkJKE1hdGguYWJzKHZhbHVlKSAqIG0uZXJyb3IgKyBlcnJvciAqIE1hdGguYWJzKG12YWx1ZSkpCgkJCQkJCS8gKG12YWx1ZSAqIG12YWx1ZSksIHVuaXQuZGl2KG0udW5pdCksIHRpbWUpOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5ldyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHF1b3RpZW50IG9mIHRoaXMKCSAqIG9iamVjdCBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCgkgKiAKCSAqIEBwYXJhbSBkIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgdGhlIGRpdmlzb3Igb2YgdGhpcyBvYmplY3QuCgkgKiBAcGFyYW0gdSBUaGUgPGNvZGU+VW5pdDwvY29kZT4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiB0aGF0IGlzIHRoZSBxdW90aWVudCBvZiB0aGlzIG9iamVjdAoJICogICAgICAgICBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuIFRoZSBlcnJvciBhbmQgdW5pdCBvZiB0aGUgbmV3CgkgKiAgICAgICAgIG9iamVjdCBhcmUgY29tcHV0ZWQuIFRoZSB0aW1lIG9mIHRoZSBuZXcgb2JqZWN0IGlzIHNldCB0byB0aGUKCSAqICAgICAgICAgdGltZSBvZiB0aGlzIG9iamVjdC4KCSAqIEB0aHJvd3MgQXJpdGhtZXRpY0V4Y2VwdGlvbiBJZiB0aGUgPGNvZGU+VW5pdDwvY29kZT4gb2JqZWN0cyBvZiB0aGlzIG9iamVjdAoJICogICAgICAgICBhbmQgdGhlIHNwZWNpZmllZCBvYmplY3QgY2Fubm90IGJlIGRpdmlkZWQuCgkgKiBAc2VlIFVuaXQKCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IGRpdihkb3VibGUgZCwgVW5pdCB1KSB7CgkJcmV0dXJuIG5ldyBNZWFzdXJlbWVudCh2YWx1ZSAvIGQsIGVycm9yIC8gTWF0aC5hYnMoZCksIHVuaXQuZGl2KHUpLAoJCQkJdGltZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCBpcyB0aGUgcXVvdGllbnQgb2YgdGhpcwoJICogb2JqZWN0IGRpdmlkZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KCSAqIAoJICogQHBhcmFtIGQgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSB0aGUgZGl2aXNvciBvZiB0aGlzIG9iamVjdC4KCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBxdW90aWVudCBvZiB0aGlzCgkgKiAgICAgICAgIG9iamVjdCBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuIFRoZSBlcnJvciBvZiB0aGUgbmV3CgkgKiAgICAgICAgIG9iamVjdCBpcyBjb21wdXRlZC4gVGhlIHVuaXQgYW5kIHRpbWUgb2YgdGhlIG5ldyBvYmplY3QgaXMgc2V0IHRvCgkgKiAgICAgICAgIHRoZSA8Y29kZT5Vbml0PC9jb2RlPiBhbmQgdGltZSBvZiB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IGRpdihkb3VibGUgZCkgewoJCXJldHVybiBuZXcgTWVhc3VyZW1lbnQodmFsdWUgLyBkLCBlcnJvciAvIE1hdGguYWJzKGQpLCB1bml0LCB0aW1lKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhpcwoJICogb2JqZWN0IGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgoJICogCgkgKiBUaGUgZXJyb3IgYW5kIHVuaXQgb2YgdGhlIG5ldyBvYmplY3QgYXJlIGNvbXB1dGVkLiBUaGUgdGltZSBvZiB0aGUgbmV3CgkgKiBvYmplY3QgaXMgc2V0IHRvIHRoZSB0aW1lIG9mIHRoaXMgb2JqZWN0LgoJICogCgkgKiBAcGFyYW0gbSBUaGUgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IHdpbGwgYmUgYWRkZWQgd2l0aCB0aGlzCgkgKiAgICAgICAgb2JqZWN0LgoJICogQHJldHVybiBBIG5ldyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHN1bSBvZiB0aGlzIGFuZAoJICogICAgICAgICBtLgoJICogQHNlZSBVbml0CgkgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24gSWYgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdHMgb2YgdGhpcyBvYmplY3QKCSAqICAgICAgICAgYW5kIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGNhbm5vdCBiZSBhZGRlZC4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IGFkZChNZWFzdXJlbWVudCBtKSB7CgkJcmV0dXJuIG5ldyBNZWFzdXJlbWVudCh2YWx1ZSArIG0udmFsdWUsIGVycm9yICsgbS5lcnJvciwgdW5pdAoJCQkJLmFkZChtLnVuaXQpLCB0aW1lKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhpcwoJICogb2JqZWN0IGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCgkgKiAKCSAqIEBwYXJhbSBkIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYWRkZWQgd2l0aCB0aGlzIG9iamVjdC4KCSAqIEBwYXJhbSB1IFRoZSA8Y29kZT5Vbml0PC9jb2RlPiBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4KCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhpcwoJICogICAgICAgICBvYmplY3QgYWRkZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gVGhlIHVuaXQgb2YgdGhlIG5ldyBvYmplY3QKCSAqICAgICAgICAgaXMgY29tcHV0ZWQuIFRoZSBlcnJvciBhbmQgdGltZSBvZiB0aGUgbmV3IG9iamVjdCBpcyBzZXQgdG8gdGhlCgkgKiAgICAgICAgIGVycm9yIGFuZCB0aW1lIG9mIHRoaXMgb2JqZWN0LgoJICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uIElmIHRoZSA8Y29kZT5Vbml0PC9jb2RlPiBvYmplY3RzIG9mIHRoaXMgb2JqZWN0CgkgKiAgICAgICAgIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlIGNhbm5vdCBiZSBhZGRlZC4KCSAqIEBzZWUgVW5pdAoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQgYWRkKGRvdWJsZSBkLCBVbml0IHUpIHsKCQlyZXR1cm4gbmV3IE1lYXN1cmVtZW50KHZhbHVlICsgZCwgZXJyb3IsIHVuaXQuYWRkKHUpLCB0aW1lKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhpcwoJICogb2JqZWN0IGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCgkgKiAKCSAqIEBwYXJhbSBkIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgYWRkZWQgd2l0aCB0aGlzIG9iamVjdC4KCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBzdW0gb2YgdGhpcwoJICogICAgICAgICBvYmplY3QgYWRkZWQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gVGhlIGVycm9yLCB1bml0LCBhbmQgdGltZSBvZgoJICogICAgICAgICB0aGUgbmV3IG9iamVjdCBpcyBzZXQgdG8gdGhlIGVycm9yLCA8Y29kZT5Vbml0PC9jb2RlPiBhbmQgdGltZSBvZgoJICogICAgICAgICB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IGFkZChkb3VibGUgZCkgewoJCXJldHVybiBuZXcgTWVhc3VyZW1lbnQodmFsdWUgKyBkLCBlcnJvciwgdW5pdCwgdGltZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCBpcyB0aGUgc3VidHJhY3Rpb24gb2YKCSAqIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhpcyBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBtIFRoZSA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20KCSAqICAgICAgICB0aGlzIG9iamVjdC4KCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCB0aGF0IGlzIHRoZSBzdWJ0cmFjdGlvbiBvZgoJICogICAgICAgICB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoaXMgb2JqZWN0LiBUaGUgZXJyb3IgYW5kIHVuaXQgb2YgdGhlCgkgKiAgICAgICAgIG5ldyBvYmplY3QgYXJlIGNvbXB1dGVkLiBUaGUgdGltZSBvZiB0aGUgbmV3IG9iamVjdCBpcyBzZXQgdG8gdGhlCgkgKiAgICAgICAgIHRpbWUgb2YgdGhpcyBvYmplY3QuCgkgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24gSWYgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdHMgb2YgdGhpcyBvYmplY3QKCSAqICAgICAgICAgYW5kIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGNhbm5vdCBiZSBzdWJ0cmFjdGVkLgoJICogQHNlZSBVbml0CgkgKi8KCXB1YmxpYyBNZWFzdXJlbWVudCBzdWIoTWVhc3VyZW1lbnQgbSkgewoJCXJldHVybiBuZXcgTWVhc3VyZW1lbnQodmFsdWUgLSBtLnZhbHVlLCBlcnJvciArIG0uZXJyb3IsIHVuaXQKCQkJCS5zdWIobS51bml0KSwgdGltZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCBpcyB0aGUgc3VidHJhY3Rpb24gb2YKCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGlzIG9iamVjdC4KCSAqIAoJICogQHBhcmFtIGQgVGhlIHZhbHVlIHRoYXQgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhpcyBvYmplY3QuCgkgKiBAcGFyYW0gdSBUaGUgPGNvZGU+VW5pdDwvY29kZT4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCgkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgdGhhdCBpcyB0aGUgc3VidHJhY3Rpb24gb2YKCSAqICAgICAgICAgdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIHRoaXMgb2JqZWN0LiBUaGUgdW5pdCBvZiB0aGUgbmV3IG9iamVjdAoJICogICAgICAgICBpcyBjb21wdXRlZC4gVGhlIGVycm9yIGFuZCB0aW1lIG9mIHRoZSBuZXcgb2JqZWN0IGlzIHNldCB0byB0aGUKCSAqICAgICAgICAgZXJyb3IgYW5kIHRpbWUgb2YgdGhpcyBvYmplY3QuCgkgKiBAdGhyb3dzIEFyaXRobWV0aWNFeGNlcHRpb24gSWYgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdHMgb2YgdGhpcyBvYmplY3QKCSAqICAgICAgICAgYW5kIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGNhbm5vdCBiZSBzdWJ0cmFjdGVkLgoJICogQHNlZSBVbml0CgkgKi8KCXB1YmxpYyBNZWFzdXJlbWVudCBzdWIoZG91YmxlIGQsIFVuaXQgdSkgewoJCXJldHVybiBuZXcgTWVhc3VyZW1lbnQodmFsdWUgLSBkLCBlcnJvciwgdW5pdC5zdWIodSksIHRpbWUpOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIG5ldyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHN1YnRyYWN0aW9uIG9mCgkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlIGZyb20gdGhpcyBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBkIFRoZSB2YWx1ZSB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCBmcm9tIHRoaXMgb2JqZWN0LgoJICogQHJldHVybiBBIG5ldyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHRoYXQgaXMgdGhlIHN1YnRyYWN0aW9uIG9mCgkgKiAgICAgICAgIHRoZSBzcGVjaWZpZWQgdmFsdWUgZnJvbSB0aGlzIG9iamVjdC4gVGhlIGVycm9yLCB1bml0IGFuZCB0aW1lIG9mCgkgKiAgICAgICAgIHRoZSBuZXcgb2JqZWN0IGlzIHNldCB0byB0aGUgZXJyb3IsIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdCBhbmQKCSAqICAgICAgICAgdGltZSBvZiB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IHN1Yihkb3VibGUgZCkgewoJCXJldHVybiBuZXcgTWVhc3VyZW1lbnQodmFsdWUgLSBkLCBlcnJvciwgdW5pdCwgdGltZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoaXMgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+CgkgKiBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0LgoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCWlmIChuYW1lID09IG51bGwpIHsKCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoJCQlzYi5hcHBlbmQodmFsdWUpOwoJCQlpZiAoZXJyb3IgIT0gMC4wZCkgewoJCQkJc2IuYXBwZW5kKCIgKy8tICIpOwoJCQkJc2IuYXBwZW5kKGVycm9yKTsKCQkJfQoJCQlTdHJpbmcgdSA9IHVuaXQudG9TdHJpbmcoKTsKCQkJaWYgKHUubGVuZ3RoKCkgPiAwKSB7CgkJCQlzYi5hcHBlbmQoIiAiKTsKCQkJCXNiLmFwcGVuZCh1KTsKCQkJfQoJCQluYW1lID0gc2IudG9TdHJpbmcoKTsKCQl9CgkJcmV0dXJuIG5hbWU7Cgl9CgoJLyoqCgkgKiBDb21wYXJlcyB0aGlzIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZvciBvcmRlci4gUmV0dXJucyBhCgkgKiBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgaWYgdGhpcyBvYmplY3QgaXMgbGVzcwoJICogdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBOb3RlOiBUaGlzIGNsYXNzIGhhcyBhIG5hdHVyYWwgb3JkZXJpbmcgdGhhdCBpcyBpbmNvbnNpc3RlbnQgd2l0aCBlcXVhbHMuCgkgKiBGb3IgdGhpcyBtZXRob2QsIGFub3RoZXIgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBpcyBjb25zaWRlcmVkCgkgKiBlcXVhbCBpZiB0aGVyZSBpcyBzb21lIDxjb2RlPng8L2NvZGU+IHN1Y2ggdGhhdAoJICogCgkgKiA8cHJlPgoJICogZ2V0VmFsdWUoKSAtIGdldEVycm9yKCkgJmx0Oz0geCAmbHQ7PSBnZXRWYWx1ZSgpICsgZ2V0RXJyb3IoKQoJICogPC9wcmU+CgkgKiAKCSAqIGZvciBib3RoIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3RzIGJlaW5nIGNvbXBhcmVkLgoJICogCgkgKiBAcGFyYW0gb2JqIFRoZSBvYmplY3QgdG8gYmUgY29tcGFyZWQuCgkgKiBAcmV0dXJuIEEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIHRoaXMgb2JqZWN0IGlzCgkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KCSAqIAoJICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gSWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm90IG9mIHR5cGUKCSAqICAgICAgICAgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+LgoJICogQHRocm93cyBBcml0aG1ldGljRXhjZXB0aW9uIElmIHRoZSB1bml0IG9mIHRoZSBzcGVjaWZpZWQKCSAqICAgICAgICAgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBpcyBub3QgZXF1YWwgdG8gdGhlIDxjb2RlPlVuaXQ8L2NvZGU+CgkgKiAgICAgICAgIG9iamVjdCBvZiB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG9iaikgewoJCWlmICh0aGlzID09IG9iaikgewoJCQlyZXR1cm4gMDsKCQl9CgkJTWVhc3VyZW1lbnQgdGhhdCA9IChNZWFzdXJlbWVudCkgb2JqOwoJCWlmICghdW5pdC5lcXVhbHModGhhdC51bml0KSkgewoJCQl0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiQ2Fubm90IGNvbXBhcmUgIiArIHRoaXMgKyAiIGFuZCAiCgkJCQkJKyB0aGF0KTsKCQl9CgkJaWYgKHZhbHVlID09IHRoYXQudmFsdWUpIHsKCQkJcmV0dXJuIDA7CgkJfQoJCWlmICh2YWx1ZSA8IHRoYXQudmFsdWUpIHsKCQkJaWYgKCh2YWx1ZSArIGVycm9yKSA+PSAodGhhdC52YWx1ZSAtIHRoYXQuZXJyb3IpKSB7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCQllbHNlIHsKCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KCQllbHNlIHsKCQkJaWYgKCh2YWx1ZSAtIGVycm9yKSA8PSAodGhhdC52YWx1ZSArIHRoYXQuZXJyb3IpKSB7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCQllbHNlIHsKCQkJCXJldHVybiAxOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gQSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgoJICovCglwdWJsaWMgaW50IGhhc2hDb2RlKCkgewoJCWxvbmcgYml0cyA9IERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHZhbHVlICsgZXJyb3IpOwoJCXJldHVybiAoKGludCkgKGJpdHMgXiAoYml0cyA+Pj4gMzIpKSkgXiB1bml0Lmhhc2hDb2RlKCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBvYmplY3QuIFR3bwoJICogPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBzYW1lIHZhbHVlLCBlcnJvcgoJICogYW5kIDxjb2RlPlVuaXQ8L2NvZGU+LgoJICogCgkgKiA8cD4KCSAqIE5vdGU6IFRoaXMgY2xhc3MgaGFzIGEgbmF0dXJhbCBvcmRlcmluZyB0aGF0IGlzIGluY29uc2lzdGVudCB3aXRoIGVxdWFscy4KCSAqIFNlZSB7QGxpbmsgI2NvbXBhcmVUb30uCgkgKiAKCSAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0OwoJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewoJCWlmICh0aGlzID09IG9iaikgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKCEob2JqIGluc3RhbmNlb2YgTWVhc3VyZW1lbnQpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJTWVhc3VyZW1lbnQgdGhhdCA9IChNZWFzdXJlbWVudCkgb2JqOwoJCXJldHVybiAodmFsdWUgPT0gdGhhdC52YWx1ZSkgJiYgKGVycm9yID09IHRoYXQuZXJyb3IpCgkJCQkmJiB1bml0LmVxdWFscyh0aGF0LnVuaXQpOwoJfQp9ClBLAwQKAAAAAABrUu40NkAFY1MOAABTDgAAMQAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1N0YXRlLmphdmEvKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS51dGlsLm1lYXN1cmVtZW50L3NyYy9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1N0YXRlLmphdmEsdiAxLjggMjAwNi8wNi8xNiAxNjozMTozNCBoYXJncmF2ZSBFeHAgJAogKgogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCnBhY2thZ2Ugb3JnLm9zZ2kudXRpbC5tZWFzdXJlbWVudDsKCi8qKgogKiBHcm91cHMgYSBzdGF0ZSBuYW1lLCB2YWx1ZSBhbmQgdGltZXN0YW1wLgogKiAKICogPHA+CiAqIFRoZSBzdGF0ZSBpdHNlbGYgaXMgcmVwcmVzZW50ZWQgYXMgYW4gaW50ZWdlciBhbmQgdGhlIHRpbWUgaXMgbWVhc3VyZWQgaW4KICogbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsIDE5NzAgVVRDLgogKiAKICogPHA+CiAqIEEgPGNvZGU+U3RhdGU8L2NvZGU+IG9iamVjdCBpcyBpbW11dGFibGUgc28gdGhhdCBpdCBtYXkgYmUgZWFzaWx5IHNoYXJlZC4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS44ICQKICovCnB1YmxpYyBjbGFzcyBTdGF0ZSB7CglmaW5hbCBpbnQJCXZhbHVlOwoJZmluYWwgbG9uZwkJdGltZTsKCWZpbmFsIFN0cmluZwluYW1lOwoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IDxjb2RlPlN0YXRlPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0YXRlLgoJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN0YXRlLgoJICogQHBhcmFtIHRpbWUgVGhlIHRpbWUgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LCBKYW51YXJ5IDEsCgkgKiAgICAgICAgMTk3MCBVVEMuCgkgKi8KCXB1YmxpYyBTdGF0ZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBsb25nIHRpbWUpIHsKCQl0aGlzLnZhbHVlID0gdmFsdWU7CgkJdGhpcy5uYW1lID0gbmFtZTsKCQl0aGlzLnRpbWUgPSB0aW1lOwoJfQoKCS8qKgoJICogQ3JlYXRlIGEgbmV3IDxjb2RlPlN0YXRlPC9jb2RlPiBvYmplY3Qgd2l0aCBhIHRpbWUgb2YgMC4KCSAqIAoJICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgc3RhdGUuCgkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3RhdGUuCgkgKi8KCXB1YmxpYyBTdGF0ZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7CgkJdGhpcyh2YWx1ZSwgbmFtZSwgMCk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGlzIDxjb2RlPlN0YXRlPC9jb2RlPi4KCSAqIAoJICogQHJldHVybiBUaGUgdmFsdWUgb2YgdGhpcyA8Y29kZT5TdGF0ZTwvY29kZT4gb2JqZWN0LgoJICovCglwdWJsaWMgZmluYWwgaW50IGdldFZhbHVlKCkgewoJCXJldHVybiB2YWx1ZTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHRpbWUgd2l0aCB3aGljaCB0aGlzIDxjb2RlPlN0YXRlPC9jb2RlPiB3YXMgY3JlYXRlZC4KCSAqIAoJICogQHJldHVybiBUaGUgdGltZSB3aXRoIHdoaWNoIHRoaXMgPGNvZGU+U3RhdGU8L2NvZGU+IHdhcyBjcmVhdGVkLiBUaGUgdGltZQoJICogICAgICAgICBpcyBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbnVhcnkgMSwgMTk3MCBVVEMuCgkgKi8KCXB1YmxpYyBmaW5hbCBsb25nIGdldFRpbWUoKSB7CgkJcmV0dXJuIHRpbWU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgPGNvZGU+U3RhdGU8L2NvZGU+LgoJICogCgkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoaXMgPGNvZGU+U3RhdGU8L2NvZGU+IG9iamVjdC4KCSAqLwoJcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewoJCXJldHVybiBuYW1lOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBhIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGlzIG9iamVjdC4KCSAqLwoJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CgkJc2IuYXBwZW5kKHZhbHVlKTsKCQlpZiAobmFtZSAhPSBudWxsKSB7CgkJCXNiLmFwcGVuZCgiIFwiIik7CgkJCXNiLmFwcGVuZChuYW1lKTsKCQkJc2IuYXBwZW5kKCJcIiIpOwoJCX0KCQlyZXR1cm4gKHNiLnRvU3RyaW5nKCkpOwoJfQoKCS8qKgoJICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gQSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgoJICovCglwdWJsaWMgaW50IGhhc2hDb2RlKCkgewoJCWludCBoYXNoID0gdmFsdWU7CgkJaWYgKG5hbWUgIT0gbnVsbCkgewoJCQloYXNoIF49IG5hbWUuaGFzaENvZGUoKTsKCQl9CgkJcmV0dXJuIGhhc2g7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIG9iamVjdC4gVHdvCgkgKiA8Y29kZT5TdGF0ZTwvY29kZT4gb2JqZWN0cyBhcmUgZXF1YWwgaWYgdGhleSBoYXZlIHNhbWUgdmFsdWUgYW5kIG5hbWUuCgkgKiAKCSAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QuCgkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgb2JqZWN0OwoJICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgoJICovCglwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewoJCWlmICh0aGlzID09IG9iaikgewoJCQlyZXR1cm4gdHJ1ZTsKCQl9CgkJaWYgKCEob2JqIGluc3RhbmNlb2YgU3RhdGUpKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJU3RhdGUgdGhhdCA9IChTdGF0ZSkgb2JqOwoJCWlmICh2YWx1ZSAhPSB0aGF0LnZhbHVlKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaWYgKG5hbWUgPT0gdGhhdC5uYW1lKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlpZiAobmFtZSA9PSBudWxsKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJcmV0dXJuIG5hbWUuZXF1YWxzKHRoYXQubmFtZSk7Cgl9Cn0KUEsDBAoAAAAAAGtS7jQUzDclTEIAAExCAAAwAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvVW5pdC5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kudXRpbC5tZWFzdXJlbWVudC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0LmphdmEsdiAxLjE1IDIwMDYvMDYvMTYgMTY6MzE6MzQgaGFyZ3JhdmUgRXhwICQKICoKICogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDAyLCAyMDA2KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICoKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwpwYWNrYWdlIG9yZy5vc2dpLnV0aWwubWVhc3VyZW1lbnQ7CgppbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKCi8qKgogKiBBIHVuaXQgc3lzdGVtIGZvciBtZWFzdXJlbWVudHMuCiAqIAogKiBUaGlzIGNsYXNzIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHRoZSBtb3N0IGNvbW1vbiBTSSB1bml0cy4KICogPHA+CiAqIAogKiA8cD4KICogVGhpcyBjbGFzcyBvbmx5IHN1cHBvcnQgZXhwb25lbnRzIGZvciB0aGUgYmFzZSBTSSB1bml0cyBpbiB0aGUgcmFuZ2UgLTY0IHRvCiAqICs2My4gQW55IG9wZXJhdGlvbiB3aGljaCBwcm9kdWNlcyBhbiBleHBvbmVudCBvdXRzaWRlIG9mIHRoaXMgcmFuZ2Ugd2lsbAogKiByZXN1bHQgaW4gYSA8Y29kZT5Vbml0PC9jb2RlPiBvYmplY3Qgd2l0aCB1bmRlZmluZWQgZXhwb25lbnRzLgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjE1ICQKICovCi8qCiAqIFRoaXMgbG9jYWwgY2xhc3MgbWFpbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB1bml0cy4gSXQgY2FuIGNhbGN1bGF0ZSBuZXcKICogdW5pdHMgd2hlbiB0d28gdmFsdWVzIGFyZSBtdWx0aXBsaWVkLCBkaXZpZGVkLCBhZGRlZCBvciBzdWJ0cmFjdGVkLiA8cD4gVGhlCiAqIHVuaXQgd29ya3Mgd2l0aCB0aGUgNyBiYXNpYyBTSSB0eXBlcyArIHJhZCArIHVwIHRvIDJeNiBjdXN0b20gdHlwZXMuIEZvciBlYWNoCiAqIHR5cGUsIHRoZSB1bml0IGtlZXBzIGEgYml0IG1hc2sgd2l0aCB0aGUgZXhwb25lbnRzIG9mIHRoZSBiYXNpYyB0eXBlcy4gRWcuCiAqIG0vcyBpcyBtID0gMSwgcyA9IC0xLiBNdWx0aXBseWluZyBvbmUgdW5pdCB3aXRoIGFub3RoZXIgbWVhbnMgdGhhdCB0aGUgYml0CiAqIG1hc2tzIGFyZSBhZGRlZCwgZGl2aWRpbmcgbWVhbnMgdGhhdCB0aGUgYml0IG1hc2tzIGFyZSBzdWJ0cmFjdGVkLiA8cD4gVGhpcwogKiBjbGFzcyBjYW4gaGFuZGxlIGFueSByZWFzb25hYmxlIGNvbWJpbmF0aW9uIG9mIFNJIHVuaXRzLiBIb3dldmVyLCBpdCB3aWxsCiAqIGFsd2F5cyB0cnkgdG8gY29lcmNlIHJlc3VsdHMgYmFjayBpbnRvIHRoZSBiYXNpYyBzZXQuIEUuZy4gd2hlbiB5b3UgZG8gVipBCiAqIHlvdSBzaG91bGQgZ2V0IFcgYW5kIG5vdCBtMi5rZy9zMyAuIE9ubHkgd2hlbiB0aGUgZXhpc3RpbmcgdHlwZXMgZG8gbm90IG1hdGNoCiAqIGRvZXMgdGhlIHVuaXQgZmFsbGJhY2sgdG8gdGhlIGV4cGFuZGVkIGZvcm0uIDxwPiBUaGlzIGNsYXNzIHVzZXMgb2Zmc2V0CiAqIGFyaXRobWV0aWMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwb25lbnRzIGFyZSBzdG9yZWQgaW4gYW4gbG9uZy4gVGhlIHNwZWNpYWwKICogZmllbGQgaXMgdXNlZCBmb3IgdW5pdHMgdGhhdCBzaG91bGQgbm90IGJlIGFyaXRobWV0aWNhbGx5IGRpdmlkZWQgb3IKICogbXVsdGlwbGllZCwgbGlrZSBsb25naXR1ZGUgYW5kIGxhdHRpdHVkZS4gVGhlc2Ugc3BlY2lhbCB1bml0cyBjYW4gaG93ZXZlciwgYmUKICogZGl2aWRlZCBhbmQgbXVsdGlwbGllZCBieSB0aGUgYmFzaWMgNyBjb25zdGFudHMgb2YgdGhlIFNJLCBlLmcuIGRlZy9zLgogKi8KcHVibGljIGNsYXNzIFVuaXQgewoJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZwlVTklUWQkJPSBjcmVhdGVUeXBlKDAsIDAsIDAsIDAsIDAsIDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwKTsKCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcJWkVSTwkJPSAweDQwTDsKCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcJTUFTSwkJPSAweDdmTDsKCXByaXZhdGUgZmluYWwgc3RhdGljIGludAltX1NISUZUCQk9IDA7Cglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJc19TSElGVAkJPSA3OwoJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50CWtnX1NISUZUCT0gMTQ7Cglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJS19TSElGVAkJPSAyMTsKCXByaXZhdGUgZmluYWwgc3RhdGljIGludAlBX1NISUZUCQk9IDI4OwoJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50CW1vbF9TSElGVAk9IDM1OwoJcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50CWNkX1NISUZUCT0gNDI7Cglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJcmFkX1NISUZUCT0gNDk7Cglwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQJeF9TSElGVAkJPSA1NjsKCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcJeF9NQVNLCQk9IE1BU0sgPDwgeF9TSElGVDsKCS8qKiBObyBVbml0IChVbml0eSkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAl1bml0eQkJPSBuZXcgVW5pdCgiIiwgVU5JVFkpOwkJCQkJLy8gVW5pdHkKCS8qIFNJIEJhc2UgVW5pdHMgKi8KCS8qKiBUaGUgbGVuZ3RoIHVuaXQgbWV0ZXIgKG0pICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJbQkJCT0gbmV3IFVuaXQoIm0iLCBjcmVhdGVUeXBlKDAsIDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAwLCAwLCAxKSk7CQkJLy8gRGlzdGFuY2UKCS8vIG1ldGVyCgkvKiogVGhlIHRpbWUgdW5pdCBzZWNvbmQgKHMpICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJcwkJCT0gbmV3IFVuaXQoInMiLCBjcmVhdGVUeXBlKDAsIDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAwLCAxLCAwKSk7CQkJLy8gVGltZQoJLy8gU2Vjb25kcwoJLy8gcwoJLyoqIFRoZSBtYXNzIHVuaXQga2lsb2dyYW0gKGtnKSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CWtnCQkJPSBuZXcgVW5pdCgia2ciLCBjcmVhdGVUeXBlKDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAwLCAxLCAwLCAwKSk7CQkJLy8gTWFzcwoJLy8ga2lsb2dyYW0KCS8vIGtnCgkvKiogVGhlIHRlbXBlcmF0dXJlIHVuaXQga2VsdmluIChLKSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CUsJCQk9IG5ldyBVbml0KCJLIiwgY3JlYXRlVHlwZSgwLCAwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMSwgMCwgMCwgMCkpOwkJCS8vIFRlbXBlcmF0dXJlCgkvLyBrZWx2aW4KCS8vIEsKCS8qKiBUaGUgZWxlY3RyaWMgY3VycmVudCB1bml0IGFtcGVyZSAoQSkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAlBCQkJPSBuZXcgVW5pdCgiQSIsIGNyZWF0ZVR5cGUoMCwgMCwgMCwKCQkJCQkJCQkJCQkJCTAsIDEsIDAsIDAsIDAsIDApKTsJCQkvLyBDdXJyZW50CgkvLyBhbXBlcmUKCS8vIEEKCS8qKiBUaGUgYW1vdW50IG9mIHN1YnN0YW5jZSB1bml0IG1vbGUgKG1vbCkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAltb2wJCQk9IG5ldyBVbml0KCJtb2wiLCBjcmVhdGVUeXBlKDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAxLCAwLCAwLCAwLCAwLCAwKSk7CQkJLy8gU3Vic3RhbmNlCgkvLyBtb2xlCgkvLyBtb2wKCS8qKiBUaGUgbHVtaW5vdXMgaW50ZW5zaXR5IHVuaXQgY2FuZGVsYSAoY2QpICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJY2QJCQk9IG5ldyBVbml0KCJjZCIsIGNyZWF0ZVR5cGUoMCwgMCwKCQkJCQkJCQkJCQkJCTEsIDAsIDAsIDAsIDAsIDAsIDApKTsJCQkvLyBMaWdodAoJLy8gY2FuZGVsYQoJLy8gY2QKCS8qIFNJIERlcml2ZWQgVW5pdHMgKi8KCS8qKiBUaGUgc3BlZWQgdW5pdCBtZXRlciBwZXIgc2Vjb25kIChtL3MpICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJbV9zCQkJPSBuZXcgVW5pdCgibS9zIiwgY3JlYXRlVHlwZSgwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMCwgMCwgMCwgLTEsIDEpKTsJCS8vIFNwZWVkCgkvLyBtL3MKCS8qKiBUaGUgYWNjZWxlcmF0aW9uIHVuaXQgbWV0ZXIgcGVyIHNlY29uZCBzcXVhcmVkIChtL3MgPHN1cD4yIDwvc3VwPikgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAltX3MyCQk9IG5ldyBVbml0KCJtL3MyIiwgY3JlYXRlVHlwZSgwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMCwgMCwgMCwgLTIsIDEpKTsJCS8vIEFjY2VsZXJhdGlvbgoJLy8gbS9zXjIKCS8qKiBUaGUgYXJlYSB1bml0IHNxdWFyZSBtZXRlcihtIDxzdXA+MiA8L3N1cD4pICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJbTIJCQk9IG5ldyBVbml0KCJtMiIsIGNyZWF0ZVR5cGUoMCwgMCwKCQkJCQkJCQkJCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDIpKTsJCQkvLyBTdXJmYWNlCgkvLyBtXjIKCS8qKiBUaGUgdm9sdW1lIHVuaXQgY3ViaWMgbWV0ZXIgKG0gPHN1cD4zIDwvc3VwPikgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAltMwkJCT0gbmV3IFVuaXQoIm0zIiwgY3JlYXRlVHlwZSgwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMCwgMCwgMCwgMCwgMykpOwkJCS8vIFZvbHVtZQoJLy8gbV4zCgkvKioKCSAqIFRoZSBmcmVxdWVuY3kgdW5pdCBoZXJ0eiAoSHopLgoJICogPHA+CgkgKiBoZXJ0eiBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMgMS9zCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAlIegkJCT0gbmV3IFVuaXQoIkh6IiwgY3JlYXRlVHlwZSgwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMCwgMCwgMCwgLTEsIDApKTsJCS8vIEZyZXF1ZW5jeQoJLy8gMS9zCgkvKioKCSAqIFRoZSBmb3JjZSB1bml0IG5ld3RvbiAoTikuCgkgKiA8cD4KCSAqIE4gaXMgZXhwcmVzc2VkIGluIFNJIHVuaXRzIGFzIG0mIzE4MztrZy9zIDxzdXA+MiA8L3N1cD4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CU4JCQk9IG5ldyBVbml0KCJOIiwgY3JlYXRlVHlwZSgwLCAwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMCwgMSwgLTIsIDEpKTsJCQkvLyBGb3JjZQoJLy8gbmV3dG9uCgkvLyAobSprZykvc14yCgkvKioKCSAqIFRoZSBwcmVzc3VyZSB1bml0IHBhc2NhbCAoUGEpLgoJICogPHA+CgkgKiBQYSBpcyBlcXVhbCB0byBOL20gPHN1cD4yIDwvc3VwPiBvciBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMKCSAqIGtnL20mIzE4MztzIDxzdXA+MiA8L3N1cD4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CVBhCQkJPSBuZXcgVW5pdCgiUGEiLCBjcmVhdGVUeXBlKDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAwLCAxLCAtMiwgLTEpKTsJCS8vIFByZXNzdXJlCgkvLyBwYXNjYWwKCS8vIGtnLyhtKnNeMikKCS8qKgoJICogVGhlIGVuZXJneSB1bml0IGpvdWxlIChKKS4KCSAqIDxwPgoJICogam91bGUgaXMgZXF1YWwgdG8gTiYjMTgzO20gb3IgaXMgZXhwcmVzc2VkIGluIFNJIHVuaXRzIGFzIG0gPHN1cD4yCgkgKiA8L3N1cD4mIzE4MztrZy9zIDxzdXA+MgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJSgkJCT0gbmV3IFVuaXQoIkoiLCBjcmVhdGVUeXBlKDAsIDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAxLCAtMiwgMikpOwkJCS8vIEVuZXJneQoJLy8gam91bGUKCS8vIChtXjIqa2cpL3NeMgoJLyoqCgkgKiBUaGUgcG93ZXIgdW5pdCB3YXR0IChXKS4KCSAqIDxwPgoJICogd2F0dCBpcyBlcXVhbCB0byBKL3Mgb3IgaXMgZXhwcmVzc2VkIGluIFNJIHVuaXRzIGFzIG0gPHN1cD4yCgkgKiA8L3N1cD4mIzE4MztrZy9zIDxzdXA+MyA8L3N1cD4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CVcJCQk9IG5ldyBVbml0KCJXIiwgY3JlYXRlVHlwZSgwLCAwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgMCwgMSwgLTMsIDIpKTsJCQkvLyBQb3dlcgoJLy8gd2F0dAoJLy8gKG1eMiprZykvc14zCgkvKioKCSAqIFRoZSBlbGVjdHJpYyBjaGFyZ2UgdW5pdCBjb3Vsb21iIChDKS4KCSAqIDxwPgoJICogY291bG9tYiBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMgcyYjMTgzO0EKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CUMJCQk9IG5ldyBVbml0KCJDIiwgY3JlYXRlVHlwZSgwLCAwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMSwgMCwgMCwgMSwgMCkpOwkJCS8vIENoYXJnZQoJLy8gY291bHVtYgoJLy8gcypBCgkvKioKCSAqIFRoZSBlbGVjdHJpYyBwb3RlbnRpYWwgZGlmZmVyZW5jZSB1bml0IHZvbHQgKFYpLgoJICogPHA+CgkgKiB2b2x0IGlzIGVxdWFsIHRvIFcvQSBvciBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMgbSA8c3VwPjIKCSAqIDwvc3VwPiYjMTgzO2tnL3MgPHN1cD4zIDwvc3VwPiYjMTgzO0EKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CVYJCQk9IG5ldyBVbml0KCJWIiwgY3JlYXRlVHlwZSgwLCAwLCAwLAoJCQkJCQkJCQkJCQkJMCwgLTEsIDAsIDEsIC0zLCAyKSk7CQkJLy8gRWwuCgkvLyBQb3RlbnQuCgkvLyB2b2x0CgkvLyAobV4yKmtnKS8oc14zKkEpCgkvKioKCSAqIFRoZSBjYXBhY2l0YW5jZSB1bml0IGZhcmFkIChGKS4KCSAqIDxwPgoJICogZmFyYWQgaXMgZXF1YWwgdG8gQy9WIG9yIGlzIGV4cHJlc3NlZCBpbiBTSSB1bml0cyBhcyBzIDxzdXA+NAoJICogPC9zdXA+JiMxODM7QSA8c3VwPjIgPC9zdXA+L20gPHN1cD4yIDwvc3VwPiYjMTgzO2tnCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAlGCQkJPSBuZXcgVW5pdCgiRiIsIGNyZWF0ZVR5cGUoMCwgMCwgMCwKCQkJCQkJCQkJCQkJCTAsIDIsIDAsIC0xLCA0LCAtMikpOwkJCS8vIENhcGFjaXRhbmNlCgkvLyBmYXJhZAoJLy8gKHNeNCpBXjIpLyhtXjIqa2cpCgkvKioKCSAqIFRoZSBlbGVjdHJpYyByZXNpc3RhbmNlIHVuaXQgb2htLgoJICogPHA+CgkgKiBvaG0gaXMgZXF1YWwgdG8gVi9BIG9yIGlzIGV4cHJlc3NlZCBpbiBTSSB1bml0cyBhcyBtIDxzdXA+MgoJICogPC9zdXA+JiMxODM7a2cvcyA8c3VwPjMgPC9zdXA+JiMxODM7QSA8c3VwPjIgPC9zdXA+CgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAlPaG0JCQk9IG5ldyBVbml0KCJPaG0iLCBjcmVhdGVUeXBlKDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAtMiwgMCwgMSwgLTMsIDIpKTsJCS8vIFJlc2lzdGFuY2UKCS8vIG9obQoJLy8gKG1eMiprZykvKHNeMypBXjIpCgkvKioKCSAqIFRoZSBlbGVjdHJpYyBjb25kdWN0YW5jZSB1bml0IHNpZW1lbnMgKFMpLgoJICogPHA+CgkgKiBzaWVtZW5zIGlzIGVxdWFsIHRvIEEvViBvciBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMgcyA8c3VwPjMKCSAqIDwvc3VwPiYjMTgzO0EgPHN1cD4yIDwvc3VwPi9tIDxzdXA+MiA8L3N1cD4mIzE4MztrZwoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJUwkJCT0gbmV3IFVuaXQoIlMiLCBjcmVhdGVUeXBlKDAsIDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAyLCAwLCAtMSwgMywgLTIpKTsJCQkvLyBDb25kdWN0YW5jZQoJLy8gc2llbWVucwoJLy8gKHNeMypBXjIpLyhtXjIqa2cpCgkvKioKCSAqIFRoZSBtYWduZXRpYyBmbHV4IHVuaXQgd2ViZXIgKFdiKS4KCSAqIDxwPgoJICogd2ViZXIgaXMgZXF1YWwgdG8gViYjMTgzO3Mgb3IgaXMgZXhwcmVzc2VkIGluIFNJIHVuaXRzIGFzIG0gPHN1cD4yCgkgKiA8L3N1cD4mIzE4MztrZy9zIDxzdXA+MiA8L3N1cD4mIzE4MztBCgkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAlXYgkJCT0gbmV3IFVuaXQoIldiIiwgY3JlYXRlVHlwZSgwLCAwLAoJCQkJCQkJCQkJCQkJMCwgMCwgLTEsIDAsIDEsIC0yLCAyKSk7CQkvLyBNYWduLgoJLy8gRmx1eAoJLy8gd2ViZXIKCS8vIChtXjIqa2cpLyhzXjIqQSkKCS8qKgoJICogVGhlIG1hZ25ldGljIGZsdXggZGVuc2l0eSB1bml0IHRlc2xhIChUKS4KCSAqIDxwPgoJICogdGVzbGEgaXMgZXF1YWwgdG8gV2IvbSA8c3VwPjIgPC9zdXA+IG9yIGlzIGV4cHJlc3NlZCBpbiBTSSB1bml0cyBhcyBrZy9zCgkgKiA8c3VwPjIgPC9zdXA+JiMxODM7QQoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJVAkJCT0gbmV3IFVuaXQoIlQiLCBjcmVhdGVUeXBlKDAsIDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAtMSwgMCwgMSwgLTIsIDApKTsJCQkvLyBNYWduLgoJLy8gRmx1eAoJLy8gRGVucy4KCS8vIHRlc2xhCgkvLyBrZy8oc14yKkEpCgkvKioKCSAqIFRoZSBpbGx1bWluYW5jZSB1bml0IGx1eCAobHgpLgoJICogPHA+CgkgKiBsdXggaXMgZXhwcmVzc2VkIGluIFNJIHVuaXRzIGFzIGNkL20gPHN1cD4yIDwvc3VwPgoJICovCglwdWJsaWMgZmluYWwgc3RhdGljIFVuaXQJbHgJCQk9IG5ldyBVbml0KCJseCIsIGNyZWF0ZVR5cGUoMCwgMCwKCQkJCQkJCQkJCQkJCTEsIDAsIDAsIDAsIDAsIDAsIC0yKSk7CQkvLyBJbGx1bWluYWNlCgkvLyBsdXgKCS8vIGNkL21eMgoJLyoqCgkgKiBUaGUgYWJzb3JiZWQgZG9zZSB1bml0IGdyYXkgKEd5KS4KCSAqIDxwPgoJICogR3kgaXMgZXF1YWwgdG8gSi9rZyBvciBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMgbSA8c3VwPjIgPC9zdXA+L3MKCSAqIDxzdXA+MiA8L3N1cD4KCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CUd5CQkJPSBuZXcgVW5pdCgiR3kiLCBjcmVhdGVUeXBlKDAsIDAsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAwLCAwLCAtMiwgMikpOwkJLy8gQWJzb3JiZWQKCS8vIGRvc2UKCS8vIGdyYXkKCS8vIG1eMi9zXjIKCS8qKgoJICogVGhlIGNhdGFseXRpYyBhY3Rpdml0eSB1bml0IGthdGFsIChrYXQpLgoJICogPHA+CgkgKiBrYXRhbCBpcyBleHByZXNzZWQgaW4gU0kgdW5pdHMgYXMgbW9sL3MKCSAqLwoJcHVibGljIGZpbmFsIHN0YXRpYyBVbml0CWthdAkJCT0gbmV3IFVuaXQoImthdCIsIGNyZWF0ZVR5cGUoMCwgMCwKCQkJCQkJCQkJCQkJCTAsIDEsIDAsIDAsIDAsIC0xLCAwKSk7CQkvLyBDYXRhbHl0aWMKCS8vIEFjdC4KCS8vIGthdGFsCgkvLyBtb2wvcwoJLyoqIFRoZSBhbmdsZSB1bml0IHJhZGlhbnMgKHJhZCkgKi8KCXB1YmxpYyBmaW5hbCBzdGF0aWMgVW5pdAlyYWQJCQk9IG5ldyBVbml0KCJyYWQiLCBjcmVhdGVUeXBlKDAsIDEsCgkJCQkJCQkJCQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwKSk7CQkJLy8gQW5nbGUKCS8vIHJhZGlhbnMKCS8vIHJhZAoJLyoqCgkgKiBBbiBhcnJheSBjb250YWluaW5nIGFsbCB1bml0cyBkZWZpbmVkLiBUaGUgZmlyc3Qgc2V2ZW4gaXRlbXMgbXVzdCBiZSBtLAoJICogcywga2csIEssIEEsIG1vbCwgY2QsIHJhZCBpbiB0aGlzIG9yZGVyIQoJICovCglwcml2YXRlIGZpbmFsIHN0YXRpYyBVbml0W10JYWxsVW5pdHMJPSBuZXcgVW5pdFtdIHttLCBzLCBrZywgSywgQSwgbW9sLAoJCQljZCwgcmFkLCBtX3MsIG1fczIsIG0yLCBtMywgSHosIE4sIFBhLCBKLCBXLCBDLCBWLCBGLCBPaG0sIFMsIFdiLAoJCQlULCBseCwgR3ksIGthdCwgdW5pdHkJCQl9OwoJcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlCWJhc2U7Cglwcml2YXRlIFN0cmluZwkJCQluYW1lOwoJcHJpdmF0ZSBsb25nCQkJCXR5cGU7CgoJLyoqCgkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlVuaXQ8L2NvZGU+IGluc3RhbmNlLgoJICogCgkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgPGNvZGU+VW5pdDwvY29kZT4KCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSA8Y29kZT5Vbml0PC9jb2RlPgoJICovCglwcml2YXRlIFVuaXQoU3RyaW5nIG5hbWUsIGxvbmcgdHlwZSkgewoJCXRoaXMubmFtZSA9IG5hbWU7CgkJdGhpcy50eXBlID0gdHlwZTsKCQkvL1N5c3RlbS5vdXQucHJpbnRsbiggbmFtZSArICIgIiArIExvbmcudG9IZXhTdHJpbmcoIHR5cGUgKSApOwoJfQoKCS8qKgoJICogQ3JlYXRlIGEgdHlwZSBmaWVsZCBmcm9tIHRoZSBiYXNlIFNJIHVuaXQgZXhwb25lbnQgdmFsdWVzLgoJICogIAoJICovCglwcml2YXRlIHN0YXRpYyBsb25nIGNyZWF0ZVR5cGUoaW50IHgsIGludCByYWQsIGludCBjZCwgaW50IG1vbCwgaW50IEEsCgkJCWludCBLLCBpbnQga2csIGludCBzLCBpbnQgbSkgewoJCXJldHVybiAoKChaRVJPICsgbSkgJiBNQVNLKSA8PCBtX1NISUZUKQoJCQkJfCAoKChaRVJPICsgcykgJiBNQVNLKSA8PCBzX1NISUZUKQoJCQkJfCAoKChaRVJPICsga2cpICYgTUFTSykgPDwga2dfU0hJRlQpCgkJCQl8ICgoKFpFUk8gKyBLKSAmIE1BU0spIDw8IEtfU0hJRlQpCgkJCQl8ICgoKFpFUk8gKyBBKSAmIE1BU0spIDw8IEFfU0hJRlQpCgkJCQl8ICgoKFpFUk8gKyBtb2wpICYgTUFTSykgPDwgbW9sX1NISUZUKQoJCQkJfCAoKChaRVJPICsgY2QpICYgTUFTSykgPDwgY2RfU0hJRlQpCgkJCQl8ICgoKFpFUk8gKyByYWQpICYgTUFTSykgPDwgcmFkX1NISUZUKQoJCQkJfCAoKChsb25nKSB4KSA8PCB4X1NISUZUKTsKCX0KCgkvKioKCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgPGNvZGU+VW5pdDwvY29kZT4gb2JqZWN0IGlzIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdC4gVGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwKCSAqIGlmIHRoZWlyIGV4cG9uZW50cyBhcmUgZXF1YWwuCgkgKiAKCSAqIEBwYXJhbSBvYmogdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IG9iamVjdCB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBlcXVhbGl0eQoJICogCgkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCA8Y29kZT5Vbml0PC9jb2RlPiBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcwoJICogICAgICAgICA8Y29kZT5Vbml0PC9jb2RlPiBvYmplY3QuCgkgKi8KCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CgkJaWYgKHRoaXMgPT0gb2JqKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCQlpZiAoIShvYmogaW5zdGFuY2VvZiBVbml0KSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiAoKFVuaXQpIG9iaikudHlwZSA9PSB0eXBlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4KCSAqIAoJICogQHJldHVybiBUaGlzIG9iamVjdCdzIGhhc2ggY29kZS4KCSAqLwoJcHVibGljIGludCBoYXNoQ29kZSgpIHsKCQlyZXR1cm4gKGludCkgKCh0eXBlID4+PiAzMikgXiB0eXBlKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+VW5pdDwvY29kZT4gdGhhdCBpcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhpcwoJICogPGNvZGU+VW5pdDwvY29kZT4gYW5kIHRoZSA8Y29kZT5Vbml0PC9jb2RlPiBzcGVjaWZpZWQKCSAqIAoJICogQHBhcmFtIHRoYXQgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhpcwoJICogICAgICAgIDxjb2RlPlVuaXQ8L2NvZGU+CgkgKiAKCSAqIEByZXR1cm4gYSBuZXcgPGNvZGU+VW5pdDwvY29kZT4gdGhhdCBpcyB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhpcwoJICogICAgICAgICA8Y29kZT5Vbml0PC9jb2RlPiBhbmQgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IHNwZWNpZmllZAoJICogCgkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgYm90aCA8Y29kZT5Vbml0PC9jb2RlPiBzIGFyZSBzcGVjaWFsCgkgKiAKCSAqIEBzZWUgVW5pdCNpc1NwZWNpYWwKCSAqLwoJVW5pdCBtdWwoVW5pdCB0aGF0KSB7CgkJaWYgKHRoaXMuaXNTcGVjaWFsKCkgJiYgdGhhdC5pc1NwZWNpYWwoKSkgewoJCQl0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiQ2Fubm90IG11bHRpcGx5ICIgKyB0aGlzICsgIiB3aXRoICIKCQkJCQkrIHRoYXQpOwoJCX0KCQlyZXR1cm4gZmluZCh0aGlzLnR5cGUgLSBVTklUWSArIHRoYXQudHlwZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgbmV3IDxjb2RlPlVuaXQ8L2NvZGU+IHRoYXQgaXMgdGhlIGRpdmlzaW9uIG9mIHRoaXMgPGNvZGU+VW5pdDwvY29kZT4KCSAqIGFuZCB0aGUgPGNvZGU+VW5pdDwvY29kZT4gc3BlY2lmaWVkCgkgKiAKCSAqIEBwYXJhbSB0aGF0IHRoZSA8Y29kZT5Vbml0PC9jb2RlPiB0aGF0IHRoaXMgPGNvZGU+VW5pdDwvY29kZT4gd2lsbCBiZSBkaXZpZGVkCgkgKiAgICAgICAgd2l0aAoJICogQHJldHVybiBhIG5ldyA8Y29kZT5Vbml0PC9jb2RlPiB0aGF0IGlzIHRoZSBkaXZpc2lvbiBvZiB0aGlzIDxjb2RlPlVuaXQ8L2NvZGU+CgkgKiAgICAgICAgIGFuZCB0aGUgPGNvZGU+VW5pdDwvY29kZT4gc3BlY2lmaWVkCgkgKiAKCSAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiBib3RoIDxjb2RlPlVuaXQ8L2NvZGU+IHMgYXJlIHNwZWNpYWwKCSAqIAoJICogQHNlZSBVbml0I2lzU3BlY2lhbAoJICovCglVbml0IGRpdihVbml0IHRoYXQpIHsKCQlpZiAodGhpcy5pc1NwZWNpYWwoKSAmJiB0aGF0LmlzU3BlY2lhbCgpKSB7CgkJCWlmICh0aGlzLnR5cGUgPT0gdGhhdC50eXBlKSB7CgkJCQlyZXR1cm4gVW5pdC51bml0eTsKCQkJfQoJCQl0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiQ2Fubm90IGRpdmlkZSAiICsgdGhpcyArICIgYnkgIgoJCQkJCSsgdGhhdCk7CgkJfQoJCXJldHVybiBmaW5kKHRoaXMudHlwZSAtIHRoYXQudHlwZSArIFVOSVRZKTsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+VW5pdDwvY29kZT4gdGhhdCBpcyB0aGUgYWRkaXRpb24gb2YgdGhpcyA8Y29kZT5Vbml0PC9jb2RlPgoJICogYW5kIHRoZSA8Y29kZT5Vbml0PC9jb2RlPiBzcGVjaWZpZWQuCgkgKiAKCSAqIEBwYXJhbSB0aGF0IHRoZSA8Y29kZT5Vbml0PC9jb2RlPiB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGlzCgkgKiAgICAgICAgPGNvZGU+VW5pdDwvY29kZT4KCSAqIAoJICogQHJldHVybiBhIG5ldyA8Y29kZT5Vbml0PC9jb2RlPiB0aGF0IGlzIHRoZSBhZGRpdGlvbiBvZiB0aGlzIDxjb2RlPlVuaXQ8L2NvZGU+CgkgKiAgICAgICAgIGFuZCB0aGUgPGNvZGU+VW5pdDwvY29kZT4gc3BlY2lmaWVkLgoJICogCgkgKiBAdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gaWYgdGhlIHR3byA8Y29kZT5Vbml0PC9jb2RlPiBzIGFyZSBub3QgdGhlIHNhbWUKCSAqLwoJVW5pdCBhZGQoVW5pdCB0aGF0KSB7CgkJaWYgKCF0aGlzLmVxdWFscyh0aGF0KSkgewoJCQl0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiQ2Fubm90IGFkZCAiICsgdGhpcyArICIgdG8gIiArIHRoYXQpOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0KCgkvKioKCSAqIFJldHVybnMgYSBuZXcgPGNvZGU+VW5pdDwvY29kZT4gdGhhdCBpcyB0aGUgc3VidHJhY3Rpb24gYmV0d2VlbiB0aGlzCgkgKiA8Y29kZT5Vbml0PC9jb2RlPiBhbmQgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IHNwZWNpZmllZC4KCSAqIAoJICogQHBhcmFtIHRoYXQgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IHRoYXQgd2lsbCBiZSBzdWJ0cmFjdGVkIGZyb20gdGhpcwoJICogICAgICAgIDxjb2RlPlVuaXQ8L2NvZGU+CgkgKiBAcmV0dXJuIGEgbmV3IDxjb2RlPlVuaXQ8L2NvZGU+IHRoYXQgaXMgdGhlIHN1YnRyYWN0aW9uIGJldHdlZW4gdGhpcwoJICogICAgICAgICA8Y29kZT5Vbml0PC9jb2RlPiBhbmQgdGhlIDxjb2RlPlVuaXQ8L2NvZGU+IHNwZWNpZmllZC4KCSAqIAoJICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5Vbml0PC9jb2RlPiBzcGVjaWZpZWQgaXMgbm90IHRoZSBzYW1lCgkgKiAgICAgICAgIGFzIHRoaXMgPGNvZGU+VW5pdDwvY29kZT4KCSAqLwoJVW5pdCBzdWIoVW5pdCB0aGF0KSB7CgkJaWYgKCF0aGlzLmVxdWFscyh0aGF0KSkgewoJCQl0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiQ2Fubm90IHN1YnRyYWN0ICIgKyB0aGF0ICsgIiBmcm9tICIKCQkJCQkrIHRoaXMpOwoJCX0KCQlyZXR1cm4gdGhpczsKCX0KCgkvKioKCSAqIEZpbmRzIGEgPGNvZGU+VW5pdDwvY29kZT4gYmFzZWQgb24gYSB0eXBlLiBJZiB0aGUgPGNvZGU+VW5pdDwvY29kZT4gaXMgbm90CgkgKiBmb3VuZCwgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCBhZGRlZCB0byB0aGUgbGlzdCBvZiBhbGwgdW5pdHMgdW5kZXIgYSBudWxsCgkgKiBuYW1lLgoJICogCgkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgPGNvZGU+VW5pdDwvY29kZT4gdG8gZmluZAoJICogCgkgKiBAcmV0dXJuIHRoZSA8Y29kZT5Vbml0PC9jb2RlPgoJICovCglzdGF0aWMgVW5pdCBmaW5kKGxvbmcgdHlwZSkgewoJCWlmIChiYXNlID09IG51bGwpIHsKCQkJc3luY2hyb25pemVkIChVbml0LmNsYXNzKSB7CgkJCQlpZiAoYmFzZSA9PSBudWxsKSB7CgkJCQkJaW50IHNpemUgPSBhbGxVbml0cy5sZW5ndGg7CgkJCQkJYmFzZSA9IG5ldyBIYXNodGFibGUoc2l6ZSA8PCAxKTsKCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewoJCQkJCQliYXNlLnB1dChhbGxVbml0c1tpXSwgYWxsVW5pdHNbaV0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlVbml0IHVuaXQgPSBuZXcgVW5pdChudWxsLCB0eXBlKTsKCQlVbml0IG91dCA9IChVbml0KSBiYXNlLmdldCh1bml0KTsKCQlpZiAob3V0ID09IG51bGwpIHsKCQkJYmFzZS5wdXQodW5pdCwgdW5pdCk7CgkJCW91dCA9IHVuaXQ7CgkJfQoJCXJldHVybiBvdXQ7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5Vbml0PC9jb2RlPgoJICogCgkgKiBAcmV0dXJuIEEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSA8Y29kZT5Vbml0PC9jb2RlPgoJICovCglwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewoJCWlmIChuYW1lID09IG51bGwpIHsKCQkJaW50IG0gPSAoaW50KSAoKCh0eXBlID4+IG1fU0hJRlQpICYgTUFTSykgLSBaRVJPKTsKCQkJaW50IHMgPSAoaW50KSAoKCh0eXBlID4+IHNfU0hJRlQpICYgTUFTSykgLSBaRVJPKTsKCQkJaW50IGtnID0gKGludCkgKCgodHlwZSA+PiBrZ19TSElGVCkgJiBNQVNLKSAtIFpFUk8pOwoJCQlpbnQgSyA9IChpbnQpICgoKHR5cGUgPj4gS19TSElGVCkgJiBNQVNLKSAtIFpFUk8pOwoJCQlpbnQgQSA9IChpbnQpICgoKHR5cGUgPj4gQV9TSElGVCkgJiBNQVNLKSAtIFpFUk8pOwoJCQlpbnQgbW9sID0gKGludCkgKCgodHlwZSA+PiBtb2xfU0hJRlQpICYgTUFTSykgLSBaRVJPKTsKCQkJaW50IGNkID0gKGludCkgKCgodHlwZSA+PiBjZF9TSElGVCkgJiBNQVNLKSAtIFpFUk8pOwoJCQlpbnQgcmFkID0gKGludCkgKCgodHlwZSA+PiByYWRfU0hJRlQpICYgTUFTSykgLSBaRVJPKTsKCQkJU3RyaW5nQnVmZmVyIG51bWVyYXRvciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKCQkJU3RyaW5nQnVmZmVyIGRlbm9taW5hdG9yID0gbmV3IFN0cmluZ0J1ZmZlcigpOwoJCQlhZGRTSW5hbWUobSwgIm0iLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKCQkJYWRkU0luYW1lKHMsICJzIiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CgkJCWFkZFNJbmFtZShrZywgImtnIiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CgkJCWFkZFNJbmFtZShLLCAiSyIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwoJCQlhZGRTSW5hbWUoQSwgIkEiLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKCQkJYWRkU0luYW1lKG1vbCwgIm1vbCIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwoJCQlhZGRTSW5hbWUoY2QsICJjZCIsIG51bWVyYXRvciwgZGVub21pbmF0b3IpOwoJCQlhZGRTSW5hbWUocmFkLCAicmFkIiwgbnVtZXJhdG9yLCBkZW5vbWluYXRvcik7CgkJCWlmIChkZW5vbWluYXRvci5sZW5ndGgoKSA+IDApIHsKCQkJCWlmIChudW1lcmF0b3IubGVuZ3RoKCkgPT0gMCkgewoJCQkJCW51bWVyYXRvci5hcHBlbmQoIjEiKTsKCQkJCX0KCQkJCW51bWVyYXRvci5hcHBlbmQoIi8iKTsKCQkJCW51bWVyYXRvci5hcHBlbmQoKE9iamVjdCkgZGVub21pbmF0b3IpOyAvKgoJCQkJCQkJCQkJCQkJCSAqIHdlIHVzZSAoT2JqZWN0KSB0bwoJCQkJCQkJCQkJCQkJCSAqIGF2b2lkIHVzaW5nIG5ldyAxLjQKCQkJCQkJCQkJCQkJCQkgKiBtZXRob2QKCQkJCQkJCQkJCQkJCQkgKiBhcHBlbmQoU3RyaW5nQnVmZmVyKQoJCQkJCQkJCQkJCQkJCSAqLwoJCQl9CgkJCW5hbWUgPSBudW1lcmF0b3IudG9TdHJpbmcoKTsKCQl9CgkJcmV0dXJuIG5hbWU7Cgl9CgoJcHJpdmF0ZSB2b2lkIGFkZFNJbmFtZShpbnQgc2ksIFN0cmluZyBuYW1lLCBTdHJpbmdCdWZmZXIgbnVtZXJhdG9yLAoJCQlTdHJpbmdCdWZmZXIgZGVub21pbmF0b3IpIHsKCQlpZiAoc2kgIT0gMCkgewoJCQlTdHJpbmdCdWZmZXIgc2IgPSAoc2kgPiAwKSA/IG51bWVyYXRvciA6IGRlbm9taW5hdG9yOwoJCQlpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CgkJCQlzYi5hcHBlbmQoIioiKTsKCQkJfQoJCQlzYi5hcHBlbmQobmFtZSk7CgkJCWludCBwb3dlciA9IE1hdGguYWJzKHNpKTsKCQkJaWYgKHBvd2VyID4gMSkgewoJCQkJc2IuYXBwZW5kKCJeIik7CgkJCQlzYi5hcHBlbmQocG93ZXIpOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogQ2hlY2tzIHdoZXRoZXIgdGhlIHVuaXQgaGFzIGEgc3BlY2lhbCB0eXBlLCBpLmUuIG5vdCBhIFNJIHVuaXQuCgkgKiAKCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBzcGVjaWFsLCBvdGhlcndpc2UgZmFsc2UuCgkgKi8KCXByaXZhdGUgYm9vbGVhbiBpc1NwZWNpYWwoKSB7CgkJcmV0dXJuICh0eXBlICYgeF9NQVNLKSAhPSAwOwoJfQp9ClBLAwQKAAAAAABrUu40beeax4cBAACHAQAAMwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kudXRpbC5tZWFzdXJlbWVudC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9wYWNrYWdlLmh0bWwsdiAxLjUgMjAwNi8wNy8xMiAyMTowNzoxOSBoYXJncmF2ZSBFeHAgJCAtLT4KPEJPRFk+CjxwPk1lYXN1cmVtZW50IFBhY2thZ2UgVmVyc2lvbiAxLjAuCjxwPkJ1bmRsZXMgd2lzaGluZyB0byB1c2UgdGhpcyBwYWNrYWdlIG11c3QgbGlzdCB0aGUgcGFja2FnZQppbiB0aGUgSW1wb3J0LVBhY2thZ2UgaGVhZGVyIG9mIHRoZSBidW5kbGUncyBtYW5pZmVzdC4KRm9yIGV4YW1wbGU6CjxwcmU+CkltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS51dGlsLm1lYXN1cmVtZW50OyB2ZXJzaW9uPTEuMAo8L3ByZT4KPC9CT0RZPgpQSwMECgAAAAAAa1LuNMT/n98LAAAACwAAADIAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9wYWNrYWdlaW5mb3ZlcnNpb24gMS4wUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAkAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvcG9zaXRpb24vUEsDBAoAAAAAAGtS7jRaWpvFySAAAMkgAAAxAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvcG9zaXRpb24vUG9zaXRpb24uamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnV0aWwucG9zaXRpb24vc3JjL29yZy9vc2dpL3V0aWwvcG9zaXRpb24vUG9zaXRpb24uamF2YSx2IDEuOSAyMDA2LzA3LzEyIDIxOjIxOjM1IGhhcmdyYXZlIEV4cCAkCiAqCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMiwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKgogKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KcGFja2FnZSBvcmcub3NnaS51dGlsLnBvc2l0aW9uOwoKaW1wb3J0IG9yZy5vc2dpLnV0aWwubWVhc3VyZW1lbnQuTWVhc3VyZW1lbnQ7CmltcG9ydCBvcmcub3NnaS51dGlsLm1lYXN1cmVtZW50LlVuaXQ7CgovKioKICogUG9zaXRpb24gcmVwcmVzZW50cyBhIGdlb2dyYXBoaWMgbG9jYXRpb24sIGJhc2VkIG9uIHRoZSBXR1M4NCBTeXN0ZW0gKFdvcmxkCiAqIEdlb2RldGljIFN5c3RlbSAxOTg0KS4KICogPHA+CiAqIFRoZSA8Y29kZT5vcmcub3NnaS51dGlsLm1lYXN1cmVtZW50Lk1lYXN1cmVtZW50PC9jb2RlPiBjbGFzcyBpcyB1c2VkIHRvCiAqIHJlcHJlc2VudCB0aGUgdmFsdWVzIHRoYXQgbWFrZSB1cCBhIHBvc2l0aW9uLgogKiA8cD4KICogPHA+CiAqIEEgZ2l2ZW4gcG9zaXRpb24gb2JqZWN0IG1heSBsYWNrIGFueSBvZiBpdCdzIGNvbXBvbmVudHMsIGkuZS4gdGhlIGFsdGl0dWRlCiAqIG1heSBub3QgYmUga25vd24uIFN1Y2ggbWlzc2luZyB2YWx1ZXMgd2lsbCBiZSByZXByZXNlbnRlZCBieSBudWxsLgogKiA8cD4KICogUG9zaXRpb24gZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGVpdGhlciBlcXVhbHMoKSBvcgogKiBoYXNoQ29kZSgpIGJlY2F1c2UgaXQgaXMgbm90IGNsZWFyIGhvdyBtaXNzaW5nIHZhbHVlcyBzaG91bGQgYmUgaGFuZGxlZC4gSXQKICogaXMgdXAgdG8gdGhlIHVzZXIgb2YgYSBwb3NpdGlvbiB0byBkZXRlcm1pbmUgaG93IGJlc3QgdG8gY29tcGFyZSB0d28gcG9zaXRpb24KICogb2JqZWN0cy4gQSA8Y29kZT5Qb3NpdGlvbjwvY29kZT4gb2JqZWN0IGlzIGltbXV0YWJsZS4KICovCnB1YmxpYyBjbGFzcyBQb3NpdGlvbiB7Cglwcml2YXRlIE1lYXN1cmVtZW50CWFsdGl0dWRlOwoJcHJpdmF0ZSBNZWFzdXJlbWVudAlsb25naXR1ZGU7Cglwcml2YXRlIE1lYXN1cmVtZW50CWxhdGl0dWRlOwoJcHJpdmF0ZSBNZWFzdXJlbWVudAlzcGVlZDsKCXByaXZhdGUgTWVhc3VyZW1lbnQJdHJhY2s7CgoJLyoqCgkgKiBDb250cnVjdHMgYSA8Y29kZT5Qb3NpdGlvbjwvY29kZT4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIHZhbHVlcy4KCSAqIAoJICogQHBhcmFtIGxhdCBhIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3Qgc3BlY2lmeWluZyB0aGUgbGF0aXR1ZGUgaW4KCSAqICAgICAgICByYWRpYW5zLCBvciBudWxsCgkgKiBAcGFyYW0gbG9uIGEgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBsb25naXR1ZGUgaW4KCSAqICAgICAgICByYWRpYW5zLCBvciBudWxsCgkgKiBAcGFyYW0gYWx0IGEgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBhbHRpdHVkZSBpbgoJICogICAgICAgIG1ldGVycywgb3IgbnVsbAoJICogQHBhcmFtIHNwZWVkIGEgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBzcGVlZCBpbgoJICogICAgICAgIG1ldGVycyBwZXIgc2Vjb25kLCBvciBudWxsCgkgKiBAcGFyYW0gdHJhY2sgYSA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IHNwZWNpZnlpbmcgdGhlIHRyYWNrIGluCgkgKiAgICAgICAgcmFkaWFucywgb3IgbnVsbAoJICovCglwdWJsaWMgUG9zaXRpb24oTWVhc3VyZW1lbnQgbGF0LCBNZWFzdXJlbWVudCBsb24sIE1lYXN1cmVtZW50IGFsdCwKCQkJTWVhc3VyZW1lbnQgc3BlZWQsIE1lYXN1cmVtZW50IHRyYWNrKSB7CgkJaWYgKGxhdCAhPSBudWxsKSB7CgkJCWlmICghVW5pdC5yYWQuZXF1YWxzKGxhdC5nZXRVbml0KCkpKSB7CgkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIExhdGl0dWRlIik7CgkJCX0KCQkJdGhpcy5sYXRpdHVkZSA9IGxhdDsKCQl9CgkJaWYgKGxvbiAhPSBudWxsKSB7CgkJCWlmICghVW5pdC5yYWQuZXF1YWxzKGxvbi5nZXRVbml0KCkpKSB7CgkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIExvbmdpdHVkZSIpOwoJCQl9CgkJCXRoaXMubG9uZ2l0dWRlID0gbG9uOwoJCX0KCQlub3JtYWxpemVMYXRMb24oKTsKCQlpZiAoYWx0ICE9IG51bGwpIHsKCQkJaWYgKCFVbml0Lm0uZXF1YWxzKGFsdC5nZXRVbml0KCkpKSB7CgkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIEFsdGl0dWRlIik7CgkJCX0KCQkJdGhpcy5hbHRpdHVkZSA9IGFsdDsKCQl9CgkJaWYgKHNwZWVkICE9IG51bGwpIHsKCQkJaWYgKCFVbml0Lm1fcy5lcXVhbHMoc3BlZWQuZ2V0VW5pdCgpKSkgewoJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBTcGVlZCIpOwoJCQl9CgkJCXRoaXMuc3BlZWQgPSBzcGVlZDsKCQl9CgkJaWYgKHRyYWNrICE9IG51bGwpIHsKCQkJaWYgKCFVbml0LnJhZC5lcXVhbHModHJhY2suZ2V0VW5pdCgpKSkgewoJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBUcmFjayIpOwoJCQl9CgkJCXRoaXMudHJhY2sgPSBub3JtYWxpemVUcmFjayh0cmFjayk7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgYWx0aXR1ZGUgb2YgdGhpcyBwb3NpdGlvbiBpbiBtZXRlcnMuCgkgKiAKCSAqIEByZXR1cm4gYSA8Y29kZT5NZWFzdXJlbWVudDwvY29kZT4gb2JqZWN0IGluIDxjb2RlPlVuaXQubTwvY29kZT4gcmVwcmVzZW50aW5nCgkgKiAgICAgICAgIHRoZSBhbHRpdHVkZSBpbiBtZXRlcnMgYWJvdmUgdGhlIGVsbGlwc29pZCA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKCSAqICAgICAgICAgYWx0aXR1ZGUgaXMgbm90IGtub3duLgoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQgZ2V0QWx0aXR1ZGUoKSB7CgkJcmV0dXJuIGFsdGl0dWRlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbG9uZ2l0dWRlIG9mIHRoaXMgcG9zaXRpb24gaW4gcmFkaWFucy4KCSAqIAoJICogQHJldHVybiBhIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgaW4gPGNvZGU+VW5pdC5yYWQ8L2NvZGU+CgkgKiAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgbG9uZ2l0dWRlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbG9uZ2l0dWRlCgkgKiAgICAgICAgIGlzIG5vdCBrbm93bi4KCSAqLwoJcHVibGljIE1lYXN1cmVtZW50IGdldExvbmdpdHVkZSgpIHsKCQlyZXR1cm4gbG9uZ2l0dWRlOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgbGF0aXR1ZGUgb2YgdGhpcyBwb3NpdGlvbiBpbiByYWRpYW5zLgoJICogCgkgKiBAcmV0dXJuIGEgPGNvZGU+TWVhc3VyZW1lbnQ8L2NvZGU+IG9iamVjdCBpbiA8Y29kZT5Vbml0LnJhZDwvY29kZT4KCSAqICAgICAgICAgcmVwcmVzZW50aW5nIHRoZSBsYXRpdHVkZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxhdGl0dWRlIGlzCgkgKiAgICAgICAgIG5vdCBrbm93bi4uCgkgKi8KCXB1YmxpYyBNZWFzdXJlbWVudCBnZXRMYXRpdHVkZSgpIHsKCQlyZXR1cm4gbGF0aXR1ZGU7Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIHRoZSBncm91bmQgc3BlZWQgb2YgdGhpcyBwb3NpdGlvbiBpbiBtZXRlcnMgcGVyIHNlY29uZC4KCSAqIAoJICogQHJldHVybiBhIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgaW4gPGNvZGU+VW5pdC5tX3M8L2NvZGU+CgkgKiAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgc3BlZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVlZCBpcyBub3QKCSAqICAgICAgICAga25vd24uLgoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQgZ2V0U3BlZWQoKSB7CgkJcmV0dXJuIHNwZWVkOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdHJhY2sgb2YgdGhpcyBwb3NpdGlvbiBpbiByYWRpYW5zIGFzIGEgY29tcGFzcyBoZWFkaW5nLiBUaGUKCSAqIHRyYWNrIGlzIHRoZSBleHRyYXBvbGF0aW9uIG9mIHByZXZpb3VzIHByZXZpb3VzbHkgbWVhc3VyZWQgcG9zaXRpb25zIHRvIGEKCSAqIGZ1dHVyZSBwb3NpdGlvbi4KCSAqIAoJICogQHJldHVybiBhIDxjb2RlPk1lYXN1cmVtZW50PC9jb2RlPiBvYmplY3QgaW4gPGNvZGU+VW5pdC5yYWQ8L2NvZGU+CgkgKiAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgdHJhY2ssIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB0cmFjayBpcyBub3QKCSAqICAgICAgICAga25vd24uLgoJICovCglwdWJsaWMgTWVhc3VyZW1lbnQgZ2V0VHJhY2soKSB7CgkJcmV0dXJuIHRyYWNrOwoJfQoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZQlMT05fUkFOR0UJPSBNYXRoLlBJOwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlCUxBVF9SQU5HRQk9IE1hdGguUEkgLyAyLjBEOwoKCS8qKgoJICogVmVyaWZ5IHRoZSBsb25naXR1ZGUgYW5kIGxhdGl0dWRlIHBhcmFtZXRlcnMgc28gdGhleSBmaXQgdGhlIG5vcm1hbAoJICogY29vcmRpbmF0ZSBzeXN0ZW0uIEEgbGF0aXR1ZGUgaXMgYmV0d2VlbiAtOTAgKHNvdXRoKSBhbmQgKzkwIChub3J0aCkuIEEgQQoJICogbG9uZ2l0dWRlIGlzIGJldHdlZW4gLTE4MCAoV2VzdGVybiBoZW1pc3BoZXJlKSBhbmQgKzE4MCAoZWFzdGVybgoJICogaGVtaXNwaGVyZSkuIFRoaXMgbWV0aG9kIGZpcnN0IG5vcm1hbGl6ZXMgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUKCSAqIGJldHdlZW4gKy8tIDE4MC4gSWYgdGhlIHxsYXRpdHVkZXwgPiA5MCwgdGhlbiB0aGUgbG9uZ2l0dWRlIGlzIGFkZGVkIDE4MAoJICogYW5kIHRoZSBsYXRpdHVkZSBpcyBub3JtYWxpemVkIHRvIGZpdCArLy05MC4gKEV4YW1wbGUgYXJlIHdpdGggZGVncmVlcwoJICogdGhvdWdoIHJhZGlhbnMgYXJlIHVzZWQpIDxicj4KCSAqIE5vIG5vcm1hbGl6YXRpb24gdGFrZXMgcGxhY2Ugd2hlbiBlaXRoZXIgbG9uIG9yIGxhdCBpcyBudWxsLgoJICovCglwcml2YXRlIHZvaWQgbm9ybWFsaXplTGF0TG9uKCkgewoJCWlmIChsb25naXR1ZGUgPT0gbnVsbCB8fCBsYXRpdHVkZSA9PSBudWxsKQoJCQlyZXR1cm47CgkJZG91YmxlIGRsb24gPSBsb25naXR1ZGUuZ2V0VmFsdWUoKTsKCQlkb3VibGUgZGxhdCA9IGxhdGl0dWRlLmdldFZhbHVlKCk7CgkJaWYgKGRsb24gPj0gLUxPTl9SQU5HRSAmJiBkbG9uIDwgTE9OX1JBTkdFICYmIGRsYXQgPj0gLUxBVF9SQU5HRQoJCQkJJiYgZGxhdCA8PSBMQVRfUkFOR0UpCgkJCXJldHVybjsKCQlkbG9uID0gbm9ybWFsaXplKGRsb24sIExPTl9SQU5HRSk7CgkJZGxhdCA9IG5vcm1hbGl6ZShkbGF0LCBMQVRfUkFOR0UgKiAyLjBEKTsgLy8gRmlyc3Qgb3ZlciAxODAgZGVncmVlCgkJLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0byBtb3ZlIHRvIG90aGVyIHNpZGUgb2YgdGhlIGVhcnRoCgkJaWYgKGRsYXQgPiBMQVRfUkFOR0UgfHwgZGxhdCA8IC1MQVRfUkFOR0UpIHsKCQkJZGxvbiA9IG5vcm1hbGl6ZShkbG9uIC0gTE9OX1JBTkdFLCBMT05fUkFOR0UpOwoJCQlkbGF0ID0gbm9ybWFsaXplKChMQVRfUkFOR0UgKiAyLjBEKSAtIGRsYXQsIExBVF9SQU5HRSk7CgkJfQoJCWxvbmdpdHVkZSA9IG5ldyBNZWFzdXJlbWVudChkbG9uLCBsb25naXR1ZGUuZ2V0RXJyb3IoKSwgbG9uZ2l0dWRlCgkJCQkuZ2V0VW5pdCgpLCBsb25naXR1ZGUuZ2V0VGltZSgpKTsKCQlsYXRpdHVkZSA9IG5ldyBNZWFzdXJlbWVudChkbGF0LCBsYXRpdHVkZS5nZXRFcnJvcigpLCBsYXRpdHVkZQoJCQkJLmdldFVuaXQoKSwgbGF0aXR1ZGUuZ2V0VGltZSgpKTsKCX0KCgkvKioKCSAqIFRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyB0aGUgYSB2YWx1ZSBhY2NvcmRpbmcgdG8gYSByYW5nZS4gVGhpcyBpcyBub3QKCSAqIHNpbXBsZSBtb2R1bG8gKGFzIEkgdGhvdWdodCB3aGVuIEkgc3RhcnRlZCksIGJ1dCByZXF1aXJlcyBzb21lIHNwZWNpYWwKCSAqIGhhbmRsaW5nLiBGb3IgcG9zaXRpdmUgbnVtYmVycyB3ZSBzdWJ0cmFjdCAyKnJhbmdlIGZyb20gdGhlIG51bWJlciBzbwoJICogdGhhdCBlbmQgdXAgYmV0d2VlbiAtLysgcmFuZ2UuIEZvciBuZWdhdGl2ZSBudW1iZXJzIHdlIGFkZCB0aGlzIHZhbHVlLgoJICogRm9yIGV4YW1wbGUsIGlmIHRoZSB2YWx1ZSBpcyAyNzAgYW5kIHRoZSByYW5nZSBpcyArLy0gMTgwLiBUaGVuIHNpZ249MSBzbwoJICogdGhlIChpbnQpIGZhY3RvciBiZWNvbWVzIDI3MCsxODAvMzYwID0gMS4gVGhpcyBtZWFucyB0aGF0IDI3MC0zNjA9LTkwIGlzCgkgKiB0aGUgcmVzdWx0LiAoZGVncmVlcyBhcmUgb25seSB1c2VkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHVuZGVyc3RhbmQsIHRoaXMKCSAqIGZ1bmN0aW9uIGlzIGFnbm9zdGljIGZvciByYWRpYW5zL2RlZ3JlZXMpLiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4KCSAqIFtyYW5nZSxyYW5nZSZndDsgVGhlIGFsZ29yaXRobSBpcyBub3QgdmVyeSBmYXN0LCBidXQgaXQgaGFuZGxpbmcgdGhlCgkgKiBbJmd0OyByYW5nZXMgbWFkZSBpdCB2ZXJ5IG1lc3N5IHVzaW5nIGludGVnZXIgYXJpdGhtZXRpYywgYW5kIHRoaXMgaXMKCSAqIHZlcnkgcmVhZGFibGUuIE5vdGUgdGhhdCBpdCBpcyBoaWdobHkgdW5saWtlbHkgdGhhdCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQKCSAqIGluIG5vcm1hbCBzaXR1YXRpb25zLiBOb3JtYWxseSBpbnB1dCB2YWx1ZXMgdG8gcG9zaXRpb24gYXJlIGFscmVhZHkKCSAqIG5vcm1hbGl6ZWQgYmVjYXVzZSB0aGV5IGNvbWUgZnJvbSBhIEdQUy4gQW5kIHRoaXMgaXMgbXVjaCBtb3JlIHJlYWRhYmxlLgoJICogCgkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRoYXQgbmVlZHMgYWRqdXN0aW5nCgkgKiBAcGFyYW0gcmFuZ2UgLXJhbmdlID0gPCB2YWx1ZSA8IHJhbmdlCgkgKi8KCXByaXZhdGUgZG91YmxlIG5vcm1hbGl6ZShkb3VibGUgdmFsdWUsIGRvdWJsZSByYW5nZSkgewoJCWRvdWJsZSB0d2ljZVJhbmdlID0gMi4wRCAqIHJhbmdlOwoJCXdoaWxlICh2YWx1ZSA+PSByYW5nZSkgewoJCQl2YWx1ZSAtPSB0d2ljZVJhbmdlOwoJCX0KCQl3aGlsZSAodmFsdWUgPCAtcmFuZ2UpIHsKCQkJdmFsdWUgKz0gdHdpY2VSYW5nZTsKCQl9CgkJcmV0dXJuIHZhbHVlOwoJfQoKCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZQlUUkFDS19SQU5HRQk9IE1hdGguUEkgKiAyLjBEOwoKCS8qKgoJICogTm9ybWFsaXplIHRyYWNrIHRvIGJlIGEgdmFsdWUgc3VjaCB0aGF0OiAwIDw9IHZhbHVlIDwgKzJQSS4gVGhpcwoJICogY29ycmVzcG9uZHMgdG8gMCBkZWcgdG8gKzM2MCBkZWcuIDAgaXMgTm9ydGggMC41KlBJIGlzIEVhc3QgUEkgaXMgU291dGgKCSAqIDEuNSpQSSBpcyBXZXN0CgkgKiAKCSAqIEBwYXJhbSB0cmFjayBWYWx1ZSB0byBiZSBub3JtYWxpemVkCgkgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgdmFsdWUKCSAqLwoJcHJpdmF0ZSBNZWFzdXJlbWVudCBub3JtYWxpemVUcmFjayhNZWFzdXJlbWVudCB0cmFjaykgewoJCWRvdWJsZSB2YWx1ZSA9IHRyYWNrLmdldFZhbHVlKCk7CgkJaWYgKCgwLjBEIDw9IHZhbHVlKSAmJiAodmFsdWUgPCBUUkFDS19SQU5HRSkpIHsKCQkJcmV0dXJuIHRyYWNrOyAvKiB2YWx1ZSBpcyBhbHJlYWR5IG5vcm1hbGl6ZWQgKi8KCQl9CgkJdmFsdWUgJT0gVFJBQ0tfUkFOR0U7CgkJaWYgKHZhbHVlIDwgMC4wRCkgewoJCQl2YWx1ZSArPSBUUkFDS19SQU5HRTsKCQl9CgkJcmV0dXJuIG5ldyBNZWFzdXJlbWVudCh2YWx1ZSwgdHJhY2suZ2V0RXJyb3IoKSwgdHJhY2suZ2V0VW5pdCgpLCB0cmFjawoJCQkJLmdldFRpbWUoKSk7Cgl9Cn0KUEsDBAoAAAAAAGtS7jREsC+UewEAAHsBAAAwAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvcG9zaXRpb24vcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS51dGlsLnBvc2l0aW9uL3NyYy9vcmcvb3NnaS91dGlsL3Bvc2l0aW9uL3BhY2thZ2UuaHRtbCx2IDEuMyAyMDA2LzA3LzEyIDIxOjA2OjU3IGhhcmdyYXZlIEV4cCAkIC0tPgo8Qk9EWT4KPHA+UG9zaXRpb24gUGFja2FnZSBWZXJzaW9uIDEuMC4KPHA+QnVuZGxlcyB3aXNoaW5nIHRvIHVzZSB0aGlzIHBhY2thZ2UgbXVzdCBsaXN0IHRoZSBwYWNrYWdlCmluIHRoZSBJbXBvcnQtUGFja2FnZSBoZWFkZXIgb2YgdGhlIGJ1bmRsZSdzIG1hbmlmZXN0LgpGb3IgZXhhbXBsZToKPHByZT4KSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLnV0aWwucG9zaXRpb247IHZlcnNpb249MS4wCjwvcHJlPgo8L0JPRFk+ClBLAwQKAAAAAABrUu40xP+f3wsAAAALAAAALwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL3Bvc2l0aW9uL3BhY2thZ2VpbmZvdmVyc2lvbiAxLjBQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAACMAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC90cmFja2VyL1BLAwQKAAAAAABrUu4010jM+g+RAAAPkQAANgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXIuamF2YS8qCiAqICRIZWFkZXI6IC9jdnNob21lL2J1aWxkL29yZy5vc2dpLnV0aWwudHJhY2tlci9zcmMvb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyLmphdmEsdiAxLjIxIDIwMDYvMDcvMTIgMjE6MDU6MTcgaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMCwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5vc2dpLnV0aWwudHJhY2tlcjsKCmltcG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKCi8qKgogKiBUaGUgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IGNsYXNzIHNpbXBsaWZpZXMgdXNpbmcgc2VydmljZXMgZnJvbSB0aGUKICogRnJhbWV3b3JrJ3Mgc2VydmljZSByZWdpc3RyeS4KICogPHA+CiAqIEEgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdCBpcyBjb25zdHJ1Y3RlZCB3aXRoIHNlYXJjaCBjcml0ZXJpYQogKiBhbmQgYSA8Y29kZT5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI8L2NvZGU+IG9iamVjdC4gQQogKiA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IGNhbiB1c2UgdGhlCiAqIDxjb2RlPlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjwvY29kZT4gb2JqZWN0IHRvIGN1c3RvbWl6ZSB0aGUgc2VydmljZQogKiBvYmplY3RzIHRvIGJlIHRyYWNrZWQuIFRoZSA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IGNhbiB0aGVuIGJlCiAqIG9wZW5lZCB0byBiZWdpbiB0cmFja2luZyBhbGwgc2VydmljZXMgaW4gdGhlIEZyYW1ld29yaydzIHNlcnZpY2UgcmVnaXN0cnkKICogdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlYXJjaCBjcml0ZXJpYS4gVGhlIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPgogKiBvYmplY3QgY29ycmVjdGx5IGhhbmRsZXMgYWxsIG9mIHRoZSBkZXRhaWxzIG9mIGxpc3RlbmluZyB0bwogKiA8Y29kZT5TZXJ2aWNlRXZlbnQ8L2NvZGU+IG9iamVjdHMgYW5kIGdldHRpbmcgYW5kIHVuZ2V0dGluZyBzZXJ2aWNlcy4KICogPHA+CiAqIFRoZSA8Y29kZT5nZXRTZXJ2aWNlUmVmZXJlbmNlczwvY29kZT4gbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZ2V0CiAqIHJlZmVyZW5jZXMgdG8gdGhlIHNlcnZpY2VzIGJlaW5nIHRyYWNrZWQuIFRoZSA8Y29kZT5nZXRTZXJ2aWNlPC9jb2RlPiBhbmQKICogPGNvZGU+Z2V0U2VydmljZXM8L2NvZGU+IG1ldGhvZHMgY2FuIGJlIGNhbGxlZCB0byBnZXQgdGhlIHNlcnZpY2Ugb2JqZWN0cwogKiBmb3IgdGhlIHRyYWNrZWQgc2VydmljZS4KICogCiAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4yMSAkCiAqLwpwdWJsaWMgY2xhc3MgU2VydmljZVRyYWNrZXIgaW1wbGVtZW50cyBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIgewoJLyogc2V0IHRoaXMgdG8gdHJ1ZSB0byBjb21waWxlIGluIGRlYnVnIG1lc3NhZ2VzICovCglzdGF0aWMgZmluYWwgYm9vbGVhbgkJCQlERUJVRwkJCT0gZmFsc2U7CgkvKioKCSAqIEJ1bmRsZSBjb250ZXh0IGFnYWluc3Qgd2hpY2ggdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IGlzIHRyYWNraW5nLgoJICovCglwcm90ZWN0ZWQgZmluYWwgQnVuZGxlQ29udGV4dAkJY29udGV4dDsKCS8qKgoJICogRmlsdGVyIHNwZWNpZnlpbmcgc2VhcmNoIGNyaXRlcmlhIGZvciB0aGUgc2VydmljZXMgdG8gdHJhY2suCgkgKiAKCSAqIEBzaW5jZSAxLjEKCSAqLwoJcHJvdGVjdGVkIGZpbmFsIEZpbHRlcgkJCQlmaWx0ZXI7CgkvKioKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjwvY29kZT4gb2JqZWN0IGZvciB0aGlzIHRyYWNrZXIuCgkgKi8KCWZpbmFsIFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcgkJY3VzdG9taXplcjsKCS8qKgoJICogRmlsdGVyIHN0cmluZyBmb3IgdXNlIHdoZW4gYWRkaW5nIHRoZSBTZXJ2aWNlTGlzdGVuZXIuIElmIHRoaXMgZmllbGQgaXMKCSAqIHNldCwgdGhlbiBjZXJ0YWluIG9wdGltaXphdGlvbnMgY2FuIGJlIHRha2VuIHNpbmNlIHdlIGRvbid0IGhhdmUgYSB1c2VyCgkgKiBzdXBwbGllZCBmaWx0ZXIuCgkgKi8KCWZpbmFsIFN0cmluZwkJCQkJCWxpc3RlbmVyRmlsdGVyOwoJLyoqCgkgKiBDbGFzcyBuYW1lIHRvIGJlIHRyYWNrZWQuIElmIHRoaXMgZmllbGQgaXMgc2V0LCB0aGVuIHdlIGFyZSB0cmFja2luZyBieQoJICogY2xhc3MgbmFtZS4KCSAqLwoJcHJpdmF0ZSBmaW5hbCBTdHJpbmcJCQkJdHJhY2tDbGFzczsKCS8qKgoJICogUmVmZXJlbmNlIHRvIGJlIHRyYWNrZWQuIElmIHRoaXMgZmllbGQgaXMgc2V0LCB0aGVuIHdlIGFyZSB0cmFja2luZyBhCgkgKiBzaW5nbGUgU2VydmljZVJlZmVyZW5jZS4KCSAqLwoJcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlUmVmZXJlbmNlCQl0cmFja1JlZmVyZW5jZTsKCS8qKgoJICogVHJhY2tlZCBzZXJ2aWNlczogPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IC0+IGN1c3RvbWl6ZWQKCSAqIE9iamVjdCBhbmQgPGNvZGU+U2VydmljZUxpc3RlbmVyPC9jb2RlPiBvYmplY3QKCSAqLwoJcHJpdmF0ZSBUcmFja2VkCQkJCQkJdHJhY2tlZDsKCS8qKgoJICogTW9kaWZpY2F0aW9uIGNvdW50LiBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkIHRvIHplcm8gYnkgb3Blbiwgc2V0IHRvIC0xCgkgKiBieSBjbG9zZSBhbmQgaW5jcmVtZW50ZWQgYnkgbW9kaWZpZWQuCgkgKiAKCSAqIFRoaXMgZmllbGQgaXMgdm9sYXRpbGUgc2luY2UgaXQgaXMgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4KCSAqLwoJcHJpdmF0ZSB2b2xhdGlsZSBpbnQJCQkJdHJhY2tpbmdDb3VudAk9IC0xOwoJLyoqCgkgKiBDYWNoZWQgU2VydmljZVJlZmVyZW5jZSBmb3IgZ2V0U2VydmljZVJlZmVyZW5jZS4KCSAqIAoJICogVGhpcyBmaWVsZCBpcyB2b2xhdGlsZSBzaW5jZSBpdCBpcyBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLgoJICovCglwcml2YXRlIHZvbGF0aWxlIFNlcnZpY2VSZWZlcmVuY2UJY2FjaGVkUmVmZXJlbmNlOwoJLyoqCgkgKiBDYWNoZWQgc2VydmljZSBvYmplY3QgZm9yIGdldFNlcnZpY2UuCgkgKiAKCSAqIFRoaXMgZmllbGQgaXMgdm9sYXRpbGUgc2luY2UgaXQgaXMgYWNjZXNzZWQgYnkgbXVsdGlwbGUgdGhyZWFkcy4KCSAqLwoJcHJpdmF0ZSB2b2xhdGlsZSBPYmplY3QJCQkJY2FjaGVkU2VydmljZTsKCgkvKioKCSAqIENyZWF0ZSBhIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3Qgb24gdGhlIHNwZWNpZmllZAoJICogPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFRoZSBzZXJ2aWNlIHJlZmVyZW5jZWQgYnkgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPgoJICogb2JqZWN0IHdpbGwgYmUgdHJhY2tlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBjb250ZXh0IDxjb2RlPkJ1bmRsZUNvbnRleHQ8L2NvZGU+IG9iamVjdCBhZ2FpbnN0IHdoaWNoIHRoZQoJICogICAgICAgIHRyYWNraW5nIGlzIGRvbmUuCgkgKiBAcGFyYW0gcmVmZXJlbmNlIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdCBmb3IgdGhlIHNlcnZpY2UKCSAqICAgICAgICB0byBiZSB0cmFja2VkLgoJICogQHBhcmFtIGN1c3RvbWl6ZXIgVGhlIGN1c3RvbWl6ZXIgb2JqZWN0IHRvIGNhbGwgd2hlbiBzZXJ2aWNlcyBhcmUgYWRkZWQsCgkgKiAgICAgICAgbW9kaWZpZWQsIG9yIHJlbW92ZWQgaW4gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0LgoJICogICAgICAgIElmIGN1c3RvbWl6ZXIgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhpcwoJICogICAgICAgIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3Qgd2lsbCBiZSB1c2VkIGFzIHRoZQoJICogICAgICAgIDxjb2RlPlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjwvY29kZT4gb2JqZWN0IGFuZCB0aGUKCSAqICAgICAgICA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IHdpbGwgY2FsbCB0aGUKCSAqICAgICAgICA8Y29kZT5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI8L2NvZGU+IG1ldGhvZHMgb24gaXRzZWxmLgoJICovCglwdWJsaWMgU2VydmljZVRyYWNrZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwKCQkJU2VydmljZVRyYWNrZXJDdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwoJCXRoaXMudHJhY2tSZWZlcmVuY2UgPSByZWZlcmVuY2U7CgkJdGhpcy50cmFja0NsYXNzID0gbnVsbDsKCQl0aGlzLmN1c3RvbWl6ZXIgPSAoY3VzdG9taXplciA9PSBudWxsKSA/IHRoaXMgOiBjdXN0b21pemVyOwoJCXRoaXMubGlzdGVuZXJGaWx0ZXIgPSAiKCIgKyBDb25zdGFudHMuU0VSVklDRV9JRCArICI9IiArIHJlZmVyZW5jZS5nZXRQcm9wZXJ0eShDb25zdGFudHMuU0VSVklDRV9JRCkudG9TdHJpbmcoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKCQl0cnkgewoJCQl0aGlzLmZpbHRlciA9IGNvbnRleHQuY3JlYXRlRmlsdGVyKGxpc3RlbmVyRmlsdGVyKTsKCQl9CgkJY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgeyAvLyB3ZSBjb3VsZCBvbmx5IGdldCB0aGlzIGV4Y2VwdGlvbgoJCQkvLyBpZiB0aGUgU2VydmljZVJlZmVyZW5jZSB3YXMKCQkJLy8gaW52YWxpZAoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAoJCQkJCSJ1bmV4cGVjdGVkIEludmFsaWRTeW50YXhFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKCQl9Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYSA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IG9uIHRoZSBzcGVjaWZpZWQgY2xhc3MKCSAqIG5hbWUuCgkgKiAKCSAqIDxwPgoJICogU2VydmljZXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUgd2lsbCBiZSB0cmFja2VkIGJ5CgkgKiB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBjb250ZXh0IDxjb2RlPkJ1bmRsZUNvbnRleHQ8L2NvZGU+IG9iamVjdCBhZ2FpbnN0IHdoaWNoIHRoZQoJICogICAgICAgIHRyYWNraW5nIGlzIGRvbmUuCgkgKiBAcGFyYW0gY2xhenogQ2xhc3MgbmFtZSBvZiB0aGUgc2VydmljZXMgdG8gYmUgdHJhY2tlZC4KCSAqIEBwYXJhbSBjdXN0b21pemVyIFRoZSBjdXN0b21pemVyIG9iamVjdCB0byBjYWxsIHdoZW4gc2VydmljZXMgYXJlIGFkZGVkLAoJICogICAgICAgIG1vZGlmaWVkLCBvciByZW1vdmVkIGluIHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqICAgICAgICBJZiBjdXN0b21pemVyIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVuIHRoaXMKCSAqICAgICAgICA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IHdpbGwgYmUgdXNlZCBhcyB0aGUKCSAqICAgICAgICA8Y29kZT5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI8L2NvZGU+IG9iamVjdCBhbmQgdGhlCgkgKiAgICAgICAgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdCB3aWxsIGNhbGwgdGhlCgkgKiAgICAgICAgPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyPC9jb2RlPiBtZXRob2RzIG9uIGl0c2VsZi4KCSAqLwoJcHVibGljIFNlcnZpY2VUcmFja2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGNsYXp6LAoJCQlTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIgY3VzdG9taXplcikgewoJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CgkJdGhpcy50cmFja1JlZmVyZW5jZSA9IG51bGw7CgkJdGhpcy50cmFja0NsYXNzID0gY2xheno7CgkJdGhpcy5jdXN0b21pemVyID0gKGN1c3RvbWl6ZXIgPT0gbnVsbCkgPyB0aGlzIDogY3VzdG9taXplcjsKCQl0aGlzLmxpc3RlbmVyRmlsdGVyID0gIigiICsgQ29uc3RhbnRzLk9CSkVDVENMQVNTICsgIj0iICsgY2xhenoudG9TdHJpbmcoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKCQl0cnkgewoJCQl0aGlzLmZpbHRlciA9IGNvbnRleHQuY3JlYXRlRmlsdGVyKGxpc3RlbmVyRmlsdGVyKTsKCQl9CgkJY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgeyAvLyB3ZSBjb3VsZCBvbmx5IGdldCB0aGlzIGV4Y2VwdGlvbgoJCQkvLyBpZiB0aGUgY2xhenogYXJndW1lbnQgd2FzCgkJCS8vIG1hbGZvcm1lZAoJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAoJCQkJCSJ1bmV4cGVjdGVkIEludmFsaWRTeW50YXhFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKCQl9Cgl9CgoJLyoqCgkgKiBDcmVhdGUgYSA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IG9uIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPkZpbHRlcjwvY29kZT4gb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFNlcnZpY2VzIHdoaWNoIG1hdGNoIHRoZSBzcGVjaWZpZWQgPGNvZGU+RmlsdGVyPC9jb2RlPiBvYmplY3Qgd2lsbCBiZQoJICogdHJhY2tlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBjb250ZXh0IDxjb2RlPkJ1bmRsZUNvbnRleHQ8L2NvZGU+IG9iamVjdCBhZ2FpbnN0IHdoaWNoIHRoZQoJICogICAgICAgIHRyYWNraW5nIGlzIGRvbmUuCgkgKiBAcGFyYW0gZmlsdGVyIDxjb2RlPkZpbHRlcjwvY29kZT4gb2JqZWN0IHRvIHNlbGVjdCB0aGUgc2VydmljZXMgdG8gYmUKCSAqICAgICAgICB0cmFja2VkLgoJICogQHBhcmFtIGN1c3RvbWl6ZXIgVGhlIGN1c3RvbWl6ZXIgb2JqZWN0IHRvIGNhbGwgd2hlbiBzZXJ2aWNlcyBhcmUgYWRkZWQsCgkgKiAgICAgICAgbW9kaWZpZWQsIG9yIHJlbW92ZWQgaW4gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0LgoJICogICAgICAgIElmIGN1c3RvbWl6ZXIgaXMgbnVsbCwgdGhlbiB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPgoJICogICAgICAgIG9iamVjdCB3aWxsIGJlIHVzZWQgYXMgdGhlIDxjb2RlPlNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjwvY29kZT4KCSAqICAgICAgICBvYmplY3QgYW5kIHRoZSA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IHdpbGwgY2FsbCB0aGUKCSAqICAgICAgICA8Y29kZT5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI8L2NvZGU+IG1ldGhvZHMgb24gaXRzZWxmLgoJICogQHNpbmNlIDEuMQoJICovCglwdWJsaWMgU2VydmljZVRyYWNrZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBGaWx0ZXIgZmlsdGVyLAoJCQlTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIgY3VzdG9taXplcikgewoJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CgkJdGhpcy50cmFja1JlZmVyZW5jZSA9IG51bGw7CgkJdGhpcy50cmFja0NsYXNzID0gbnVsbDsKCQl0aGlzLmxpc3RlbmVyRmlsdGVyID0gbnVsbDsKCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKCQl0aGlzLmN1c3RvbWl6ZXIgPSAoY3VzdG9taXplciA9PSBudWxsKSA/IHRoaXMgOiBjdXN0b21pemVyOwoJCWlmICgoY29udGV4dCA9PSBudWxsKSB8fCAoZmlsdGVyID09IG51bGwpKSB7IC8vIHdlIHRocm93IGEgTlBFIGhlcmUKCQkJLy8gdG8KCQkJLy8gYmUgY29uc2lzdGVudCB3aXRoIHRoZQoJCQkvLyBvdGhlciBjb25zdHJ1Y3RvcnMKCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CgkJfQoJfQoKCS8qKgoJICogT3BlbiB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgYW5kIGJlZ2luIHRyYWNraW5nCgkgKiBzZXJ2aWNlcy4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBjYWxscyA8Y29kZT5vcGVuKGZhbHNlKTwvY29kZT4uCgkgKiAKCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+QnVuZGxlQ29udGV4dDwvY29kZT4KCSAqICAgICAgICAgb2JqZWN0IHdpdGggd2hpY2ggdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IHdhcwoJICogICAgICAgICBjcmVhdGVkIGlzIG5vIGxvbmdlciB2YWxpZC4KCSAqIEBzZWUgI29wZW4oYm9vbGVhbikKCSAqLwoJcHVibGljIHZvaWQgb3BlbigpIHsKCQlvcGVuKGZhbHNlKTsKCX0KCgkvKioKCSAqIE9wZW4gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IGFuZCBiZWdpbiB0cmFja2luZwoJICogc2VydmljZXMuCgkgKiAKCSAqIDxwPgoJICogU2VydmljZXMgd2hpY2ggbWF0Y2ggdGhlIHNlYXJjaCBjcml0ZXJpYSBzcGVjaWZpZWQgd2hlbiB0aGlzCgkgKiA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IHdhcyBjcmVhdGVkIGFyZSBub3cgdHJhY2tlZCBieSB0aGlzCgkgKiA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0LgoJICogCgkgKiBAcGFyYW0gdHJhY2tBbGxTZXJ2aWNlcyBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGlzCgkgKiAgICAgICAgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IHdpbGwgdHJhY2sgYWxsIG1hdGNoaW5nIHNlcnZpY2VzCgkgKiAgICAgICAgcmVnYXJkbGVzcyBvZiBjbGFzcyBsb2FkZXIgYWNjZXNzaWJpbGl0eS4gSWYgPGNvZGU+ZmFsc2U8L2NvZGU+LAoJICogICAgICAgIHRoZW4gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gd2lsbCBvbmx5IHRyYWNrIG1hdGNoaW5nCgkgKiAgICAgICAgc2VydmljZXMgd2hpY2ggYXJlIGNsYXNzIGxvYWRlciBhY2Nlc3NpYmlsZSB0byB0aGUgYnVuZGxlIHdob3NlCgkgKiAgICAgICAgPGNvZGU+QnVuZGxlQ29udGV4dDwvY29kZT4gaXMgdXNlZCBieSB0aGlzCgkgKiAgICAgICAgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+LgoJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSA8Y29kZT5CdW5kbGVDb250ZXh0PC9jb2RlPgoJICogICAgICAgICBvYmplY3Qgd2l0aCB3aGljaCB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3Qgd2FzCgkgKiAgICAgICAgIGNyZWF0ZWQgaXMgbm8gbG9uZ2VyIHZhbGlkLgoJICogQHNpbmNlIDEuMwoJICovCglwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb3Blbihib29sZWFuIHRyYWNrQWxsU2VydmljZXMpIHsKCQlpZiAodHJhY2tlZCAhPSBudWxsKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKERFQlVHKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VydmljZVRyYWNrZXIub3BlbjogIiArIGZpbHRlcik7IC8vJE5PTi1OTFMtMSQKCQl9CgkJdHJhY2tlZCA9IHRyYWNrQWxsU2VydmljZXMgPyBuZXcgQWxsVHJhY2tlZCgpIDogbmV3IFRyYWNrZWQoKTsKCQl0cmFja2luZ0NvdW50ID0gMDsKCQlzeW5jaHJvbml6ZWQgKHRyYWNrZWQpIHsKCQkJdHJ5IHsKCQkJCWNvbnRleHQuYWRkU2VydmljZUxpc3RlbmVyKHRyYWNrZWQsIGxpc3RlbmVyRmlsdGVyKTsKCQkJCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzOwoJCQkJaWYgKGxpc3RlbmVyRmlsdGVyID09IG51bGwpIHsgLy8gdXNlciBzdXBwbGllZCBmaWx0ZXIKCQkJCQlyZWZlcmVuY2VzID0gZ2V0SW5pdGlhbFJlZmVyZW5jZXModHJhY2tBbGxTZXJ2aWNlcywgbnVsbCwKCQkJCQkJCWZpbHRlci50b1N0cmluZygpKTsKCQkJCX0KCQkJCWVsc2UgeyAvLyBjb25zdHJ1Y3RvciBzdXBwbGllZCBmaWx0ZXIKCQkJCQlpZiAodHJhY2tDbGFzcyA9PSBudWxsKSB7CgkJCQkJCXJlZmVyZW5jZXMgPSBuZXcgU2VydmljZVJlZmVyZW5jZVtdIHt0cmFja1JlZmVyZW5jZX07CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQlyZWZlcmVuY2VzID0gZ2V0SW5pdGlhbFJlZmVyZW5jZXModHJhY2tBbGxTZXJ2aWNlcywKCQkJCQkJCQl0cmFja0NsYXNzLCBudWxsKTsKCQkJCQl9CgkJCQl9CgoJCQkJdHJhY2tlZC5zZXRJbml0aWFsU2VydmljZXMocmVmZXJlbmNlcyk7IC8vIHNldCB0cmFja2VkIHdpdGgKCQkJCS8vIHRoZSBpbml0aWFsCgkJCQkvLyByZWZlcmVuY2VzCgkJCX0KCQkJY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewoJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCgkJCQkJCSJ1bmV4cGVjdGVkIEludmFsaWRTeW50YXhFeGNlcHRpb246ICIgKyBlLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKCQkJfQoJCX0KCQkvKiBDYWxsIHRyYWNrZWQgb3V0c2lkZSBvZiBzeW5jaHJvbml6ZWQgcmVnaW9uICovCgkJdHJhY2tlZC50cmFja0luaXRpYWxTZXJ2aWNlcygpOyAvLyBwcm9jZXNzIHRoZSBpbml0aWFsIHJlZmVyZW5jZXMKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgaW5pdGlhbCA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3RzIHRoYXQKCSAqIHdpbGwgYmUgdHJhY2tlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSB0cmFja0FsbFNlcnZpY2VzIElmIHRydWUsIHVzZSBnZXRBbGxTZXJ2aWNlUmVmZXJlbmNlcy4KCSAqIEBwYXJhbSB0cmFja0NsYXNzIHRoZSBjbGFzcyBuYW1lIHdpdGggd2hpY2ggdGhlIHNlcnZpY2Ugd2FzIHJlZ2lzdGVyZWQsCgkgKiAgICAgICAgb3IgbnVsbCBmb3IgYWxsIHNlcnZpY2VzLgoJICogQHBhcmFtIGZpbHRlclN0cmluZyB0aGUgZmlsdGVyIGNyaXRlcmlhIG9yIG51bGwgZm9yIGFsbCBzZXJ2aWNlcy4KCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgaW5pdGlhbCA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3RzLgoJICogQHRocm93cyBJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgdXNlcyBhbiBpbnZhbGlkIHN5bnRheC4KCSAqLwoJcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlW10gZ2V0SW5pdGlhbFJlZmVyZW5jZXMoYm9vbGVhbiB0cmFja0FsbFNlcnZpY2VzLAoJCQlTdHJpbmcgdHJhY2tDbGFzcywgU3RyaW5nIGZpbHRlclN0cmluZykKCQkJdGhyb3dzIEludmFsaWRTeW50YXhFeGNlcHRpb24gewoJCWlmICh0cmFja0FsbFNlcnZpY2VzKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEFsbFNlcnZpY2VSZWZlcmVuY2VzKHRyYWNrQ2xhc3MsIGZpbHRlclN0cmluZyk7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlcyh0cmFja0NsYXNzLCBmaWx0ZXJTdHJpbmcpOwoJCX0KCX0KCgkvKioKCSAqIENsb3NlIHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4KCSAqIG9iamVjdCBzaG91bGQgZW5kIHRoZSB0cmFja2luZyBvZiBzZXJ2aWNlcy4KCSAqLwoJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgewoJCWlmICh0cmFja2VkID09IG51bGwpIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoREVCVUcpIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5jbG9zZTogIiArIGZpbHRlcik7IC8vJE5PTi1OTFMtMSQKCQl9CgkJdHJhY2tlZC5jbG9zZSgpOwoJCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0U2VydmljZVJlZmVyZW5jZXMoKTsKCQlUcmFja2VkIG91dGdvaW5nID0gdHJhY2tlZDsKCQl0cmFja2VkID0gbnVsbDsKCQl0cnkgewoJCQljb250ZXh0LnJlbW92ZVNlcnZpY2VMaXN0ZW5lcihvdXRnb2luZyk7CgkJfQoJCWNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewoJCQkvKiBJbiBjYXNlIHRoZSBjb250ZXh0IHdhcyBzdG9wcGVkLiAqLwoJCX0KCQlpZiAocmVmZXJlbmNlcyAhPSBudWxsKSB7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewoJCQkJb3V0Z29pbmcudW50cmFjayhyZWZlcmVuY2VzW2ldKTsKCQkJfQoJCX0KCQl0cmFja2luZ0NvdW50ID0gLTE7CgkJaWYgKERFQlVHKSB7CgkJCWlmICgoY2FjaGVkUmVmZXJlbmNlID09IG51bGwpICYmIChjYWNoZWRTZXJ2aWNlID09IG51bGwpKSB7CgkJCQlTeXN0ZW0ub3V0CgkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5jbG9zZVtjYWNoZWQgY2xlYXJlZF06ICIgKyBmaWx0ZXIpOyAvLyROT04tTkxTLTEkCgkJCX0KCQl9Cgl9CgoJLyoqCgkgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZQoJICogPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyLmFkZGluZ1NlcnZpY2U8L2NvZGU+IG1ldGhvZC4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdAoJICogaGFzIGJlZW4gY29uc3RydWN0ZWQgd2l0aCBhIDxjb2RlPm51bGwgU2VydmljZVRyYWNrZXJDdXN0b21pemVyPC9jb2RlPgoJICogYXJndW1lbnQuCgkgKiAKCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCgkgKiA8Y29kZT5nZXRTZXJ2aWNlPC9jb2RlPiwgb24gdGhlIDxjb2RlPkJ1bmRsZUNvbnRleHQ8L2NvZGU+IG9iamVjdAoJICogd2l0aCB3aGljaCB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3Qgd2FzIGNyZWF0ZWQsIHBhc3NpbmcKCSAqIHRoZSBzcGVjaWZpZWQgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0LgoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRvIGN1c3RvbWl6ZSB0aGUgc2VydmljZQoJICogb2JqZWN0IHRvIGJlIHRyYWNrZWQgZm9yIHRoZSBzZXJ2aWNlIGJlaW5nIGFkZGVkLiBJbiB0aGF0IGNhc2UsIHRha2UgY2FyZQoJICogbm90IHRvIHJlbHkgb24gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgcmVtb3ZlZFNlcnZpY2UgdGhhdCB3aWxsCgkgKiB1bmdldCB0aGUgc2VydmljZS4KCSAqIAoJICogQHBhcmFtIHJlZmVyZW5jZSBSZWZlcmVuY2UgdG8gc2VydmljZSBiZWluZyBhZGRlZCB0byB0aGlzCgkgKiAgICAgICAgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIEByZXR1cm4gVGhlIHNlcnZpY2Ugb2JqZWN0IHRvIGJlIHRyYWNrZWQgZm9yIHRoZSBzZXJ2aWNlIGFkZGVkIHRvIHRoaXMKCSAqICAgICAgICAgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIEBzZWUgU2VydmljZVRyYWNrZXJDdXN0b21pemVyCgkgKi8KCXB1YmxpYyBPYmplY3QgYWRkaW5nU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewoJCXJldHVybiBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKCX0KCgkvKioKCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlCgkgKiA8Y29kZT5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIubW9kaWZpZWRTZXJ2aWNlPC9jb2RlPiBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QKCSAqIGhhcyBiZWVuIGNvbnN0cnVjdGVkIHdpdGggYSA8Y29kZT5udWxsIFNlcnZpY2VUcmFja2VyQ3VzdG9taXplcjwvY29kZT4KCSAqIGFyZ3VtZW50LgoJICogCgkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIG1vZGlmaWVkIHNlcnZpY2UuCgkgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSBvYmplY3QgZm9yIHRoZSBtb2RpZmllZCBzZXJ2aWNlLgoJICogQHNlZSBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIKCSAqLwoJcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewoJfQoKCS8qKgoJICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyQ3VzdG9taXplci5yZW1vdmVkU2VydmljZTwvY29kZT4gbWV0aG9kLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0CgkgKiBoYXMgYmVlbiBjb25zdHJ1Y3RlZCB3aXRoIGEgPGNvZGU+bnVsbCBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI8L2NvZGU+CgkgKiBhcmd1bWVudC4KCSAqIAoJICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgPGNvZGU+dW5nZXRTZXJ2aWNlPC9jb2RlPiwgb24gdGhlCgkgKiA8Y29kZT5CdW5kbGVDb250ZXh0PC9jb2RlPiBvYmplY3Qgd2l0aCB3aGljaCB0aGlzCgkgKiA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IHdhcyBjcmVhdGVkLCBwYXNzaW5nIHRoZSBzcGVjaWZpZWQKCSAqIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdC4KCSAqIDxwPgoJICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcy4gSWYgdGhlIGRlZmF1bHQKCSAqIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPmFkZGluZ1NlcnZpY2U8L2NvZGU+IG1ldGhvZCB3YXMgdXNlZCwgdGhpcwoJICogbWV0aG9kIG11c3QgdW5nZXQgdGhlIHNlcnZpY2UuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIHJlbW92ZWQgc2VydmljZS4KCSAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9iamVjdCBmb3IgdGhlIHJlbW92ZWQgc2VydmljZS4KCSAqIEBzZWUgU2VydmljZVRyYWNrZXJDdXN0b21pemVyCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewoJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Cgl9CgoJLyoqCgkgKiBXYWl0IGZvciBhdCBsZWFzdCBvbmUgc2VydmljZSB0byBiZSB0cmFja2VkIGJ5IHRoaXMKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiA8cD4KCSAqIEl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRoYXQgPGNvZGU+d2FpdEZvclNlcnZpY2U8L2NvZGU+IGlzIG5vdCB1c2VkCgkgKiBkdXJpbmcgdGhlIGNhbGxpbmcgb2YgdGhlIDxjb2RlPkJ1bmRsZUFjdGl2YXRvcjwvY29kZT4gbWV0aG9kcy4KCSAqIDxjb2RlPkJ1bmRsZUFjdGl2YXRvcjwvY29kZT4gbWV0aG9kcyBhcmUgZXhwZWN0ZWQgdG8gY29tcGxldGUgaW4gYQoJICogc2hvcnQgcGVyaW9kIG9mIHRpbWUuCgkgKiAKCSAqIEBwYXJhbSB0aW1lb3V0IHRpbWUgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQuIElmIHplcm8sIHRoZSBtZXRob2QKCSAqICAgICAgICB3aWxsIHdhaXQgaW5kZWZpbmF0ZWx5LgoJICogQHJldHVybiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgPGNvZGU+Z2V0U2VydmljZSgpPC9jb2RlPi4KCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gSWYgYW5vdGhlciB0aHJlYWQgaGFzIGludGVycnVwdGVkIHRoZQoJICogICAgICAgICBjdXJyZW50IHRocmVhZC4KCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIHRoZSB2YWx1ZSBvZiB0aW1lb3V0IGlzIG5lZ2F0aXZlLgoJICovCglwdWJsaWMgT2JqZWN0IHdhaXRGb3JTZXJ2aWNlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKCQlpZiAodGltZW91dCA8IDApIHsKCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGltZW91dCB2YWx1ZSBpcyBuZWdhdGl2ZSIpOyAvLyROT04tTkxTLTEkCgkJfQoJCU9iamVjdCBvYmplY3QgPSBnZXRTZXJ2aWNlKCk7CgkJd2hpbGUgKG9iamVjdCA9PSBudWxsKSB7CgkJCVRyYWNrZWQgdHJhY2tlZCA9IHRoaXMudHJhY2tlZDsgLyoKCQkJCQkJCQkJCQkgKiB1c2UgbG9jYWwgdmFyIHNpbmNlIHdlIGFyZSBub3QKCQkJCQkJCQkJCQkgKiBzeW5jaHJvbml6ZWQKCQkJCQkJCQkJCQkgKi8KCQkJaWYgKHRyYWNrZWQgPT0gbnVsbCkgeyAvKiBpZiBTZXJ2aWNlVHJhY2tlciBpcyBub3Qgb3BlbiAqLwoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQkJc3luY2hyb25pemVkICh0cmFja2VkKSB7CgkJCQlpZiAodHJhY2tlZC5zaXplKCkgPT0gMCkgewoJCQkJCXRyYWNrZWQud2FpdCh0aW1lb3V0KTsKCQkJCX0KCQkJfQoJCQlvYmplY3QgPSBnZXRTZXJ2aWNlKCk7CgkJCWlmICh0aW1lb3V0ID4gMCkgewoJCQkJcmV0dXJuIG9iamVjdDsKCQkJfQoJCX0KCQlyZXR1cm4gb2JqZWN0OwoJfQoKCS8qKgoJICogUmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdHMgZm9yIGFsbAoJICogc2VydmljZXMgYmVpbmcgdHJhY2tlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gQXJyYXkgb2YgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0cyBvcgoJICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBzZXJ2aWNlIGFyZSBiZWluZyB0cmFja2VkLgoJICovCglwdWJsaWMgU2VydmljZVJlZmVyZW5jZVtdIGdldFNlcnZpY2VSZWZlcmVuY2VzKCkgewoJCVRyYWNrZWQgdHJhY2tlZCA9IHRoaXMudHJhY2tlZDsgLyoKCQkJCQkJCQkJCSAqIHVzZSBsb2NhbCB2YXIgc2luY2Ugd2UgYXJlIG5vdAoJCQkJCQkJCQkJICogc3luY2hyb25pemVkCgkJCQkJCQkJCQkgKi8KCQlpZiAodHJhY2tlZCA9PSBudWxsKSB7IC8qIGlmIFNlcnZpY2VUcmFja2VyIGlzIG5vdCBvcGVuICovCgkJCXJldHVybiBudWxsOwoJCX0KCQlzeW5jaHJvbml6ZWQgKHRyYWNrZWQpIHsKCQkJaW50IGxlbmd0aCA9IHRyYWNrZWQuc2l6ZSgpOwoJCQlpZiAobGVuZ3RoID09IDApIHsKCQkJCXJldHVybiBudWxsOwoJCQl9CgkJCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IFNlcnZpY2VSZWZlcmVuY2VbbGVuZ3RoXTsKCQkJRW51bWVyYXRpb24ga2V5cyA9IHRyYWNrZWQua2V5cygpOwoJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJCQlyZWZlcmVuY2VzW2ldID0gKFNlcnZpY2VSZWZlcmVuY2UpIGtleXMubmV4dEVsZW1lbnQoKTsKCQkJfQoJCQlyZXR1cm4gcmVmZXJlbmNlczsKCQl9Cgl9CgoJLyoqCgkgKiBSZXR1cm5zIGEgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IGZvciBvbmUgb2YgdGhlIHNlcnZpY2VzCgkgKiBiZWluZyB0cmFja2VkIGJ5IHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBJZiBtdWx0aXBsZSBzZXJ2aWNlcyBhcmUgYmVpbmcgdHJhY2tlZCwgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgaGlnaGVzdAoJICogcmFua2luZyAoYXMgc3BlY2lmaWVkIGluIGl0cyA8Y29kZT5zZXJ2aWNlLnJhbmtpbmc8L2NvZGU+IHByb3BlcnR5KSBpcwoJICogcmV0dXJuZWQuCgkgKiAKCSAqIDxwPgoJICogSWYgdGhlcmUgaXMgYSB0aWUgaW4gcmFua2luZywgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgbG93ZXN0IHNlcnZpY2UgSUQgKGFzCgkgKiBzcGVjaWZpZWQgaW4gaXRzIDxjb2RlPnNlcnZpY2UuaWQ8L2NvZGU+IHByb3BlcnR5KTsgdGhhdCBpcywgdGhlCgkgKiBzZXJ2aWNlIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZmlyc3QgaXMgcmV0dXJuZWQuCgkgKiA8cD4KCSAqIFRoaXMgaXMgdGhlIHNhbWUgYWxnb3JpdGhtIHVzZWQgYnkKCSAqIDxjb2RlPkJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZTwvY29kZT4uCgkgKiAKCSAqIEByZXR1cm4gPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCgkgKiAgICAgICAgIG5vIHNlcnZpY2UgaXMgYmVpbmcgdHJhY2tlZC4KCSAqIEBzaW5jZSAxLjEKCSAqLwoJcHVibGljIFNlcnZpY2VSZWZlcmVuY2UgZ2V0U2VydmljZVJlZmVyZW5jZSgpIHsKCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNhY2hlZFJlZmVyZW5jZTsKCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKCQkJaWYgKERFQlVHKSB7CgkJCQlTeXN0ZW0ub3V0CgkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5nZXRTZXJ2aWNlUmVmZXJlbmNlW2NhY2hlZF06ICIgKyBmaWx0ZXIpOyAvLyROT04tTkxTLTEkCgkJCX0KCQkJcmV0dXJuIHJlZmVyZW5jZTsKCQl9CgkJaWYgKERFQlVHKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VydmljZVRyYWNrZXIuZ2V0U2VydmljZVJlZmVyZW5jZTogIiArIGZpbHRlcik7IC8vJE5PTi1OTFMtMSQKCQl9CgkJU2VydmljZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBnZXRTZXJ2aWNlUmVmZXJlbmNlcygpOwoJCWludCBsZW5ndGggPSAocmVmZXJlbmNlcyA9PSBudWxsKSA/IDAgOiByZWZlcmVuY2VzLmxlbmd0aDsKCQlpZiAobGVuZ3RoID09IDApIC8qIGlmIG5vIHNlcnZpY2UgaXMgYmVpbmcgdHJhY2tlZCAqLwoJCXsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCWludCBpbmRleCA9IDA7CgkJaWYgKGxlbmd0aCA+IDEpIC8qIGlmIG1vcmUgdGhhbiBvbmUgc2VydmljZSwgc2VsZWN0IGhpZ2hlc3QgcmFua2luZyAqLwoJCXsKCQkJaW50IHJhbmtpbmdzW10gPSBuZXcgaW50W2xlbmd0aF07CgkJCWludCBjb3VudCA9IDA7CgkJCWludCBtYXhSYW5raW5nID0gSW50ZWdlci5NSU5fVkFMVUU7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKCQkJCU9iamVjdCBwcm9wZXJ0eSA9IHJlZmVyZW5jZXNbaV0KCQkJCQkJLmdldFByb3BlcnR5KENvbnN0YW50cy5TRVJWSUNFX1JBTktJTkcpOwoJCQkJaW50IHJhbmtpbmcgPSAocHJvcGVydHkgaW5zdGFuY2VvZiBJbnRlZ2VyKSA/ICgoSW50ZWdlcikgcHJvcGVydHkpCgkJCQkJCS5pbnRWYWx1ZSgpCgkJCQkJCTogMDsKCQkJCXJhbmtpbmdzW2ldID0gcmFua2luZzsKCQkJCWlmIChyYW5raW5nID4gbWF4UmFua2luZykgewoJCQkJCWluZGV4ID0gaTsKCQkJCQltYXhSYW5raW5nID0gcmFua2luZzsKCQkJCQljb3VudCA9IDE7CgkJCQl9CgkJCQllbHNlIHsKCQkJCQlpZiAocmFua2luZyA9PSBtYXhSYW5raW5nKSB7CgkJCQkJCWNvdW50Kys7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCWlmIChjb3VudCA+IDEpIC8qIGlmIHN0aWxsIG1vcmUgdGhhbiBvbmUgc2VydmljZSwgc2VsZWN0IGxvd2VzdCBpZCAqLwoJCQl7CgkJCQlsb25nIG1pbklkID0gTG9uZy5NQVhfVkFMVUU7CgkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CgkJCQkJaWYgKHJhbmtpbmdzW2ldID09IG1heFJhbmtpbmcpIHsKCQkJCQkJbG9uZyBpZCA9ICgoTG9uZykgKHJlZmVyZW5jZXNbaV0KCQkJCQkJCQkuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLlNFUlZJQ0VfSUQpKSkKCQkJCQkJCQkubG9uZ1ZhbHVlKCk7CgkJCQkJCWlmIChpZCA8IG1pbklkKSB7CgkJCQkJCQlpbmRleCA9IGk7CgkJCQkJCQltaW5JZCA9IGlkOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCXJldHVybiBjYWNoZWRSZWZlcmVuY2UgPSByZWZlcmVuY2VzW2luZGV4XTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHNlcnZpY2Ugb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkCgkgKiA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3QgaWYgdGhlIHJlZmVyZW5jZWQgc2VydmljZSBpcyBiZWluZwoJICogdHJhY2tlZCBieSB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIHRoZSBkZXNpcmVkIHNlcnZpY2UuCgkgKiBAcmV0dXJuIFNlcnZpY2Ugb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzZXJ2aWNlIHJlZmVyZW5jZWQKCSAqICAgICAgICAgYnkgdGhlIHNwZWNpZmllZCA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3QgaXMgbm90CgkgKiAgICAgICAgIGJlaW5nIHRyYWNrZWQuCgkgKi8KCXB1YmxpYyBPYmplY3QgZ2V0U2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewoJCVRyYWNrZWQgdHJhY2tlZCA9IHRoaXMudHJhY2tlZDsgLyoKCQkJCQkJCQkJCSAqIHVzZSBsb2NhbCB2YXIgc2luY2Ugd2UgYXJlIG5vdAoJCQkJCQkJCQkJICogc3luY2hyb25pemVkCgkJCQkJCQkJCQkgKi8KCQlpZiAodHJhY2tlZCA9PSBudWxsKSB7IC8qIGlmIFNlcnZpY2VUcmFja2VyIGlzIG5vdCBvcGVuICovCgkJCXJldHVybiBudWxsOwoJCX0KCQlzeW5jaHJvbml6ZWQgKHRyYWNrZWQpIHsKCQkJcmV0dXJuIHRyYWNrZWQuZ2V0KHJlZmVyZW5jZSk7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJuIGFuIGFycmF5IG9mIHNlcnZpY2Ugb2JqZWN0cyBmb3IgYWxsIHNlcnZpY2VzIGJlaW5nIHRyYWNrZWQgYnkgdGhpcwoJICogPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogQHJldHVybiBBcnJheSBvZiBzZXJ2aWNlIG9iamVjdHMgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc2VydmljZSBhcmUKCSAqICAgICAgICAgYmVpbmcgdHJhY2tlZC4KCSAqLwoJcHVibGljIE9iamVjdFtdIGdldFNlcnZpY2VzKCkgewoJCVRyYWNrZWQgdHJhY2tlZCA9IHRoaXMudHJhY2tlZDsgLyoKCQkJCQkJCQkJCSAqIHVzZSBsb2NhbCB2YXIgc2luY2Ugd2UgYXJlIG5vdAoJCQkJCQkJCQkJICogc3luY2hyb25pemVkCgkJCQkJCQkJCQkgKi8KCQlpZiAodHJhY2tlZCA9PSBudWxsKSB7IC8qIGlmIFNlcnZpY2VUcmFja2VyIGlzIG5vdCBvcGVuICovCgkJCXJldHVybiBudWxsOwoJCX0KCQlzeW5jaHJvbml6ZWQgKHRyYWNrZWQpIHsKCQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBnZXRTZXJ2aWNlUmVmZXJlbmNlcygpOwoJCQlpbnQgbGVuZ3RoID0gKHJlZmVyZW5jZXMgPT0gbnVsbCkgPyAwIDogcmVmZXJlbmNlcy5sZW5ndGg7CgkJCWlmIChsZW5ndGggPT0gMCkgewoJCQkJcmV0dXJuIG51bGw7CgkJCX0KCQkJT2JqZWN0W10gb2JqZWN0cyA9IG5ldyBPYmplY3RbbGVuZ3RoXTsKCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewoJCQkJb2JqZWN0c1tpXSA9IGdldFNlcnZpY2UocmVmZXJlbmNlc1tpXSk7CgkJCX0KCQkJcmV0dXJuIG9iamVjdHM7CgkJfQoJfQoKCS8qKgoJICogUmV0dXJucyBhIHNlcnZpY2Ugb2JqZWN0IGZvciBvbmUgb2YgdGhlIHNlcnZpY2VzIGJlaW5nIHRyYWNrZWQgYnkgdGhpcwoJICogPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogPHA+CgkgKiBJZiBhbnkgc2VydmljZXMgYXJlIGJlaW5nIHRyYWNrZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlc3VsdCBvZgoJICogY2FsbGluZyA8Y29kZT5nZXRTZXJ2aWNlKGdldFNlcnZpY2VSZWZlcmVuY2UoKSk8L2NvZGU+LgoJICogCgkgKiBAcmV0dXJuIFNlcnZpY2Ugb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHNlcnZpY2UgaXMgYmVpbmcKCSAqICAgICAgICAgdHJhY2tlZC4KCSAqLwoJcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlKCkgewoJCU9iamVjdCBzZXJ2aWNlID0gY2FjaGVkU2VydmljZTsKCQlpZiAoc2VydmljZSAhPSBudWxsKSB7CgkJCWlmIChERUJVRykgewoJCQkJU3lzdGVtLm91dAoJCQkJCQkucHJpbnRsbigiU2VydmljZVRyYWNrZXIuZ2V0U2VydmljZVtjYWNoZWRdOiAiICsgZmlsdGVyKTsgLy8kTk9OLU5MUy0xJAoJCQl9CgkJCXJldHVybiBzZXJ2aWNlOwoJCX0KCQlpZiAoREVCVUcpIHsKCQkJU3lzdGVtLm91dC5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5nZXRTZXJ2aWNlOiAiICsgZmlsdGVyKTsgLy8kTk9OLU5MUy0xJAoJCX0KCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGdldFNlcnZpY2VSZWZlcmVuY2UoKTsKCQlpZiAocmVmZXJlbmNlID09IG51bGwpIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoJCXJldHVybiBjYWNoZWRTZXJ2aWNlID0gZ2V0U2VydmljZShyZWZlcmVuY2UpOwoJfQoKCS8qKgoJICogUmVtb3ZlIGEgc2VydmljZSBmcm9tIHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogVGhlIHNwZWNpZmllZCBzZXJ2aWNlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoaXMKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuIElmIHRoZSBzcGVjaWZpZWQgc2VydmljZSB3YXMgYmVpbmcKCSAqIHRyYWNrZWQgdGhlbiB0aGUgPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyLnJlbW92ZWRTZXJ2aWNlPC9jb2RlPgoJICogbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZvciB0aGF0IHNlcnZpY2UuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlIHRvIGJlIHJlbW92ZWQuCgkgKi8KCXB1YmxpYyB2b2lkIHJlbW92ZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewoJCVRyYWNrZWQgdHJhY2tlZCA9IHRoaXMudHJhY2tlZDsgLyoKCQkJCQkJCQkJCSAqIHVzZSBsb2NhbCB2YXIgc2luY2Ugd2UgYXJlIG5vdAoJCQkJCQkJCQkJICogc3luY2hyb25pemVkCgkJCQkJCQkJCQkgKi8KCQlpZiAodHJhY2tlZCA9PSBudWxsKSB7IC8qIGlmIFNlcnZpY2VUcmFja2VyIGlzIG5vdCBvcGVuICovCgkJCXJldHVybjsKCQl9CgkJdHJhY2tlZC51bnRyYWNrKHJlZmVyZW5jZSk7Cgl9CgoJLyoqCgkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZXJ2aWNlcyBiZWluZyB0cmFja2VkIGJ5IHRoaXMKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEByZXR1cm4gTnVtYmVyIG9mIHNlcnZpY2VzIGJlaW5nIHRyYWNrZWQuCgkgKi8KCXB1YmxpYyBpbnQgc2l6ZSgpIHsKCQlUcmFja2VkIHRyYWNrZWQgPSB0aGlzLnRyYWNrZWQ7IC8qCgkJCQkJCQkJCQkgKiB1c2UgbG9jYWwgdmFyIHNpbmNlIHdlIGFyZSBub3QKCQkJCQkJCQkJCSAqIHN5bmNocm9uaXplZAoJCQkJCQkJCQkJICovCgkJaWYgKHRyYWNrZWQgPT0gbnVsbCkgeyAvKiBpZiBTZXJ2aWNlVHJhY2tlciBpcyBub3Qgb3BlbiAqLwoJCQlyZXR1cm4gMDsKCQl9CgkJcmV0dXJuIHRyYWNrZWQuc2l6ZSgpOwoJfQoKCS8qKgoJICogUmV0dXJucyB0aGUgdHJhY2tpbmcgY291bnQgZm9yIHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdC4KCSAqIAoJICogVGhlIHRyYWNraW5nIGNvdW50IGlzIGluaXRpYWxpemVkIHRvIDAgd2hlbiB0aGlzCgkgKiA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0IGlzIG9wZW5lZC4gRXZlcnkgdGltZSBhIHNlcnZpY2UgaXMKCSAqIGFkZGVkIG9yIHJlbW92ZWQgZnJvbSB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgdGhlCgkgKiB0cmFja2luZyBjb3VudCBpcyBpbmNyZW1lbnRlZC4KCSAqIAoJICogPHA+CgkgKiBUaGUgdHJhY2tpbmcgY291bnQgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgaGFzIGFkZGVkIG9yIHJlbW92ZWQgYSBzZXJ2aWNlIGJ5CgkgKiBjb21wYXJpbmcgYSB0cmFja2luZyBjb3VudCB2YWx1ZSBwcmV2aW91c2x5IGNvbGxlY3RlZCB3aXRoIHRoZSBjdXJyZW50CgkgKiB0cmFja2luZyBjb3VudCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGhhcyBub3QgY2hhbmdlZCwgdGhlbiBubyBzZXJ2aWNlIGhhcwoJICogYmVlbiBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhpcyA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0CgkgKiBzaW5jZSB0aGUgcHJldmlvdXMgdHJhY2tpbmcgY291bnQgd2FzIGNvbGxlY3RlZC4KCSAqIAoJICogQHNpbmNlIDEuMgoJICogQHJldHVybiBUaGUgdHJhY2tpbmcgY291bnQgZm9yIHRoaXMgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdAoJICogICAgICAgICBvciAtMSBpZiB0aGlzIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgaXMgbm90IG9wZW4uCgkgKi8KCXB1YmxpYyBpbnQgZ2V0VHJhY2tpbmdDb3VudCgpIHsKCQlyZXR1cm4gdHJhY2tpbmdDb3VudDsKCX0KCgkvKioKCSAqIENhbGxlZCBieSB0aGUgVHJhY2tlZCBvYmplY3Qgd2hlbmV2ZXIgdGhlIHNldCBvZiB0cmFja2VkIHNlcnZpY2VzIGlzCgkgKiBtb2RpZmllZC4gSW5jcmVtZW50cyB0aGUgdHJhY2tpbmcgY291bnQgYW5kIGNsZWFycyB0aGUgY2FjaGUuCgkgKi8KCS8qCgkgKiBUaGlzIG1ldGhvZCBtdXN0IG5vdCBiZSBzeW5jaHJvbml6ZWQgc2luY2UgaXQgaXMgY2FsbGVkIGJ5IFRyYWNrZWQgd2hpbGUKCSAqIFRyYWNrZWQgaXMgc3luY2hyb25pemVkLiBXZSBkb24ndCB3YW50IHN5bmNocm9uaXphdGlvbiBpbnRlcmFjdGlvbnMKCSAqIGJldHdlZW4gdGhlIFNlcnZpY2VMaXN0ZW5lciB0aHJlYWQgYW5kIHRoZSB1c2VyIHRocmVhZC4KCSAqLwoJdm9pZCBtb2RpZmllZCgpIHsKCQl0cmFja2luZ0NvdW50Kys7IC8qIGluY3JlbWVudCBtb2RpZmljYXRpb24gY291bnQgKi8KCQljYWNoZWRSZWZlcmVuY2UgPSBudWxsOyAvKiBjbGVhciBjYWNoZWQgdmFsdWUgKi8KCQljYWNoZWRTZXJ2aWNlID0gbnVsbDsgLyogY2xlYXIgY2FjaGVkIHZhbHVlICovCgkJaWYgKERFQlVHKSB7CgkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2VydmljZVRyYWNrZXIubW9kaWZpZWQ6ICIgKyBmaWx0ZXIpOyAvLyROT04tTkxTLTEkCgkJfQoJfQoKCS8qKgoJICogRmluYWxpemUuIFRoaXMgbWV0aG9kIG5vIGxvbmdlciBwZXJmb3JtcyBhbnkgZnVuY3Rpb24gYnV0IGl0IGtlcHQgdG8KCSAqIG1haW50YWluIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggcHJpb3IgdmVyc2lvbnMgb2YgdGhpcyBjbGFzcy4KCSAqLwoJcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKCX0KCgkvKioKCSAqIElubmVyIGNsYXNzIHRvIHRyYWNrIHNlcnZpY2VzLiBJZiBhIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QKCSAqIGlzIHJldXNlZCAoY2xvc2VkIHRoZW4gcmVvcGVuZWQpLCB0aGVuIGEgbmV3IFRyYWNrZWQgb2JqZWN0IGlzIHVzZWQuIFRoaXMKCSAqIGNsYXNzIGlzIGEgaGFzaHRhYmxlIG1hcHBpbmcgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IC0+CgkgKiBjdXN0b21pemVkIE9iamVjdC4gVGhpcyBjbGFzcyBpcyB0aGUgPGNvZGU+U2VydmljZUxpc3RlbmVyPC9jb2RlPgoJICogb2JqZWN0IGZvciB0aGUgdHJhY2tlci4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUKCSAqIHRyYWNrZWQgc2VydmljZXMuIFRoaXMgaXMgbm90IGEgcHVibGljIGNsYXNzLiBJdCBpcyBvbmx5IGZvciB1c2UgYnkgdGhlCgkgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IGNsYXNzLgoJICogCgkgKi8KCWNsYXNzIFRyYWNrZWQgZXh0ZW5kcyBIYXNodGFibGUgaW1wbGVtZW50cyBTZXJ2aWNlTGlzdGVuZXIgewoJCXN0YXRpYyBmaW5hbCBsb25nCQkJc2VyaWFsVmVyc2lvblVJRAk9IC03NDIwMDY1MTk5NzkxMDA2MDc5TDsKCQkvKioKCQkgKiBMaXN0IG9mIFNlcnZpY2VSZWZlcmVuY2VzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGFkZGVkLiBUaGlzIGlzIHVzZWQKCQkgKiB0byBkZWFsIHdpdGggbmVzdGluZyBvZiBTZXJ2aWNlRXZlbnRzLiBTaW5jZSBTZXJ2aWNlRXZlbnRzIGFyZQoJCSAqIHN5bmNocm9ub3VzbHkgZGVsaXZlcmVkLCBTZXJ2aWNlRXZlbnRzIGNhbiBiZSBuZXN0ZWQuIEZvciBleGFtcGxlLAoJCSAqIHdoZW4gcHJvY2Vzc2luZyB0aGUgYWRkaW5nIG9mIGEgc2VydmljZSBhbmQgdGhlIGN1c3RvbWl6ZXIgY2F1c2VzIHRoZQoJCSAqIHNlcnZpY2UgdG8gYmUgdW5yZWdpc3RlcmVkLCBub3RpZmljYXRpb24gdG8gdGhlIG5lc3RlZCBjYWxsIHRvCgkJICogdW50cmFjayB0aGF0IHRoZSBzZXJ2aWNlIHdhcyB1bnJlZ2lzdGVyZWQgY2FuIGJlIG1hZGUgdG8gdGhlIHRyYWNrCgkJICogbWV0aG9kLgoJCSAqIAoJCSAqIFNpbmNlIHRoZSBBcnJheUxpc3QgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZCwgYWxsIGFjY2VzcyB0bwoJCSAqIHRoaXMgbGlzdCBtdXN0IGJlIHByb3RlY3RlZCBieSB0aGUgc2FtZSBzeW5jaHJvbml6ZWQgb2JqZWN0IGZvcgoJCSAqIHRocmVhZCBzYWZldHkuCgkJICovCgkJcHJpdmF0ZSBBcnJheUxpc3QJCQlhZGRpbmc7CgoJCS8qKgoJCSAqIHRydWUgaWYgdGhlIHRyYWNrZWQgb2JqZWN0IGlzIGNsb3NlZC4KCQkgKiAKCQkgKiBUaGlzIGZpZWxkIGlzIHZvbGF0aWxlIGJlY2F1c2UgaXQgaXMgc2V0IGJ5IG9uZSB0aHJlYWQgYW5kIHJlYWQgYnkKCQkgKiBhbm90aGVyLgoJCSAqLwoJCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbgljbG9zZWQ7CgoJCS8qKgoJCSAqIEluaXRpYWwgbGlzdCBvZiBTZXJ2aWNlUmVmZXJlbmNlcyBmb3IgdGhlIHRyYWNrZXIuIFRoaXMgaXMgdXNlZCB0bwoJCSAqIGNvcnJlY3RseSBwcm9jZXNzIHRoZSBpbml0aWFsIHNlcnZpY2VzIHdoaWNoIGNvdWxkIGJlY29tZQoJCSAqIHVucmVnaXN0ZXJlZCBiZWZvcmUgdGhleSBhcmUgdHJhY2tlZC4gVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgdGhlCgkJICogaW5pdGlhbCBzZXQgb2YgdHJhY2tlZCBzZXJ2aWNlcyBhcmUgbm90ICJhbm5vdW5jZWQiIGJ5IFNlcnZpY2VFdmVudHMKCQkgKiBhbmQgdGhlcmVmb3JlIHRoZSBTZXJ2aWNlRXZlbnQgZm9yIHVucmVnaXN0cmF0aW9uIGNvdWxkIGJlIGRlbGl2ZXJlZAoJCSAqIGJlZm9yZSB3ZSB0cmFjayB0aGUgc2VydmljZS4KCQkgKiAKCQkgKiBBIHNlcnZpY2UgbXVzdCBub3QgYmUgaW4gYm90aCB0aGUgaW5pdGlhbCBhbmQgYWRkaW5nIGxpc3RzIGF0IHRoZQoJCSAqIHNhbWUgdGltZS4gQSBzZXJ2aWNlIG11c3QgYmUgbW92ZWQgZnJvbSB0aGUgaW5pdGlhbCBsaXN0IHRvIHRoZQoJCSAqIGFkZGluZyBsaXN0ICJhdG9taWNhbGx5IiBiZWZvcmUgd2UgYmVnaW4gdHJhY2tpbmcgaXQuCgkJICogCgkJICogU2luY2UgdGhlIExpbmtlZExpc3QgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZCwgYWxsIGFjY2VzcwoJCSAqIHRvIHRoaXMgbGlzdCBtdXN0IGJlIHByb3RlY3RlZCBieSB0aGUgc2FtZSBzeW5jaHJvbml6ZWQgb2JqZWN0IGZvcgoJCSAqIHRocmVhZCBzYWZldHkuCgkJICovCgkJcHJpdmF0ZSBMaW5rZWRMaXN0CQkJaW5pdGlhbDsKCgkJLyoqCgkJICogVHJhY2tlZCBjb25zdHJ1Y3Rvci4KCQkgKi8KCQlwcm90ZWN0ZWQgVHJhY2tlZCgpIHsKCQkJc3VwZXIoKTsKCQkJY2xvc2VkID0gZmFsc2U7CgkJCWFkZGluZyA9IG5ldyBBcnJheUxpc3QoNik7CgkJCWluaXRpYWwgPSBuZXcgTGlua2VkTGlzdCgpOwoJCX0KCgkJLyoqCgkJICogU2V0IGluaXRpYWwgbGlzdCBvZiBzZXJ2aWNlcyBpbnRvIHRyYWNrZXIgYmVmb3JlIFNlcnZpY2VFdmVudHMgYmVnaW4KCQkgKiB0byBiZSByZWNlaXZlZC4KCQkgKiAKCQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBmcm9tIFNlcnZpY2VUcmFja2VyLm9wZW4gd2hpbGUKCQkgKiBzeW5jaHJvbml6ZWQgb24gdGhpcyBvYmplY3QgaW4gdGhlIHNhbWUgc3luY2hyb25pemVkIGJsb2NrIGFzIHRoZQoJCSAqIGFkZFNlcnZpY2VMaXN0ZW5lciBjYWxsLgoJCSAqIAoJCSAqIEBwYXJhbSByZWZlcmVuY2VzIFRoZSBpbml0aWFsIGxpc3Qgb2Ygc2VydmljZXMgdG8gYmUgdHJhY2tlZC4KCQkgKi8KCQlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsU2VydmljZXMoU2VydmljZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMpIHsKCQkJaWYgKHJlZmVyZW5jZXMgPT0gbnVsbCkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCWludCBzaXplID0gcmVmZXJlbmNlcy5sZW5ndGg7CgkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CgkJCQlpZiAoREVCVUcpIHsKCQkJCQlTeXN0ZW0ub3V0CgkJCQkJCQkucHJpbnRsbigiU2VydmljZVRyYWNrZXIuVHJhY2tlZC5zZXRJbml0aWFsU2VydmljZXM6ICIgKyByZWZlcmVuY2VzW2ldKTsgLy8kTk9OLU5MUy0xJAoJCQkJfQoJCQkJaW5pdGlhbC5hZGQocmVmZXJlbmNlc1tpXSk7CgkJCX0KCQl9CgoJCS8qKgoJCSAqIFRyYWNrIHRoZSBpbml0aWFsIGxpc3Qgb2Ygc2VydmljZXMuIFRoaXMgaXMgY2FsbGVkIGFmdGVyCgkJICogU2VydmljZUV2ZW50cyBjYW4gYmVnaW4gdG8gYmUgcmVjZWl2ZWQuCgkJICogCgkJICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbSBTZXJ2aWNlVHJhY2tlci5vcGVuIHdoaWxlIG5vdAoJCSAqIHN5bmNocm9uaXplZCBvbiB0aGlzIG9iamVjdCBhZnRlciB0aGUgYWRkU2VydmljZUxpc3RlbmVyIGNhbGwuCgkJICogCgkJICovCgkJcHJvdGVjdGVkIHZvaWQgdHJhY2tJbml0aWFsU2VydmljZXMoKSB7CgkJCXdoaWxlICh0cnVlKSB7CgkJCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZTsKCQkJCXN5bmNocm9uaXplZCAodGhpcykgewoJCQkJCWlmIChpbml0aWFsLnNpemUoKSA9PSAwKSB7CgkJCQkJCS8qCgkJCQkJCSAqIGlmIHRoZXJlIGFyZSBubyBtb3JlIGluaXRhbCBzZXJ2aWNlcwoJCQkJCQkgKi8KCQkJCQkJcmV0dXJuOyAvKiB3ZSBhcmUgZG9uZSAqLwoJCQkJCX0KCQkJCQkvKgoJCQkJCSAqIG1vdmUgdGhlIGZpcnN0IHNlcnZpY2UgZnJvbSB0aGUgaW5pdGlhbCBsaXN0IHRvIHRoZQoJCQkJCSAqIGFkZGluZyBsaXN0IHdpdGhpbiB0aGlzIHN5bmNocm9uaXplZCBibG9jay4KCQkJCQkgKi8KCQkJCQlyZWZlcmVuY2UgPSAoU2VydmljZVJlZmVyZW5jZSkgaW5pdGlhbC5yZW1vdmVGaXJzdCgpOwoJCQkJCWlmICh0aGlzLmdldChyZWZlcmVuY2UpICE9IG51bGwpIHsKCQkJCQkJLyogaWYgd2UgYXJlIGFscmVhZHkgdHJhY2tpbmcgdGhpcyBzZXJ2aWNlICovCgkJCQkJCWlmIChERUJVRykgewoJCQkJCQkJU3lzdGVtLm91dAoJCQkJCQkJCQkucHJpbnRsbigiU2VydmljZVRyYWNrZXIuVHJhY2tlZC50cmFja0luaXRpYWxTZXJ2aWNlc1thbHJlYWR5IHRyYWNrZWRdOiAiICsgcmVmZXJlbmNlKTsgLy8kTk9OLU5MUy0xJAoJCQkJCQl9CgkJCQkJCWNvbnRpbnVlOyAvKiBza2lwIHRoaXMgc2VydmljZSAqLwoJCQkJCX0KCQkJCQlpZiAoYWRkaW5nLmNvbnRhaW5zKHJlZmVyZW5jZSkpIHsKCQkJCQkJLyoKCQkJCQkJICogaWYgdGhpcyBzZXJ2aWNlIGlzIGFscmVhZHkgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcKCQkJCQkJICogYWRkZWQuCgkJCQkJCSAqLwoJCQkJCQlpZiAoREVCVUcpIHsKCQkJCQkJCVN5c3RlbS5vdXQKCQkJCQkJCQkJLnByaW50bG4oIlNlcnZpY2VUcmFja2VyLlRyYWNrZWQudHJhY2tJbml0aWFsU2VydmljZXNbYWxyZWFkeSBhZGRpbmddOiAiICsgcmVmZXJlbmNlKTsgLy8kTk9OLU5MUy0xJAoJCQkJCQl9CgkJCQkJCWNvbnRpbnVlOyAvKiBza2lwIHRoaXMgc2VydmljZSAqLwoJCQkJCX0KCQkJCQlhZGRpbmcuYWRkKHJlZmVyZW5jZSk7CgkJCQl9CgkJCQlpZiAoREVCVUcpIHsKCQkJCQlTeXN0ZW0ub3V0CgkJCQkJCQkucHJpbnRsbigiU2VydmljZVRyYWNrZXIuVHJhY2tlZC50cmFja0luaXRpYWxTZXJ2aWNlczogIiArIHJlZmVyZW5jZSk7IC8vJE5PTi1OTFMtMSQKCQkJCX0KCQkJCXRyYWNrQWRkaW5nKHJlZmVyZW5jZSk7IC8qCgkJCQkJCQkJCQkgKiBCZWdpbiB0cmFja2luZyBpdC4gV2UgY2FsbAoJCQkJCQkJCQkJICogdHJhY2tBZGRpbmcgc2luY2Ugd2UgaGF2ZSBhbHJlYWR5IHB1dAoJCQkJCQkJCQkJICogdGhlIHJlZmVyZW5jZSBpbiB0aGUgYWRkaW5nIGxpc3QuCgkJCQkJCQkJCQkgKi8KCQkJfQoJCX0KCgkJLyoqCgkJICogQ2FsbGVkIGJ5IHRoZSBvd25pbmcgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdCB3aGVuIGl0IGlzCgkJICogY2xvc2VkLgoJCSAqLwoJCXByb3RlY3RlZCB2b2lkIGNsb3NlKCkgewoJCQljbG9zZWQgPSB0cnVlOwoJCX0KCgkJLyoqCgkJICogPGNvZGU+U2VydmljZUxpc3RlbmVyPC9jb2RlPiBtZXRob2QgZm9yIHRoZQoJCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBjbGFzcy4gVGhpcyBtZXRob2QgbXVzdCBOT1QgYmUKCQkgKiBzeW5jaHJvbml6ZWQgdG8gYXZvaWQgZGVhZGxvY2sgcG90ZW50aWFsLgoJCSAqIAoJCSAqIEBwYXJhbSBldmVudCA8Y29kZT5TZXJ2aWNlRXZlbnQ8L2NvZGU+IG9iamVjdCBmcm9tIHRoZSBmcmFtZXdvcmsuCgkJICovCgkJcHVibGljIHZvaWQgc2VydmljZUNoYW5nZWQoU2VydmljZUV2ZW50IGV2ZW50KSB7CgkJCS8qCgkJCSAqIENoZWNrIGlmIHdlIGhhZCBhIGRlbGF5ZWQgY2FsbCAod2hpY2ggY291bGQgaGFwcGVuIHdoZW4gd2UKCQkJICogY2xvc2UpLgoJCQkgKi8KCQkJaWYgKGNsb3NlZCkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gZXZlbnQuZ2V0U2VydmljZVJlZmVyZW5jZSgpOwoJCQlpZiAoREVCVUcpIHsKCQkJCVN5c3RlbS5vdXQKCQkJCQkJLnByaW50bG4oIlNlcnZpY2VUcmFja2VyLlRyYWNrZWQuc2VydmljZUNoYW5nZWRbIiArIGV2ZW50LmdldFR5cGUoKSArICJdOiAiICsgcmVmZXJlbmNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCgkJCX0KCgkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7CgkJCQljYXNlIFNlcnZpY2VFdmVudC5SRUdJU1RFUkVEIDoKCQkJCWNhc2UgU2VydmljZUV2ZW50Lk1PRElGSUVEIDoKCQkJCQlpZiAobGlzdGVuZXJGaWx0ZXIgIT0gbnVsbCkgeyAvLyBjb25zdHJ1Y3RvciBzdXBwbGllZAoJCQkJCQkJCQkJCQkJLy8gZmlsdGVyCgkJCQkJCXRyYWNrKHJlZmVyZW5jZSk7CgkJCQkJCS8qCgkJCQkJCSAqIElmIHRoZSBjdXN0b21pemVyIHRocm93cyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCBpdAoJCQkJCQkgKiBpcyBzYWZlIHRvIGxldCBpdCBwcm9wYWdhdGUKCQkJCQkJICovCgkJCQkJfQoJCQkJCWVsc2UgeyAvLyB1c2VyIHN1cHBsaWVkIGZpbHRlcgoJCQkJCQlpZiAoZmlsdGVyLm1hdGNoKHJlZmVyZW5jZSkpIHsKCQkJCQkJCXRyYWNrKHJlZmVyZW5jZSk7CgkJCQkJCQkvKgoJCQkJCQkJICogSWYgdGhlIGN1c3RvbWl6ZXIgdGhyb3dzIGFuIHVuY2hlY2tlZCBleGNlcHRpb24sCgkJCQkJCQkgKiBpdCBpcyBzYWZlIHRvIGxldCBpdCBwcm9wYWdhdGUKCQkJCQkJCSAqLwoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJdW50cmFjayhyZWZlcmVuY2UpOwoJCQkJCQkJLyoKCQkJCQkJCSAqIElmIHRoZSBjdXN0b21pemVyIHRocm93cyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLAoJCQkJCQkJICogaXQgaXMgc2FmZSB0byBsZXQgaXQgcHJvcGFnYXRlCgkJCQkJCQkgKi8KCQkJCQkJfQoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgU2VydmljZUV2ZW50LlVOUkVHSVNURVJJTkcgOgoJCQkJCXVudHJhY2socmVmZXJlbmNlKTsKCQkJCQkvKgoJCQkJCSAqIElmIHRoZSBjdXN0b21pemVyIHRocm93cyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCBpdCBpcwoJCQkJCSAqIHNhZmUgdG8gbGV0IGl0IHByb3BhZ2F0ZQoJCQkJCSAqLwoJCQkJCWJyZWFrOwoJCQl9CgkJfQoKCQkvKioKCQkgKiBCZWdpbiB0byB0cmFjayB0aGUgcmVmZXJlbmNlZCBzZXJ2aWNlLgoJCSAqIAoJCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIGEgc2VydmljZSB0byBiZSB0cmFja2VkLgoJCSAqLwoJCXByb3RlY3RlZCB2b2lkIHRyYWNrKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CgkJCU9iamVjdCBvYmplY3Q7CgkJCXN5bmNocm9uaXplZCAodGhpcykgewoJCQkJb2JqZWN0ID0gdGhpcy5nZXQocmVmZXJlbmNlKTsKCQkJfQoJCQlpZiAob2JqZWN0ICE9IG51bGwpIC8qIHdlIGFyZSBhbHJlYWR5IHRyYWNraW5nIHRoZSBzZXJ2aWNlICovCgkJCXsKCQkJCWlmIChERUJVRykgewoJCQkJCVN5c3RlbS5vdXQKCQkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5UcmFja2VkLnRyYWNrW21vZGlmaWVkXTogIiArIHJlZmVyZW5jZSk7IC8vJE5PTi1OTFMtMSQKCQkJCX0KCQkJCXN5bmNocm9uaXplZCAodGhpcykgewoJCQkJCW1vZGlmaWVkKCk7IC8qIGluY3JlbWVudCBtb2RpZmljYXRpb24gY291bnQgKi8KCQkJCX0KCQkJCS8qIENhbGwgY3VzdG9taXplciBvdXRzaWRlIG9mIHN5bmNocm9uaXplZCByZWdpb24gKi8KCQkJCWN1c3RvbWl6ZXIubW9kaWZpZWRTZXJ2aWNlKHJlZmVyZW5jZSwgb2JqZWN0KTsKCQkJCS8qCgkJCQkgKiBJZiB0aGUgY3VzdG9taXplciB0aHJvd3MgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwgaXQgaXMgc2FmZQoJCQkJICogdG8gbGV0IGl0IHByb3BhZ2F0ZQoJCQkJICovCgkJCQlyZXR1cm47CgkJCX0KCQkJc3luY2hyb25pemVkICh0aGlzKSB7CgkJCQlpZiAoYWRkaW5nLmNvbnRhaW5zKHJlZmVyZW5jZSkpIHsgLyoKCQkJCQkJCQkJCQkJCSAqIGlmIHRoaXMgc2VydmljZSBpcwoJCQkJCQkJCQkJCQkJICogYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZgoJCQkJCQkJCQkJCQkJICogYmVpbmcgYWRkZWQuCgkJCQkJCQkJCQkJCQkgKi8KCQkJCQlpZiAoREVCVUcpIHsKCQkJCQkJU3lzdGVtLm91dAoJCQkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5UcmFja2VkLnRyYWNrW2FscmVhZHkgYWRkaW5nXTogIiArIHJlZmVyZW5jZSk7IC8vJE5PTi1OTFMtMSQKCQkJCQl9CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJYWRkaW5nLmFkZChyZWZlcmVuY2UpOyAvKiBtYXJrIHRoaXMgc2VydmljZSBpcyBiZWluZyBhZGRlZCAqLwoJCQl9CgoJCQl0cmFja0FkZGluZyhyZWZlcmVuY2UpOyAvKgoJCQkJCQkJCQkgKiBjYWxsIHRyYWNrQWRkaW5nIG5vdyB0aGF0IHdlIGhhdmUgcHV0IHRoZQoJCQkJCQkJCQkgKiByZWZlcmVuY2UgaW4gdGhlIGFkZGluZyBsaXN0CgkJCQkJCQkJCSAqLwoJCX0KCgkJLyoqCgkJICogQ29tbW9uIGxvZ2ljIHRvIGFkZCBhIHNlcnZpY2UgdG8gdGhlIHRyYWNrZXIgdXNlZCBieSB0cmFjayBhbmQKCQkgKiB0cmFja0luaXRpYWxTZXJ2aWNlcy4gVGhlIHNwZWNpZmllZCByZWZlcmVuY2UgbXVzdCBoYXZlIGJlZW4gcGxhY2VkCgkJICogaW4gdGhlIGFkZGluZyBsaXN0IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgoJCSAqIAoJCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIGEgc2VydmljZSB0byBiZSB0cmFja2VkLgoJCSAqLwoJCXByaXZhdGUgdm9pZCB0cmFja0FkZGluZyhTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSkgewoJCQlpZiAoREVCVUcpIHsKCQkJCVN5c3RlbS5vdXQKCQkJCQkJLnByaW50bG4oIlNlcnZpY2VUcmFja2VyLlRyYWNrZWQudHJhY2tBZGRpbmc6ICIgKyByZWZlcmVuY2UpOyAvLyROT04tTkxTLTEkCgkJCX0KCQkJT2JqZWN0IG9iamVjdCA9IG51bGw7CgkJCWJvb2xlYW4gYmVjYW1lVW50cmFja2VkID0gZmFsc2U7CgkJCS8qIENhbGwgY3VzdG9taXplciBvdXRzaWRlIG9mIHN5bmNocm9uaXplZCByZWdpb24gKi8KCQkJdHJ5IHsKCQkJCW9iamVjdCA9IGN1c3RvbWl6ZXIuYWRkaW5nU2VydmljZShyZWZlcmVuY2UpOwoJCQkJLyoKCQkJCSAqIElmIHRoZSBjdXN0b21pemVyIHRocm93cyBhbiB1bmNoZWNrZWQgZXhjZXB0aW9uLCBpdCB3aWxsCgkJCQkgKiBwcm9wYWdhdGUgYWZ0ZXIgdGhlIGZpbmFsbHkKCQkJCSAqLwoJCQl9CgkJCWZpbmFsbHkgewoJCQkJc3luY2hyb25pemVkICh0aGlzKSB7CgkJCQkJaWYgKGFkZGluZy5yZW1vdmUocmVmZXJlbmNlKSkgeyAvKgoJCQkJCQkJCQkJCQkJICogaWYgdGhlIHNlcnZpY2Ugd2FzIG5vdAoJCQkJCQkJCQkJCQkJICogdW50cmFja2VkIGR1cmluZyB0aGUKCQkJCQkJCQkJCQkJCSAqIGN1c3RvbWl6ZXIgY2FsbGJhY2sKCQkJCQkJCQkJCQkJCSAqLwoJCQkJCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKCQkJCQkJCXRoaXMucHV0KHJlZmVyZW5jZSwgb2JqZWN0KTsKCQkJCQkJCW1vZGlmaWVkKCk7IC8qIGluY3JlbWVudCBtb2RpZmljYXRpb24gY291bnQgKi8KCQkJCQkJCW5vdGlmeUFsbCgpOyAvKgoJCQkJCQkJCQkJCSAqIG5vdGlmeSBhbnkgd2FpdGVycyBpbgoJCQkJCQkJCQkJCSAqIHdhaXRGb3JTZXJ2aWNlCgkJCQkJCQkJCQkJICovCgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWJlY2FtZVVudHJhY2tlZCA9IHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCS8qCgkJCSAqIFRoZSBzZXJ2aWNlIGJlY2FtZSB1bnRyYWNrZWQgZHVyaW5nIHRoZSBjdXN0b21pemVyIGNhbGxiYWNrLgoJCQkgKi8KCQkJaWYgKGJlY2FtZVVudHJhY2tlZCkgewoJCQkJaWYgKERFQlVHKSB7CgkJCQkJU3lzdGVtLm91dAoJCQkJCQkJLnByaW50bG4oIlNlcnZpY2VUcmFja2VyLlRyYWNrZWQudHJhY2tBZGRpbmdbcmVtb3ZlZF06ICIgKyByZWZlcmVuY2UpOyAvLyROT04tTkxTLTEkCgkJCQl9CgkJCQkvKiBDYWxsIGN1c3RvbWl6ZXIgb3V0c2lkZSBvZiBzeW5jaHJvbml6ZWQgcmVnaW9uICovCgkJCQljdXN0b21pemVyLnJlbW92ZWRTZXJ2aWNlKHJlZmVyZW5jZSwgb2JqZWN0KTsKCQkJCS8qCgkJCQkgKiBJZiB0aGUgY3VzdG9taXplciB0aHJvd3MgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwgaXQgaXMgc2FmZQoJCQkJICogdG8gbGV0IGl0IHByb3BhZ2F0ZQoJCQkJICovCgkJCX0KCQl9CgoJCS8qKgoJCSAqIERpc2NvbnRpbnVlIHRyYWNraW5nIHRoZSByZWZlcmVuY2VkIHNlcnZpY2UuCgkJICogCgkJICogQHBhcmFtIHJlZmVyZW5jZSBSZWZlcmVuY2UgdG8gdGhlIHRyYWNrZWQgc2VydmljZS4KCQkgKi8KCQlwcm90ZWN0ZWQgdm9pZCB1bnRyYWNrKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CgkJCU9iamVjdCBvYmplY3Q7CgkJCXN5bmNocm9uaXplZCAodGhpcykgewoJCQkJaWYgKGluaXRpYWwucmVtb3ZlKHJlZmVyZW5jZSkpIHsgLyoKCQkJCQkJCQkJCQkJCSAqIGlmIHRoaXMgc2VydmljZSBpcwoJCQkJCQkJCQkJCQkJICogYWxyZWFkeSBpbiB0aGUgbGlzdCBvZgoJCQkJCQkJCQkJCQkJICogaW5pdGlhbCByZWZlcmVuY2VzIHRvCgkJCQkJCQkJCQkJCQkgKiBwcm9jZXNzCgkJCQkJCQkJCQkJCQkgKi8KCQkJCQlpZiAoREVCVUcpIHsKCQkJCQkJU3lzdGVtLm91dAoJCQkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5UcmFja2VkLnVudHJhY2tbcmVtb3ZlZCBmcm9tIGluaXRpYWxdOiAiICsgcmVmZXJlbmNlKTsgLy8kTk9OLU5MUy0xJAoJCQkJCX0KCQkJCQlyZXR1cm47IC8qCgkJCQkJCQkgKiB3ZSBoYXZlIHJlbW92ZWQgaXQgZnJvbSB0aGUgbGlzdCBhbmQgaXQgd2lsbCBub3QKCQkJCQkJCSAqIGJlIHByb2Nlc3NlZAoJCQkJCQkJICovCgkJCQl9CgoJCQkJaWYgKGFkZGluZy5yZW1vdmUocmVmZXJlbmNlKSkgeyAvKgoJCQkJCQkJCQkJCQkgKiBpZiB0aGUgc2VydmljZSBpcyBpbiB0aGUKCQkJCQkJCQkJCQkJICogcHJvY2VzcyBvZiBiZWluZyBhZGRlZAoJCQkJCQkJCQkJCQkgKi8KCQkJCQlpZiAoREVCVUcpIHsKCQkJCQkJU3lzdGVtLm91dAoJCQkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5UcmFja2VkLnVudHJhY2tbYmVpbmcgYWRkZWRdOiAiICsgcmVmZXJlbmNlKTsgLy8kTk9OLU5MUy0xJAoJCQkJCX0KCQkJCQlyZXR1cm47IC8qCgkJCQkJCQkgKiBpbiBjYXNlIHRoZSBzZXJ2aWNlIGlzIHVudHJhY2tlZCB3aGlsZSBpbiB0aGUKCQkJCQkJCSAqIHByb2Nlc3Mgb2YgYWRkaW5nCgkJCQkJCQkgKi8KCQkJCX0KCQkJCW9iamVjdCA9IHRoaXMucmVtb3ZlKHJlZmVyZW5jZSk7IC8qCgkJCQkJCQkJCQkJCQkgKiBtdXN0IHJlbW92ZSBmcm9tIHRyYWNrZXIKCQkJCQkJCQkJCQkJCSAqIGJlZm9yZSBjYWxsaW5nIGN1c3RvbWl6ZXIKCQkJCQkJCQkJCQkJCSAqIGNhbGxiYWNrCgkJCQkJCQkJCQkJCQkgKi8KCQkJCWlmIChvYmplY3QgPT0gbnVsbCkgeyAvKiBhcmUgd2UgYWN0dWFsbHkgdHJhY2tpbmcgdGhlIHNlcnZpY2UgKi8KCQkJCQlyZXR1cm47CgkJCQl9CgkJCQltb2RpZmllZCgpOyAvKiBpbmNyZW1lbnQgbW9kaWZpY2F0aW9uIGNvdW50ICovCgkJCX0KCQkJaWYgKERFQlVHKSB7CgkJCQlTeXN0ZW0ub3V0CgkJCQkJCS5wcmludGxuKCJTZXJ2aWNlVHJhY2tlci5UcmFja2VkLnVudHJhY2tbcmVtb3ZlZF06ICIgKyByZWZlcmVuY2UpOyAvLyROT04tTkxTLTEkCgkJCX0KCQkJLyogQ2FsbCBjdXN0b21pemVyIG91dHNpZGUgb2Ygc3luY2hyb25pemVkIHJlZ2lvbiAqLwoJCQljdXN0b21pemVyLnJlbW92ZWRTZXJ2aWNlKHJlZmVyZW5jZSwgb2JqZWN0KTsKCQkJLyoKCQkJICogSWYgdGhlIGN1c3RvbWl6ZXIgdGhyb3dzIGFuIHVuY2hlY2tlZCBleGNlcHRpb24sIGl0IGlzIHNhZmUgdG8KCQkJICogbGV0IGl0IHByb3BhZ2F0ZQoJCQkgKi8KCQl9Cgl9CgoJLyoqCgkgKiBTdWJjbGFzcyBvZiBUcmFja2VkIHdoaWNoIGltcGxlbWVudHMgdGhlIEFsbFNlcnZpY2VMaXN0ZW5lciBpbnRlcmZhY2UuCgkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgYnkgdGhlIFNlcnZpY2VUcmFja2VyIGlmIG9wZW4gaXMgY2FsbGVkIHdpdGggdHJ1ZS4KCSAqIAoJICogQHNpbmNlIDEuMwoJICovCgljbGFzcyBBbGxUcmFja2VkIGV4dGVuZHMgVHJhY2tlZCBpbXBsZW1lbnRzIEFsbFNlcnZpY2VMaXN0ZW5lciB7CgkJc3RhdGljIGZpbmFsIGxvbmcJc2VyaWFsVmVyc2lvblVJRAk9IDQwNTA3NjQ4NzUzMDUxMzc3MTZMOwoKCQkvKioKCQkgKiBBbGxUcmFja2VkIGNvbnN0cnVjdG9yLgoJCSAqLwoJCXByb3RlY3RlZCBBbGxUcmFja2VkKCkgewoJCQlzdXBlcigpOwoJCX0KCX0KfQpQSwMECgAAAAAAa1LuNHuCwtINDwAADQ8AAEAAAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyQ3VzdG9taXplci5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kudXRpbC50cmFja2VyL3NyYy9vcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXJDdXN0b21pemVyLmphdmEsdiAxLjEwIDIwMDYvMDYvMTYgMTY6MzE6MTMgaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwMCwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5vc2dpLnV0aWwudHJhY2tlcjsKCmltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKCi8qKgogKiBUaGUgPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyPC9jb2RlPiBpbnRlcmZhY2UgYWxsb3dzIGEKICogPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdCB0byBjdXN0b21pemUgdGhlIHNlcnZpY2Ugb2JqZWN0cyB0aGF0IGFyZQogKiB0cmFja2VkLiBUaGUgPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyPC9jb2RlPiBvYmplY3QgaXMgY2FsbGVkIHdoZW4gYQogKiBzZXJ2aWNlIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0LiBUaGUKICogPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyPC9jb2RlPiBjYW4gdGhlbiByZXR1cm4gYW4gb2JqZWN0IGZvciB0aGUgdHJhY2tlZAogKiBzZXJ2aWNlLiBUaGUgPGNvZGU+U2VydmljZVRyYWNrZXJDdXN0b21pemVyPC9jb2RlPiBvYmplY3QgaXMgYWxzbyBjYWxsZWQgd2hlbiBhCiAqIHRyYWNrZWQgc2VydmljZSBpcyBtb2RpZmllZCBvciBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlCiAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCiAqIAogKiA8cD4KICogVGhlIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UgbWF5IGJlIGNhbGxlZCBhcyB0aGUgcmVzdWx0IG9mIGEKICogPGNvZGU+U2VydmljZUV2ZW50PC9jb2RlPiBiZWluZyByZWNlaXZlZCBieSBhIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCiAqIFNpbmNlIDxjb2RlPlNlcnZpY2VFdmVudDwvY29kZT4gcyBhcmUgc3luY2hyb25vdXNseSBkZWxpdmVyZWQgYnkgdGhlIEZyYW1ld29yaywKICogaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIG1ldGhvZHMgZG8gbm90CiAqIHJlZ2lzdGVyICg8Y29kZT5CdW5kbGVDb250ZXh0LnJlZ2lzdGVyU2VydmljZTwvY29kZT4pLCBtb2RpZnkgKAogKiA8Y29kZT5TZXJ2aWNlUmVnaXN0cmF0aW9uLnNldFByb3BlcnRpZXM8L2NvZGU+KSBvciB1bnJlZ2lzdGVyICgKICogPGNvZGU+U2VydmljZVJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyPC9jb2RlPikgYSBzZXJ2aWNlIHdoaWxlIGJlaW5nCiAqIHN5bmNocm9uaXplZCBvbiBhbnkgb2JqZWN0LgogKiAKICogQHZlcnNpb24gJFJldmlzaW9uOiAxLjEwICQKICovCnB1YmxpYyBpbnRlcmZhY2UgU2VydmljZVRyYWNrZXJDdXN0b21pemVyIHsKCS8qKgoJICogQSBzZXJ2aWNlIGlzIGJlaW5nIGFkZGVkIHRvIHRoZSA8Y29kZT5TZXJ2aWNlVHJhY2tlcjwvY29kZT4gb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSBzZXJ2aWNlIHdoaWNoIG1hdGNoZWQgdGhlIHNlYXJjaAoJICogcGFyYW1ldGVycyBvZiB0aGUgPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdCBpcyBhZGRlZCB0byBpdC4gVGhpcwoJICogbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIHNlcnZpY2Ugb2JqZWN0IHRvIGJlIHRyYWNrZWQgZm9yIHRoaXMKCSAqIDxjb2RlPlNlcnZpY2VSZWZlcmVuY2U8L2NvZGU+IG9iamVjdC4gVGhlIHJldHVybmVkIHNlcnZpY2Ugb2JqZWN0IGlzIHN0b3JlZAoJICogaW4gdGhlIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgYW5kIGlzIGF2YWlsYWJsZSBmcm9tIHRoZQoJICogPGNvZGU+Z2V0U2VydmljZTwvY29kZT4gYW5kIDxjb2RlPmdldFNlcnZpY2VzPC9jb2RlPiBtZXRob2RzLgoJICogCgkgKiBAcGFyYW0gcmVmZXJlbmNlIFJlZmVyZW5jZSB0byBzZXJ2aWNlIGJlaW5nIGFkZGVkIHRvIHRoZQoJICogICAgICAgIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiBAcmV0dXJuIFRoZSBzZXJ2aWNlIG9iamVjdCB0byBiZSB0cmFja2VkIGZvciB0aGUKCSAqICAgICAgICAgPGNvZGU+U2VydmljZVJlZmVyZW5jZTwvY29kZT4gb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQoJICogICAgICAgICA8Y29kZT5TZXJ2aWNlUmVmZXJlbmNlPC9jb2RlPiBvYmplY3Qgc2hvdWxkIG5vdCBiZSB0cmFja2VkLgoJICovCglwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpOwoKCS8qKgoJICogQSBzZXJ2aWNlIHRyYWNrZWQgYnkgdGhlIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4KCSAqIG1vZGlmaWVkLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgc2VydmljZSBiZWluZyB0cmFja2VkIGJ5IHRoZQoJICogPGNvZGU+U2VydmljZVRyYWNrZXI8L2NvZGU+IG9iamVjdCBoYXMgaGFkIGl0IHByb3BlcnRpZXMgbW9kaWZpZWQuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIHNlcnZpY2UgdGhhdCBoYXMgYmVlbiBtb2RpZmllZC4KCSAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlIG9iamVjdCBmb3IgdGhlIG1vZGlmaWVkIHNlcnZpY2UuCgkgKi8KCXB1YmxpYyB2b2lkIG1vZGlmaWVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwKCQkJT2JqZWN0IHNlcnZpY2UpOwoKCS8qKgoJICogQSBzZXJ2aWNlIHRyYWNrZWQgYnkgdGhlIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QgaGFzIGJlZW4KCSAqIHJlbW92ZWQuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgc2VydmljZSBpcyBubyBsb25nZXIgYmVpbmcgdHJhY2tlZCBieSB0aGUKCSAqIDxjb2RlPlNlcnZpY2VUcmFja2VyPC9jb2RlPiBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSByZWZlcmVuY2UgUmVmZXJlbmNlIHRvIHNlcnZpY2UgdGhhdCBoYXMgYmVlbiByZW1vdmVkLgoJICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2Ugb2JqZWN0IGZvciB0aGUgcmVtb3ZlZCBzZXJ2aWNlLgoJICovCglwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwKCQkJT2JqZWN0IHNlcnZpY2UpOwp9ClBLAwQKAAAAAABrUu40jSwMX38BAAB/AQAALwAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL3RyYWNrZXIvcGFja2FnZS5odG1sPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vcmcub3NnaS51dGlsLnRyYWNrZXIvc3JjL29yZy9vc2dpL3V0aWwvdHJhY2tlci9wYWNrYWdlLmh0bWwsdiAxLjQgMjAwNi8wNy8xMiAyMTowNzoxMCBoYXJncmF2ZSBFeHAgJCAtLT4KPEJPRFk+CjxwPlNlcnZpY2UgVHJhY2tlciBQYWNrYWdlIFZlcnNpb24gMS4zLgo8cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UKaW4gdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuCkZvciBleGFtcGxlOgo8cHJlPgpJbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kudXRpbC50cmFja2VyOyB2ZXJzaW9uPTEuMwo8L3ByZT4KPC9CT0RZPgpQSwMECgAAAAAAa1LuNJ3tsLcOAAAADgAAAC4AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC90cmFja2VyL3BhY2thZ2VpbmZvdmVyc2lvbiAxLjMuMgpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAAB8AAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC94bWwvUEsDBAoAAAAAAGtS7jRdv4mNE00AABNNAAA2AAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwveG1sL1hNTFBhcnNlckFjdGl2YXRvci5qYXZhLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kudXRpbC54bWwvc3JjL29yZy9vc2dpL3V0aWwveG1sL1hNTFBhcnNlckFjdGl2YXRvci5qYXZhLHYgMS4xMCAyMDA2LzA2LzIxIDE3OjQxOjIwIGhhcmdyYXZlIEV4cCAkCiAqIAogKiBDb3B5cmlnaHQgKGMpIE9TR2kgQWxsaWFuY2UgKDIwMDIsIDIwMDYpLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKiAKICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwoKcGFja2FnZSBvcmcub3NnaS51dGlsLnhtbDsKCmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLm5ldC5VUkw7CmltcG9ydCBqYXZhLnV0aWwuKjsKCmltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwoKaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwoKLyoqCiAqIEEgQnVuZGxlQWN0aXZhdG9yIGNsYXNzIHRoYXQgYWxsb3dzIGFueSBKQVhQIGNvbXBsaWFudCBYTUwgUGFyc2VyIHRvIHJlZ2lzdGVyCiAqIGl0c2VsZiBhcyBhbiBPU0dpIHBhcnNlciBzZXJ2aWNlLgogKiAKICogTXVsdGlwbGUgSkFYUCBjb21wbGlhbnQgcGFyc2VycyBjYW4gY29uY3VycmVudGx5IHJlZ2lzdGVyIGJ5IHVzaW5nIHRoaXMKICogQnVuZGxlQWN0aXZhdG9yIGNsYXNzLiBCdW5kbGVzIHdobyB3aXNoIHRvIHVzZSBhbiBYTUwgcGFyc2VyIGNhbiB0aGVuIHVzZSB0aGUKICogZnJhbWV3b3JrJ3Mgc2VydmljZSByZWdpc3RyeSB0byBsb2NhdGUgYXZhaWxhYmxlIFhNTCBQYXJzZXJzIHdpdGggdGhlIGRlc2lyZWQKICogY2hhcmFjdGVyaXN0aWNzIHN1Y2ggYXMgdmFsaWRhdGluZyBhbmQgbmFtZXNwYWNlLWF3YXJlLgogKiAKICogPHA+CiAqIFRoZSBzZXJ2aWNlcyB0aGF0IHRoaXMgYnVuZGxlIGFjdGl2YXRvciBlbmFibGVzIGEgYnVuZGxlIHRvIHByb3ZpZGUgYXJlOgogKiA8dWw+CiAqIDxsaT48Y29kZT5qYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5PC9jb2RlPih7QGxpbmsgI1NBWEZBQ1RPUllOQU1FfSkKICogPGxpPjxjb2RlPmphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2NvZGU+KAogKiB7QGxpbmsgI0RPTUZBQ1RPUllOQU1FfSkKICogPC91bD4KICogCiAqIDxwPgogKiBUaGUgYWxnb3JpdGhtIHRvIGZpbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYWJzdHJhY3QgcGFyc2VycyBpcyBkZXJpdmVkCiAqIGZyb20gdGhlIEpBUiBmaWxlIHNwZWNpZmljYXRpb25zLCBzcGVjaWZpY2FsbHkgdGhlIFNlcnZpY2VzIEFQSS4KICogPHA+CiAqIEFuIFhNTFBhcnNlckFjdGl2YXRvciBhc3N1bWVzIHRoYXQgaXQgY2FuIGZpbmQgdGhlIGNsYXNzIGZpbGUgbmFtZXMgb2YgdGhlCiAqIGZhY3RvcnkgY2xhc3NlcyBpbiB0aGUgZm9sbG93aW5nIGZpbGVzOgogKiA8dWw+CiAqIDxsaT48Y29kZT4vTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTwvY29kZT4gaXMKICogYSBmaWxlIGNvbnRhaW5lZCBpbiBhIGphciBhdmFpbGFibGUgdG8gdGhlIHJ1bnRpbWUgd2hpY2ggY29udGFpbnMgdGhlCiAqIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUocykgb2YgdGhlIFNBWFBhcnNlckZhY3RvcnkuCiAqIDxsaT48Y29kZT4vTUVUQS1JTkYvc2VydmljZXMvamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTwvY29kZT4KICogaXMgYSBmaWxlIGNvbnRhaW5lZCBpbiBhIGphciBhdmFpbGFibGUgdG8gdGhlIHJ1bnRpbWUgd2hpY2ggY29udGFpbnMgdGhlCiAqIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUocykgb2YgdGhlIDxjb2RlPkRvY3VtZW50QnVpbGRlckZhY3Rvcnk8L2NvZGU+CiAqIDwvdWw+CiAqIDxwPgogKiBJZiBlaXRoZXIgb2YgdGhlIGZpbGVzIGRvZXMgbm90IGV4aXN0LCA8Y29kZT5YTUxQYXJzZXJBY3RpdmF0b3I8L2NvZGU+CiAqIGFzc3VtZXMgdGhhdCB0aGUgcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBwYXJzZXIgdHlwZS4KICogCiAqIDxwPgogKiA8Y29kZT5YTUxQYXJzZXJBY3RpdmF0b3I8L2NvZGU+IGF0dGVtcHRzIHRvIGluc3RhbnRpYXRlIGJvdGggdGhlCiAqIDxjb2RlPlNBWFBhcnNlckZhY3Rvcnk8L2NvZGU+IGFuZCB0aGUgPGNvZGU+RG9jdW1lbnRCdWlsZGVyRmFjdG9yeTwvY29kZT4uCiAqIEl0IHJlZ2lzdGVycyBlYWNoIGZhY3Rvcnkgd2l0aCB0aGUgZnJhbWV3b3JrIGFsb25nIHdpdGggc2VydmljZSBwcm9wZXJ0aWVzOgogKiA8dWw+CiAqIDxsaT57QGxpbmsgI1BBUlNFUl9WQUxJREFUSU5HfS0gaW5kaWNhdGVzIGlmIHRoaXMgZmFjdG9yeSBzdXBwb3J0cwogKiB2YWxpZGF0aW5nIHBhcnNlcnMuIEl0J3MgdmFsdWUgaXMgYSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KICogPGxpPntAbGluayAjUEFSU0VSX05BTUVTUEFDRUFXQVJFfS0gaW5kaWNhdGVzIGlmIHRoaXMgZmFjdG9yeSBzdXBwb3J0cwogKiBuYW1lc3BhY2UgYXdhcmUgcGFyc2VycyBJdCdzIHZhbHVlIGlzIGEgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCiAqIDwvdWw+CiAqIDxwPgogKiBJbmRpdmlkdWFsIHBhcnNlciBpbXBsZW1lbnRhdGlvbnMgbWF5IGhhdmUgYWRkaXRpb25hbCBmZWF0dXJlcywgcHJvcGVydGllcywKICogb3IgYXR0cmlidXRlcyB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIHNlbGVjdCBhIHBhcnNlciB3aXRoIGEgZmlsdGVyLiBUaGVzZSBjYW4KICogYmUgYWRkZWQgYnkgZXh0ZW5kaW5nIHRoaXMgY2xhc3MgYW5kIG92ZXJyaWRpbmcgdGhlCiAqIDxjb2RlPnNldFNBWFByb3BlcnRpZXM8L2NvZGU+IGFuZCA8Y29kZT5zZXRET01Qcm9wZXJ0aWVzPC9jb2RlPiBtZXRob2RzLgogKi8KcHVibGljIGNsYXNzIFhNTFBhcnNlckFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciwgU2VydmljZUZhY3RvcnkgewoJLyoqIENvbnRleHQgb2YgdGhpcyBidW5kbGUgKi8KCXByaXZhdGUgQnVuZGxlQ29udGV4dAkJY29udGV4dDsKCS8qKgoJICogRmlsZW5hbWUgY29udGFpbmluZyB0aGUgU0FYIFBhcnNlciBGYWN0b3J5IENsYXNzIG5hbWUuIEFsc28gdXNlZCBhcyB0aGUKCSAqIGJhc2lzIGZvciB0aGUgPGNvZGU+U0VSVklDRV9QSUQ8Y29kZT4gcmVnaXN0cmF0aW9uIHByb3BlcnR5LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlTQVhGQUNUT1JZTkFNRQkJCT0gImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkiOwoJLyoqCgkgKiBGaWxlbmFtZSBjb250YWluaW5nIHRoZSBET00gUGFyc2VyIEZhY3RvcnkgQ2xhc3MgbmFtZS4gQWxzbyB1c2VkIGFzIHRoZQoJICogYmFzaXMgZm9yIHRoZSA8Y29kZT5TRVJWSUNFX1BJRDwvY29kZT4gcmVnaXN0cmF0aW9uIHByb3BlcnR5LgoJICovCglwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZwlET01GQUNUT1JZTkFNRQkJCT0gImphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkiOwoJLyoqIFBhdGggdG8gdGhlIGZhY3RvcnkgY2xhc3MgbmFtZSBmaWxlcyAqLwoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nCVBBUlNFUkNMQVNTRklMRVBBVEgJCT0gIi9NRVRBLUlORi9zZXJ2aWNlcy8iOwoJLyoqIEZ1bGx5IHF1YWxpZmllZCBwYXRoIG5hbWUgb2YgU0FYIFBhcnNlciBGYWN0b3J5IENsYXNzIE5hbWUgZmlsZSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJU0FYQ0xBU1NGSUxFCQkJPSBQQVJTRVJDTEFTU0ZJTEVQQVRICgkJCQkJCQkJCQkJCQkJCQkrIFNBWEZBQ1RPUllOQU1FOwoJLyoqIEZ1bGx5IHF1YWxpZmllZCBwYXRoIG5hbWUgb2YgRE9NIFBhcnNlciBGYWN0b3J5IENsYXNzIE5hbWUgZmlsZSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJRE9NQ0xBU1NGSUxFCQkJPSBQQVJTRVJDTEFTU0ZJTEVQQVRICgkJCQkJCQkJCQkJCQkJCQkrIERPTUZBQ1RPUllOQU1FOwoJLyoqIFNBWCBGYWN0b3J5IFNlcnZpY2UgRGVzY3JpcHRpb24gKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlTQVhGQUNUT1JZREVTQ1JJUFRJT04JPSAiQSBKQVhQIENvbXBsaWFudCBTQVggUGFyc2VyIjsKCS8qKiBET00gRmFjdG9yeSBTZXJ2aWNlIERlc2NyaXB0aW9uICovCglwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcJRE9NRkFDVE9SWURFU0NSSVBUSU9OCT0gIkEgSkFYUCBDb21wbGlhbnQgRE9NIFBhcnNlciI7CgkvKioKCSAqIFNlcnZpY2UgcHJvcGVydHkgc3BlY2lmeWluZyBpZiBmYWN0b3J5IGlzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydAoJICogdmFsaWRhdGluZyBwYXJzZXJzLiBUaGUgdmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KCSAqLwoJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcJUEFSU0VSX1ZBTElEQVRJTkcJCT0gInBhcnNlci52YWxpZGF0aW5nIjsKCS8qKgoJICogU2VydmljZSBwcm9wZXJ0eSBzcGVjaWZ5aW5nIGlmIGZhY3RvcnkgaXMgY29uZmlndXJlZCB0byBzdXBwb3J0IG5hbWVzcGFjZQoJICogYXdhcmUgcGFyc2Vycy4gVGhlIHZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCgkgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nCVBBUlNFUl9OQU1FU1BBQ0VBV0FSRQk9ICJwYXJzZXIubmFtZXNwYWNlQXdhcmUiOwoJLyoqCgkgKiBLZXkgZm9yIHBhcnNlciBmYWN0b3J5IG5hbWUgcHJvcGVydHkgLSB0aGlzIG11c3QgYmUgc2F2ZWQgaW4gdGhlIHBhcnNlcnMKCSAqIHByb3BlcnRpZXMgaGFzaHRhYmxlIHNvIHRoYXQgdGhlIHBhcnNlciBmYWN0b3J5IGNhbiBiZSBpbnN0YW50aWF0ZWQgZnJvbQoJICogYSBTZXJ2aWNlUmVmZXJlbmNlCgkgKi8KCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZwlGQUNUT1JZTkFNRUtFWQkJCT0gInBhcnNlci5mYWN0b3J5bmFtZSI7CgoJLyoqCgkgKiBDYWxsZWQgd2hlbiB0aGlzIGJ1bmRsZSBpcyBzdGFydGVkIHNvIHRoZSBGcmFtZXdvcmsgY2FuIHBlcmZvcm0gdGhlCgkgKiBidW5kbGUtc3BlY2lmaWMgYWN0aXZpdGllcyBuZWNlc3NhcnkgdG8gc3RhcnQgdGhpcyBidW5kbGUuIFRoaXMgbWV0aG9kCgkgKiBjYW4gYmUgdXNlZCB0byByZWdpc3RlciBzZXJ2aWNlcyBvciB0byBhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIHRoYXQgdGhpcwoJICogYnVuZGxlIG5lZWRzLgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIG11c3QgY29tcGxldGUgYW5kIHJldHVybiB0byBpdHMgY2FsbGVyIGluIGEgdGltZWx5IG1hbm5lci4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byByZWdpc3RlciBhIFNBWCBhbmQgRE9NIHBhcnNlciB3aXRoIHRoZQoJICogRnJhbWV3b3JrJ3Mgc2VydmljZSByZWdpc3RyeS4KCSAqIAoJICogQHBhcmFtIGNvbnRleHQgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBidW5kbGUgYmVpbmcgc3RhcnRlZC4KCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGlzCgkgKiAgICAgICAgIGJ1bmRsZSBpcyBtYXJrZWQgYXMgc3RvcHBlZCBhbmQgdGhlIEZyYW1ld29yayB3aWxsIHJlbW92ZSB0aGlzCgkgKiAgICAgICAgIGJ1bmRsZSdzIGxpc3RlbmVycywgdW5yZWdpc3RlciBhbGwgc2VydmljZXMgcmVnaXN0ZXJlZCBieSB0aGlzCgkgKiAgICAgICAgIGJ1bmRsZSwgYW5kIHJlbGVhc2UgYWxsIHNlcnZpY2VzIHVzZWQgYnkgdGhpcyBidW5kbGUuCgkgKiBAc2VlIEJ1bmRsZSNzdGFydAoJICovCglwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewoJCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7CgkJQnVuZGxlIHBhcnNlckJ1bmRsZSA9IGNvbnRleHQuZ2V0QnVuZGxlKCk7CgkJdHJ5IHsKCQkJLy8gY2hlY2sgZm9yIHNheCBwYXJzZXJzCgkJCXJlZ2lzdGVyU0FYUGFyc2VycyhnZXRQYXJzZXJGYWN0b3J5Q2xhc3NOYW1lcyhwYXJzZXJCdW5kbGUKCQkJCQkuZ2V0UmVzb3VyY2UoU0FYQ0xBU1NGSUxFKSkpOwoJCQkvLyBjaGVjayBmb3IgZG9tIHBhcnNlcnMKCQkJcmVnaXN0ZXJET01QYXJzZXJzKGdldFBhcnNlckZhY3RvcnlDbGFzc05hbWVzKHBhcnNlckJ1bmRsZQoJCQkJCS5nZXRSZXNvdXJjZShET01DTEFTU0ZJTEUpKSk7CgkJfQoJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKCQkJLy8gaWYgdGhlcmUgd2VyZSBhbnkgSU8gZXJyb3JzIGFjY2Vzc2luZyB0aGUgcmVzb3VyY2UgZmlsZXMKCQkJLy8gY29udGFpbmluZyB0aGUgY2xhc3MgbmFtZXMKCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOwoJCQl0aHJvdyBuZXcgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcihpb2UpOwoJCX0KCX0KCgkvKioKCSAqIDxwPgoJICogVGhpcyBtZXRob2QgaGFzIG5vdGhpbmcgdG8gZG8gYXMgYWxsIGFjdGl2ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbnMgd2lsbAoJICogYXV0b21hdGljYWxseSBnZXQgdW5yZWdpc3RlcmVkIHdoZW4gdGhlIGJ1bmRsZSBzdG9wcy4KCSAqIAoJICogQHBhcmFtIGNvbnRleHQgVGhlIGV4ZWN1dGlvbiBjb250ZXh0IG9mIHRoZSBidW5kbGUgYmVpbmcgc3RvcHBlZC4KCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBJZiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGUKCSAqICAgICAgICAgYnVuZGxlIGlzIHN0aWxsIG1hcmtlZCBhcyBzdG9wcGVkLCBhbmQgdGhlIEZyYW1ld29yayB3aWxsIHJlbW92ZQoJICogICAgICAgICB0aGUgYnVuZGxlJ3MgbGlzdGVuZXJzLCB1bnJlZ2lzdGVyIGFsbCBzZXJ2aWNlcyByZWdpc3RlcmVkIGJ5IHRoZQoJICogICAgICAgICBidW5kbGUsIGFuZCByZWxlYXNlIGFsbCBzZXJ2aWNlcyB1c2VkIGJ5IHRoZSBidW5kbGUuCgkgKiBAc2VlIEJ1bmRsZSNzdG9wCgkgKi8KCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKCX0KCgkvKioKCSAqIEdpdmVuIHRoZSBVUkwgZm9yIGEgZmlsZSwgcmVhZHMgYW5kIHJldHVybnMgdGhlIHBhcnNlciBjbGFzcyBuYW1lcy4gVGhlcmUKCSAqIG1heSBiZSBtdWx0aXBsZSBjbGFzc2VzIHNwZWNpZmllZCBpbiB0aGlzIGZpbGUsIG9uZSBwZXIgbGluZS4gVGhlcmUgbWF5CgkgKiBhbHNvIGJlIGNvbW1lbnQgbGluZXMgaW4gdGhlIGZpbGUsIHdoaWNoIGJlZ2luIHdpdGggIiMiLgoJICogCgkgKiBAcGFyYW0gcGFyc2VyVXJsIFRoZSBVUkwgb2YgdGhlIHNlcnZpY2UgZmlsZSBjb250YWluaW5nIHRoZSBwYXJzZXIgY2xhc3MKCSAqICAgICAgICBuYW1lcwoJICogQHJldHVybiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIHBhcnNlciBjbGFzcyBuYW1lcyBvciBudWxsIGlmCgkgKiAgICAgICAgIHBhcnNlclVybCBpcyBudWxsCgkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSByZWFkaW5nIHRoZSBVUkwgaW5wdXQgc3RyZWFtCgkgKi8KCXByaXZhdGUgVmVjdG9yIGdldFBhcnNlckZhY3RvcnlDbGFzc05hbWVzKFVSTCBwYXJzZXJVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CgkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKDEpOwoJCWlmIChwYXJzZXJVcmwgIT0gbnVsbCkgewoJCQlTdHJpbmcgcGFyc2VyRmFjdG9yeUNsYXNzTmFtZSA9IG51bGw7CgkJCUlucHV0U3RyZWFtIGlzID0gcGFyc2VyVXJsLm9wZW5TdHJlYW0oKTsKCQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzKSk7CgkJCXdoaWxlICh0cnVlKSB7CgkJCQlwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lID0gYnIucmVhZExpbmUoKTsKCQkJCWlmIChwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lID09IG51bGwpIHsKCQkJCQlicmVhazsgLy8gZW5kIG9mIGZpbGUgcmVhY2hlZAoJCQkJfQoJCQkJU3RyaW5nIHBmY05hbWUgPSBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lLnRyaW0oKTsKCQkJCWlmIChwZmNOYW1lLmxlbmd0aCgpID09IDApIHsKCQkJCQljb250aW51ZTsgLy8gYmxhbmsgbGluZQoJCQkJfQoJCQkJaW50IGNvbW1lbnRJZHggPSBwZmNOYW1lLmluZGV4T2YoIiMiKTsKCQkJCWlmIChjb21tZW50SWR4ID09IDApIHsgLy8gY29tbWVudCBsaW5lCgkJCQkJY29udGludWU7CgkJCQl9CgkJCQllbHNlCgkJCQkJaWYgKGNvbW1lbnRJZHggPCAwKSB7IC8vIG5vIGNvbW1lbnQgb24gdGhpcyBsaW5lCgkJCQkJCXYuYWRkRWxlbWVudChwZmNOYW1lKTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCXYuYWRkRWxlbWVudChwZmNOYW1lLnN1YnN0cmluZygwLCBjb21tZW50SWR4KS50cmltKCkpOwoJCQkJCX0KCQkJfQoJCQlyZXR1cm4gdjsKCQl9CgkJZWxzZSB7CgkJCXJldHVybiBudWxsOwoJCX0KCX0KCgkvKioKCSAqIFJlZ2lzdGVyIFNBWCBQYXJzZXIgRmFjdG9yeSBTZXJ2aWNlcyB3aXRoIHRoZSBmcmFtZXdvcmsuCgkgKiAKCSAqIEBwYXJhbSBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lcyAtIGEgPGNvZGU+VmVjdG9yPC9jb2RlPiBvZgoJICogICAgICAgIDxjb2RlPlN0cmluZzwvY29kZT4gb2JqZWN0cyBjb250YWluaW5nIHRoZSBuYW1lcyBvZiB0aGUgcGFyc2VyCgkgKiAgICAgICAgRmFjdG9yeSBDbGFzc2VzCgkgKiBAdGhyb3dzIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgaWYgdGhyb3duIGZyb20gPGNvZGU+Z2V0RmFjdG9yeTwvY29kZT4KCSAqLwoJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyU0FYUGFyc2VycyhWZWN0b3IgcGFyc2VyRmFjdG9yeUNsYXNzTmFtZXMpCgkJCXRocm93cyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIHsKCQlpZiAocGFyc2VyRmFjdG9yeUNsYXNzTmFtZXMgIT0gbnVsbCkgewoJCQlFbnVtZXJhdGlvbiBlID0gcGFyc2VyRmFjdG9yeUNsYXNzTmFtZXMuZWxlbWVudHMoKTsKCQkJaW50IGluZGV4ID0gMDsKCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKCQkJCVN0cmluZyBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwoJCQkJLy8gY3JlYXRlIGEgc2F4IHBhcnNlciBmYWN0b3J5IGp1c3QgdG8gZ2V0IGl0J3MgZGVmYXVsdAoJCQkJLy8gcHJvcGVydGllcy4gSXQgd2lsbCBuZXZlciBiZSB1c2VkIHNpbmNlCgkJCQkvLyB0aGlzIGNsYXNzIHdpbGwgb3BlcmF0ZSBhcyBhIHNlcnZpY2UgZmFjdG9yeSBhbmQgZ2l2ZSBlYWNoCgkJCQkvLyBzZXJ2aWNlIHJlcXVlc3RvciBpdCdzIG93biBTYXhQYXJzZXJGYWN0b3J5CgkJCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSAoU0FYUGFyc2VyRmFjdG9yeSkgZ2V0RmFjdG9yeShwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lKTsKCQkJCUhhc2h0YWJsZSBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSg3KTsKCQkJCS8vIGZpZ3VyZSBvdXQgdGhlIGRlZmF1bHQgcHJvcGVydGllcyBvZiB0aGUgcGFyc2VyCgkJCQlzZXREZWZhdWx0U0FYUHJvcGVydGllcyhmYWN0b3J5LCBwcm9wZXJ0aWVzLCBpbmRleCk7CgkJCQkvLyBzdG9yZSB0aGUgcGFyc2VyIGZhY3RvcnkgY2xhc3MgbmFtZSBpbiB0aGUgcHJvcGVydGllcyBzbyB0aGF0CgkJCQkvLyBpdCBjYW4gYmUgcmV0cmlldmVkIHdoZW4gZ2V0U2VydmljZSBpcyBjYWxsZWQKCQkJCS8vIHRvIHJldHVybiBhIHBhcnNlciBmYWN0b3J5CgkJCQlwcm9wZXJ0aWVzLnB1dChGQUNUT1JZTkFNRUtFWSwgcGFyc2VyRmFjdG9yeUNsYXNzTmFtZSk7CgkJCQkvLyByZWxlYXNlIHRoZSBmYWN0b3J5CgkJCQlmYWN0b3J5ID0gbnVsbDsKCQkJCS8vIHJlZ2lzdGVyIHRoZSBmYWN0b3J5IGFzIGEgc2VydmljZQoJCQkJY29udGV4dC5yZWdpc3RlclNlcnZpY2UoU0FYRkFDVE9SWU5BTUUsIHRoaXMsIHByb3BlcnRpZXMpOwoJCQkJaW5kZXgrKzsKCQkJfQoJCX0KCX0KCgkvKioKCSAqIDxwPgoJICogU2V0IHRoZSBTQVggUGFyc2VyIFNlcnZpY2UgUHJvcGVydGllcy4gQnkgZGVmYXVsdCwgdGhlIGZvbGxvd2luZwoJICogcHJvcGVydGllcyBhcmUgc2V0OgoJICogPHVsPgoJICogPGxpPjxjb2RlPlNFUlZJQ0VfREVTQ1JJUFRJT048L2NvZGU+CgkgKiA8bGk+PGNvZGU+U0VSVklDRV9QSUQ8L2NvZGU+CgkgKiA8bGk+PGNvZGU+UEFSU0VSX1ZBTElEQVRJTkc8L2NvZGU+LSBpbnN0YW50aWF0ZXMgYSBwYXJzZXIgYW5kIHF1ZXJpZXMKCSAqIGl0IHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgdmFsaWRhdGluZyBvciBub3QKCSAqIDxsaT48Y29kZT5QQVJTRVJfTkFNRVNQQUNFQVdBUkU8L2NvZGU+LSBpbnN0YW50aWF0ZXMgYSBwYXJzZXIgYW5kCgkgKiBxdWVyaWVzIGl0IHRvIGZpbmQgb3V0IHdoZXRoZXIgaXQgaXMgbmFtZXNwYWNlIGF3YXJlIG9yIG5vdAoJICogPHVsPgoJICogCgkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgPGNvZGU+U0FYUGFyc2VyRmFjdG9yeTwvY29kZT4gb2JqZWN0CgkgKiBAcGFyYW0gcHJvcHMgPGNvZGU+SGFzaHRhYmxlPC9jb2RlPiBvZiBzZXJ2aWNlIHByb3BlcnRpZXMuCgkgKi8KCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0U0FYUHJvcGVydGllcyhTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnksCgkJCUhhc2h0YWJsZSBwcm9wcywgaW50IGluZGV4KSB7CgkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX0RFU0NSSVBUSU9OLCBTQVhGQUNUT1JZREVTQ1JJUFRJT04pOwoJCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9QSUQsIFNBWEZBQ1RPUllOQU1FICsgIi4iCgkJCQkrIGNvbnRleHQuZ2V0QnVuZGxlKCkuZ2V0QnVuZGxlSWQoKSArICIuIiArIGluZGV4KTsKCQlzZXRTQVhQcm9wZXJ0aWVzKGZhY3RvcnksIHByb3BzKTsKCX0KCgkvKioKCSAqIDxwPgoJICogU2V0IHRoZSBjdXN0b21pemFibGUgU0FYIFBhcnNlciBTZXJ2aWNlIFByb3BlcnRpZXMuCgkgKiAKCSAqIDxwPgoJICogVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gaW5zdGFudGlhdGUgYSB2YWxpZGF0aW5nIHBhcnNlciBhbmQgYQoJICogbmFtZXNwYWNlYXdhcmUgcGFyc2VyIHRvIGRldGVybWluZSBpZiB0aGUgcGFyc2VyIGNhbiBzdXBwb3J0IHRob3NlCgkgKiBmZWF0dXJlcy4gVGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgYXJlIHRoZW4gc2V0IGluIHRoZSBzcGVjaWZpZWQKCSAqIHByb3BlcnRpZXMgb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGFkZCBhZGRpdGlvbmFsIFNBWDIgZmVhdHVyZXMgYW5kCgkgKiBwcm9wZXJ0aWVzLiBJZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGZpbHRlciBzZWFyY2hlcyBvZiB0aGUgT1NHaSBzZXJ2aWNlCgkgKiByZWdpc3RyeSwgdGhpcyBtZXRob2QgbXVzdCBwdXQgYSBrZXksIHZhbHVlIHBhaXIgaW50byB0aGUgcHJvcGVydGllcwoJICogb2JqZWN0IGZvciBlYWNoIGZlYXR1cmUgb3IgcHJvcGVydHkuIEZvciBleGFtcGxlLAoJICogCgkgKiBwcm9wZXJ0aWVzLnB1dCgiaHR0cDovL3d3dy5hY21lLmNvbS9mZWF0dXJlcy9mb28iLCBCb29sZWFuLlRSVUUpOwoJICogCgkgKiBAcGFyYW0gZmFjdG9yeSAtIHRoZSBTQVhQYXJzZXJGYWN0b3J5IG9iamVjdAoJICogQHBhcmFtIHByb3BlcnRpZXMgLSB0aGUgcHJvcGVydGllcyBvYmplY3QgZm9yIHRoZSBzZXJ2aWNlCgkgKi8KCXB1YmxpYyB2b2lkIHNldFNBWFByb3BlcnRpZXMoU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5LCBIYXNodGFibGUgcHJvcGVydGllcykgewoJCS8vIGNoZWNrIGlmIHRoaXMgcGFyc2VyIGNhbiBiZSBjb25maWd1cmVkIHRvIHZhbGlkYXRlCgkJYm9vbGVhbiB2YWxpZGF0aW5nID0gdHJ1ZTsKCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7CgkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CgkJdHJ5IHsKCQkJZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKCQl9CgkJY2F0Y2ggKEV4Y2VwdGlvbiBwY2VfdmFsKSB7CgkJCXZhbGlkYXRpbmcgPSBmYWxzZTsKCQl9CgkJLy8gY2hlY2sgaWYgdGhpcyBwYXJzZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUgbmFtZXNwYWNlYXdhcmUKCQlib29sZWFuIG5hbWVzcGFjZWF3YXJlID0gdHJ1ZTsKCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwoJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CgkJdHJ5IHsKCQkJZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKCQl9CgkJY2F0Y2ggKEV4Y2VwdGlvbiBwY2VfbnNhKSB7CgkJCW5hbWVzcGFjZWF3YXJlID0gZmFsc2U7CgkJfQoJCS8vIHNldCB0aGUgZmFjdG9yeSB2YWx1ZXMKCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7CgkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShuYW1lc3BhY2Vhd2FyZSk7CgkJLy8gc2V0IHRoZSBPU0dpIHNlcnZpY2UgcHJvcGVydGllcwoJCXByb3BlcnRpZXMucHV0KFBBUlNFUl9OQU1FU1BBQ0VBV0FSRSwgbmV3IEJvb2xlYW4obmFtZXNwYWNlYXdhcmUpKTsKCQlwcm9wZXJ0aWVzLnB1dChQQVJTRVJfVkFMSURBVElORywgbmV3IEJvb2xlYW4odmFsaWRhdGluZykpOwoJfQoKCS8qKgoJICogUmVnaXN0ZXIgRE9NIFBhcnNlciBGYWN0b3J5IFNlcnZpY2VzIHdpdGggdGhlIGZyYW1ld29yay4KCSAqIAoJICogQHBhcmFtIHBhcnNlckZhY3RvcnlDbGFzc05hbWVzIC0gYSA8Y29kZT5WZWN0b3I8L2NvZGU+IG9mCgkgKiAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3RzIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHRoZSBwYXJzZXIKCSAqICAgICAgICBGYWN0b3J5IENsYXNzZXMKCSAqIEB0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBpZiB0aHJvd24gZnJvbSA8Y29kZT5nZXRGYWN0b3J5PC9jb2RlPgoJICovCglwcml2YXRlIHZvaWQgcmVnaXN0ZXJET01QYXJzZXJzKFZlY3RvciBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lcykKCQkJdGhyb3dzIEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgewoJCWlmIChwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lcyAhPSBudWxsKSB7CgkJCUVudW1lcmF0aW9uIGUgPSBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lcy5lbGVtZW50cygpOwoJCQlpbnQgaW5kZXggPSAwOwoJCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewoJCQkJU3RyaW5nIHBhcnNlckZhY3RvcnlDbGFzc05hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7CgkJCQkvLyBjcmVhdGUgYSBkb20gcGFyc2VyIGZhY3RvcnkganVzdCB0byBnZXQgaXQncyBkZWZhdWx0CgkJCQkvLyBwcm9wZXJ0aWVzLiBJdCB3aWxsIG5ldmVyIGJlIHVzZWQgc2luY2UKCQkJCS8vIHRoaXMgY2xhc3Mgd2lsbCBvcGVyYXRlIGFzIGEgc2VydmljZSBmYWN0b3J5IGFuZCBnaXZlIGVhY2gKCQkJCS8vIHNlcnZpY2UgcmVxdWVzdG9yIGl0J3Mgb3duIERvY3VtZW50QnVpbGRlckZhY3RvcnkKCQkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IChEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KSBnZXRGYWN0b3J5KHBhcnNlckZhY3RvcnlDbGFzc05hbWUpOwoJCQkJSGFzaHRhYmxlIHByb3BlcnRpZXMgPSBuZXcgSGFzaHRhYmxlKDcpOwoJCQkJLy8gZmlndXJlIG91dCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIHRoZSBwYXJzZXIKCQkJCXNldERlZmF1bHRET01Qcm9wZXJ0aWVzKGZhY3RvcnksIHByb3BlcnRpZXMsIGluZGV4KTsKCQkJCS8vIHN0b3JlIHRoZSBwYXJzZXIgZmFjdG9yeSBjbGFzcyBuYW1lIGluIHRoZSBwcm9wZXJ0aWVzIHNvIHRoYXQKCQkJCS8vIGl0IGNhbiBiZSByZXRyaWV2ZWQgd2hlbiBnZXRTZXJ2aWNlIGlzIGNhbGxlZAoJCQkJLy8gdG8gcmV0dXJuIGEgcGFyc2VyIGZhY3RvcnkKCQkJCXByb3BlcnRpZXMucHV0KEZBQ1RPUllOQU1FS0VZLCBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lKTsKCQkJCS8vIHJlbGVhc2UgdGhlIGZhY3RvcnkKCQkJCWZhY3RvcnkgPSBudWxsOwoJCQkJLy8gcmVnaXN0ZXIgdGhlIGZhY3RvcnkgYXMgYSBzZXJ2aWNlCgkJCQljb250ZXh0LnJlZ2lzdGVyU2VydmljZShET01GQUNUT1JZTkFNRSwgdGhpcywgcHJvcGVydGllcyk7CgkJCQlpbmRleCsrOwoJCQl9CgkJfQoJfQoKCS8qKgoJICogU2V0IHRoZSBET00gcGFyc2VyIHNlcnZpY2UgcHJvcGVydGllcy4KCSAqIAoJICogQnkgZGVmYXVsdCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzIGFyZSBzZXQ6CgkgKiA8dWw+CgkgKiA8bGk+PGNvZGU+U0VSVklDRV9ERVNDUklQVElPTjwvY29kZT4KCSAqIDxsaT48Y29kZT5TRVJWSUNFX1BJRDwvY29kZT4KCSAqIDxsaT48Y29kZT5QQVJTRVJfVkFMSURBVElORzwvY29kZT4KCSAqIDxsaT48Y29kZT5QQVJTRVJfTkFNRVNQQUNFQVdBUkU8L2NvZGU+CgkgKiA8dWw+CgkgKiAKCSAqIEBwYXJhbSBmYWN0b3J5IFRoZSA8Y29kZT5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5PC9jb2RlPiBvYmplY3QKCSAqIEBwYXJhbSBwcm9wcyA8Y29kZT5IYXNodGFibGU8L2NvZGU+IG9mIHNlcnZpY2UgcHJvcGVydGllcy4KCSAqLwoJcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRET01Qcm9wZXJ0aWVzKERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSwKCQkJSGFzaHRhYmxlIHByb3BzLCBpbnQgaW5kZXgpIHsKCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfREVTQ1JJUFRJT04sIERPTUZBQ1RPUllERVNDUklQVElPTik7CgkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1BJRCwgRE9NRkFDVE9SWU5BTUUgKyAiLiIKCQkJCSsgY29udGV4dC5nZXRCdW5kbGUoKS5nZXRCdW5kbGVJZCgpICsgIi4iICsgaW5kZXgpOwoJCXNldERPTVByb3BlcnRpZXMoZmFjdG9yeSwgcHJvcHMpOwoJfQoKCS8qKgoJICogPHA+CgkgKiBTZXQgdGhlIGN1c3RvbWl6YWJsZSBET00gUGFyc2VyIFNlcnZpY2UgUHJvcGVydGllcy4KCSAqIAoJICogPHA+CgkgKiBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBpbnN0YW50aWF0ZSBhIHZhbGlkYXRpbmcgcGFyc2VyIGFuZCBhCgkgKiBuYW1lc3BhY2Vhd2FyZSBwYXJzZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBwYXJzZXIgY2FuIHN1cHBvcnQgdGhvc2UKCSAqIGZlYXR1cmVzLiBUaGUgYXBwcm9wcmlhdGUgcHJvcGVydGllcyBhcmUgdGhlbiBzZXQgaW4gdGhlIHNwZWNpZmllZCBwcm9wcwoJICogb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGFkZCBhZGRpdGlvbmFsIERPTTIgZmVhdHVyZXMgYW5kCgkgKiBwcm9wZXJ0aWVzLiBJZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIGZpbHRlciBzZWFyY2hlcyBvZiB0aGUgT1NHaSBzZXJ2aWNlCgkgKiByZWdpc3RyeSwgdGhpcyBtZXRob2QgbXVzdCBwdXQgYSBrZXksIHZhbHVlIHBhaXIgaW50byB0aGUgcHJvcGVydGllcwoJICogb2JqZWN0IGZvciBlYWNoIGZlYXR1cmUgb3IgcHJvcGVydHkuIEZvciBleGFtcGxlLAoJICogCgkgKiBwcm9wZXJ0aWVzLnB1dCgiaHR0cDovL3d3dy5hY21lLmNvbS9mZWF0dXJlcy9mb28iLCBCb29sZWFuLlRSVUUpOwoJICogCgkgKiBAcGFyYW0gZmFjdG9yeSAtIHRoZSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IG9iamVjdAoJICogQHBhcmFtIHByb3BzIC0gSGFzaHRhYmxlIG9mIHNlcnZpY2UgcHJvcGVydGllcy4KCSAqLwoJcHVibGljIHZvaWQgc2V0RE9NUHJvcGVydGllcyhEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGZhY3RvcnksIEhhc2h0YWJsZSBwcm9wcykgewoJCS8vIGNoZWNrIGlmIHRoaXMgcGFyc2VyIGNhbiBiZSBjb25maWd1cmVkIHRvIHZhbGlkYXRlCgkJYm9vbGVhbiB2YWxpZGF0aW5nID0gdHJ1ZTsKCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcodHJ1ZSk7CgkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShmYWxzZSk7CgkJdHJ5IHsKCQkJZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKCQl9CgkJY2F0Y2ggKEV4Y2VwdGlvbiBwY2VfdmFsKSB7CgkJCXZhbGlkYXRpbmcgPSBmYWxzZTsKCQl9CgkJLy8gY2hlY2sgaWYgdGhpcyBwYXJzZXIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUgbmFtZXNwYWNlYXdhcmUKCQlib29sZWFuIG5hbWVzcGFjZWF3YXJlID0gdHJ1ZTsKCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwoJCWZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CgkJdHJ5IHsKCQkJZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKCQl9CgkJY2F0Y2ggKEV4Y2VwdGlvbiBwY2VfbnNhKSB7CgkJCW5hbWVzcGFjZWF3YXJlID0gZmFsc2U7CgkJfQoJCS8vIHNldCB0aGUgZmFjdG9yeSB2YWx1ZXMKCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7CgkJZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZShuYW1lc3BhY2Vhd2FyZSk7CgkJLy8gc2V0IHRoZSBPU0dpIHNlcnZpY2UgcHJvcGVydGllcwoJCXByb3BzLnB1dChQQVJTRVJfVkFMSURBVElORywgbmV3IEJvb2xlYW4odmFsaWRhdGluZykpOwoJCXByb3BzLnB1dChQQVJTRVJfTkFNRVNQQUNFQVdBUkUsIG5ldyBCb29sZWFuKG5hbWVzcGFjZWF3YXJlKSk7Cgl9CgoJLyoqCgkgKiBHaXZlbiBhIHBhcnNlciBmYWN0b3J5IGNsYXNzIG5hbWUsIGluc3RhbnRpYXRlIHRoYXQgY2xhc3MuCgkgKiAKCSAqIEBwYXJhbSBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lIEEgPGNvZGU+U3RyaW5nPC9jb2RlPiBvYmplY3QgY29udGFpbmluZwoJICogICAgICAgIHRoZSBuYW1lIG9mIHRoZSBwYXJzZXIgZmFjdG9yeSBjbGFzcwoJICogQHJldHVybiBhIHBhcnNlckZhY3RvcnlDbGFzcyBPYmplY3QKCSAqIEBwcmUgcGFyc2VyRmFjdG9yeUNsYXNzTmFtZSE9bnVsbAoJICovCglwcml2YXRlIE9iamVjdCBnZXRGYWN0b3J5KFN0cmluZyBwYXJzZXJGYWN0b3J5Q2xhc3NOYW1lKQoJCQl0aHJvd3MgRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciB7CgkJRXhjZXB0aW9uIGUgPSBudWxsOwoJCXRyeSB7CgkJCXJldHVybiBDbGFzcy5mb3JOYW1lKHBhcnNlckZhY3RvcnlDbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7CgkJfQoJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpIHsKCQkJZSA9IGNuZmU7CgkJfQoJCWNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGllKSB7CgkJCWUgPSBpZTsKCQl9CgkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7CgkJCWUgPSBpYWU7CgkJfQoJCXRocm93IG5ldyBGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yKGUpOwoJfQoKCS8qKgoJICogQ3JlYXRlcyBhIG5ldyBYTUwgUGFyc2VyIEZhY3Rvcnkgb2JqZWN0LgoJICogCgkgKiA8cD4KCSAqIEEgdW5pcXVlIFhNTCBQYXJzZXIgRmFjdG9yeSBvYmplY3QgaXMgcmV0dXJuZWQgZm9yIGVhY2ggY2FsbCB0byB0aGlzCgkgKiBtZXRob2QuCgkgKiAKCSAqIDxwPgoJICogVGhlIHJldHVybmVkIFhNTCBQYXJzZXIgRmFjdG9yeSBvYmplY3Qgd2lsbCBiZSBjb25maWd1cmVkIGZvciB2YWxpZGF0aW5nCgkgKiBhbmQgbmFtZXNwYWNlIGF3YXJlIHN1cHBvcnQgYXMgc3BlY2lmaWVkIGluIHRoZSBzZXJ2aWNlIHByb3BlcnRpZXMgb2YgdGhlCgkgKiBzcGVjaWZpZWQgU2VydmljZVJlZ2lzdHJhdGlvbiBvYmplY3QuCgkgKiAKCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGNvbmZpZ3VyZSBhZGRpdGlvbmFsIGZlYXR1cmVzIGluIHRoZQoJICogcmV0dXJuZWQgWE1MIFBhcnNlciBGYWN0b3J5IG9iamVjdC4KCSAqIAoJICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHVzaW5nIHRoZSBzZXJ2aWNlLgoJICogQHBhcmFtIHJlZ2lzdHJhdGlvbiBUaGUgPGNvZGU+U2VydmljZVJlZ2lzdHJhdGlvbjwvY29kZT4gb2JqZWN0IGZvciB0aGUKCSAqICAgICAgICBzZXJ2aWNlLgoJICogQHJldHVybiBBIG5ldywgY29uZmlndXJlZCBYTUwgUGFyc2VyIEZhY3Rvcnkgb2JqZWN0IG9yIG51bGwgaWYgYQoJICogICAgICAgICBjb25maWd1cmF0aW9uIGVycm9yIHdhcyBlbmNvdW50ZXJlZAoJICovCglwdWJsaWMgT2JqZWN0IGdldFNlcnZpY2UoQnVuZGxlIGJ1bmRsZSwgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24pIHsKCQlTZXJ2aWNlUmVmZXJlbmNlIHNyZWYgPSByZWdpc3RyYXRpb24uZ2V0UmVmZXJlbmNlKCk7CgkJU3RyaW5nIHBhcnNlckZhY3RvcnlDbGFzc05hbWUgPSAoU3RyaW5nKSBzcmVmCgkJCQkuZ2V0UHJvcGVydHkoRkFDVE9SWU5BTUVLRVkpOwoJCXRyeSB7CgkJCS8vIG5lZWQgdG8gc2V0IGZhY3RvcnkgcHJvcGVydGllcwoJCQlPYmplY3QgZmFjdG9yeSA9IGdldEZhY3RvcnkocGFyc2VyRmFjdG9yeUNsYXNzTmFtZSk7CgkJCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgU0FYUGFyc2VyRmFjdG9yeSkgewoJCQkJKChTQVhQYXJzZXJGYWN0b3J5KSBmYWN0b3J5KS5zZXRWYWxpZGF0aW5nKCgoQm9vbGVhbikgc3JlZgoJCQkJCQkuZ2V0UHJvcGVydHkoUEFSU0VSX1ZBTElEQVRJTkcpKS5ib29sZWFuVmFsdWUoKSk7CgkJCQkoKFNBWFBhcnNlckZhY3RvcnkpIGZhY3RvcnkpLnNldE5hbWVzcGFjZUF3YXJlKCgoQm9vbGVhbikgc3JlZgoJCQkJCQkuZ2V0UHJvcGVydHkoUEFSU0VSX05BTUVTUEFDRUFXQVJFKSkuYm9vbGVhblZhbHVlKCkpOwoJCQl9CgkJCWVsc2UKCQkJCWlmIChmYWN0b3J5IGluc3RhbmNlb2YgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSkgewoJCQkJCSgoRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSkgZmFjdG9yeSkKCQkJCQkJCS5zZXRWYWxpZGF0aW5nKCgoQm9vbGVhbikgc3JlZgoJCQkJCQkJCQkuZ2V0UHJvcGVydHkoUEFSU0VSX1ZBTElEQVRJTkcpKQoJCQkJCQkJCQkuYm9vbGVhblZhbHVlKCkpOwoJCQkJCSgoRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSkgZmFjdG9yeSkKCQkJCQkJCS5zZXROYW1lc3BhY2VBd2FyZSgoKEJvb2xlYW4pIHNyZWYKCQkJCQkJCQkJLmdldFByb3BlcnR5KFBBUlNFUl9OQU1FU1BBQ0VBV0FSRSkpCgkJCQkJCQkJCS5ib29sZWFuVmFsdWUoKSk7CgkJCQl9CgkJCXJldHVybiBmYWN0b3J5OwoJCX0KCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBmY2UpIHsKCQkJZmNlLnByaW50U3RhY2tUcmFjZSgpOwoJCQlyZXR1cm4gbnVsbDsKCQl9Cgl9CgoJLyoqCgkgKiBSZWxlYXNlcyBhIFhNTCBQYXJzZXIgRmFjdG9yeSBvYmplY3QuCgkgKiAKCSAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSByZWxlYXNpbmcgdGhlIHNlcnZpY2UuCgkgKiBAcGFyYW0gcmVnaXN0cmF0aW9uIFRoZSA8Y29kZT5TZXJ2aWNlUmVnaXN0cmF0aW9uPC9jb2RlPiBvYmplY3QgZm9yIHRoZQoJICogICAgICAgIHNlcnZpY2UuCgkgKiBAcGFyYW0gc2VydmljZSBUaGUgWE1MIFBhcnNlciBGYWN0b3J5IG9iamVjdCByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwKCSAqICAgICAgICB0byB0aGUgPGNvZGU+Z2V0U2VydmljZTwvY29kZT4gbWV0aG9kLgoJICovCglwdWJsaWMgdm9pZCB1bmdldFNlcnZpY2UoQnVuZGxlIGJ1bmRsZSwgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24sCgkJCU9iamVjdCBzZXJ2aWNlKSB7Cgl9Cn0KUEsDBAoAAAAAAGtS7jTgNH8CbgEAAG4BAAArAAAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwveG1sL3BhY2thZ2UuaHRtbDwhLS0gJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQvb3JnLm9zZ2kudXRpbC54bWwvc3JjL29yZy9vc2dpL3V0aWwveG1sL3BhY2thZ2UuaHRtbCx2IDEuMiAyMDA2LzA3LzEyIDIxOjA2OjU5IGhhcmdyYXZlIEV4cCAkIC0tPgo8Qk9EWT4KPHA+WE1MIFBhcnNlciBQYWNrYWdlIFZlcnNpb24gMS4wLgo8cD5CdW5kbGVzIHdpc2hpbmcgdG8gdXNlIHRoaXMgcGFja2FnZSBtdXN0IGxpc3QgdGhlIHBhY2thZ2UKaW4gdGhlIEltcG9ydC1QYWNrYWdlIGhlYWRlciBvZiB0aGUgYnVuZGxlJ3MgbWFuaWZlc3QuCkZvciBleGFtcGxlOgo8cHJlPgpJbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kudXRpbC54bWw7IHZlcnNpb249MS4wCjwvcHJlPgo8L0JPRFk+ClBLAwQKAAAAAABrUu40xP+f3wsAAAALAAAAKgAAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL3htbC9wYWNrYWdlaW5mb3ZlcnNpb24gMS4wUEsDBAoAAAAAAGtS7jRkeT8k1QYAANUGAAAKAAAAYWJvdXQuaHRtbDwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KPCEtLSAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC9vc2dpL2Fib3V0Lmh0bWwsdiAxLjMgMjAwNi8wMy8xNCAwMToyMTozNCBoYXJncmF2ZSBFeHAgJCAtLT4KPGh0bWw+CjxoZWFkPgo8dGl0bGU+QWJvdXQ8L3RpdGxlPgo8bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CjwvaGVhZD4KPGJvZHkgbGFuZz0iRU4tVVMiPgo8aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KIAo8aDM+Q29weXJpZ2h0PC9oMz4KPHA+Q29weXJpZ2h0IChjKSAyMDAwLCAyMDA1PC9wPgoKPHA+T1NHaSBBbGxpYW5jZTxici8+CkJpc2hvcCBSYW5jaCA2PGJyLz4KMjQwMCBDYW1pbm8gUmFtb24sIFN1aXRlIDM3NTxici8+ClNhbiBSYW1vbiwgQ0EgOTQ1ODMgVVNBCjwvcD4KPHA+QWxsIFJpZ2h0cyBSZXNlcnZlZC48L3A+Cgo8aDM+TGljZW5zZTwvaDM+CjxwPlRoZSBPU0dpIEFsbGlhbmNlIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIGphciAoJnF1b3Q7V29yayZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIFdvcmsgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJnF1b3Q7TGljZW5zZSZxdW90OykuICBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPi48L3A+Cgo8aDM+Tm90aWNlczwvaDM+CjxwPkltcGxlbWVudGF0aW9uIG9mIGNlcnRhaW4gZWxlbWVudHMgb2YgdGhlIENvbnRlbnQgbWF5IGJlIHN1YmplY3QgdG8gdGhpcmQgcGFydHkKaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cywgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiwgcGF0ZW50IHJpZ2h0cyAoc3VjaCBhIHRoaXJkIHBhcnR5IG1heQpvciBtYXkgbm90IGJlIGEgbWVtYmVyIG9mIHRoZSBPU0dpIEFsbGlhbmNlKS4gVGhlIE9TR2kgQWxsaWFuY2UgYW5kIGl0cyBtZW1iZXJzIGFyZSBub3QgcmVzcG9uc2libGUgCmFuZCBzaGFsbCBub3QgYmUgaGVsZCByZXNwb25zaWJsZSBpbiBhbnkgbWFubmVyIGZvciBpZGVudGlmeWluZyBvciBmYWlsaW5nIHRvIGlkZW50aWZ5IGFueSBvciAKYWxsIHN1Y2ggdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cy48L3A+Cgo8cD5PU0dpJnRyYWRlOyBpcyBhIHRyYWRlbWFyaywgcmVnaXN0ZXJlZCB0cmFkZW1hcmssIG9yIHNlcnZpY2UgbWFyawpvZiBUaGUgT1NHaSBBbGxpYW5jZSBpbiB0aGUgVVMgYW5kIG90aGVyIGNvdW50cmllcy4gSmF2YSBpcyBhIHRyYWRlbWFyaywKcmVnaXN0ZXJlZCB0cmFkZW1hcmssIG9yIHNlcnZpY2UgbWFyayBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVUwphbmQgb3RoZXIgY291bnRyaWVzLiBBbGwgb3RoZXIgdHJhZGVtYXJrcywgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzLCBvcgpzZXJ2aWNlIG1hcmtzIHVzZWQgaW4gdGhlIENvbnRlbnQgYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlCm93bmVycyBhbmQgYXJlIGhlcmVieSByZWNvZ25pemVkLjwvcD4KCjwvYm9keT4KPC9odG1sPlBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAABAAAAG9yZy9QSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAAAkAAABvcmcvb3NnaS9QSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAABEAAABvcmcvb3NnaS9zZXJ2aWNlL1BLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAFAAAAG9yZy9vc2dpL3NlcnZpY2UvY20vUEsDBAoAAAAAAGtS7jQyXAskFAIAABQCAAAnAAAAb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uLmNsYXNzyv66vgAAAC4AGgcAFwcAGAEABmdldFBpZAEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQANZ2V0UHJvcGVydGllcwEAGCgpTGphdmEvdXRpbC9EaWN0aW9uYXJ5OwEABnVwZGF0ZQEAGShMamF2YS91dGlsL0RpY3Rpb25hcnk7KVYBAApFeGNlcHRpb25zBwAZAQAGZGVsZXRlAQADKClWAQANZ2V0RmFjdG9yeVBpZAEAEXNldEJ1bmRsZUxvY2F0aW9uAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQARZ2V0QnVuZGxlTG9jYXRpb24BAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAhoYXNoQ29kZQEAAygpSQEAClNvdXJjZUZpbGUBABJDb25maWd1cmF0aW9uLmphdmEBACFvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb24BABBqYXZhL2xhbmcvT2JqZWN0AQATamF2YS9pby9JT0V4Y2VwdGlvbgYBAAEAAgAAAAAACgQBAAMABAAABAEABQAGAAAEAQAHAAgAAQAJAAAABAABAAoEAQALAAwAAQAJAAAABAABAAoEAQANAAQAAAQBAAcADAABAAkAAAAEAAEACgQBAA4ADwAABAEAEAAEAAAEAQARABIAAAQBABMAFAAAAAEAFQAAAAIAFlBLAwQKAAAAAABrUu40nEIu/OcCAADnAgAALAAAAG9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkFkbWluLmNsYXNzyv66vgAAAC4AGgcAFAcAFQEAElNFUlZJQ0VfRkFDVE9SWVBJRAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIABYBABZTRVJWSUNFX0JVTkRMRUxPQ0FUSU9OCAAXAQAaY3JlYXRlRmFjdG9yeUNvbmZpZ3VyYXRpb24BADcoTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb247AQAKRXhjZXB0aW9ucwcAGAEASShMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbjsBABBnZXRDb25maWd1cmF0aW9uAQASbGlzdENvbmZpZ3VyYXRpb25zAQA4KExqYXZhL2xhbmcvU3RyaW5nOylbTG9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbjsHABkBAApTb3VyY2VGaWxlAQAXQ29uZmlndXJhdGlvbkFkbWluLmphdmEBACZvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25BZG1pbgEAEGphdmEvbGFuZy9PYmplY3QBABJzZXJ2aWNlLmZhY3RvcnlQaWQBABZzZXJ2aWNlLmJ1bmRsZUxvY2F0aW9uAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAKW9yZy9vc2dpL2ZyYW1ld29yay9JbnZhbGlkU3ludGF4RXhjZXB0aW9uBgEAAQACAAAAAgAZAAMABAABAAUAAAACAAYAGQAHAAQAAQAFAAAAAgAIAAUEAQAJAAoAAQALAAAABAABAAwEAQAJAA0AAQALAAAABAABAAwEAQAOAA0AAQALAAAABAABAAwEAQAOAAoAAQALAAAABAABAAwEAQAPABAAAQALAAAABgACAAwAEQABABIAAAACABNQSwMECgAAAAAAa1LuNGLN9NlQBAAAUAQAACwAAABvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25FdmVudC5jbGFzc8r+ur4AAAAuACwKAAcAJAkABgAlCQAGACYJAAYAJwkABgAoBwApBwAqAQAKQ01fVVBEQVRFRAEAAUkBAA1Db25zdGFudFZhbHVlAwAAAAEBAApDTV9ERUxFVEVEAwAAAAIBAAR0eXBlAQAKZmFjdG9yeVBpZAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAA3BpZAEACXJlZmVyZW5jZQEAJUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBAAY8aW5pdD4BAE0oTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlO0lMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAoTG9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV2ZW50OwEADWdldEZhY3RvcnlQaWQBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABmdldFBpZAEAB2dldFR5cGUBAAMoKUkBAAxnZXRSZWZlcmVuY2UBACcoKUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBAApTb3VyY2VGaWxlAQAXQ29uZmlndXJhdGlvbkV2ZW50LmphdmEMABQAKwwAEgATDAAOAAkMAA8AEAwAEQAQAQAmb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uRXZlbnQBABBqYXZhL2xhbmcvT2JqZWN0AQADKClWACEABgAHAAAABgAZAAgACQABAAoAAAACAAsAGQAMAAkAAQAKAAAAAgANABIADgAJAAAAEgAPABAAAAASABEAEAAAABIAEgATAAAA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AAAFKrQACbAAAAACABsAAAAGAAEAAABgABwAAAAMAAEAAAAFAB0AHgAAAAEAJQAmAAEAGgAAADwAAgACAAAACLsAClm3AAu/AAAAAgAbAAAABgABAAAAbgAcAAAAFgACAAAACAAdAB4AAAAAAAgAFgAXAAEAAQAnAAAAAgAoUEsDBAoAAAAAAGtS7jTFYg0F2gAAANoAAAAvAAAAb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uTGlzdGVuZXIuY2xhc3PK/rq+AAAALgAJBwAHBwAIAQASY29uZmlndXJhdGlvbkV2ZW50AQArKExvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25FdmVudDspVgEAClNvdXJjZUZpbGUBABpDb25maWd1cmF0aW9uTGlzdGVuZXIuamF2YQEAKW9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkxpc3RlbmVyAQAQamF2YS9sYW5nL09iamVjdAYBAAEAAgAAAAAAAQQBAAMABAAAAAEABQAAAAIABlBLAwQKAAAAAABrUu40CutcmRkGAAAZBgAAMQAAAG9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBlcm1pc3Npb24uY2xhc3PK/rq+AAAALgBKCgARADIIADMKADQANQcANggANwoABAAyCgA0ADgIADkKADQAOggAOwcAPAoACwA9CgA0AD4KAAsAPwcAQAoADwBBBwBCAQAQc2VyaWFsVmVyc2lvblVJRAEAAUoBAA1Db25zdGFudFZhbHVlBU9WZdM2AQfHAQAJQ09ORklHVVJFAQASTGphdmEvbGFuZy9TdHJpbmc7AQAGPGluaXQ+AQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC1Mb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbjsBAARuYW1lAQAHYWN0aW9ucwEAB2ltcGxpZXMBAB0oTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjspWgEAAXABABpMamF2YS9zZWN1cml0eS9QZXJtaXNz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b247AQADYWRkAQAdKExqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb247KVYBAApwZXJtaXNzaW9uAQAaTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjsBAAdpbXBsaWVzAQAdKExqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb247KVoBAAFwAQAIZWxlbWVudHMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247AQAIbm9uRW1wdHkBAApTb3VyY2VGaWxlAQAcQ29uZmlndXJhdGlvblBlcm1pc3Npb24uamF2YQwAGwAcDAAZABoBACtvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QZXJtaXNzaW9uAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIBABRpbnZhbGlkIHBlcm1pc3Npb246IAwAQQBCDABBAEMMAEQARQwAGwBGDABHAEgBABtqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb24BAD5hdHRlbXB0IHRvIGFkZCBhIFBlcm1pc3Npb24gdG8gYSByZWFkb25seSBQZXJtaXNzaW9uQ29sbGVjdGlvbgEAN29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBlcm1pc3Npb25Db2xsZWN0aW9uJDEBAAABAAxJbm5lckNsYXNzZXMMABsASQEANW9yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBlcm1pc3Npb25Db2xsZWN0aW9uAQAiamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvbgEABmFwcGVuZAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAKaXNSZWFkT25seQEAAygpWgEAOyhMb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGVybWlzc2lvbkNvbGxlY3Rpb247WilWADAAEgATAAAAAgAYABQAFQABABYAAAACABcAAgAZABoAAAAEAAEAGwAcAAEAHQAAADwAAgABAAAACiq3AAEqA7UAArEAAAACAB4AAAAOAAMAAACQAAQAkQAJAJIAHwAAAAwAAQAAAAoAIAAhAAAAAQAiACMAAQAdAAAAgQAEAAIAAAA5K8EAA5oAHrsABFm7AAVZtwAGEge2AAgrtgAJtgAKtwALvyq2AAyZAA27AA1ZEg63AA+/KgS1AAKxAAAAAgAeAAAAGgAGAAAAowAHAKQAIgCoACkAqQAzAKwAOACtAB8AAAAWAAIAAAA5ACAAIQAAAAAAOQAkACUAAQABACYAJwABAB0AAABIAAEAAgAAABQqtAACmQAOK8EAA5kABwSnAAQDrAAAAAIAHgAAAAYAAQAAALoAHwAAABYAAgAAABQAIAAhAAAAAAAUACgAJQABAAEAKQAqAAEAHQAAAEcABAACAAAADyq0AAI8uwAQWSobtwARsAAAAAIAHgAAAAoAAgAAAMQABQDFAB8AAAAWAAIAAAAPACAAIQAAAAUACgArABoAAQACACwAAAACAC0APQAAAAoAAQAQAAAAAAAAUEsDBAoAAAAAAGtS7jS24o81bgEAAG4BAAAtAAAAb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uUGx1Z2luLmNsYXNzyv66vgAAAC4AEQcADQcADgEACUNNX1RBUkdFVAEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAA8BAApDTV9SQU5LSU5HCAAQAQATbW9kaWZ5Q29uZmlndXJhdGlvbgEAPihMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7TGphdmEvdXRpbC9EaWN0aW9uYXJ5OylWAQAKU291cmNlRmlsZQEAGENvbmZpZ3VyYXRpb25QbHVnaW4uamF2YQEAJ29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBsdWdpbgEAEGphdmEvbGFuZy9PYmplY3QBAAljbS50YXJnZXQBABFzZXJ2aWNlLmNtUmFua2luZwYBAAEAAgAAAAIAGQADAAQAAQAFAAAAAgAGABkABwAEAAEABQAAAAIACAABBAEACQAKAAAAAQALAAAAAgAMUEsDBAoAAAAAAGtS7jQjFP0l9gAAAPYAAAAoAAAAb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZS5jbGFzc8r+ur4AAAAuAAwHAAkHAAoBAAd1cGRhdGVkAQAZKExqYXZhL3V0aWwvRGljdGlvbmFyeTspVgEACkV4Y2VwdGlvbnMHAAsBAApTb3VyY2VGaWxlAQATTWFuYWdlZFNlcnZpY2UuamF2YQEAIm9yZy9vc2dpL3NlcnZpY2UvY20vTWFuYWdlZFNlcnZpY2UBABBqYXZhL2xhbmcvT2JqZWN0AQAqb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uRXhjZXB0aW9uBgEAAQACAAAAAAABBAEAAwAEAAEABQAAAAQAAQAGAAEABwAAAAIACFBLAwQKAAAAAABrUu404QG0O2kBAABpAQAALwAAAG9yZy9vc2dpL3NlcnZpY2UvY20vTWFuYWdlZFNlcnZpY2VGYWN0b3J5LmNsYXNzyv66vgAAAC4AEAcADQcADgEAB2dldE5hbWUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAB3VwZGF0ZWQBACsoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9EaWN0aW9uYXJ5OylWAQAKRXhjZXB0aW9ucwcADwEAB2RlbGV0ZWQBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAApTb3VyY2VGaWxlAQAaTWFuYWdlZFNlcnZpY2VGYWN0b3J5LmphdmEBAClvcmcvb3NnaS9zZXJ2aWNlL2NtL01hbmFnZWRTZXJ2aWNlRmFjdG9yeQEAEGphdmEvbGFuZy9PYmplY3QBACpvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25FeGNlcHRpb24GAQABAAIAAAAAAAMEAQADAAQAAAQBAAUABgABAAcAAAAEAAEACAQBAAkACgAAAAEACwAAAAIADFBLAwQKAAAAAABrUu40R/03nAwAAAAMAAAAHwAAAG9yZy9vc2dpL3NlcnZpY2UvY20vcGFja2FnZWluZm92ZXJzaW9uIDEuMgpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAABsAAABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9QSwMECgAAAAAAa1LuNLphx6LIAQAAyAEAADMAAABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRDb25zdGFudHMuY2xhc3PK/rq+AAAALgAYBwARBwASAQARU0VSVklDRV9DT01QT05FTlQBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAATAQAOQ09NUE9ORU5UX05BTUUIABQBAAxDT01QT05FTlRfSUQIABUBABFDT01QT05FTlRfRkFDVE9SWQgAFgEAF1JFRkVSRU5DRV9UQVJHRVRfU1VGRklYCAAXAQAKU291cmNlRmlsZQEAF0NvbXBvbmVudENvbnN0YW50cy5qYXZhAQAtb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29uc3RhbnRzAQAQamF2YS9sYW5nL09iamVjdAEAEVNlcnZpY2UtQ29tcG9uZW50AQAOY29tcG9uZW50Lm5hbWUBAAxjb21wb25lbnQuaWQBABFjb21wb25lbnQuZmFjdG9yeQEABy50YXJnZXQGAQABAAIAAAAFABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAZAA0ABAABAAUAAAACAA4AAAABAA8AAAACABBQSwMECgAAAAAAa1LuNBapTG77AgAA+wIAADEAAABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRDb250ZXh0LmNsYXNzyv66vgAAAC4AGQcAFwcAGAEADWdldFByb3BlcnRpZXMBABgoKUxqYXZhL3V0aWwvRGljdGlvbmFyeTsBAA1sb2NhdGVTZXJ2aWNlAQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsBAEsoTGphdmEvbGFuZy9TdHJpbmc7TG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOylMamF2YS9sYW5nL09iamVjdDsBAA5sb2NhdGVTZXJ2aWNlcwEAJyhMamF2YS9sYW5nL1N0cmluZzspW0xqYXZhL2xhbmcvT2JqZWN0OwEAEGdldEJ1bmRsZUNvbnRleHQBACQoKUxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsBAA5nZXRVc2luZ0J1bmRsZQEAHSgpTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7AQAUZ2V0Q29tcG9uZW50SW5zdGFuY2UBADAoKUxvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRJbnN0YW5jZTsBAA9lbmFibGVDb21wb25lbnQBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABBkaXNhYmxlQ29tcG9uZW50AQATZ2V0U2VydmljZVJlZmVyZW5jZQEAJygpTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEAClNvdXJjZUZpbGUBABVDb21wb25lbnRDb250ZXh0LmphdmEBACtvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRDb250ZXh0AQAQamF2YS9sYW5nL09iamVjdAYBAAEAAgAAAAAACgQBAAMABAAABAEABQAGAAAEAQAFAAcAAAQBAAgACQAABAEACgALAAAEAQAMAA0AAAQBAA4ADwAABAEAEAARAAAEAQASABEAAAQBABMAFAAAAAEAFQAAAAIAFlBLAwQKAAAAAABrUu40IUu+ZS4EAAAuBAAAMwAAAG9yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEV4Y2VwdGlvbi5jbGFzc8r+ur4AAAAuACcKAAcAIAkABgAhCgAHACIHACMKAAQAIgcAJAcAJQEAEHNlcmlhbFZlcnNpb25VSUQBAAFKAQANQ29uc3RhbnRWYWx1ZQWYxij/mX/p9AEABWNhdXNlAQAVTGphdmEvbGFuZy9UaHJvd2FibGU7AQAGPGluaXQ+AQAqKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvVGhyb3dhYmxlOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC9Mb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RXhjZXB0aW9uOwEAB21lc3NhZ2UBABJMamF2YS9sYW5nL1N0cmluZzsBABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABgoTGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAAhnZXRDYXVzZQEAFygpTGphdmEvbGFuZy9UaHJvd2FibGU7AQAJaW5pdENhdXNlAQAsKExqYXZhL2xhbmcvVGhyb3dhYmxlOylMamF2YS9sYW5nL1Rocm93YWJsZTsBAApTb3VyY2VGaWxlAQAXQ29tcG9uZW50RXhjZXB0aW9uLmphdmEMAA8AGAwADQAODAAPACYBAB9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uAQAtb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RXhjZXB0aW9uAQAaamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24BAAMoKVYAIQAGAAcAAAACABgACAAJAAEACgAAAAIACwASAA0ADgAAAAUAAQAPABAAAQARAAAAUQACAAMAAAALKiu3AAEqLLUAArEAAAACABIAAAAOAAMAAAAoAAUAKQAKACoAEwAAACAAAwAAAAsAFAAVAAAAAAALABYAFwABAAAACwANAA4AAgABAA8AGAABABEAAABHAAIAAgAAAAsqK7cAASoBtQACsQAAAAIAEgAAAA4AAwAAADIABQAzAAoANAATAAAAFgACAAAACwAUABUAAAAAAAsAFgAXAAEAAQAPABkAAQARAAAARgACAAIAAAAKKrcAAyortQACsQAAAAIAEgAAAA4AAwAAADwABAA9AAkAPgATAAAAFgACAAAACgAUABUAAAAAAAoADQAOAAEAAQAaABsAAQARAAAALwABAAEAAAAFKrQAArAAAAACABIAAAAGAAEAAABIABMAAAAMAAEAAAAFABQAFQAAAAEAHAAdAAEAEQAAADwAAgACAAAACLsABFm3AAW/AAAAAgASAAAABgABAAAAVQATAAAAFgACAAAACAAUABUAAAAAAAgADQAOAAEAAQAeAAAAAgAfUEsDBAoAAAAAAGtS7jQiBzIY6wAAAOsAAAAxAAAAb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RmFjdG9yeS5jbGFzc8r+ur4AAAAuAAkHAAcHAAgBAAtuZXdJbnN0YW5jZQEARihMamF2YS91dGlsL0RpY3Rpb25hcnk7KUxvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRJbnN0YW5jZTsBAApTb3VyY2VGaWxlAQAVQ29tcG9uZW50RmFjdG9yeS5qYXZhAQArb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RmFjdG9yeQEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAEEAQADAAQAAAABAAUAAAACAAZQSwMECgAAAAAAa1LuNI4YS2DTAAAA0wAAADIAAABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRJbnN0YW5jZS5jbGFzc8r+ur4AAAAuAAsHAAkHAAoBAAdkaXNwb3NlAQADKClWAQALZ2V0SW5zdGFuY2UBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEAClNvdXJjZUZpbGUBABZDb21wb25lbnRJbnN0YW5jZS5qYXZhAQAsb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50SW5zdGFuY2UBABBqYXZhL2xhbmcvT2JqZWN0BgEAAQACAAAAAAACBAEAAwAEAAAEAQAFAAYAAAABAAcAAAACAAhQSwMECgAAAAAAa1LuNMWfAa4MAAAADAAAACYAAABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9wYWNrYWdlaW5mb3ZlcnNpb24gMS4wClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAGAAAAG9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL1BLAwQKAAAAAABrUu40/rXLWS8BAAAvAQAAJwAAAG9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0NvbnN0YW50cy5jbGFzc8r+ur4AAAAuABEHAA8HABABAAlEUklWRVJfSUQBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAADAQAPREVWSUNFX0NBVEVHT1JZCAAHAQANREVWSUNFX1NFUklBTAgACQEAEkRFVklDRV9ERVNDUklQVElPTggACwEAClNvdXJjZUZpbGUBAA5Db25zdGFudHMuamF2YQEAIW9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0NvbnN0YW50cwEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAEABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAAAAEADQAAAAIADlBLAwQKAAAAAABrUu40sreBh8kAAADJAAAAJAAAAG9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RldmljZS5jbGFzc8r+ur4AAAAuAA0HAAsHAAwBAApNQVRDSF9OT05FAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAAEADW5vRHJpdmVyRm91bmQBAAMoKVYBAApTb3VyY2VGaWxlAQALRGV2aWNlLmphdmEBAB5vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9EZXZpY2UBABBqYXZhL2xhbmcvT2JqZWN0BgEAAQACAAAAAQAZAAMABAABAAUAAAACAAYAAQQBAAcACAAAAAEACQAAAAIAClBLAwQKAAAAAABrUu40rni/OzcBAAA3AQAAJAAAAG9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlci5jbGFzc8r+ur4AAAAuAA4HAAsHAAwBAAVtYXRjaAEAKChMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7KUkBAApFeGNlcHRpb25zBwANAQAGYXR0YWNoAQA5KExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTspTGphdmEvbGFuZy9TdHJpbmc7AQAKU291cmNlRmlsZQEAC0RyaXZlci5qYXZhAQAeb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRHJpdmVyAQAQamF2YS9sYW5nL09iamVjdAEAE2phdmEvbGFuZy9FeGNlcHRpb24GAQABAAIAAAAAAAIEAQADAAQAAQAFAAAABAABAAYEAQAHAAgAAQAFAAAABAABAAYAAQAJAAAAAgAKUEsDBAoAAAAAAGtS7jR+aShcOAEAADgBAAArAAAAb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRHJpdmVyTG9jYXRvci5jbGFzc8r+ur4AAAAuAA4HAAsHAAwBAAtmaW5kRHJpdmVycwEAKyhMamF2YS91dGlsL0RpY3Rpb25hcnk7KVtMamF2YS9sYW5nL1N0cmluZzsBAApsb2FkRHJpdmVyAQApKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9pby9JbnB1dFN0cmVhbTsBAApFeGNlcHRpb25zBwANAQAKU291cmNlRmlsZQEAEkRyaXZlckxvY2F0b3IuamF2YQEAJW9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlckxvY2F0b3IBABBqYXZhL2xhbmcvT2JqZWN0AQATamF2YS9pby9JT0V4Y2VwdGlvbgYBAAEAAgAAAAAAAgQBAAMABAAABAEABQAGAAEABwAAAAQAAQAIAAEACQAAAAIAClBLAwQKAAAAAABrUu404c7pVRgBAAAYAQAALAAAAG9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RyaXZlclNlbGVjdG9yLmNsYXNzyv66vgAAAC4ADQcACwcADAEAC1NFTEVDVF9OT05FAQABSQEADUNvbnN0YW50VmFsdWUD/////wEABnNlbGVjdAEASChMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7W0xvcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9NYXRjaDspSQEAClNvdXJjZUZpbGUBABNEcml2ZXJTZWxlY3Rvci5qYXZhAQAmb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRHJpdmVyU2VsZWN0b3IBABBqYXZhL2xhbmcvT2JqZWN0BgEAAQACAAAAAQAZAAMABAABAAUAAAACAAYAAQQBAAcACAAAAAEACQAAAAIAClBLAwQKAAAAAABrUu40B1WmnM8AAADPAAAAIwAAAG9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL01hdGNoLmNsYXNzyv66vgAAAC4ACwcACQcACgEACWdldERyaXZlcgEAJygpTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEADWdldE1hdGNoVmFsdWUBAAMoKUkBAApTb3VyY2VGaWxlAQAKTWF0Y2guamF2YQEAHW9yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL01hdGNoAQAQamF2YS9sYW5nL09iamVjdAYBAAEAAgAAAAAAAgQBAAMABAAABAEABQAGAAAAAQAHAAAAAgAIUEsDBAoAAAAAAGtS7jSErhq3DAAAAAwAAAAjAAAAb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvcGFja2FnZWluZm92ZXJzaW9uIDEuMQpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAABcAAABvcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1BLAwQKAAAAAABrUu40n6jv9mINAABiDQAAIgAAAG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnQuY2xhc3PK/rq+AAAALgCrCgAtAGQJABIAZQoAEgBmBwBnCgAEAGQJABIAaAoAaQBqCwBrAGwLAGsAbQcAbgoAaQBvCgAEAHAIAHEKAAQAbwoABAByCgAEAGoLAHMAdAcAdQoACgB2CgAEAHYKAAoAdwoABAB3BwB4CgAXAGQKAC0AeQoAegB7CgAXAHwIAH0IAH4KABcAfwcAgAgAgQoAHwCCCgAfAIMKABIAhAoAHwCFBwCGBwCHCACICgAmAIkKAAoAiggAiwoACgCMCgAKAI0HAI4BAAV0b3BpYwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACnByb3BlcnRpZXMBABVMamF2YS91dGlsL0hhc2h0YWJsZTsBAAlTRVBBUkFUT1IBAA1Db25zdGFudFZhbHVlAQANdG9rZW5BbHBoYWJldAEABjxpbml0PgEAKyhMamF2YS9sYW5nL1N0cmluZztMamF2YS91dGlsL0RpY3Rpb25hcnk7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQADa2V5AQAFdmFsdWUBABJMamF2YS9sYW5nL09iamVjdDsBAAFlAQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAR0aGlzAQAeTG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnQ7AQAWTGphdmEvdXRpbC9EaWN0aW9uYXJ5OwEAC2dldFByb3BlcnR5AQAmKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL09iamVjdDsBAARuYW1lAQAQZ2V0UHJvcGVydHlOYW1lcwEAFSgpW0xqYXZhL2xhbmcvU3RyaW5nOwEAAWkBAAFJAQAFbmFtZXMBABNbTGphdmEvbGFuZy9TdHJpbmc7AQAEa2V5cwEACGdldFRvcGljAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAdtYXRjaGVzAQAeKExvcmcvb3NnaS9mcmFtZXdvcmsvRmlsdGVyOylaAQAGZmlsdGVyAQAbTG9yZy9vc2dpL2ZyYW1ld29yay9GaWx0ZXI7AQAGZXF1YWxzAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaAQAGb2JqZWN0AQAFZXZlbnQBAAhoYXNoQ29kZQEAAygpSQEACHRvU3RyaW5nAQARdmFsaWRhdGVUb3BpY05hbWUBAAMoKVYBAAJzdAEAG0xqYXZhL3V0aWwvU3RyaW5nVG9rZW5pemVyOwEAIkxqYXZhL3V0aWwvTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsBAA12YWxpZGF0ZVRva2VuAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAFdG9rZW4BAAZsZW5ndGgBAApTb3VyY2VGaWxlAQAKRXZlbnQuamF2YQwANQBaDAAuAC8MAFkAWgEAE2phdmEvdXRpbC9IYXNodGFibGUMADAAMQcAjwwASwCQBwCRDACSAJMMAJQAlQEAEGphdmEvbGFuZy9TdHJpbmcMAJYAlwwAmACZAQAMZXZlbnQudG9waWNzDACaAFcHAJsMAJwAnQEAHG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnQMAFIAUwwAVgBXAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgwAngCfBwCgDAChAE0MAKIAowEACCBbdG9waWM9AQABXQwAWABNAQAZamF2YS91dGlsL1N0cmluZ1Rva2VuaXplcgEAAS8MADUApAwApQBNDABeAF8MAKYAkwEAIGphdmEvdXRpbC9Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgEADWludmFsaWQgdG9waWMMADUAXwwAYQBXAQBAQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODlfLQwApwCoDACpAKoBABBqYXZhL2xhbmcvT2JqZWN0AQAUamF2YS91dGlsL0RpY3Rpb25hcnkBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247AQAVamF2YS91dGlsL0VudW1lcmF0aW9uAQAPaGFzTW9yZUVsZW1lbnRzAQADKClaAQALbmV4dEVsZW1lbnQBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQADcHV0AQA4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aS9zZXJ2aWNlL2V2ZW50L0V2ZW50OylWAQAJc2VuZEV2ZW50AQAKU291cmNlRmlsZQEAD0V2ZW50QWRtaW4uamF2YQEAIW9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRBZG1pbgEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAIEAQADAAQAAAQBAAUABAAAAAEABgAAAAIAB1BLAwQKAAAAAABrUu408vHfr9UDAADVAwAAKwAAAG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRDb25zdGFudHMuY2xhc3PK/rq+AAAALgA7BwApBwAqAQALRVZFTlRfVE9QSUMBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAArAQAMRVZFTlRfRklMVEVSCAAsAQANQlVORExFX1NJR05FUggALQEAE0JVTkRMRV9TWU1CT0xJQ05BTUUIAC4BAAlCVU5ETEVfSUQIAC8BAAZCVU5ETEUIADABAAVFVkVOVAgAMQEACUVYQ0VQVElPTggAMgEAD0VYQ0VQVElPTl9DTEFTUwgAMwEAEUVYQ0VQVElPTl9NRVNTQUdFCAA0AQAHTUVTU0FHRQgANQEAB1NFUlZJQ0UIADYBAApTRVJWSUNFX0lECAA3AQATU0VSVklDRV9PQkpFQ1RDTEFTUwgAOAEAC1NFUlZJQ0VfUElECAA5AQAJVElNRVNUQU1QCAA6AQAPRVhFQ1BUSU9OX0NMQVNTAQAKRGVwcmVjYXRlZAEAClNvdXJjZUZpbGUBABNFdmVudENvbnN0YW50cy5qYXZhAQAlb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudENvbnN0YW50cwEAEGphdmEvbGFuZy9PYmplY3QBAAxldmVudC50b3BpY3MBAAxldmVudC5maWx0ZXIBAA1idW5kbGUuc2lnbmVyAQATYnVuZGxlLnN5bWJvbGljTmFtZQEACWJ1bmRsZS5pZAEABmJ1bmRsZQEABWV2ZW50AQAJZXhjZXB0aW9uAQAPZXhjZXB0aW9uLmNsYXNzAQARZXhjZXB0aW9uLm1lc3NhZ2UBAAdtZXNzYWdlAQAHc2VydmljZQEACnNlcnZpY2UuaWQBABNzZXJ2aWNlLm9iamVjdENsYXNzAQALc2VydmljZS5waWQBAAl0aW1lc3RhbXAGAQABAAIAAAARABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAZAA0ABAABAAUAAAACAA4AGQAPAAQAAQAFAAAAAgAQABkAEQAEAAEABQAAAAIAEgAZABMABAABAAUAAAACABQAGQAVAAQAAQAFAAAAAgAWABkAFwAEAAEABQAAAAIAGAAZABkABAABAAUAAAACABoAGQAbAAQAAQAFAAAAAgAcABkAHQAEAAEABQAAAAIAHgAZAB8ABAABAAUAAAACACAAGQAhAAQAAQAFAAAAAgAiABkAIwAEAAEABQAAAAIAJAAZACUABAACAAUAAAACABYAJgAAAAAAAAABACcAAAACAChQSwMECgAAAAAAa1LuNErNMEG6AAAAugAAACkAAABvcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50SGFuZGxlci5jbGFzc8r+ur4AAAAuAAkHAAcHAAgBAAtoYW5kbGVFdmVudAEAIShMb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudDspVgEAClNvdXJjZUZpbGUBABFFdmVudEhhbmRsZXIuamF2YQEAI29yZy9vc2dpL3NlcnZpY2UvZXZlbnQvRXZlbnRIYW5kbGVyAQAQamF2YS9sYW5nL09iamVjdAYBAAEAAgAAAAAAAQQBAAMABAAAAAEABQAAAAIABlBLAwQKAAAAAABrUu40zIdycSARAAAgEQAALAAAAG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uLmNsYXNzyv66vgAAAC4AqQoAGQBtCgAZAG4KACUAbwkAGQBwCQAZAHEKABkAcgoAcwB0BwB1CAB2CgAIAG8IAHcKAHMAeAgAeQkAGQB6CAB7CgBzAHwKAHMAfQgAfgoAcwB/BwCACgAUAIEIAIIKABQAgwoAFACEBwCFCgAZAIYKAHMAhwgAiAoAFACJCACKBwCLCgAfAIEKAHMAjAoAGQCNCgCOAI8KAJAAkQcAkgEAEHNlcmlhbFZlcnNpb25VSUQBAAFKAQANQ29uc3RhbnRWYWx1ZQWuvNurPgwShAEAB1BVQkxJU0gBABJMamF2YS9sYW5nL1N0cmluZzsBAAlTVUJTQ1JJQkUBAA5BQ1RJT05fUFVCTElTSAEAAUkDAAAAAQEAEEFDVElPTl9TVUJTQ1JJQkUDAAAAAgEACkFDVElPTl9BTEwDAAAAAwEAC0FDVElPTl9OT05FAwAAAAABAAthY3Rpb25fbWFzawEABnByZWZpeAEAB2FjdGlvbnMBAAY8aW5pdD4BACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKExvcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1RvcGljUGVybWlzc2lvbjsBAARuYW1lAQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpVgEABG1hc2sBAARpbml0AQAHZ2V0TWFzawEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAAWMBAAFDAQAIbWF0Y2hsZW4BAAlzZWVuY29tbWEBAAFaAQABYQEAAltDAQABaQEAB2ltcGxpZXMBAB0oTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjspWgEABnRhcmdldAEAAXABABpMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOwEACmdldEFjdGlvbnMBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAAnNiAQAYTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAFY29tbWEBABduZXdQZXJtaXNzaW9uQ29sbGVjdGlvbgEAJigpTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb247AQAGZXF1YWxzAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaAQADb2JqAQASTGphdmEvbGFuZy9PYmplY3Q7AQAIaGFzaENvZGUBAAMoKUkBAAt3cml0ZU9iamVjdAEAHyhMamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW07KVYBAAFzAQAcTGphdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtOwEACkV4Y2VwdGlvbnMHAJMBAApyZWFkT2JqZWN0AQAeKExqYXZhL2lvL09iamVjdElucHV0U3RyZWFtOylWAQAbTGphdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW07BwCUAQAKU291cmNlRmlsZQEAFFRvcGljUGVybWlzc2lvbi5qYXZhDABFAEYMADoAQgwAOgCVDAA3AC8MADkALAwARABCBwCWDACXAGABACJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uAQAMaW52YWxpZCBuYW1lAQABKgwAWwBcAQAADAA4ACwBAAIvKgwAmACZDACaAJsBABVpbnZhbGlkIGFjdGlvbiBzdHJpbmcMAJwAnQEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIMADoAngEAFGludmFsaWQgcGVybWlzc2lvbjogDACfAKAMAKEAVQEAJm9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uDACiAFUMAKMAmQEAB3B1Ymxpc2gMAJ8ApAEACXN1YnNjcmliZQEAMG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uQ29sbGVjdGlvbgwAXwBgDABUAFUHAKUMAKYAngcApwwAqACeAQAYamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uAQATamF2YS9pby9JT0V4Y2VwdGlvbgEAIGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAQamF2YS9sYW5nL1N0cmluZwEABmxlbmd0aAEACGVuZHNXaXRoAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAJc3Vic3RyaW5nAQAWKElJKUxqYXZhL2xhbmcvU3RyaW5nOwEAC3RvQ2hhckFycmF5AQAEKClbQwEAAygpVgEABmFwcGVuZAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAIdG9TdHJpbmcBAAdnZXROYW1lAQAKc3RhcnRzV2l0aAEAGyhDKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOwEAGmphdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtAQASZGVmYXVsdFdyaXRlT2JqZWN0AQAZamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbQEAEWRlZmF1bHRSZWFkT2JqZWN0ADEAGQAlAAAACgAYACYAJwABACgAAAACACkAGQArACwAAQAoAAAAAgAcABkALQAsAAEAKAAAAAIAHgAa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VGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAyTG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uQ29sbGVjdGlvbjsBAANhZGQBAB0oTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjspVgEAB29sZE1hc2sBAAFJAQAHbmV3TWFzawEACnBlcm1pc3Npb24BABpMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOwEAAnBwAQAoTG9yZy9vc2dpL3NlcnZpY2UvZXZlbnQvVG9waWNQZXJtaXNzaW9uOwEABG5hbWUBABJMamF2YS9sYW5nL1N0cmluZzsBAAhleGlzdGluZwEAB2ltcGxpZXMBAB0oTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjspWgEAAXgBAAdkZXNpcmVkAQAJZWZmZWN0aXZlAQAEbGFzdAEABm9mZnNldAEACGVsZW1lbnRzAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwEAClNvdXJjZUZpbGUBABRUb3BpY1Blcm1pc3Npb24uamF2YQwAKgArAQATamF2YS91dGlsL0hhc2h0YWJsZQwAJgAnDAAoACkBACZvcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1RvcGljUGVybWlzc2lvbgEAImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24BABZqYXZhL2xhbmcvU3RyaW5nQnVmZmVyAQAUaW52YWxpZCBwZXJtaXNzaW9uOiAMAGYAZwwAZgBoDABpAGoMACoAawwAbABtAQAbamF2YS9sYW5nL1NlY3VyaXR5RXhjZXB0aW9uAQA+YXR0ZW1wdCB0byBhZGQgYSBQZXJtaXNzaW9uIHRvIGEgcmVhZG9ubHkgUGVybWlzc2lvbkNvbGxlY3Rpb24MAG4AagwAbwBwDABxAHIMACoAcwwAdAB1AQABKgcAdgwAdwB4DAB5AHIBAAEvDAB6AHsMAHwAfQwARABFAQAwb3JnL29zZ2kvc2VydmljZS9ldmVudC9Ub3BpY1Blcm1pc3Npb25Db2xsZWN0aW9uAQAiamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvbgEABmFwcGVuZAEALChMamF2YS9sYW5nL1N0cmluZzsp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bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXF1ZXN0O0xqYXZheC9zZXJ2bGV0L2h0dHAvSHR0cFNlcnZsZXRSZXNwb25zZTspWgEACkV4Y2VwdGlvbnMHABoBAAtnZXRSZXNvdXJjZQEAIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbmV0L1VSTDsBAAtnZXRNaW1lVHlwZQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQAKU291cmNlRmlsZQEAEEh0dHBDb250ZXh0LmphdmEBACFvcmcvb3NnaS9zZXJ2aWNlL2h0dHAvSHR0cENvbnRleHQBABBqYXZhL2xhbmcvT2JqZWN0AQAwb3JnLm9zZ2kuc2VydmljZS5odHRwLmF1dGhlbnRpY2F0aW9uLnJlbW90ZS51c2VyAQApb3JnLm9zZ2kuc2VydmljZS5odHRwLmF1dGhlbnRpY2F0aW9uLnR5cGUBAChvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbi5hdXRob3JpemF0aW9uAQATamF2YS9pby9JT0V4Y2VwdGlvbgYBAAEAAgAAAAMAGQADAAQAAQAFAAAAAgAGABkABwAEAAEABQAAAAIACAAZAAkABAABAAUAAAACAAoAAwQBAAsADAABAA0AAAAEAAEADgQBAA8AEAAABAEAEQASAAAAAQATAAAAAgAUUEsDBAoAAAAAAGtS7jQU9NR5VQIAAFUCAAAnAAAAb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBTZXJ2aWNlLmNsYXNzyv66vgAAAC4AFAcAEAcAEQEAD3JlZ2lzdGVyU2VydmxldAEAZShMamF2YS9sYW5nL1N0cmluZztMamF2YXgvc2VydmxldC9TZXJ2bGV0O0xqYXZhL3V0aWwvRGljdGlvbmFyeTtMb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBDb250ZXh0OylWAQAKRXhjZXB0aW9ucwcAEgcAEwEAEXJlZ2lzdGVyUmVzb3VyY2VzAQBKKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nO0xvcmcvb3NnaS9zZXJ2aWNlL2h0dHAvSHR0cENvbnRleHQ7KVYBAAp1bnJlZ2lzdGVyAQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAYY3JlYXRlRGVmYXVsdEh0dHBDb250ZXh0AQAlKClMb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBDb250ZXh0OwEAClNvdXJjZUZpbGUBABBIdHRwU2VydmljZS5qYXZhAQAhb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBTZXJ2aWNlAQAQamF2YS9sYW5nL09iamVjdAEAHmphdmF4L3NlcnZsZXQvU2VydmxldEV4Y2VwdGlvbgEAKG9yZy9vc2dpL3NlcnZpY2UvaHR0cC9OYW1lc3BhY2VFeGNlcHRpb24GAQABAAIAAAAAAAQEAQADAAQAAQAFAAAABgACAAYABwQBAAgACQABAAUAAAAEAAEABwQBAAoACwAABAEADAANAAAAAQAOAAAAAgAPUEsDBAoAAAAAAGtS7jR+K4cj9QMAAPUDAAAuAAAAb3JnL29zZ2kvc2VydmljZS9odHRwL05hbWVzcGFjZUV4Y2VwdGlvbi5jbGFzc8r+ur4AAAAuACYKAAYAHwkABQAgBwAhCgADACIHACMHACQBABBzZXJpYWxWZXJzaW9uVUlEAQABSgEADUNvbnN0YW50VmFsdWUFZGoJWXU+RXMBAAVjYXVzZQEAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEABjxpbml0PgEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAqTG9yZy9vc2dpL3NlcnZpY2UvaHR0cC9OYW1lc3BhY2VFeGNlcHRpb247AQAHbWVzc2FnZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAKihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1Rocm93YWJsZTspVgEADGdldEV4Y2VwdGlvbgEAFygpTGphdmEvbGFuZy9UaHJvd2FibGU7AQAIZ2V0Q2F1c2UBAAlpbml0Q2F1c2UBACwoTGphdmEvbGFuZy9UaHJvd2FibGU7KUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEAClNvdXJjZUZpbGUBABdOYW1lc3BhY2VFeGNlcHRpb24uamF2YQwADgAPDAAMAA0BAB9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uDAAOACUBAChvcmcvb3NnaS9zZXJ2aWNlL2h0dHAvTmFtZXNwYWNlRXhjZXB0aW9uAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAAygpVgAhAAUABgAAAAIAGAAHAAgAAQAJAAAAAgAKABIADAANAAAABQABAA4ADwABABAAAABHAAIAAgAAAAsqK7cAASoBtQACsQAAAAIAEQAAAA4AAwAAACgABQApAAoAKgASAAAAFgACAAAACwATABQAAAAAAAsAFQAWAAEAAQAOABcAAQAQAAAAUQACAAMAAAALKiu3AAEqLLUAArEAAAACABEAAAAOAAMAAAA0AAUANQAKADYAEgAAACAAAwAAAAsAEwAUAAAAAAALABUAFgABAAAACwAMAA0AAgABABgAGQABABAAAAAvAAEAAQAAAAUqtAACsAAAAAIAEQAAAAYAAQAAAEMAEgAAAAwAAQAAAAUAEwAUAAAAAQAaABkAAQAQAAAALwABAAEAAAAFKrQAArAAAAACABEAAAAGAAEAAABPABIAAAAMAAEAAAAFABMAFAAAAAEAGwAcAAEAEAAAADwAAgACAAAACLsAA1m3AAS/AAAAAgARAAAABgABAAAAXQASAAAAFgACAAAACAATABQAAAAAAAgADAANAAEAAQAdAAAAAgAeUEsDBAoAAAAAAGtS7jRH/TecDAAAAAwAAAAhAAAAb3JnL29zZ2kvc2VydmljZS9odHRwL3BhY2thZ2VpbmZvdmVyc2lvbiAxLjIKUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAUAAAAb3JnL29zZ2kvc2VydmljZS9pby9QSwMECgAAAAAAa1LuNM7xbf9dAQAAXQEAACsAAABvcmcvb3NnaS9zZXJ2aWNlL2lvL0Nvbm5lY3Rpb25GYWN0b3J5LmNsYXNzyv66vgAAAC4AEQcADQcADgEACUlPX1NDSEVNRQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAA8BABBjcmVhdGVDb25uZWN0aW9uAQA4KExqYXZhL2xhbmcvU3RyaW5nO0laKUxqYXZheC9taWNyb2VkaXRpb24vaW8vQ29ubmVjdGlvbjsBAApFeGNlcHRpb25zBwAQAQAKU291cmNlRmlsZQEAFkNvbm5lY3Rpb25GYWN0b3J5LmphdmEBACVvcmcvb3NnaS9zZXJ2aWNlL2lvL0Nvbm5lY3Rpb25GYWN0b3J5AQAQamF2YS9sYW5nL09iamVjdAEACWlvLnNjaGVtZQEAE2phdmEvaW8vSU9FeGNlcHRpb24GAQABAAIAAAABABkAAwAEAAEABQAAAAIABgABBAEABwAIAAEACQAAAAQAAQAKAAEACwAAAAIADFBLAwQKAAAAAABrUu40HJDUPFkDAABZAwAAKgAAAG9yZy9vc2dpL3NlcnZpY2UvaW8vQ29ubmVjdG9yU2VydmljZS5jbGFzc8r+ur4AAAAuAB4HABsHABwBAARSRUFEAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAQEABVdSSVRFAwAAAAIBAApSRUFEX1dSSVRFAwAAAAMBAARvcGVuAQA2KExqYXZhL2xhbmcvU3RyaW5nOylMamF2YXgvbWljcm9lZGl0aW9uL2lvL0Nvbm5lY3Rpb247AQAKRXhjZXB0aW9ucwcAHQEANyhMamF2YS9sYW5nL1N0cmluZztJKUxqYXZheC9taWNyb2VkaXRpb24vaW8vQ29ubmVjdGlvbjsBADgoTGphdmEvbGFuZy9TdHJpbmc7SVopTGphdmF4L21pY3JvZWRpdGlvbi9pby9Db25uZWN0aW9uOwEAD29wZW5JbnB1dFN0cmVhbQEAKShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vSW5wdXRTdHJlYW07AQATb3BlbkRhdGFJbnB1dFN0cmVhbQEALShMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vRGF0YUlucHV0U3RyZWFtOwEAEG9wZW5PdXRwdXRTdHJlYW0BACooTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2lvL091dHB1dFN0cmVhbTsBABRvcGVuRGF0YU91dHB1dFN0cmVhbQEALihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvaW8vRGF0YU91dHB1dFN0cmVhbTsBAApTb3VyY2VGaWxlAQAVQ29ubmVjdG9yU2VydmljZS5qYXZhAQAkb3JnL29zZ2kvc2VydmljZS9pby9Db25uZWN0b3JTZXJ2aWNlAQAQamF2YS9sYW5nL09iamVjdAEAE2phdmEvaW8vSU9FeGNlcHRpb24GAQABAAIAAAADABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKAAcEAQALAAwAAQANAAAABAABAA4EAQALAA8AAQANAAAABAABAA4EAQALABAAAQANAAAABAABAA4EAQARABIAAQANAAAABAABAA4EAQATABQAAQANAAAABAABAA4EAQAVABYAAQANAAAABAABAA4EAQAXABgAAQANAAAABAABAA4AAQAZAAAAAgAaUEsDBAoAAAAAAGtS7jTFnwGuDAAAAAwAAAAfAAAAb3JnL29zZ2kvc2VydmljZS9pby9wYWNrYWdlaW5mb3ZlcnNpb24gMS4wClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAFQAAAG9yZy9vc2dpL3NlcnZpY2UvbG9nL1BLAwQKAAAAAABrUu40GlB8D4ABAACAAQAAIwAAAG9yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ0VudHJ5LmNsYXNzyv66vgAAAC4AEwcAEQcAEgEACWdldEJ1bmRsZQEAHSgpTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7AQATZ2V0U2VydmljZVJlZmVyZW5jZQEAJygpTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEACGdldExldmVsAQADKClJAQAKZ2V0TWVzc2FnZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAMZ2V0RXhjZXB0aW9uAQAXKClMamF2YS9sYW5nL1Rocm93YWJsZTsBAAdnZXRUaW1lAQADKClKAQAKU291cmNlRmlsZQEADUxvZ0VudHJ5LmphdmEBAB1vcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dFbnRyeQEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAYEAQADAAQAAAQBAAUABgAABAEABwAIAAAEAQAJAAoAAAQBAAsADAAABAEADQAOAAAAAQAPAAAAAgAQUEsDBAoAAAAAAGtS7jS1YCyo0QAAANEAAAAmAAAAb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nTGlzdGVuZXIuY2xhc3PK/rq+AAAALgALBwAIBwAJBwAKAQAGbG9nZ2VkAQAiKExvcmcvb3NnaS9zZXJ2aWNlL2xvZy9Mb2dFbnRyeTspVgEAClNvdXJjZUZpbGUBABBMb2dMaXN0ZW5lci5qYXZhAQAgb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nTGlzdGVuZXIBABBqYXZhL2xhbmcvT2JqZWN0AQAXamF2YS91dGlsL0V2ZW50TGlzdGVuZXIGAQABAAIAAQADAAAAAQQBAAQABQAAAAEABgAAAAIAB1BLAwQKAAAAAABrUu40VSUS3xABAAAQAQAAKwAAAG9yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1JlYWRlclNlcnZpY2UuY2xhc3PK/rq+AAAALgAMBwAKBwALAQAOYWRkTG9nTGlzdGVuZXIBACUoTG9yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ0xpc3RlbmVyOylWAQARcmVtb3ZlTG9nTGlzdGVuZXIBAAZnZXRMb2cBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247AQAKU291cmNlRmlsZQEAFUxvZ1JlYWRlclNlcnZpY2UuamF2YQEAJW9yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1JlYWRlclNlcnZpY2UBABBqYXZhL2xhbmcvT2JqZWN0BgEAAQACAAAAAAADBAEAAwAEAAAEAQAFAAQAAAQBAAYABwAAAAEACAAAAAIACVBLAwQKAAAAAABrUu405mTbpxECAAARAgAAJQAAAG9yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1NlcnZpY2UuY2xhc3PK/rq+AAAALgAWBwAUBwAVAQAJTE9HX0VSUk9SAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAQEAC0xPR19XQVJOSU5HAwAAAAIBAAhMT0dfSU5GTwMAAAADAQAJTE9HX0RFQlVHAwAAAAQBAANsb2cBABYoSUxqYXZhL2xhbmcvU3RyaW5nOylWAQArKElMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1Rocm93YWJsZTspVgEAOyhMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7SUxqYXZhL2xhbmcvU3RyaW5nOylWAQBQKExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTtJTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAApTb3VyY2VGaWxlAQAPTG9nU2VydmljZS5qYXZhAQAfb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nU2VydmljZQEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAEABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAEBAEADQAOAAAEAQANAA8AAAQBAA0AEAAABAEADQARAAAAAQASAAAAAgATUEsDBAoAAAAAAGtS7jQGzCyFDAAAAAwAAAAgAAAAb3JnL29zZ2kvc2VydmljZS9sb2cvcGFja2FnZWluZm92ZXJzaW9uIDEuMwpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAABoAAABvcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL1BLAwQKAAAAAABrUu40KoKjojQDAAA0AwAAMwAAAG9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvQXR0cmlidXRlRGVmaW5pdGlvbi5jbGFzc8r+ur4AAAAuAC0HACsHACwBAAZTVFJJTkcBAAFJAQANQ29uc3RhbnRWYWx1ZQMAAAABAQAETE9ORwMAAAACAQAHSU5URUdFUgMAAAADAQAFU0hPUlQDAAAABAEACUNIQVJBQ1RFUgMAAAAFAQAEQllURQMAAAAGAQAGRE9VQkxFAwAAAAcBAAVGTE9BVAMAAAAIAQAKQklHSU5URUdFUgMAAAAJAQAKRGVwcmVjYXRlZAEACkJJR0RFQ0lNQUwDAAAACgEAB0JPT0xFQU4DAAAACwEAB2dldE5hbWUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABWdldElEAQAOZ2V0RGVzY3JpcHRpb24BAA5nZXRDYXJkaW5hbGl0eQEAAygpSQEAB2dldFR5cGUBAA9nZXRPcHRpb25WYWx1ZXMBABUoKVtMamF2YS9sYW5nL1N0cmluZzsBAA9nZXRPcHRpb25MYWJlbHMBAAh2YWxpZGF0ZQEAJihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmc7AQAPZ2V0RGVmYXVsdFZhbHVlAQAKU291cmNlRmlsZQEAGEF0dHJpYnV0ZURlZmluaXRpb24uamF2YQEALW9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvQXR0cmlidXRlRGVmaW5pdGlvbgEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAALABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAZAA0ABAABAAUAAAACAA4AGQAPAAQAAQAFAAAAAgAQABkAEQAEAAEABQAAAAIAEgAZABMABAABAAUAAAACABQAGQAVAAQAAgAFAAAAAgAWABcAAAAAABkAGAAEAAIABQAAAAIAGQAXAAAAAAAZABoABAABAAUAAAACABsACQQBABwAHQAABAEAHgAdAAAEAQAfAB0AAAQBACAAIQAABAEAIgAhAAAEAQAjACQAAAQBACUAJAAABAEAJgAnAAAEAQAoACQAAAABACkAAAACACpQSwMECgAAAAAAa1LuNGjHkqI6AQAAOgEAADMAAABvcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlSW5mb3JtYXRpb24uY2xhc3PK/rq+AAAALgAOBwALBwAMBwANAQAHZ2V0UGlkcwEAFSgpW0xqYXZhL2xhbmcvU3RyaW5nOwEADmdldEZhY3RvcnlQaWRzAQAJZ2V0QnVuZGxlAQAdKClMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZTsBAApTb3VyY2VGaWxlAQAYTWV0YVR5cGVJbmZvcm1hdGlvbi5qYXZhAQAtb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZUluZm9ybWF0aW9uAQAQamF2YS9sYW5nL09iamVjdAEAKm9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVQcm92aWRlcgYBAAEAAgABAAMAAAADBAEABAAFAAAEAQAGAAUAAAQBAAcACAAAAAEACQAAAAIAClBLAwQKAAAAAABrUu40FftZzjUBAAA1AQAAMAAAAG9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVQcm92aWRlci5jbGFzc8r+ur4AAAAuAAsHAAkHAAoBABhnZXRPYmplY3RDbGFzc0RlZmluaXRpb24BAFcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL09iamVjdENsYXNzRGVmaW5pdGlvbjsBAApnZXRMb2NhbGVzAQAVKClbTGphdmEvbGFuZy9TdHJpbmc7AQAKU291cmNlRmlsZQEAFU1ldGFUeXBlUHJvdmlkZXIuamF2YQEAKm9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVQcm92aWRlcgEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAIEAQADAAQAAAQBAAUABgAAAAEABwAAAAIACFBLAwQKAAAAAABrUu40J86VemMBAABjAQAALwAAAG9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVTZXJ2aWNlLmNsYXNzyv66vgAAAC4ADgcACwcADAEAG01FVEFUWVBFX0RPQ1VNRU5UU19MT0NBVElPTgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAA0BABZnZXRNZXRhVHlwZUluZm9ybWF0aW9uAQBMKExvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlOylMb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZUluZm9ybWF0aW9uOwEAClNvdXJjZUZpbGUBABRNZXRhVHlwZVNlcnZpY2UuamF2YQEAKW9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVTZXJ2aWNlAQAQamF2YS9sYW5nL09iamVjdAEAEU9TR0ktSU5GL21ldGF0eXBlBgEAAQACAAAAAQAZAAMABAABAAUAAAACAAYAAQQBAAcACAAAAAEACQAAAAIAClBLAwQKAAAAAABrUu40C5HDYQsCAAALAgAANQAAAG9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvT2JqZWN0Q2xhc3NEZWZpbml0aW9uLmNsYXNzyv66vgAAAC4AGgcAFwcAGAEACFJFUVVJUkVEAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAQEACE9QVElPTkFMAwAAAAIBAANBTEwD/////wEAB2dldE5hbWUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABWdldElEAQAOZ2V0RGVzY3JpcHRpb24BABdnZXRBdHRyaWJ1dGVEZWZpbml0aW9ucwEAMyhJKVtMb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9BdHRyaWJ1dGVEZWZpbml0aW9uOwEAB2dldEljb24BABgoSSlMamF2YS9pby9JbnB1dFN0cmVhbTsBAApFeGNlcHRpb25zBwAZAQAKU291cmNlRmlsZQEAGk9iamVjdENsYXNzRGVmaW5pdGlvbi5qYXZhAQAvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9PYmplY3RDbGFzc0RlZmluaXRpb24BABBqYXZhL2xhbmcvT2JqZWN0AQATamF2YS9pby9JT0V4Y2VwdGlvbgYBAAEAAgAAAAMAGQADAAQAAQAFAAAAAgAGABkABwAEAAEABQAAAAIACAAZAAkABAABAAUAAAACAAoABQQBAAsADAAABAEADQAMAAAEAQAOAAwAAAQBAA8AEAAABAEAEQASAAEAEwAAAAQAAQAUAAEAFQAAAAIAFlBLAwQKAAAAAABrUu40hK4atwwAAAAMAAAAJQAAAG9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvcGFja2FnZWluZm92ZXJzaW9uIDEuMQpQSwMECgAAAAAAa1LuNAAAAAAAAAAAAAAAABcAAABvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1BLAwQKAAAAAABrUu40MSVA+q4DAACuAwAAMgAAAG9yZy9vc2dpL3NlcnZpY2UvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uLmNsYXNzyv66vgAAAC4AJQoABgAeCQAFAB8HACAKAAMAIQcAIgcAIwEAEHNlcmlhbFZlcnNpb25VSUQBAAFKAQANQ29uc3RhbnRWYWx1ZQXsWqVRVLA8+gEABWNhdXNlAQAVTGphdmEvbGFuZy9UaHJvd2FibGU7AQAGPGluaXQ+AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBAC5Mb3JnL29zZ2kvc2VydmljZS9wcmVmcy9CYWNraW5nU3RvcmVFeGNlcHRpb247AQABcwEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAKihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1Rocm93YWJsZTspVgEACGdldENhdXNlAQAXKClMamF2YS9sYW5nL1Rocm93YWJsZTsBAAlpbml0Q2F1c2UBACwoTGphdmEvbGFuZy9UaHJvd2FibGU7KUxqYXZhL2xhbmcvVGhyb3dhYmxlOwEAClNvdXJjZUZpbGUBABpCYWNraW5nU3RvcmVFeGNlcHRpb24uamF2YQwADgAPDAAMAA0BAB9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uDAAOACQBACxvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbgEAE2phdmEvbGFuZy9FeGNlcHRpb24BAAMoKVYAIQAFAAYAAAACABgABwAIAAEACQAAAAIACgASAAwADQAAAAQAAQAOAA8AAQAQAAAARwACAAIAAAALKiu3AAEqAbUAArEAAAACABEAAAAOAAMAAAAoAAUAKQAKACoAEgAAABYAAgAAAAsAEwAUAAAAAAALABUAFgABAAEADgAXAAEAEAAAAFEAAgADAAAACyortwABKiy1AAKxAAAAAgARAAAADgADAAAANQAFADYACgA3ABIAAAAgAAMAAAALABMAFAAAAAAACwAVABYAAQAAAAsADAANAAIAAQAYABkAAQAQAAAALwABAAEAAAAFKrQAArAAAAACABEAAAAGAAEAAABCABIAAAAMAAEAAAAFABMAFAAAAAEAGgAbAAEAEAAAADwAAgACAAAACLsAA1m3AAS/AAAAAgARAAAABgABAAAAUAASAAAAFgACAAAACAATABQAAAAAAAgADAANAAEAAQAcAAAAAgAdUEsDBAoAAAAAAGtS7jQqazVtPwUAAD8FAAAoAAAAb3JnL29zZ2kvc2VydmljZS9wcmVmcy9QcmVmZXJlbmNlcy5jbGFzc8r+ur4AAAAuADkHADYHADcBAANwdXQBACcoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVYBAANnZXQBADgoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOwEABnJlbW92ZQEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABWNsZWFyAQADKClWAQAKRXhjZXB0aW9ucwcAOAEABnB1dEludAEAFihMamF2YS9sYW5nL1N0cmluZztJKVYBAAZnZXRJbnQBABYoTGphdmEvbGFuZy9TdHJpbmc7SSlJAQAHcHV0TG9uZwEAFihMamF2YS9sYW5nL1N0cmluZztKKVYBAAdnZXRMb25nAQAWKExqYXZhL2xhbmcvU3RyaW5nO0opSgEACnB1dEJvb2xlYW4BABYoTGphdmEvbGFuZy9TdHJpbmc7WilWAQAKZ2V0Qm9vbGVhbgEAFihMamF2YS9sYW5nL1N0cmluZztaKVoBAAhwdXRGbG9hdAEAFihMamF2YS9sYW5nL1N0cmluZztGKVYBAAhnZXRGbG9hdAEAFihMamF2YS9sYW5nL1N0cmluZztGKUYBAAlwdXREb3VibGUBABYoTGphdmEvbGFuZy9TdHJpbmc7RClWAQAJZ2V0RG91YmxlAQAWKExqYXZhL2xhbmcvU3RyaW5nO0QpRAEADHB1dEJ5dGVBcnJheQEAFyhMamF2YS9sYW5nL1N0cmluZztbQilWAQAMZ2V0Qnl0ZUFycmF5AQAYKExqYXZhL2xhbmcvU3RyaW5nO1tCKVtCAQAEa2V5cwEAFSgpW0xqYXZhL2xhbmcvU3RyaW5nOwEADWNoaWxkcmVuTmFtZXMBAAZwYXJlbnQBACYoKUxvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzOwEABG5vZGUBADgoTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzOwEACm5vZGVFeGlzdHMBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAApyZW1vdmVOb2RlAQAEbmFtZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAMYWJzb2x1dGVQYXRoAQAFZmx1c2gBAARzeW5jAQAKU291cmNlRmlsZQEAEFByZWZlcmVuY2VzLmphdmEBACJvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzAQAQamF2YS9sYW5nL09iamVjdAEALG9yZy9vc2dpL3NlcnZpY2UvcHJlZnMvQmFja2luZ1N0b3JlRXhjZXB0aW9uBgEAAQACAAAAAAAaBAEAAwAEAAAEAQAFAAYAAAQBAAcACAAABAEACQAKAAEACwAAAAQAAQAMBAEADQAOAAAEAQAPABAAAAQBABEAEgAABAEAEwAUAAAEAQAVABYAAAQBABcAGAAABAEAGQAaAAAEAQAbABwAAAQBAB0AHgAABAEAHwAgAAAEAQAhACIAAAQBACMAJAAABAEAJQAmAAEACwAAAAQAAQAMBAEAJwAmAAEACwAAAAQAAQAMBAEAKAApAAAEAQAqACsAAAQBACwALQABAAsAAAAEAAEADAQBAC4ACgABAAsAAAAEAAEADAQBAC8AMAAABAEAMQAwAAAEAQAyAAoAAQALAAAABAABAAwEAQAzAAoAAQALAAAABAABAAwAAQA0AAAAAgA1UEsDBAoAAAAAAGtS7jSkcD/4VwEAAFcBAAAvAAAAb3JnL29zZ2kvc2VydmljZS9wcmVmcy9QcmVmZXJlbmNlc1NlcnZpY2UuY2xhc3PK/rq+AAAALgANBwALBwAMAQAUZ2V0U3lzdGVtUHJlZmVyZW5jZXMBACYoKUxvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzOwEAEmdldFVzZXJQcmVmZXJlbmNlcwEAOChMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL3NlcnZpY2UvcHJlZnMvUHJlZmVyZW5jZXM7AQAIZ2V0VXNlcnMBABUoKVtMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQAXUHJlZmVyZW5jZXNTZXJ2aWNlLmphdmEBAClvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzU2VydmljZQEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAMEAQADAAQAAAQBAAUABgAABAEABwAIAAAAAQAJAAAAAgAKUEsDBAoAAAAAAGtS7jSErhq3DAAAAAwAAAAiAAAAb3JnL29zZ2kvc2VydmljZS9wcmVmcy9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAHgAAAG9yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1BLAwQKAAAAAABrUu40RYek7noEAAB6BAAANwAAAG9yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1Byb3Zpc2lvbmluZ1NlcnZpY2UuY2xhc3PK/rq+AAAALgAzBwAlBwAmAQARUFJPVklTSU9OSU5HX1NQSUQBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAnAQAWUFJPVklTSU9OSU5HX1JFRkVSRU5DRQgAKAEAGVBST1ZJU0lPTklOR19BR0VOVF9DT05GSUcIACkBABlQUk9WSVNJT05JTkdfVVBEQVRFX0NPVU5UCAAqAQAZUFJPVklTSU9OSU5HX1NUQVJUX0JVTkRMRQgAKwEAFVBST1ZJU0lPTklOR19ST09UWDUwOQgALAEAF1BST1ZJU0lPTklOR19SU0hfU0VDUkVUCAAtAQALTUlNRV9TVFJJTkcIAC4BAA9NSU1FX0JZVEVfQVJSQVkIAC8BAAtNSU1FX0JVTkRMRQgAMAEAD01JTUVfQlVORExFX1VSTAgAMQEADmdldEluZm9ybWF0aW9uAQAYKClMamF2YS91dGlsL0RpY3Rpb25hcnk7AQAOc2V0SW5mb3JtYXRpb24BABkoTGphdmEvdXRpbC9EaWN0aW9uYXJ5OylWAQAOYWRkSW5mb3JtYXRpb24BACEoTGphdmEvdXRpbC96aXAvWmlwSW5wdXRTdHJlYW07KVYBAApFeGNlcHRpb25zBwAyAQAKU291cmNlRmlsZQEAGFByb3Zpc2lvbmluZ1NlcnZpY2UuamF2YQEAMW9yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1Byb3Zpc2lvbmluZ1NlcnZpY2UBABBqYXZhL2xhbmcvT2JqZWN0AQARcHJvdmlzaW9uaW5nLnNwaWQBABZwcm92aXNpb25pbmcucmVmZXJlbmNlAQAZcHJvdmlzaW9uaW5nLmFnZW50LmNvbmZpZwEAGXByb3Zpc2lvbmluZy51cGRhdGUuY291bnQBABlwcm92aXNpb25pbmcuc3RhcnQuYnVuZGxlAQAVcHJvdmlzaW9uaW5nLnJvb3R4NTA5AQAXcHJvdmlzaW9uaW5nLnJzaC5zZWNyZXQBABh0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgBABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0BABlhcHBsaWNhdGlvbi94LW9zZ2ktYnVuZGxlAQAWdGV4dC94LW9zZ2ktYnVuZGxlLXVybAEAE2phdmEvaW8vSU9FeGNlcHRpb24GAQABAAIAAAALABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAZAA0ABAABAAUAAAACAA4AGQAPAAQAAQAFAAAAAgAQABkAEQAEAAEABQAAAAIAEgAZABMABAABAAUAAAACABQAGQAVAAQAAQAFAAAAAgAWABkAFwAEAAEABQAAAAIAGAAZABkABAABAAUAAAACABoABAQBABsAHAAABAEAHQAeAAAEAQAfAB4AAAQBAB8AIAABACEAAAAEAAEAIgABACMAAAACACRQSwMECgAAAAAAa1LuNISuGrcMAAAADAAAACkAAABvcmcvb3NnaS9zZXJ2aWNlL3Byb3Zpc2lvbmluZy9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAFgAAAG9yZy9vc2dpL3NlcnZpY2UvdXBucC9QSwMECgAAAAAAa1LuNHAaSrTqAQAA6gEAACYAAABvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEFjdGlvbi5jbGFzc8r+ur4AAAAuABQHABEHABIBAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBABVnZXRSZXR1cm5Bcmd1bWVudE5hbWUBABVnZXRJbnB1dEFyZ3VtZW50TmFtZXMBABUoKVtMamF2YS9sYW5nL1N0cmluZzsBABZnZXRPdXRwdXRBcmd1bWVudE5hbWVzAQAQZ2V0U3RhdGVWYXJpYWJsZQEAPShMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU3RhdGVWYXJpYWJsZTsBAAZpbnZva2UBAC4oTGphdmEvdXRpbC9EaWN0aW9uYXJ5OylMamF2YS91dGlsL0RpY3Rpb25hcnk7AQAKRXhjZXB0aW9ucwcAEwEAClNvdXJjZUZpbGUBAA9VUG5QQWN0aW9uLmphdmEBACBvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEFjdGlvbgEAEGphdmEvbGFuZy9PYmplY3QBABNqYXZhL2xhbmcvRXhjZXB0aW9uBgEAAQACAAAAAAAGBAEAAwAEAAAEAQAFAAQAAAQBAAYABwAABAEACAAHAAAEAQAJAAoAAAQBAAsADAABAA0AAAAEAAEADgABAA8AAAACABBQSwMECgAAAAAAa1LuNHt1Ne9FBgAARQYAACYAAABvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUERldmljZS5jbGFzc8r+ur4AAAAuAE0HADsHADwBAA1NQVRDSF9HRU5FUklDAQABSQEADUNvbnN0YW50VmFsdWUDAAAAAQEACk1BVENIX1RZUEUDAAAAAwEAGE1BVENIX01BTlVGQUNUVVJFUl9NT0RFTAMAAAAHAQAhTUFUQ0hfTUFOVUZBQ1RVUkVSX01PREVMX1JFVklTSU9OAwAAAA8BAChNQVRDSF9NQU5VRkFDVFVSRVJfTU9ERUxfUkVWSVNJT05fU0VSSUFMAwAAAB8BAA9ERVZJQ0VfQ0FURUdPUlkBABJMamF2YS9sYW5nL1N0cmluZzsIAD0BAAtVUE5QX0VYUE9SVAgAPgEAA1VETggAPwEAAklEAQAEVFlQRQgAQAEADE1BTlVGQUNUVVJFUggAQQEACk1PREVMX05BTUUIAEIBAA1GUklFTkRMWV9OQU1FCABDAQAQTUFOVUZBQ1RVUkVSX1VSTAgARAEAEU1PREVMX0RFU0NSSVBUSU9OCABFAQAMTU9ERUxfTlVNQkVSCABGAQAJTU9ERUxfVVJMCABHAQANU0VSSUFMX05VTUJFUggASAEAA1VQQwgASQEAEFBSRVNFTlRBVElPTl9VUkwIAEoBAApQQVJFTlRfVUROCABLAQAMQ0hJTERSRU5fVUROCABMAQAKZ2V0U2VydmljZQEANyhMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU2VydmljZTsBAAtnZXRTZXJ2aWNlcwEAJigpW0xvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUFNlcnZpY2U7AQAIZ2V0SWNvbnMBADUoTGphdmEvbGFuZy9TdHJpbmc7KVtMb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBJY29uOwEAD2dldERlc2NyaXB0aW9ucwEAKihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvdXRpbC9EaWN0aW9uYXJ5OwEAClNvdXJjZUZpbGUBAA9VUG5QRGV2aWNlLmphdmEBACBvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUERldmljZQEAEGphdmEvbGFuZy9PYmplY3QBAARVUG5QAQALVVBuUC5leHBvcnQBAA9VUG5QLmRldmljZS5VRE4BABBVUG5QLmRldmljZS50eXBlAQAYVVBuUC5kZXZpY2UubWFudWZhY3R1cmVyAQAVVVBuUC5kZXZpY2UubW9kZWxOYW1lAQAYVVBuUC5kZXZpY2UuZnJpZW5kbHlOYW1lAQAbVVBuUC5kZXZpY2UubWFudWZhY3R1cmVyVVJMAQAcVVBuUC5kZXZpY2UubW9kZWxEZXNjcmlwdGlvbgEAF1VQblAuZGV2aWNlLm1vZGVsTnVtYmVyAQAUVVBuUC5kZXZpY2UubW9kZWxVUkwBABhVUG5QLmRldmljZS5zZXJpYWxOdW1iZXIBAA9VUG5QLmRldmljZS5VUEMBABRVUG5QLnByZXNlbnRhdGlvblVSTAEAFVVQblAuZGV2aWNlLnBhcmVudFVETgEAF1VQblAuZGV2aWNlLmNoaWxkcmVuVUROBgEAAQACAAAAFgAZAAMABAABAAUAAAACAAYAGQAHAAQAAQAFAAAAAgAIABkACQAEAAEABQAAAAIACgAZAAsABAABAAUAAAACAAwAGQANAAQAAQAFAAAAAgAOABkADwAQAAEABQAAAAIAEQAZABIAEAABAAUAAAACABMAGQAUABAAAQAFAAAAAgAVABkAFgAQAAEABQAAAAIAFQAZABcAEAABAAUAAAACABgAGQAZABAAAQAFAAAAAgAaABkAGwAQAAEABQAAAAIAHAAZAB0AEAABAAUAAAACAB4AGQAfABAAAQAFAAAAAgAgABkAIQAQAAEABQAAAAIAIgAZACMAEAABAAUAAAACACQAGQAlABAAAQAFAAAAAgAmABkAJwAQAAEABQAAAAIAKAAZACkAEAABAAUAAAACACoAGQArABAAAQAFAAAAAgAsABkALQAQAAEABQAAAAIALgAZAC8AEAABAAUAAAACADAABAQBADEAMgAABAEAMwA0AAAEAQA1ADYAAAQBADcAOAAAAAEAOQAAAAIAOlBLAwQKAAAAAABrUu40QTXGXTcBAAA3AQAALQAAAG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRXZlbnRMaXN0ZW5lci5jbGFzc8r+ur4AAAAuAA4HAAsHAAwBAAtVUE5QX0ZJTFRFUgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEADUNvbnN0YW50VmFsdWUIAA0BAA9ub3RpZnlVUG5QRXZlbnQBAD0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9EaWN0aW9uYXJ5OylWAQAKU291cmNlRmlsZQEAFlVQblBFdmVudExpc3RlbmVyLmphdmEBACdvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEV2ZW50TGlzdGVuZXIBABBqYXZhL2xhbmcvT2JqZWN0AQALdXBucC5maWx0ZXIGAQABAAIAAAABABkAAwAEAAEABQAAAAIABgABBAEABwAIAAAAAQAJAAAAAgAKUEsDBAoAAAAAAGtS7jQhQ9D4LAMAACwDAAApAAAAb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFeGNlcHRpb24uY2xhc3PK/rq+AAAALgAoCgAEACMJAAMAJAcAJQcAJgEAEHNlcmlhbFZlcnNpb25VSUQBAAFKAQANQ29uc3RhbnRWYWx1ZQX8XSRGfue3NgEADklOVkFMSURfQUNUSU9OAQABSQMAAAGRAQAMSU5WQUxJRF9BUkdTAwAAAZIBABdJTlZBTElEX1NFUVVFTkNFX05VTUJFUgMAAAGTAQAQSU5WQUxJRF9WQVJJQUJMRQMAAAGUAQAVREVWSUNFX0lOVEVSTkFMX0VSUk9SAwAAAfUBAAllcnJvckNvZGUBAAY8aW5pdD4BABYoSUxqYXZhL2xhbmcvU3RyaW5nOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACVMb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFeGNlcHRpb247AQAJZXJyb3JkZXNjAQASTGphdmEvbGFuZy9TdHJpbmc7AQARZ2V0VVBuUEVycm9yX0NvZGUBAAMoKUkBAApTb3VyY2VGaWxlAQASVVBuUEV4Y2VwdGlvbi5qYXZhDAAWACcMABUACwEAI29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRXhjZXB0aW9uAQATamF2YS9sYW5nL0V4Y2VwdGlvbgEAFShMamF2YS9sYW5nL1N0cmluZzspVgAhAAMABAAAAAcAGAAFAAYAAQAHAAAAAgAIABkACgALAAEABwAAAAIADAAZAA0ACwABAAcAAAACAA4AGQAPAAsAAQAHAAAAAgAQABkAEQALAAEABwAAAAIAEgAZABMACwABAAcAAAACABQAEgAVAAsAAAACAAEAFgAXAAEAGAAAAFEAAgADAAAACyostwABKhu1AAKxAAAAAgAZAAAADgADAAAARgAFAEcACgBIABoAAAAgAAMAAAALABsAHAAAAAAACwAVAAsAAQAAAAsAHQAeAAIAAQAfACAAAQAYAAAALwABAAEAAAAFKrQAAqwAAAACABkAAAAGAAEAAABRABoAAAAMAAEAAAAFABsAHAAAAAEAIQAAAAIAIlBLAwQKAAAAAABrUu40YogfqlkBAABZAQAAJAAAAG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QSWNvbi5jbGFzc8r+ur4AAAAuABMHABAHABEBAAtnZXRNaW1lVHlwZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAIZ2V0V2lkdGgBAAMoKUkBAAlnZXRIZWlnaHQBAAdnZXRTaXplAQAIZ2V0RGVwdGgBAA5nZXRJbnB1dFN0cmVhbQEAFygpTGphdmEvaW8vSW5wdXRTdHJlYW07AQAKRXhjZXB0aW9ucwcAEgEAClNvdXJjZUZpbGUBAA1VUG5QSWNvbi5qYXZhAQAeb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBJY29uAQAQamF2YS9sYW5nL09iamVjdAEAE2phdmEvaW8vSU9FeGNlcHRpb24GAQABAAIAAAAAAAYEAQADAAQAAAQBAAUABgAABAEABwAGAAAEAQAIAAYAAAQBAAkABgAABAEACgALAAEADAAAAAQAAQANAAEADgAAAAIAD1BLAwQKAAAAAABrUu40qOAxSfMAAADzAAAAMgAAAG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QTG9jYWxTdGF0ZVZhcmlhYmxlLmNsYXNzyv66vgAAAC4ACwcACAcACQcACgEAD2dldEN1cnJlbnRWYWx1ZQEAFCgpTGphdmEvbGFuZy9PYmplY3Q7AQAKU291cmNlRmlsZQEAG1VQblBMb2NhbFN0YXRlVmFyaWFibGUuamF2YQEALG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QTG9jYWxTdGF0ZVZhcmlhYmxlAQAQamF2YS9sYW5nL09iamVjdAEAJ29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU3RhdGVWYXJpYWJsZQYBAAEAAgABAAMAAAABBAEABAAFAAAAAQAGAAAAAgAHUEsDBAoAAAAAAGtS7jQ2sUZ2eAIAAHgCAAAnAAAAb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTZXJ2aWNlLmNsYXNzyv66vgAAAC4AGwcAFwcAGAEABFRZUEUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAZAQACSUQIABoBAAVnZXRJZAEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAHZ2V0VHlwZQEACmdldFZlcnNpb24BAAlnZXRBY3Rpb24BADYoTGphdmEvbGFuZy9TdHJpbmc7KUxvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUEFjdGlvbjsBAApnZXRBY3Rpb25zAQAlKClbTG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QQWN0aW9uOwEAEWdldFN0YXRlVmFyaWFibGVzAQAsKClbTG9yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QU3RhdGVWYXJpYWJsZTsBABBnZXRTdGF0ZVZhcmlhYmxlAQA9KExqYXZhL2xhbmcvU3RyaW5nOylMb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTdGF0ZVZhcmlhYmxlOwEAClNvdXJjZUZpbGUBABBVUG5QU2VydmljZS5qYXZhAQAhb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTZXJ2aWNlAQAQamF2YS9sYW5nL09iamVjdAEAEVVQblAuc2VydmljZS50eXBlAQAPVVBuUC5zZXJ2aWNlLmlkBgEAAQACAAAAAgAZAAMABAABAAUAAAACAAYAGQAHAAQAAQAFAAAAAgAIAAcEAQAJAAoAAAQBAAsACgAABAEADAAKAAAEAQANAA4AAAQBAA8AEAAABAEAEQASAAAEAQATABQAAAABABUAAAACABZQSwMECgAAAAAAa1LuNOPnB7ewBQAAsAUAAC0AAABvcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUFN0YXRlVmFyaWFibGUuY2xhc3PK/rq+AAAALgBgBwBGBwBHAQAIVFlQRV9VSTEBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCABIAQAIVFlQRV9VSTIIAEkBAAhUWVBFX1VJNAgASgEAB1RZUEVfSTEIAEsBAAdUWVBFX0kyCABMAQAHVFlQRV9JNAgATQEACFRZUEVfSU5UCABOAQAHVFlQRV9SNAgATwEAB1RZUEVfUjgIAFABAAtUWVBFX05VTUJFUggAUQEAD1RZUEVfRklYRURfMTRfNAgAUgEAClRZUEVfRkxPQVQIAFMBAAlUWVBFX0NIQVIIAFQBAAtUWVBFX1NUUklORwgAVQEACVRZUEVfREFURQgAVgEADVRZUEVfREFURVRJTUUIAFcBABBUWVBFX0RBVEVUSU1FX1RaCABYAQAJVFlQRV9USU1FCABZAQAMVFlQRV9USU1FX1RaCABaAQAMVFlQRV9CT09MRUFOCABbAQAPVFlQRV9CSU5fQkFTRTY0CABcAQAMVFlQRV9CSU5fSEVYCABdAQAIVFlQRV9VUkkIAF4BAAlUWVBFX1VVSUQIAF8BAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAA9nZXRKYXZhRGF0YVR5cGUBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAPZ2V0VVBuUERhdGFUeXBlAQAPZ2V0RGVmYXVsdFZhbHVlAQAUKClMamF2YS9sYW5nL09iamVjdDsBABBnZXRBbGxvd2VkVmFsdWVzAQAVKClbTGphdmEvbGFuZy9TdHJpbmc7AQAKZ2V0TWluaW11bQEAFCgpTGphdmEvbGFuZy9OdW1iZXI7AQAKZ2V0TWF4aW11bQEAB2dldFN0ZXABAAtzZW5kc0V2ZW50cwEAAygpWgEAClNvdXJjZUZpbGUBABZVUG5QU3RhdGVWYXJpYWJsZS5qYXZhAQAnb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTdGF0ZVZhcmlhYmxlAQAQamF2YS9sYW5nL09iamVjdAEAA3VpMQEAA3VpMgEAA3VpNAEAAmkxAQACaTIBAAJpNAEAA2ludAEAAnI0AQACcjgBAAZudW1iZXIBAApmaXhlZC4xNC40AQAFZmxvYXQBAARjaGFyAQAGc3RyaW5nAQAEZGF0ZQEACGRhdGVUaW1lAQALZGF0ZVRpbWUudHoBAAR0aW1lAQAHdGltZS50egEAB2Jvb2xlYW4BAApiaW4uYmFzZTY0AQAHYmluLmhleAEAA3VyaQEABHV1aWQGAQABAAIAAAAYABkAAwAEAAEABQAAAAIABgAZAAcABAABAAUAAAACAAgAGQAJAAQAAQAFAAAAAgAKABkACwAEAAEABQAAAAIADAAZAA0ABAABAAUAAAACAA4AGQAPAAQAAQAFAAAAAgAQABkAEQAEAAEABQAAAAIAEgAZABMABAABAAUAAAACABQAGQAVAAQAAQAFAAAAAgAWABkAFwAEAAEABQAAAAIAGAAZABkABAABAAUAAAACABoAGQAbAAQAAQAFAAAAAgAcABkAHQAEAAEABQAAAAIAHgAZAB8ABAABAAUAAAACACAAGQAhAAQAAQAFAAAAAgAiABkAIwAEAAEABQAAAAIAJAAZACUABAABAAUAAAACACYAGQAnAAQAAQAFAAAAAgAoABkAKQAEAAEABQAAAAIAKgAZACsABAABAAUAAAACACwAGQAtAAQAAQAFAAAAAgAuABkALwAEAAEABQAAAAIAMAAZADEABAABAAUAAAACADIAGQAzAAQAAQAFAAAAAgA0AAkEAQA1ADYAAAQBADcAOAAABAEAOQA2AAAEAQA6ADsAAAQBADwAPQAABAEAPgA/AAAEAQBAAD8AAAQBAEEAPwAABAEAQgBDAAAAAQBEAAAAAgBFUEsDBAoAAAAAAGtS7jSErhq3DAAAAAwAAAAhAAAAb3JnL29zZ2kvc2VydmljZS91cG5wL3BhY2thZ2VpbmZvdmVyc2lvbiAxLjEKUEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAbAAAAb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUEsDBAoAAAAAAGtS7jR3EX1kBAEAAAQBAAAuAAAAb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vQXV0aG9yaXphdGlvbi5jbGFzc8r+ur4AAAAuAA0HAAsHAAwBAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAdoYXNSb2xlAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAIZ2V0Um9sZXMBABUoKVtMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQASQXV0aG9yaXphdGlvbi5qYXZhAQAob3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vQXV0aG9yaXphdGlvbgEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAMEAQADAAQAAAQBAAUABgAABAEABwAIAAAAAQAJAAAAAgAKUEsDBAoAAAAAAGtS7jTfOboZZAEAAGQBAAAmAAAAb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vR3JvdXAuY2xhc3PK/rq+AAAALgAQBwANBwAOBwAPAQAJYWRkTWVtYmVyAQAkKExvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Sb2xlOylaAQARYWRkUmVxdWlyZWRNZW1iZXIBAAxyZW1vdmVNZW1iZXIBAApnZXRNZW1iZXJzAQAkKClbTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGU7AQASZ2V0UmVxdWlyZWRNZW1iZXJzAQAKU291cmNlRmlsZQEACkdyb3VwLmphdmEBACBvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Hcm91cAEAEGphdmEvbGFuZy9PYmplY3QBAB9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyBgEAAQACAAEAAwAAAAUEAQAEAAUAAAQBAAYABQAABAEABwAFAAAEAQAIAAkAAAQBAAoACQAAAAEACwAAAAIADFBLAwQKAAAAAABrUu40oxIuIZUBAACVAQAAJQAAAG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGUuY2xhc3PK/rq+AAAALgAZBwAWBwAXAQALVVNFUl9BTllPTkUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAAYAQAEUk9MRQEAAUkDAAAAAAEABFVTRVIDAAAAAQEABUdST1VQAwAAAAIBAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAdnZXRUeXBlAQADKClJAQANZ2V0UHJvcGVydGllcwEAGCgpTGphdmEvdXRpbC9EaWN0aW9uYXJ5OwEAClNvdXJjZUZpbGUBAAlSb2xlLmphdmEBAB9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Sb2xlAQAQamF2YS9sYW5nL09iamVjdAEAC3VzZXIuYW55b25lBgEAAQACAAAABAAZAAMABAABAAUAAAACAAYAGQAHAAgAAQAFAAAAAgAJABkACgAIAAEABQAAAAIACwAZAAwACAABAAUAAAACAA0AAwQBAA4ADwAABAEAEAARAAAEAQASABMAAAABABQAAAACABVQSwMECgAAAAAAa1LuNDpB1zkRAQAAEQEAACUAAABvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyLmNsYXNzyv66vgAAAC4ADQcACgcACwcADAEADmdldENyZWRlbnRpYWxzAQAYKClMamF2YS91dGlsL0RpY3Rpb25hcnk7AQANaGFzQ3JlZGVudGlhbAEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL09iamVjdDspWgEAClNvdXJjZUZpbGUBAAlVc2VyLmphdmEBAB9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyAQAQamF2YS9sYW5nL09iamVjdAEAH29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGUGAQABAAIAAQADAAAAAgQBAAQABQAABAEABgAHAAAAAQAIAAAAAgAJUEsDBAoAAAAAAGtS7jQo3x12nAIAAJwCAAAqAAAAb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluLmNsYXNzyv66vgAAAC4AFgcAEwcAFAEACmNyZWF0ZVJvbGUBADYoTGphdmEvbGFuZy9TdHJpbmc7SSlMb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUm9sZTsBAApyZW1vdmVSb2xlAQAVKExqYXZhL2xhbmcvU3RyaW5nOylaAQAHZ2V0Um9sZQEANShMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGU7AQAIZ2V0Um9sZXMBADYoTGphdmEvbGFuZy9TdHJpbmc7KVtMb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUm9sZTsBAApFeGNlcHRpb25zBwAVAQAHZ2V0VXNlcgEARyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXI7AQAQZ2V0QXV0aG9yaXphdGlvbgEATShMb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlcjspTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL0F1dGhvcml6YXRpb247AQAKU291cmNlRmlsZQEADlVzZXJBZG1pbi5qYXZhAQAkb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluAQAQamF2YS9sYW5nL09iamVjdAEAKW9yZy9vc2dpL2ZyYW1ld29yay9JbnZhbGlkU3ludGF4RXhjZXB0aW9uBgEAAQACAAAAAAAGBAEAAwAEAAAEAQAFAAYAAAQBAAcACAAABAEACQAKAAEACwAAAAQAAQAMBAEADQAOAAAEAQAPABAAAAABABEAAAACABJQSwMECgAAAAAAa1LuNJru+6cYBAAAGAQAAC8AAABvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5FdmVudC5jbGFzc8r+ur4AAAAuACoKAAYAIwkABQAkCQAFACUJAAUAJgcAJwcAKAEAA3JlZgEAJUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBAAR0eXBlAQABSQEABHJvbGUBACFMb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUm9sZTsBAAxST0xFX0NSRUFURUQBAA1Db25zdGFudFZhbHVlAwAAAAEBAAxST0xFX0NIQU5HRUQDAAAAAgEADFJPTEVfUkVNT1ZFRAMAAAAEAQAGPGluaXQ+AQBKKExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTtJTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGU7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAK0xvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5FdmVudDsBABNnZXRTZXJ2aWNlUmVmZXJlbmNlAQAnKClMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAHZ2V0VHlwZQEAAygpSQEAB2dldFJvbGUBACMoKUxvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Sb2xlOwEAClNvdXJjZUZpbGUBABNVc2VyQWRtaW5FdmVudC5qYXZhDAAUACkMAAcACAwACQAKDAALAAwBAClvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5FdmVudAEAEGphdmEvbGFuZy9PYmplY3QBAAMoKVYAIQAFAAYAAAAGAAIABwAIAAAAAgAJAAoAAAACAAsADAAAABkADQAKAAEADgAAAAIADwAZABAACgABAA4AAAACABEAGQASAAoAAQAOAAAAAgATAAQAAQAUABUAAQAWAAAAbAACAAQAAAAUKrcAASortQACKhy1AAMqLbUABLEAAAACABcAAAAWAAUAAABMAAQATQAJAE4ADgBPABMAUAAYAAAAKgAEAAAAFAAZABoAAAAAABQABwAIAAEAAAAUAAkACgACAAAAFAALAAwAAwABABsAHAABABYAAAAvAAEAAQAAAAUqtAACsAAAAAIAFwAAAAYAAQAAAFkAGAAAAAwAAQAAAAUAGQAaAAAAAQAdAB4AAQAWAAAALwABAAEAAAAFKrQAA6wAAAACABcAAAAGAAEAAABmABgAAAAMAAEAAAAFABkAGgAAAAEAHwAgAAEAFgAAAC8AAQABAAAABSq0AASwAAAAAgAXAAAABgABAAAAbwAYAAAADAABAAAABQAZABoAAAABACEAAAACACJQSwMECgAAAAAAa1LuNNlgcrvVAAAA1QAAADIAAABvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5MaXN0ZW5lci5jbGFzc8r+ur4AAAAuAAkHAAcHAAgBAAtyb2xlQ2hhbmdlZAEALihMb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluRXZlbnQ7KVYBAApTb3VyY2VGaWxlAQAWVXNlckFkbWluTGlzdGVuZXIuamF2YQEALG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pbkxpc3RlbmVyAQAQamF2YS9sYW5nL09iamVjdAYBAAEAAgAAAAAAAQQBAAMABAAAAAEABQAAAAIABlBLAwQKAAAAAABrUu40IpPghJkVAACZFQAANAAAAG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb24uY2xhc3PK/rq+AAAALgDBCgAYAIAKABgAgQoAKwCCCQAYAIMJABgAhAoAGACFCgAYAIYIAIcKAIgAiQcAiggAiwoACgCCCACMCgCIAI0KABgAjgoAGACPCgAYAJAKABgAkQcAkgoAEwCTCACUCgATAJUKABMAlgcAlwoAKwCYCACZCgATAJoIAJsIAJwHAJ0KAB4AkwoAiACeCgAYAJ8KAKAAoQoAogCjCQAYAKQKAKUApgoApwCGCACoCgCIAKkIAKoIAKsHAKwBABBzZXJpYWxWZXJzaW9uVUlEAQABSgEADUNvbnN0YW50VmFsdWUF75/l/11iyzMBAAVBRE1JTgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEAD0NIQU5HRV9QUk9QRVJUWQEAFkFDVElPTl9DSEFOR0VfUFJPUEVSVFkBAAFJAwAAAAEBABFDSEFOR0VfQ1JFREVOVElBTAEAGEFDVElPTl9DSEFOR0VfQ1JFREVOVElBTAMAAAACAQAOR0VUX0NSRURFTlRJQUwBABVBQ1RJT05fR0VUX0NSRURFTlRJQUwDAAAABAEACkFDVElPTl9BTEwDAAAABwEAC0FDVElPTl9OT05FAwAAAAABAAdhY3Rpb25zAQALYWN0aW9uX21hc2sBAAtkZXNjcmlwdGlvbgEABjxpbml0PgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAwTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb247AQAEbmFtZQEAFihMamF2YS9sYW5nL1N0cmluZztJKVYBAARtYXNrAQAEaW5pdAEABChJKVYBAAdnZXRNYXNrAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJAQABYwEAAUMBAAhtYXRjaGxlbgEACXNlZW5jb21tYQEAAVoBAAFhAQACW0MBAAFpAQAMbWF0Y2hfY2hhbmdlAQAGKFtDSSlaAQAJbWF0Y2hfZ2V0AQAObWF0Y2hfcHJvcGVydHkBABBtYXRjaF9jcmVkZW50aWFsAQAHaW1wbGllcwEAHShMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOylaAQAGdGFyZ2V0AQABcAEAGkxqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb247AQAKZ2V0QWN0aW9ucwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQACc2IBABhMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAVjb21tYQEAF25ld1Blcm1pc3Npb25Db2xsZWN0aW9uAQAmKClMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uQ29sbGVjdGlvbjsBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoBAAN1YXABAANvYmoBABJMamF2YS9sYW5nL09iamVjdDsBAAhoYXNoQ29kZQEAAygpSQEAC3dyaXRlT2JqZWN0AQAfKExqYXZhL2lvL09iamVjdE91dHB1dFN0cmVhbTspVgEAAXMBABxMamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW07AQAKRXhjZXB0aW9ucwcArQEACnJlYWRPYmplY3QBAB4oTGphdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW07KVYBAANvaXMBABtMamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbTsHAK4BAAh0b1N0cmluZwEAClNvdXJjZUZpbGUBABhVc2VyQWRtaW5QZXJtaXNzaW9uLmphdmEMAFAAUQwARABMDABEAK8MAEEAMgwAQgA1DABOAE8MALAAZQEABWFkbWluBwCxDABrAGwBACJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uAQAzQWN0aW9ucyBzcGVjaWZpZWQgZm9yIG5vLWFjdGlvbiBVc2VyQWRtaW5QZXJtaXNzaW9uAQAVSW52YWxpZCBhY3Rpb24gc3RyaW5nDACyALMMAFwAWwwAXgBbDABaAFsMAF0AWwEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIMAEQAtAEAFGludmFsaWQgcGVybWlzc2lvbjogDAC1ALYMAH0AZQEALm9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb24MAF8AYAEAEGNoYW5nZUNyZWRlbnRpYWwMALUAtwEADmNoYW5nZVByb3BlcnR5AQANZ2V0Q3JlZGVudGlhbAEAOG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb25Db2xsZWN0aW9uDABwAHEMAGQAZQcAuAwAuQC0BwC6DAC7ALQMAEMAMgcAvAwAvQC+BwC/AQACICIMAMAAcQEAAyIg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ACAAAwAPAEsAZgBnAAEANwAjAEEAMgACAAAAXwBJAEoAAAABAH4AAAACAH9QSwMECgAAAAAAa1LuNKEeEUt+CgAAfgoAAD4AAABvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzc8r+ur4AAAAuAH4KACAASAcASQoAAgBICQAfAEoJAB8ASwcATAcATQcATgoACABICABPCgAIAFAKAAgAUQoACABSCgAHAFMKAB8AVAcAVQgAVgoAEABTCgAGAFcKAAIAWAoABgBZCgAGAFoKAAIAWwgAXAoAXQBeCgBdAF8IAGAKAF0AYQoAXQBiCgACAGMHAGQHAGUBABBzZXJpYWxWZXJzaW9uVUlEAQABSgEADUNvbnN0YW50VmFsdWUFm8XngTi7YXsBAAtwZXJtaXNzaW9ucwEAFUxqYXZhL3V0aWwvSGFzaHRhYmxlOwEAC2FsbF9hbGxvd2VkAQABWgEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQA6TG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb25Db2xsZWN0aW9uOwEAA2FkZAEAHShMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOylWAQAHb2xkTWFzawEAAUkBAAduZXdNYXNrAQAKcGVybWlzc2lvbgEAGkxqYXZhL3NlY3VyaXR5L1Blcm1pc3Npb247AQADdWFwAQAwTG9yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1VzZXJBZG1pblBlcm1pc3Npb247AQAEbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACGV4aXN0aW5nAQAHaW1wbGllcwEAHShMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOylaAQABeAEAB2Rlc2lyZWQBAAllZmZlY3RpdmUBAARsYXN0AQAGb2Zmc2V0AQAIZWxlbWVudHMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247AQAKU291cmNlRmlsZQEAGFVzZXJBZG1pblBlcm1pc3Npb24uamF2YQwAKgArAQATamF2YS91dGlsL0hhc2h0YWJsZQwAJgAnDAAoACkBAC5vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIBABRJbnZhbGlkIHBlcm1pc3Npb246IAwAZgBnDABmAGgMAGkAagwAKgBrDABsAG0BABtqYXZhL2xhbmcvU2VjdXJpdHlFeGNlcHRpb24BAD5BdHRlbXB0IHRvIGFkZCBhIFBlcm1pc3Npb24gdG8gYSByZWFkb25seSBQZXJtaXNzaW9uQ29sbGVjdGlvbgwAbgBqDABvAHAMAHEAcgwAKgBzDAB0AHUBAAEqBwB2DAB3AHgMAHkAcgEAAS4MAHoAewwAfAB9DABEAEUBADhvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbgEAImphdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb24BAAZhcHBlbmQBACwoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOwEALChMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAFShMamF2YS9sYW5nL1N0cmluZzspVgEACmlzUmVhZE9ubHkBAAMoKVoBAAdnZXROYW1lAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAdnZXRNYXNrAQADKClJAQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpVgEAA3B1dAEAOChMamF2YS9sYW5nL09iamVjdDtMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAQamF2YS9sYW5nL1N0cmluZwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEABmxlbmd0aAEAC2xhc3RJbmRleE9mAQAWKExqYXZhL2xhbmcvU3RyaW5nO0kpSQEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsAMAAfACAAAAADABgAIQAiAAEAIwAAAAIAJAACACYAJwAAAAIAKAApAAAABAABACoAKwABACwAAABLAAMAAQAAABUqtwABKrsAAlm3AAO1AAQqA7UABbEAAAACAC0AAAASAAQAAAIDAAQCBAAPAgUAFAIGAC4AAAAMAAEAAAAVAC8AMAAAAAEAMQAyAAEALAAAAUIABwAHAAAAnCvBAAaaAB67AAdZuwAIWbcACRIKtgALK7YADLYADbcADr8qtgAPmQANuwAQWRIRtwASvyvAAAZNLLYAE04qtAAELbYAFMAABjoEGQTGADAZBLYAFTYFLLYAFTYGFQUVBp8AGSq0AAQtuwAGWS0VBRUGgLcAFrYAF1enAA0qtAAELSu2ABdXKrQABZoAES0SGLYAGZkACCoEtQAFsQAAAAIALQAAAEYAEQAAAhQABwIVACICFwApAhgAMwIbADgCHAA9Ah0ASgIfAE8CIABWAiEAXAIiAGMCIwB8AigAhgIqAI0CKwCWAiwAmwIuAC4AAABIAAcAVgAjADMANAAFAFwAHQA1ADQABgAAAJwALwAwAAAAAACcADYANwABADgAZAA4ADkAAgA9AF8AOgA7AAMASgBSADwAOQAEAAEAPQA+AAEALAAAAckABQAJAAAA3SvBAAaaAAUDrCvAAAZNLLYAFTYEAzYFKrQABZkALhUEmQApKrQABBIYtgAUwAAGTi3GABgVBS22ABWANgUVBRUEfhUEoAAFBKwstgATOgYqtAAEGQa2ABTAAAZOLcYAGBUFLbYAFYA2BRUFFQR+FQSgAAUErBkGtgAaBGQ2CBkGEhsVCLYAHFk2BwKfAFC7AAhZtwAJGQYDFQcEYLYAHbYACxIYtgALtgANOgYqtAAEGQa2ABTAAAZOLcYAGBUFLbYAFYA2BRUFFQR+FQSgAAUErBUHBGQ2CKf/pgOsAAAAAgAtAAAAbgAbAAACOgAHAjsACQI9AA4CPwAUAkAAFwJDACMCRAAwAkUANAJGAD0CRwBHAkgASQJPAE8CUABcAlEAYAJTAGkCVABzAlUAdQJaAH4CWwCOAlwArAJdALkCXgC9Al8AxgJgANACYQDSAmQA2wJoAC4AAABmAAoAMAAZAD8AOQADAAAA3QAvADAAAAAAAN0ANgA3AAEADgDPADgAOQACAFwAgQA/ADkAAwAUAMkAQAA0AAQAFwDGAEEANAAFAE8AjgA6ADsABgCKAFMAQgA0AAcAfgBfAEMANAAIAAEARABFAAEALAAAADIAAQABAAAACCq0AAS2AB6wAAAAAgAtAAAABgABAAACcgAuAAAADAABAAAACAAvADAAAAABAEYAAAACAEdQSwMECgAAAAAAa1LuNISuGrcMAAAADAAAACYAAABvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9wYWNrYWdlaW5mb3ZlcnNpb24gMS4xClBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAGwAAAG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1BLAwQKAAAAAABrUu40Z2rUZXIDAAByAwAALgAAAG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0Jhc2ljRW52ZWxvcGUuY2xhc3PK/rq+AAAALgAjCgAGABsJAAUAHAkABQAdCQAFAB4HAB8HACAHACEBAAV2YWx1ZQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEADmlkZW50aWZpY2F0aW9uAQAFc2NvcGUBABJMamF2YS9sYW5nL1N0cmluZzsBAAY8aW5pdD4BADkoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAKkxvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9CYXNpY0VudmVsb3BlOwEACGdldFZhbHVlAQAUKClMamF2YS9sYW5nL09iamVjdDsBABFnZXRJZGVudGlmaWNhdGlvbgEACGdldFNjb3BlAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAApTb3VyY2VGaWxlAQASQmFzaWNFbnZlbG9wZS5qYXZhDAANACIMAAgACQwACgAJDAALAAwBAChvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9CYXNpY0VudmVsb3BlAQAQamF2YS9sYW5nL09iamVjdAEAI29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0VudmVsb3BlAQADKClWACEABQAGAAEABwADAAAACAAJAAAAAAAKAAkAAAAAAAsADAAAAAQAAQANAA4AAQAPAAAAbAACAAQAAAAUKrcAASortQACKiy1AAMqLbUABLEAAAACABAAAAAWAAUAAAAoAAQAKQAJACoADgArABMALAARAAAAKgAEAAAAFAASABMAAAAAABQACAAJAAEAAAAUAAoACQACAAAAFAALAAwAAwABABQAFQABAA8AAAAvAAEAAQAAAAUqtAACsAAAAAIAEAAAAAYAAQAAADIAEQAAAAwAAQAAAAUAEgATAAAAAQAWABUAAQAPAAAALwABAAEAAAAFKrQAA7AAAAACABAAAAAGAAEAAAA5ABEAAAAMAAEAAAAFABIAEwAAAAEAFwAYAAEADwAAAC8AAQABAAAABSq0AASwAAAAAgAQAAAABgABAAAAQAARAAAADAABAAAABQASABMAAAABABkAAAACABpQSwMECgAAAAAAa1LuNLKDR0QMAQAADAEAACkAAABvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Db25zdW1lci5jbGFzc8r+ur4AAAAuAAsHAAkHAAoBAAd1cGRhdGVkAQA2KExvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAScHJvZHVjZXJzQ29ubmVjdGVkAQAlKFtMb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZTspVgEAClNvdXJjZUZpbGUBAA1Db25zdW1lci5qYXZhAQAjb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQ29uc3VtZXIBABBqYXZhL2xhbmcvT2JqZWN0BgEAAQACAAAAAAACBAEAAwAEAAAEAQAFAAYAAAABAAcAAAACAAhQSwMECgAAAAAAa1LuNOkmEkHsAAAA7AAAACkAAABvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9FbnZlbG9wZS5jbGFzc8r+ur4AAAAuAAwHAAoHAAsBAAhnZXRWYWx1ZQEAFCgpTGphdmEvbGFuZy9PYmplY3Q7AQARZ2V0SWRlbnRpZmljYXRpb24BAAhnZXRTY29wZQEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAKU291cmNlRmlsZQEADUVudmVsb3BlLmphdmEBACNvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9FbnZlbG9wZQEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAMEAQADAAQAAAQBAAUABAAABAEABgAHAAAAAQAIAAAAAgAJUEsDBAoAAAAAAGtS7jTqm6qYCgEAAAoBAAApAAAAb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vUHJvZHVjZXIuY2xhc3PK/rq+AAAALgALBwAJBwAKAQAGcG9sbGVkAQA1KExvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlOylMamF2YS9sYW5nL09iamVjdDsBABJjb25zdW1lcnNDb25uZWN0ZWQBACUoW0xvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlOylWAQAKU291cmNlRmlsZQEADVByb2R1Y2VyLmphdmEBACNvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Qcm9kdWNlcgEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAIEAQADAAQAAAQBAAUABgAAAAEABwAAAAIACFBLAwQKAAAAAABrUu40WEuPtL0BAAC9AQAAJQAAAG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmUuY2xhc3PK/rq+AAAALgAXBwAVBwAWAQAHaXNWYWxpZAEAAygpWgEAC2lzQ29ubmVjdGVkAQAKZ2V0Rmxhdm9ycwEAFCgpW0xqYXZhL2xhbmcvQ2xhc3M7AQAGdXBkYXRlAQAVKExqYXZhL2xhbmcvT2JqZWN0OylWAQAEcG9sbAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7AQAMZ2V0TGFzdFZhbHVlAQANZ2V0UHJvcGVydGllcwEAGCgpTGphdmEvdXRpbC9EaWN0aW9uYXJ5OwEACGdldFNjb3BlAQAVKClbTGphdmEvbGFuZy9TdHJpbmc7AQAIaGFzU2NvcGUBABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAApTb3VyY2VGaWxlAQAJV2lyZS5qYXZhAQAfb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZQEAEGphdmEvbGFuZy9PYmplY3QGAQABAAIAAAAAAAkEAQADAAQAAAQBAAUABAAABAEABgAHAAAEAQAIAAkAAAQBAAoACwAABAEADAALAAAEAQANAA4AAAQBAA8AEAAABAEAEQASAAAAAQATAAAAAgAUUEsDBAoAAAAAAGtS7jTEkmMnEwIAABMCAAAqAAAAb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluLmNsYXNzyv66vgAAAC4AEgcADwcAEAEACmNyZWF0ZVdpcmUBAF0oTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvdXRpbC9EaWN0aW9uYXJ5OylMb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZTsBAApkZWxldGVXaXJlAQAkKExvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlOylWAQAKdXBkYXRlV2lyZQEAOihMb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZTtMamF2YS91dGlsL0RpY3Rpb25hcnk7KVYBAAhnZXRXaXJlcwEANihMamF2YS9sYW5nL1N0cmluZzspW0xvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlOwEACkV4Y2VwdGlvbnMHABEBAApTb3VyY2VGaWxlAQAOV2lyZUFkbWluLmphdmEBACRvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW4BABBqYXZhL2xhbmcvT2JqZWN0AQApb3JnL29zZ2kvZnJhbWV3b3JrL0ludmFsaWRTeW50YXhFeGNlcHRpb24GAQABAAIAAAAAAAQEAQADAAQAAAQBAAUABgAABAEABwAIAAAEAQAJAAoAAQALAAAABAABAAwAAQANAAAAAgAOUEsDBAoAAAAAAGtS7jTdmq4rtAUAALQFAAAvAAAAb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluRXZlbnQuY2xhc3PK/rq+AAAALgA7CgAHADMJAAYANAkABgA1CQAGADYJAAYANwcAOAcAOQEACXJlZmVyZW5jZQEAJUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBAAR3aXJlAQAhTG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmU7AQAEdHlwZQEAAUkBAAl0aHJvd2FibGUBABVMamF2YS9sYW5nL1Rocm93YWJsZTsBABJQUk9EVUNFUl9FWENFUFRJT04BAA1Db25zdGFudFZhbHVlAwAAAAEBABJDT05TVU1FUl9FWENFUFRJT04DAAAAAgEADFdJUkVfQ1JFQVRFRAMAAAAEAQAMV0lSRV9VUERBVEVEAwAAAAgBAAxXSVJFX0RFTEVURUQDAAAAEAEADldJUkVfQ09OTkVDVEVEAwAAACABABFXSVJFX0RJU0NPTk5FQ1RFRAMAAABAAQAKV0lSRV9UUkFDRQMAAACAAQAGPGluaXQ+AQBfKExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTtJTG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmU7TGphdmEvbGFuZy9UaHJvd2FibGU7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAK0xvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW5FdmVudDsBAAlleGNlcHRpb24BABNnZXRTZXJ2aWNlUmVmZXJlbmNlAQAnKClMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAHZ2V0V2lyZQEAIygpTG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmU7AQAHZ2V0VHlwZQEAAygpSQEADGdldFRocm93YWJsZQEAFygpTGphdmEvbGFuZy9UaHJvd2FibGU7AQAKU291cmNlRmlsZQEAE1dpcmVBZG1pbkV2ZW50LmphdmEMACEAOgwACAAJDAAKAAsMAAwADQwADgAPAQApb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluRXZlbnQBABBqYXZhL2xhbmcvT2JqZWN0AQADKClWACEABgAHAAAADAACAAgACQAAAAIACgALAAAAAgAMAA0AAAACAA4ADwAAABkAEAANAAEAEQAAAAIAEgAZABMADQABABEAAAACABQAGQAVAA0AAQARAAAAAgAWABkAFwANAAEAEQAAAAIAGAAZABkADQABABEAAAACABoAGQAbAA0AAQARAAAAAgAcABkAHQANAAEAEQAAAAIAHgAZAB8ADQABABEAAAACACAABQABACEAIgABACMAAACAAAIABQAAABoqtwABKiu1AAIqLbUAAyoctQAEKhkEtQAFsQAAAAIAJAAAABoABgAAANEABADSAAkA0wAOANQAEwDVABkA1gAlAAAANAAFAAAAGgAmACcAAAAAABoACAAJAAEAAAAaAAwADQACAAAAGgAKAAsAAwAAABoAKAAPAAQAAQApACoAAQAjAAAALwABAAEAAAAFKrQAArAAAAACACQAAAAGAAEAAADgACUAAAAMAAEAAAAFACYAJwAAAAEAKwAsAAEAIwAAAC8AAQABAAAABSq0AAOwAAAAAgAkAAAABgABAAAA6wAlAAAADAABAAAABQAmACcAAAABAC0ALgABACMAAAAvAAEAAQAAAAUqtAAErAAAAAIAJAAAAAYAAQAAAQAAJQAAAAwAAQAAAAUAJgAnAAAAAQAvADAAAQAjAAAALwABAAEAAAAFKrQABbAAAAACACQAAAAGAAEAAAEKACUAAAAMAAEAAAAFACYAJwAAAAEAMQAAAAIAMlBLAwQKAAAAAABrUu40VUZzF9gAAADYAAAAMgAAAG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVBZG1pbkxpc3RlbmVyLmNsYXNzyv66vgAAAC4ACQcABwcACAEADndpcmVBZG1pbkV2ZW50AQAuKExvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW5FdmVudDspVgEAClNvdXJjZUZpbGUBABZXaXJlQWRtaW5MaXN0ZW5lci5qYXZhAQAsb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluTGlzdGVuZXIBABBqYXZhL2xhbmcvT2JqZWN0BgEAAQACAAAAAAABBAEAAwAEAAAAAQAFAAAAAgAGUEsDBAoAAAAAAGtS7jQXSgTI8gUAAPIFAAAuAAAAb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUNvbnN0YW50cy5jbGFzc8r+ur4AAAAuAEgHADIIADMJAAQANAcANQcANgEADVdJUkVBRE1JTl9QSUQBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlCAA3AQAcV0lSRUFETUlOX1BST0RVQ0VSX0NPTVBPU0lURQgAOAEAHFdJUkVBRE1JTl9DT05TVU1FUl9DT01QT1NJVEUIADkBABhXSVJFQURNSU5fUFJPRFVDRVJfU0NPUEUIADoBABhXSVJFQURNSU5fQ09OU1VNRVJfU0NPUEUIADsBABNXSVJFQURNSU5fU0NPUEVfQUxMAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEAFldJUkVBRE1JTl9QUk9EVUNFUl9QSUQIADwBABZXSVJFQURNSU5fQ09OU1VNRVJfUElECAA9AQAQV0lSRUFETUlOX0ZJTFRFUggAPgEAEVdJUkVWQUxVRV9DVVJSRU5UCAA/AQASV0lSRVZBTFVFX1BSRVZJT1VTCABAAQAYV0lSRVZBTFVFX0RFTFRBX0FCU09MVVRFCABBAQAYV0lSRVZBTFVFX0RFTFRBX1JFTEFUSVZFCABCAQARV0lSRVZBTFVFX0VMQVBTRUQIAEMBABpXSVJFQURNSU5fUFJPRFVDRVJfRklMVEVSUwgARAEAGldJUkVBRE1JTl9DT05TVU1FUl9GTEFWT1JTCABFAQAaV0lSRUFETUlOX1BST0RVQ0VSX0ZMQVZPUlMIAEYBABBXSVJFQURNSU5fRVZFTlRTCABHAQAIPGNsaW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAKU291cmNlRmlsZQEAEldpcmVDb25zdGFudHMuamF2YQEAEGphdmEvbGFuZy9TdHJpbmcBAAEqDAASABMBAChvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQ29uc3RhbnRzAQAQamF2YS9sYW5nL09iamVjdAEADXdpcmVhZG1pbi5waWQBABx3aXJlYWRtaW4ucHJvZHVjZXIuY29tcG9zaXRlAQAcd2lyZWFkbWluLmNvbnN1bWVyLmNvbXBvc2l0ZQEAGHdpcmVhZG1pbi5wcm9kdWNlci5zY29wZQEAGHdpcmVhZG1pbi5jb25zdW1lci5zY29wZQEAFndpcmVhZG1pbi5wcm9kdWNlci5waWQBABZ3aXJlYWRtaW4uY29uc3VtZXIucGlkAQAQd2lyZWFkbWluLmZpbHRlcgEAEXdpcmV2YWx1ZS5jdXJyZW50AQASd2lyZXZhbHVlLnByZXZpb3VzAQAYd2lyZXZhbHVlLmRlbHRhLmFic29sdXRlAQAYd2lyZXZhbHVlLmRlbHRhLnJlbGF0aXZlAQARd2lyZXZhbHVlLmVsYXBzZWQBABp3aXJlYWRtaW4ucHJvZHVjZXIuZmlsdGVycwEAGndpcmVhZG1pbi5jb25zdW1lci5mbGF2b3JzAQAad2lyZWFkbWluLnByb2R1Y2VyLmZsYXZvcnMBABB3aXJlYWRtaW4uZXZlbnRzBgEABAAFAAAAEgAZAAYABwABAAgAAAACAAkAGQAKAAcAAQAIAAAAAgALABkADAAHAAEACAAAAAIADQAZAA4ABwABAAgAAAACAA8AGQAQAAcAAQAIAAAAAgARABkAEgATAAAAGQAUAAcAAQAIAAAAAgAVABkAFgAHAAEACAAAAAIAFwAZABgABwABAAgAAAACABkAGQAaAAcAAQAIAAAAAgAbABkAHAAHAAEACAAAAAIAHQAZAB4ABwABAAgAAAACAB8AGQAgAAcAAQAIAAAAAgAhABkAIgAHAAEACAAAAAIAIwAZACQABwABAAgAAAACACUAGQAmAAcAAQAIAAAAAgAnABkAKAAHAAEACAAAAAIAKQAZACoABwABAAgAAAACACsAAQAIACwALQABAC4AAAAlAAQAAAAAAA0EvQABWQMSAlOzAAOxAAAAAQAvAAAABgABAAAAWwABADAAAAACADFQSwMECgAAAAAAa1LuNB2fKlnOEAAAzhAAAC8AAABvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlUGVybWlzc2lvbi5jbGFzc8r+ur4AAAAuAKIKABAAawoAEABsCgAiAG0JABAAbgkAEABvCgAQAHAHAHEIAHIKAAcAbQoAcwB0BwB1CgALAHYIAHcKAAsAeAoACwB5BwB6CgAiAHsIAHwKAAsAfQgAfgcAfwoAFQB2CgAQAIAKAHMAgQoAcwCCCgAQAIMKAIQAhQoAhgCACACHCACICACJCgCKAIsKAIwAjQcAjgEAEHNlcmlhbFZlcnNpb25VSUQBAAFKAQANQ29uc3RhbnRWYWx1ZQWygq3kZaRxFwEAB1BST0RVQ0UBABJMamF2YS9sYW5nL1N0cmluZzsBAAdDT05TVU1FAQAOQUNUSU9OX1BST0RVQ0UBAAFJAwAAAAEBAA5BQ1RJT05fQ09OU1VNRQMAAAACAQAKQUNUSU9OX0FMTAMAAAADAQALQUNUSU9OX05PTkUDAAAAAAEAC2FjdGlvbl9tYXNrAQAHYWN0aW9ucwEABjxpbml0PgEAJyhMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQArTG9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVQZXJtaXNzaW9uOwEABG5hbWUBABYoTGphdmEvbGFuZy9TdHJpbmc7SSlWAQAEbWFzawEABGluaXQBAAQoSSlWAQAHZ2V0TWFzawEAFShMamF2YS9sYW5nL1N0cmluZzspSQEAAWMBAAFDAQAIbWF0Y2hsZW4BAAlzZWVuY29tbWEBAAFaAQABYQEAAltDAQABaQEAB2ltcGxpZXMBAB0oTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbjspWgEABnRhcmdldAEAAXABABpMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOwEACmdldEFjdGlvbnMBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAAnNiAQAYTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAFY29tbWEBABduZXdQZXJtaXNzaW9uQ29sbGVjdGlvbgEAJigpTGphdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb247AQAGZXF1YWxzAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaAQADb2JqAQASTGphdmEvbGFuZy9PYmplY3Q7AQAIaGFzaENvZGUBAAMoKUkBAAh0b1N0cmluZwEAC3dyaXRlT2JqZWN0AQAfKExqYXZhL2lvL09iamVjdE91dHB1dFN0cmVhbTspVgEAAXMBABxMamF2YS9pby9PYmplY3RPdXRwdXRTdHJlYW07AQAKRXhjZXB0aW9ucwcAjwEACnJlYWRPYmplY3QBAB4oTGphdmEvaW8vT2JqZWN0SW5wdXRTdHJlYW07KVYBABtMamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbTsHAJABAApTb3VyY2VGaWxlAQATV2lyZVBlcm1pc3Npb24uamF2YQwAQgBDDAA2AD4MADYAkQwANAAsDAA1ACkMAEAAQQEAImphdmEvbGFuZy9JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24BABVpbnZhbGlkIGFjdGlvbiBzdHJpbmcHAJIMAJMAlAEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIMADYAlQEAFGludmFsaWQgcGVybWlzc2lvbjogDACWAJcMAF4AUgEAKW9yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVQZXJtaXNzaW9uDABMAE0BAAdwcm9kdWNlDACWAJgBAAdjb25zdW1lAQAzb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb25Db2xsZWN0aW9uDACZAFIMAFgAWQwAXABdDABRAFIHAJoMAJsAnAcAnQEAAiAiAQADIiAiAQACIikHAJ4MAJ8AlQcAoAwAoQCVAQAdamF2YS9zZWN1cml0eS9CYXNpY1Blcm1pc3Npb24BABNqYXZhL2lvL0lPRXhjZXB0aW9uAQAgamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb24BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBABBqYXZhL2xhbmcvU3RyaW5nAQALdG9DaGFyQXJyYXkBAAQoKVtDAQADKClWAQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBABsoQylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAdnZXROYW1lAQAQamF2YS9sYW5nL09iamVjdAEACGdldENsYXNzAQATKClMamF2YS9sYW5nL0NsYXNzOwEAD2phdmEvbGFuZy9DbGFzcwEAGmphdmEvaW8vT2JqZWN0T3V0cHV0U3RyZWFtAQASZGVmYXVsdFdyaXRlT2JqZWN0AQAZamF2YS9pby9PYmplY3RJbnB1dFN0cmVhbQEAEWRlZmF1bHRSZWFkT2JqZWN0ADEAEAAiAAAACQAYACMAJAABACUAAAACACYAGQAoACkAAQAlAAAAAgASABkAKgApAAEAJQAAAAIAFAAaACsALAABACUAAAACAC0AGgAuACwAAQAlAAAAAgAvABoAMAAsAAEAJQAAAAIAMQAaADIALAABACUAAAACADMAggA0ACwAAAACADUAKQAAAA0AAQA2ADcAAQA4AAAATAADAAMAAAAKKissuAABtwACsQAAAAIAOQAAAAoAAgAAAEoACQBLADoAAAAgAAMAAAAKADsAPAAAAAAACgA9ACkAAQAAAAoANQApAAIAAAA2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b3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb247AQAEbmFtZQEAEkxqYXZhL2xhbmcvU3RyaW5nOwEACGV4aXN0aW5nAQAHaW1wbGllcwEAHShMamF2YS9zZWN1cml0eS9QZXJtaXNzaW9uOylaAQABeAEAB2Rlc2lyZWQBAAllZmZlY3RpdmUBAARsYXN0AQAGb2Zmc2V0AQAIZWxlbWVudHMBABkoKUxqYXZhL3V0aWwvRW51bWVyYXRpb247AQAKU291cmNlRmlsZQEAE1dpcmVQZXJtaXNzaW9uLmphdmEMACoAKwEAE2phdmEvdXRpbC9IYXNodGFibGUMACYAJwwAKAApAQApb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZVBlcm1pc3Npb24BACJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgEAFGludmFsaWQgcGVybWlzc2lvbjogDABmAGcMAGYAaAwAaQBqDAAqAGsMAGwAbQEAG2phdmEvbGFuZy9TZWN1cml0eUV4Y2VwdGlvbgEAPmF0dGVtcHQgdG8gYWRkIGEgUGVybWlzc2lvbiB0byBhIHJlYWRvbmx5IFBlcm1pc3Npb25Db2xsZWN0aW9uDABuAGoMAG8AcAwAcQByDAAqAHMMAHQAdQEAASoHAHYMAHcAeAwAeQByAQABLgwAegB7DAB8AH0MAEQARQEAM29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL1dpcmVQZXJtaXNzaW9uQ29sbGVjdGlvbgEAImphdmEvc2VjdXJpdHkvUGVybWlzc2lvbkNvbGxlY3Rpb24BAAZhcHBlbmQBACwoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOwEALChMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAFShMamF2YS9sYW5nL1N0cmluZzspVgEACmlzUmVhZE9ubHkBAAMoKVoBAAdnZXROYW1lAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2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aS91dGlsL21lYXN1cmVtZW50L1VuaXQ7SilWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACdMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudDsBACUoRERMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OylWAQAkKERMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OylWAQAEKEQpVgEACGdldFZhbHVlAQADKClEAQAIZ2V0RXJyb3IBAAdnZXRVbml0AQAiKClMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OwEAB2dldFRpbWUBAAMoKUoBAANtdWwBAFAoTG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7KUxvcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L01lYXN1cmVtZW50OwEAAW0BAAZtdmFsdWUBAEooRExvcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1VuaXQ7KUxvcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L01lYXN1cmVtZW50OwEAAWQBAAF1AQAqKEQpTG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7AQADZGl2AQADYWRkAQADc3ViAQAIdG9TdHJpbmcBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEAAnNiAQAYTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAJY29tcGFyZVRvAQAVKExqYXZhL2xhbmcvT2JqZWN0OylJAQADb2JqAQASTGphdmEvbGFuZy9PYmplY3Q7AQAEdGhhdAEACGhhc2hDb2RlAQADKClJAQAEYml0cwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAClNvdXJjZUZpbGUBABBNZWFzdXJlbWVudC5qYXZhDAArAHoMACIAIwcAewwAfAB9DAAkACMHAH4MAH8AKAwAJwAoDAAlACYMACsALAEAJW9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQMADwAgAwARACADABFAIAMAEYAgAwAKQAqAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgwAgQCCAQAFICsvLSAMAIEAgwwARwBIBwCEDACFAFEBAAEgDABTAFQBAB1qYXZhL2xhbmcvQXJpdGhtZXRpY0V4Y2VwdGlvbgEAD0Nhbm5vdCBjb21wYXJlIAwAgQCGAQAFIGFuZCAMACsAhwcAiAwAiQCKDABQAFEBABBqYXZhL2xhbmcvT2JqZWN0AQAUamF2YS9sYW5nL0NvbXBhcmFibGUBAAMoKVYBAA5qYXZhL2xhbmcvTWF0aAEAA2FicwEABChEKUQBAB5vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1VuaXQBAAV1bml0eQEAQihMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OylMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OwEABmFwcGVuZAEAGyhEKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOwEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAQamF2YS9sYW5nL1N0cmluZwEABmxlbmd0aAEALChMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAQamF2YS9sYW5nL0RvdWJsZQEAEGRvdWJsZVRvTG9uZ0JpdHMBAAQoRClKACEACQAgAAEAIQAFABAAIgAjAAAAEAAkACMAAAAQACUAJgAAABAAJwAoAAAAggApACoAAAAYAAEAKwAsAAEALQAAAI8AAwAIAAAAKSq3AAEqJ7UAAiopuAADtQAEKhkFxgAIGQWnAAayAAW1AAYqFga1AAexAAAAAgAuAAAAGgAGAAAARgAEAEcACQBIABEASQAiAEoAKABLAC8AAAA0AAUAAAApADAAMQAAAAAAKQAiACMAAQAAACkAJAAjAAMAAAApACcAKAAFAAAAKQAlACYABgABACsAMgABAC0AAABWAAgABgAAAAoqJykZBQm3AAixAAAAAgAuAAAACgACAAAAVwAJAFgALwAAACoABAAAAAoAMAAxAAAAAAAKACIAIwABAAAACgAkACMAAwAAAAoAJwAoAAUAAQArADMAAQAtAAAASwAIAAQAAAAJKicOLQm3AAixAAAAAgAuAAAACgACAAAAZAAIAGUALwAAACAAAwAAAAkAMAAxAAAAAAAJACIAIwABAAAACQAnACgAAwABACsANAABAC0AAABBAAgAAwAAAAkqJw4BCbcACLEAAAACAC4AAAAKAAIAAABuAAgAbwAvAAAAFgACAAAACQAwADEAAAAAAAkAIgAjAAEAEQA1ADYAAQAtAAAALwACAAEAAAAFKrQAAq8AAAACAC4AAAAGAAEAAAB3AC8AAAAMAAEAAAAFADAAMQAAABEANwA2AAEALQAAAC8AAgABAAAABSq0AASvAAAAAgAuAAAABgABAAAAgQAvAAAADAABAAAABQAwADEAAAARADgAOQABAC0AAAAvAAEAAQAAAAUqtAAGsAAAAAIALgAAAAYAAQAAAIwALwAAAAwAAQAAAAUAMAAxAAAAEQA6ADsAAQAtAAAALwACAAEAAAAFKrQAB60AAAACAC4AAAAGAAEAAACYAC8AAAAMAAEAAAAFADAAMQAAAAEAPAA9AAEALQAAAHoACgAEAAAAOCu0AAJJuwAJWSq0AAIoayq0AAK4AAMrtAAEayq0AAQouAADa2MqtAAGK7QABrYACiq0AAe3AAiwAAAAAgAuAAAACgACAAAAqgAFAKsALwAAACAAAwAAADgAMAAxAAAAAAA4AD4AMQABAAUAMwA/ACMAAgABADwAQAABAC0AAABhAAkABAAAACO7AAlZKrQAAidrKrQABCe4AANrKrQABi22AAoqtAAHtwAIsAAAAAIALgAAAAYAAQAAAL4ALwAAACAAAwAAACMAMAAxAAAAAAAjAEEAIwABAAAAIwBCACgAAwABADwAQwABAC0AAABTAAkAAwAAAB+7AAlZKrQAAidrKrQABCe4AANrKrQABiq0AAe3AAiwAAAAAgAuAAAABgABAAAAzQAvAAAAFgACAAAAHwAwADEAAAAAAB8AQQAjAAEAAQBEAD0AAQAtAAAAfgAKAAQAAAA8K7QAAkm7AAlZKrQAAihvKrQAArgAAyu0AARrKrQABCi4AANrYygoa28qtAAGK7QABrYACyq0AAe3AAiwAAAAAgAuAAAACgACAAAA3wAFAOAALwAAACAAAwAAADwAMAAxAAAAAAA8AD4AMQABAAUANwA/ACMAAgABAEQAQAABAC0AAABhAAkABAAAACO7AAlZKrQAAidvKrQABCe4AANvKrQA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Z2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OylMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OwEABHRoYXQBAANkaXYBAANhZGQBAANzdWIBAARmaW5kAQAjKEopTG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvVW5pdDsBAAFpAQAEc2l6ZQEABHVuaXQBAANvdXQBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAJbnVtZXJhdG9yAQAYTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQALZGVub21pbmF0b3IBAAlhZGRTSW5hbWUBAEYoSUxqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nQnVmZmVyO0xqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOylWAQACc2IBAAVwb3dlcgEAAnNpAQAJaXNTcGVjaWFsAQADKClaAQAGY2xhc3MkAQAlKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL0NsYXNzOwEAAngxAQAiTGphdmEvbGFuZy9DbGFzc05vdEZvdW5kRXhjZXB0aW9uOwEAAngwAQAIPGNsaW5pdD4BAAMoKVYBAApTb3VyY2VGaWxlAQAJVW5pdC5qYXZhBwEtDAEuANYBACBqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgEAHmphdmEvbGFuZy9Ob0NsYXNzRGVmRm91bmRFcnJvcgwBLwDKDACuATAMAK4A2wwAqACpDACqAHABAB5vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1VuaXQMANMA1AEAHWphdmEvbGFuZy9Bcml0aG1ldGljRXhjZXB0aW9uAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgEAEENhbm5vdCBtdWx0aXBseSAMATEBMgwBMQEzAQAGIHdpdGggDADJAMoMAG8AcAwAwwDEDACIAIkBAA5DYW5ub3QgZGl2aWRlIAEABCBieSAMALcAuAEAC0Nhbm5vdCBhZGQgAQAEIHRvIAEAEENhbm5vdCBzdWJ0cmFjdCABAAYgZnJvbSAMAKYApwwAqwCsAQAeb3JnLm9zZ2kudXRpbC5tZWFzdXJlbWVudC5Vbml0DADVANYMAKQApQEAE2phdmEvdXRpbC9IYXNodGFibGUMAK4BNAwBNQE2DACuAK8MATcBOAwAzgDPDAE5ALwBAAExAQABLwEAASoHAToMATsBPAEAAV4MATEBPQwAtAC1AQAADACKAIkMAIsAiQwAjACJDACNAIkMAI4AiQwAjwCJDACQAIkBAANtL3MMAJEAiQEABG0vczIMAJIAiQwAkwCJDACUAIkMAJUAiQwAlgCJDACXAIkMAHAAiQwAmACJDACZAIkMAJoAiQwAmwCJDACcAIkMAJ0AiQwAngCJDACfAIkMAKAAiQwAoQCJDACiAIkMAKMAiQEAEGphdmEvbGFuZy9PYmplY3QBAA9qYXZhL2xhbmcvQ2xhc3MBAAdmb3JOYW1lAQAKZ2V0TWVzc2FnZQEAFShMamF2YS9sYW5nL1N0cmluZzspVgEABmFwcGVuZAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAsKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAQoSSlWAQADcHV0AQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEABmxlbmd0aAEADmphdmEvbGFuZy9NYXRoAQADYWJzAQAEKEkpSQEAGyhJKUxqYXZhL2xhbmcvU3RyaW5nQnVmZmVyOwAhAA0AbgAAAC4AGgBvAHAAAAAaAHEAcAABAHIAAAACAAkAGgBzAHAAAQByAAAAAgALABoAdAB1AAEAcgAAAAIAdgAaAHcAdQABAHIAAAACAHgAGgB5AHUAAQByAAAAAgB6ABoAewB1AAEAcgAAAAIAfAAaAH0AdQABAHIAAAACAH4AGgB/AHUAAQByAAAAAgCAABoAgQB1AAEAcgAAAAIAggAaAIMAdQABAHIAAAACAIQAGgCFAHUAAQByAAAAAgCGABoAhwBwAAEAcgAAAAIAPAAZAIgAiQAAABkAigCJAAAAGQCLAIkAAAAZAIwAiQAAABkAjQCJAAAAGQCOAIkAAAAZAI8AiQAAABkAkACJAAAAGQCRAIkAAAAZAJIAiQAAABkAkwCJAAAAGQCUAIkAAAAZAJUAiQAAABkAlgCJAAAAGQCXAIkAAAAZAHAAiQAAABkAmACJAAAAGQCZAIkAAAAZAJoAiQAAABkAmwCJAAAAGQCcAIkAAAAZAJ0AiQAAABkAngCJAAAAGQCfAIkAAAAZAKAAiQAAABkAoQCJAAAAGQCiAIkAAAAZAKMAiQAAABoApAClAAAACgCmAKcAAAACAKgAqQAAAAIAqgBwAAAACACrAKwAAQCtAAAAAAAOAAIArgCvAAEAsAAAAFkAAwAEAAAADyq3AAYqK7UAByogtQAIsQAAAAIAsQAAABIABAAAASQABAElAAkBJgAOASgAsgAAACAAAwAAAA8AswCJAAAAAAAPAKgAqQABAAAADwCqAHAAAgAKALQAtQABALAAAAD0AAYACQAAAHoUAAkVCIVhFAALfwN5FAAJFQeFYRQAC38QB3mBFAAJFQaFYRQAC38QDnmBFAAJFQWFYRQAC38QFXmBFAAJFQSFYRQAC38QHHmBFAAJHYVhFAALfxAjeYEUAAkchWEUAAt/ECp5gRQACRuFYRQAC38QMXmBGoUQOHmBrQAAAAIAsQAAAAYAAQAAATAAsgAAAFwACQAAAHoAtgB1AAAAAAB6AKMAdQABAAAAegCQAHUAAgAAAHoAjwB1AAMAAAB6AI4AdQAEAAAAegCNAHUABQAAAHoAjAB1AAYAAAB6AIsAdQAHAAAAegCKAHUACAABALcAuAABALAAAABpAAQAAgAAACUqK6YABQSsK8EADZoABQOsK8AADbQACCq0AAiUmgAHBKcABAOsAAAAAgCxAAAAFgAFAAABRgAFAUcABwFJAA4BSgAQAUwAsgAAABYAAgAAACUAswCJAAAAAAAlALkAugABAAEAuwC8AAEAsAAAADgABAABAAAADiq0AAgQIH0qtAAIg4isAAAAAgCxAAAABgABAAABVQCyAAAADAABAAAADgCzAIkAAAAAAL0AvgABALAAAAB/AAQAAgAAAEMqtwAOmQAuK7cADpkAJ7sAD1m7ABBZtwAREhK2ABMqtgAUEhW2ABMrtgAUtgAWtwAXvyq0AAiyABhlK7QACGG4ABmwAAAAAgCxAAAADgADAAABZwAOAWgAMgFrALIAAAAWAAIAAABDALMAiQAAAAAAQwC/AIkAAQAAAMAAvgABALAAAACXAAQAAgAAAFMqtwAOmQA+K7cADpkANyq0AAgrtAAIlJoAB7IAGrC7AA9ZuwAQWbcAERIbtgATKrYAFBIctgATK7YAFLYAFrcAF78qtAAIK7QACGWyABhhuAAZsAAAAAIAsQAAABYABQAAAXwADgF9ABoBfgAeAYAAQgGDALIAAAAWAAIAAABTALMAiQAAAAAAUwC/AIkAAQAAAMEAvgABALAAAABqAAQAAgAAAC4qK7YAHZoAJ7sAD1m7ABBZtwAREh62ABMqtgAUEh+2ABMrtgAUtgAWtwAXvyqwAAAAAgCxAAAADgADAAABkwAIAZQALAGWALIAAAAWAAIAAAAuALMAiQAAAAAALgC/AIkAAQAAAMIAvgABALAAAABqAAQAAgAAAC4qK7YAHZoAJ7sAD1m7ABBZtwAREiC2ABMrtgAUEiG2ABMqtgAUtgAWtwAXvyqwAAAAAgCxAAAADgADAAABpgAIAacALAGqALIAAAAWAAIAAAAuALMAiQAAAAAALgC/AIkAAQAIAMMAxAABALAAAAEkAAUABgAAAIqyACLHAGGyACPHAA8SJLgAJVmzACOnAAayACNZTcKyACLHADeyACa+PrsAJ1kdBHi3ACizACIDNgQVBB2iAByyACKyACYVBDKyACYVBDK2AClXhAQBp//kLMOnAAo6BSzDGQW/uwANWQEetwAqTbIAIiy2ACvAAA1OLccADrIAIiwstgApVyxOLbAAAgAeAFoAXQAAAF0AYQBdAAAAAgCxAAAAPgAPAAABtwAGAbgAHgG5ACQBugApAbsANgG8AD8BvQBSAbwAWAHAAGQBwgBuAcMAeQHEAH0BxQCGAcYAiAHIALIAAAA0AAUAOQAfAMUAdQAEACkALwDGAHUAAwAAAIoAqgBwAAAAbgAcAMcAiQACAHkAEQDIAIkAAwABAMkAygABALAAAAIqAAUACwAAATgqtAAHxwEvKrQACAN7FAALfxQACWWIPCq0AAgQB3sUAAt/FAAJZYg9KrQACBAOexQAC38UAAlliD4qtAAIEBV7FAALfxQACWWINgQqtAAIEBx7FAALfxQACWWINgUqtAAIECN7FAALfxQACWWINgYqtAAIECp7FAALfxQACWWINgcqtAAIEDF7FAALfxQACWWINgi7ABBZtwAROgm7ABBZtwAROgoqGxIsGQkZCrcALSocEi4ZCRkKtwAtKh0SLxkJGQq3AC0qFQQSMBkJGQq3AC0qFQUSMRkJGQq3AC0qFQYSMhkJGQq3AC0qFQcSMxkJGQq3AC0qFQgSNBkJGQq3AC0ZCrYANZ4AIxkJtgA1mgALGQkSNrYAE1cZCRI3tgATVxkJGQq2ABRXKhkJtgAWtQAHKrQAB7AAAAACALEAAABqABoAAAHRAAcB0gAXAdMAKAHUADkB1QBLAdYAXQHXAG8B2ACBAdkAkwHaAJwB2wClAdwAsAHdALsB3gDGAd8A0gHgAN4B4QDqAeIA9gHjAQIB5AEKAeUBEgHmARoB6AEiAekBKgHwATMB8gCyAAAAcAALABcBHACKAHUAAQAoAQsAiwB1AAIAOQD6AIwAdQADAEsA6ACNAHUABABdANYAjgB1AAUAbwDEAI8AdQAGAIEAsgCQAHUABwCTAKAAowB1AAgAnACXAMsAzAAJAKUAjgDNAMwACgAAATgAswCJAAAAAgDOAM8AAQCwAAAAzgACAAcAAABEG5kAQhueAActpwAFGQQ6BRkFtgA1ngALGQUSOLYAE1cZBSy2ABNXG7gAOTYGFQYEpAATGQUSOrYAE1cZBRUGtgA7V7EAAAACALEAAAAqAAoAAAH3AAQB+AAQAfkAGAH6ACAB/AAnAf0ALQH+ADMB/wA7AgAAQwIDALIAAABIAAcAEAAzANAAzAAFAC0AFgDRAHUABgAAAEQAswCJAAAAAABEANIAdQABAAAARACoAKkAAgAAAEQAywDMAAMAAABEAM0AzAAEAAIA0wDUAAEAsAAAAD0ABAABAAAAEyq0AAgUADx/CZSZAAcEpwAEA6wAAAACALEAAAAGAAEAAAILALIAAAAMAAEAAAATALMAiQAAAAgA1QDWAAIAsAAAAE4AAwACAAAAEiq4AAGwTLsAA1krtgAEtwAFvwABAAAABAAFAAIAAgCxAAAABgABAAABuACyAAAAFgACAAYADADXANgAAQAAABIA2QCpAAAArQAAAAAACADaANsAAQCwAAAEBwAMAAAAAAN7AwMDAwMDAwMDuAA+swAYuwANWRI/sgAYtwAqswAauwANWRIsAwMDAwMDAwMEuAA+twAqswBAuwANWRIuAwMDAwMDAwQDuAA+twAqswBBuwANWRIvAwMDAwMDBAMDuAA+twAqswBCuwANWRIwAwMDAwMEAwMDuAA+twAqswBDuwANWRIxAwMDAwQDAwMDuAA+twAqswBEuwANWRIyAwMDBAMDAwMDuAA+twAqswBFuwANWRIzAwMEAwMDAwMDuAA+twAqswBGuwANWRJHAwMDAwMDAwIEuAA+twAqswBIuwANWRJJAwMDAwMDAxD+BLgAPrcAKrMASrsADVkSSwMDAwMDAwMDBbgAPrcAKrMATLsADVkSTQMDAwMDAwMDBrgAPrcAKrMATrsADVkSTwMDAwMDAwMCA7gAPrcAKrMAULsADVkSUQMDAwMDAwQQ/gS4AD63ACqzAFK7AA1ZElMDAwMDAwMEEP4CuAA+twAqswBUuwANWRJVAwMDAwMDBBD+BbgAPrcAKrMAVrsADVkSVwMDAwMDAwQQ/QW4AD63ACqzAFi7AA1ZElkDAwMDBAMDBAO4AD63ACqzAFq7AA1ZElsDAwMDAgMEEP0FuAA+twAqswBcuwANWRJdAwMDAwUDAgcQ/rgAPrcAKrMAXrsADVkSXwMDAwMQ/gMEEP0FuAA+twAqswBguwANWRJhAwMDAwUDAgYQ/rgAPrcAKrMAYrsADVkSYwMDAwMCAwQQ/gW4AD63ACqzAGS7AA1ZEmUDAwMDAgMEEP4DuAA+twAqswBmuwANWRJnAwMEAwMDAwMQ/rgAPrcAKrMAaLsADVkSaQMDAwMDAwMQ/gW4AD63ACqzAGq7AA1ZEmsDAwMEAwMDAgO4AD63ACqzAGy7AA1ZEjQDBAMDAwMDAwO4AD63ACqzAG0QHL0ADVkDsgBAU1kEsgBBU1kFsgBCU1kGsgBDU1kHsgBEU1kIsgBFU1kQBrIARlNZEAeyAG1TWRAIsgBIU1kQCbIASlNZEAqyAExTWRALsgBOU1kQDLIAUFNZEA2yAFJTWRAOsgBUU1kQD7IAVlNZEBCyAFhTWRARsgBaU1kQErIAXFNZEBOyAF5TWRAUsgBgU1kQFbIAYlNZEBayAGRTWRAXsgBmU1kQGLIAaFNZEBmyAGpTWRAasgBsU1kQG7IAGlOzACaxAAAAAQCxAAAAegAeAAAANAAPAEMAHgBGADYASgBOAE8AZgBUAH4AWQCWAF4ArgBjAMYAaQDeAG0A9wBxAQ8AdQEnAH0BPwCFAVgAjwFxAJkBigCjAaMArAG7ALYB1ADBAe0AywIHANUCIADfAjkA6gJSAPUCawD/AoQBCQKcAQ8CtAEXAAEA3AAAAAIA3VBLAwQKAAAAAABrUu40xP+f3wsAAAALAAAAJQAAAG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvcGFja2FnZWluZm92ZXJzaW9uIDEuMFBLAwQKAAAAAABrUu40AAAAAAAAAAAAAAAAFwAAAG9yZy9vc2dpL3V0aWwvcG9zaXRpb24vUEsDBAoAAAAAAGtS7jS2MB407wsAAO8LAAAlAAAAb3JnL29zZ2kvdXRpbC9wb3NpdGlvbi9Qb3NpdGlvbi5jbGFzc8r+ur4AAAAuAH8KACIASwkATABNCgAbAE4KAEwATwcAUAgAUQoABQBSCQAhAFMIAFQJACEAVQoAIQBWCQBMAFcIAFgJACEAWQkATABaCABbCQAhAFwIAF0KACEAXgkAIQBfCgAbAGAJACEAYQkAIQBiCgAhAGMGQAAAAAAAAAAHAGQKABsAZQoAGwBmCgAbAGcJACEAaAkAaQBqBwBrBwBsAQAIYWx0aXR1ZGUBACdMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudDsBAAlsb25naXR1ZGUBAAhsYXRpdHVkZQEABXNwZWVkAQAFdHJhY2sBAAlMT05fUkFOR0UBAAFEAQAJTEFUX1JBTkdFAQALVFJBQ0tfUkFOR0UBAAY8aW5pdD4BAMYoTG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7TG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7TG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7TG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7TG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7KVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAIUxvcmcvb3NnaS91dGlsL3Bvc2l0aW9uL1Bvc2l0aW9uOwEAA2xhdAEAA2xvbgEAA2FsdAEAC2dldEFsdGl0dWRlAQApKClMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudDsBAAxnZXRMb25naXR1ZGUBAAtnZXRMYXRpdHVkZQEACGdldFNwZWVkAQAIZ2V0VHJhY2sBAA9ub3JtYWxpemVMYXRMb24BAAMoKVYBAARkbG9uAQAEZGxhdAEACW5vcm1hbGl6ZQEABShERClEAQAFdmFsdWUBAAVyYW5nZQEACnR3aWNlUmFuZ2UBAA5ub3JtYWxpemVUcmFjawEAUChMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9NZWFzdXJlbWVudDspTG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQ7AQAIPGNsaW5pdD4BAApTb3VyY2VGaWxlAQANUG9zaXRpb24uamF2YQwALQA+BwBtDABuAG8MAHAAcQwAcgBzAQAiamF2YS9sYW5nL0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgEAEEludmFsaWQgTGF0aXR1ZGUMAC0AdAwAJgAkAQARSW52YWxpZCBMb25naXR1ZGUMACUAJAwAPQA+DAB1AG8BABBJbnZhbGlkIEFsdGl0dWRlDAAjACQMAHYAbwEADUludmFsaWQgU3BlZWQMACcAJAEADUludmFsaWQgVHJhY2sMAEYARwwAKAAkDAB3AHgMACkAKgwAKwAqDABBAEIBACVvcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L01lYXN1cmVtZW50DAB5AHgMAHoAewwALQB8DAAsACoHAH0MAH4AKgEAH29yZy9vc2dpL3V0aWwvcG9zaXRpb24vUG9zaXRpb24BABBqYXZhL2xhbmcvT2JqZWN0AQAeb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0AQADcmFkAQAgTG9yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvVW5pdDsBAAdnZXRVbml0AQAiKClMb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9Vbml0OwEABmVxdWFscwEAFShMamF2YS9sYW5nL09iamVjdDspWgEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAAW0BAANtX3MBAAhnZXRWYWx1ZQEAAygpRAEACGdldEVycm9yAQAHZ2V0VGltZQEAAygpSgEAJihERExvcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1VuaXQ7SilWAQAOamF2YS9sYW5nL01hdGgBAAJQSQAhACEAIgAAAAgAAgAjACQAAAACACUAJAAAAAIAJgAkAAAAAgAnACQAAAACACgAJAAAABoAKQAqAAAAGgArACoAAAAaACwAKgAAAAoAAQAtAC4AAQAvAAABZwADAAYAAACzKrcAASvGAB+yAAIrtgADtgAEmgANuwAFWRIGtwAHvyortQAILMYAH7IAAiy2AAO2AASaAA27AAVZEgm3AAe/Kiy1AAoqtwALLcYAH7IADC22AAO2AASaAA27AAVZEg23AAe/Ki21AA4ZBMYAIbIADxkEtgADtgAEmgANuwAFWRIQtwAHvyoZBLUAERkFxgAlsgACGQW2AAO2AASaAA27AAVZEhK3AAe/KioZBbcAE7UAFLEAAAACADAAAABeABcAAAA9AAQAPgAIAD8AFQBAAB8AQgAkAEQAKABFADUARgA/AEgARABKAEgASwBMAEwAWQBNAGMATwBoAFEAbQBSAHsAUwCFAFUAiwBXAJAAWACeAFkAqABbALIAXQAxAAAAPgAGAAAAswAyADMAAAAAALMANAAkAAEAAACzADUAJAACAAAAswA2ACQAAwAAALMAJwAkAAQAAACzACgAJAAFAAEANwA4AAEALwAAAC8AAQABAAAABSq0AA6wAAAAAgAwAAAABgABAAAAZwAxAAAADAABAAAABQAyADMAAAABADkAOAABAC8AAAAvAAEAAQAAAAUqtAAKsAAAAAIAMAAAAAYAAQAAAHIAMQAAAAwAAQAAAAUAMgAzAAAAAQA6ADgAAQAvAAAALwABAAEAAAAFKrQACLAAAAACADAAAAAGAAEAAAB9ADEAAAAMAAEAAAAFADIAMwAAAAEAOwA4AAEALwAAAC8AAQABAAAABSq0ABGwAAAAAgAwAAAABgABAAAAiAAxAAAADAABAAAABQAyADMAAAABADwAOAABAC8AAAAvAAEAAQAAAAUqtAAUsAAAAAIAMAAAAAYAAQAAAJUAMQAAAAwAAQAAAAUAMgAzAAAAAgA9AD4AAQAvAAABPAAKAAUAAADKKrQACsYACiq0AAjHAASxKrQACrYAFUgqtAAItgAVSieyABZ3l5sAHSeyABaYnAAVKbIAF3eXmwAMKbIAF5idAASxKieyABa3ABhIKimyABcUABlrtwAYSimyABeXnQAMKbIAF3eYnAAhKieyABZnsgAWtwAYSCqyABcUABlrKWeyABe3ABhKKrsAG1knKrQACrYA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AQAVTGphdmEvdXRpbC9BcnJheUxpc3Q7AQAGY2xvc2VkAQABWgEAB2luaXRpYWwBABZMamF2YS91dGlsL0xpbmtlZExpc3Q7AQAGdGhpcyQwAQAmTG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlcjsBAAlTeW50aGV0aWMBAAY8aW5pdD4BACkoTG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAHVHJhY2tlZAEADElubmVyQ2xhc3NlcwEALkxvcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXIkVHJhY2tlZDsBABJzZXRJbml0aWFsU2VydmljZXMBACkoW0xvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTspVgEAAWkBAAFJAQAKcmVmZXJlbmNlcwEAJltMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAEc2l6ZQEAFHRyYWNrSW5pdGlhbFNlcnZpY2VzAQADKClWAQAJcmVmZXJlbmNlAQAlTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEABWNsb3NlAQAOc2VydmljZUNoYW5nZWQBACQoTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlRXZlbnQ7KVYBAAVldmVudAEAIUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZUV2ZW50OwEABXRyYWNrAQAoKExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTspVgEABm9iamVjdAEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAC3RyYWNrQWRkaW5nAQAPYmVjYW1lVW50cmFja2VkAQAHdW50cmFjawEAClNvdXJjZUZpbGUBABNTZXJ2aWNlVHJhY2tlci5qYXZhDAA0AEUMADEAMgwALQAuAQATamF2YS91dGlsL0FycmF5TGlzdAwANAB9DAArACwBABRqYXZhL3V0aWwvTGlua2VkTGlzdAwALwAwDAB+AH8MAEMAgAwAgQCCAQAjb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2UMAIMAhAwAhQB/DABRAE4HAIYMAIcAiAwAiQCABwCKDACLAIwMAE0ATgwAjQCOBwCPDACQAJEMAFMATgwAkgBFDACTAJQHAJUMAJYAlwwAmACZDACaAH8MAJsAnAcAnQwAngBFDACfAJcMAJoAhAEALG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlciRUcmFja2VkAQATamF2YS91dGlsL0hhc2h0YWJsZQEAIm9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlTGlzdGVuZXIBAAQoSSlWAQADYWRkAQAVKExqYXZhL2xhbmcvT2JqZWN0OylaAQADKClJAQALcmVtb3ZlRmlyc3QBABQoKUxqYXZhL2xhbmcvT2JqZWN0OwEAA2dldAEAJihMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9PYmplY3Q7AQAIY29udGFpbnMBAB9vcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZUV2ZW50AQATZ2V0U2VydmljZVJlZmVyZW5jZQEAJygpTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEAB2dldFR5cGUBACRvcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXIBAA5saXN0ZW5lckZpbHRlcgEAEkxqYXZhL2xhbmcvU3RyaW5nOwEABmZpbHRlcgEAG0xvcmcvb3NnaS9mcmFtZXdvcmsvRmlsdGVyOwEAGW9yZy9vc2dpL2ZyYW1ld29yay9GaWx0ZXIBAAVtYXRjaAEAKChMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7KVoBAAhtb2RpZmllZAEACmN1c3RvbWl6ZXIBADBMb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyQ3VzdG9taXplcjsBAC5vcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXJDdXN0b21pemVyAQAPbW9kaWZpZWRTZXJ2aWNlAQA6KExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTtMamF2YS9sYW5nL09iamVjdDspVgEADWFkZGluZ1NlcnZpY2UBADkoTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOylMamF2YS9sYW5nL09iamVjdDsBAAZyZW1vdmUBAANwdXQBADgoTGphdmEvbGFuZy9PYmplY3Q7TGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwEAEGphdmEvbGFuZy9PYmplY3QBAAlub3RpZnlBbGwBAA5yZW1vdmVkU2VydmljZQAgACMAJAABACUABQAYACYAJwABACgAAAACACkAAgArACwAAABCAC0ALgAAAAIALwAwAAAAEgAxADIAAQAzAAAAAAAIAAQANAA1AAEANgAAAG8ABAACAAAAJyq3AAEqK7UAAioDtQADKrsABFkQBrcABbUABiq7AAdZtwAItQAJsQAAAAIANwAAABoABgAAAyQABAMjAAkDJQAOAyYAGwMnACYDKAA4AAAAFgACAAAAJwA5ADwAAAAAACcAMQAyAAEABAA9AD4AAQA2AAAAgQADAAQAAAAhK8cABLErvj0DPh0cogAUKrQACSsdMrYACleEAwGn/+2xAAAAAgA3AAAAHgAHAAADNQAEAzYABQM4AAgDOQAPAz4AGgM5ACADQAA4AAAAKgAEAAoAFgA/AEAAAwAAACEAOQA8AAAAAAAhAEEAQgABAAgAGQBDAEAAAgAEAEQARQABADYAAADiAAIABAAAAFQqWU3CKrQACbYAC5oABizDsSq0AAm2AAzAAA1MKiu2AA7GAAgsw6f/2iq0AAYrtgAPmQAILMOn/8oqtAAGK7YAEFcsw6cACE4swy2/Kiu3ABGn/68ABQAEABAARwAAABEAJgBHAAAAKQA2AEcAAAA5AEQARwAAAEcASgBHAAAAAgA3AAAALgALAAADTQAEA04ADgNSABEDWAAcA1kAJANfACkDYQA0A2oAOQNsAEIDbQBMA3IAOAAAACAAAwAcACsARgBHAAEATAAFAEYARwABAAAAVAA5ADwAAAAEAEgARQABADYAAAA0AAIAAQAAAAYqBLUAA7EAAAACADcAAAAKAAIAAAN/AAUDgAA4AAAADAABAAAABgA5ADwAAAABAEkASgABADYAAADSAAIAAwAAAGgqtAADmQAEsSu2ABJNK7YAE6oAAAAAAFYAAAABAAAABAAAAB8AAAAfAAAAVgAAAFEqtAACtAAUxgALKiy2ABWnACgqtAACtAAWLLkAFwIAmQALKiy2ABWnABAqLLYAGKcACCostgAYsQAAAAIANwAAADIADAAAA44ABwOPAAgDkQANA5cAMAOaADoDnABCA6MAUgOkAFoDqwBfA7IAYgO0AGcDuwA4AAAAIAADAAAAaAA5ADwAAAAAAGgASwBMAAEADQBbAEYARwACAAQATQBOAAEANgAAASkAAwAHAAAAbSpZTsIqK7YADk0tw6cACjoELcMZBL8sxgApKllOwiq0AAK2ABktw6cACjoFLcMZBb8qtAACtAAaKyy5ABsDALEqWU7CKrQABiu2AA+ZAAYtw7EqtAAGK7YAEFctw6cACjoGLcMZBr8qK7cAEbEABwAEAAwADwAAAA8AEwAPAAAAHgAnACoAAAAqAC4AKgAAAEQAUQBgAAAAUgBdAGAAAABgAGQAYAAAAAIANwAAAEIAEAAAA8QABAPFAAoDxgAWA8cAGgPNAB4DzgAlA88AMQPRAD8D1gBAA9gARAPZAE8D4gBSA+QAWwPlAGcD5wBsA+sAOAAAACoABAAKAAUATwBQAAIAAABtADkAPAAAAAAAbQBGAEcAAQAWAFcATwBQAAIAAgBRAE4AAQA2AAABFAADAAgAAABwAU0DPiq0AAK0ABoruQAcAgBNqAAOpwBIOgSoAAYZBL86BSpZOgbCKrQABiu2AB2ZABwsxgAaKisstgAeVyq0AAK2ABkqtgAfpwAFBD4ZBsOnAAs6BxkGwxkHv6kFHZkAESq0AAK0ABorLLkAIAMAsQAEAAQAFQAYAAAAGAAdABgAAAAnAFAAUwAAAFMAWABTAAAAAgA3AAAAQgAQAAAD+QACA/oABAP9ABIEAgAVBBcAGAQEACcEBQAyBAoANgQLAD0EDABEBA0ASwQUAE0EFgBdBBsAYQQhAG8EJwA4AAAAKgAEAAAAcAA5ADwAAAAAAHAARgBHAAEAAgBuAE8AUAACAAQAbABSAC4AAwAEAFMATgABADYAAADrAAMABQAAAE8qWU7CKrQACSu2ACGZAAYtw7EqtAAGK7YAHZkABi3DsSortgAiTSzHAAYtw7EqtAACtgAZLcOnAAo6BC3DGQS/KrQAArQAGissuQAgAwCxAAUABAARADkAAAASAB8AOQAAACAALAA5AAAALQA2ADkAAAA5AD0AOQAAAAIANwAAADIADAAABDAABAQxAA8EOwASBEEAHQRJACAETgAmBFMAKgRUAC0EVgA0BFcAQARdAE4EYgA4AAAAKgAEACYAEwBPAFAAAgAAAE8AOQA8AAAAAABPAEYARwABAEAADwBPAFAAAgACAFQAAAACAFUAOwAAAAoAAQAjAGgAOgAAUEsDBAoAAAAAAGtS7jTfhoZ4kR8AAJEfAAAqAAAAb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyLmNsYXNzyv66vgAAAC4BDQoAQgCoCQBGAKkJAEYAqgkARgCrCQBGAKwJAEYArQcArgoABwCoCACvCgAHALAIALELACQAsgoAQgCzCAC0CgAHALMJAEYAtQsAtgC3CQBGALgHALkHALoIALsKABMAvAoAFAC9CAC+CgC/ALMHAMAKABoAqAoARgDBCQBGAMIHAMMKAB4AxAcAxQoAIADECwC2AMYKAEYAxwcAyAoAIADJBwDKCgAmAL0KACAAywsAtgDMCwC2AM0KACAAzgoARgDPCwC2ANAHANEKACAA0gsAtgDTCwC2ANQIANUKAEYA1goAIADXCgBCANgKACAA2QsA2gDbCQBGANwDgAAAAAgA3QcA3goAOwDfBX//////////BwDgCgA/AOEKACAA4gcA4woARgDTCQBGAOQKAEYA5QcA5gcA5wEACkFsbFRyYWNrZWQBAAxJbm5lckNsYXNzZXMBAAdUcmFja2VkAQAFREVCVUcBAAFaAQANQ29uc3RhbnRWYWx1ZQMAAAAAAQAHY29udGV4dAEAIkxvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dDsBAAZmaWx0ZXIBABtMb3JnL29zZ2kvZnJhbWV3b3JrL0ZpbHRlcjsBAApjdXN0b21pemVyAQAwTG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI7AQAObGlzdGVuZXJGaWx0ZXIBABJMamF2YS9sYW5nL1N0cmluZzsBAAp0cmFja0NsYXNzAQAOdHJhY2tSZWZlcmVuY2UBACVMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAHdHJhY2tlZAEALkxvcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXIkVHJhY2tlZDsBAA10cmFja2luZ0NvdW50AQABSQEAD2NhY2hlZFJlZmVyZW5jZQEADWNhY2hlZFNlcnZpY2UBABJMamF2YS9sYW5nL09iamVjdDsBAAY8aW5pdD4BAHooTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGVDb250ZXh0O0xvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTtMb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyQ3VzdG9taXplcjspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAFlAQArTG9yZy9vc2dpL2ZyYW1ld29yay9JbnZhbGlkU3ludGF4RXhjZXB0aW9uOwEABHRoaXMBACZMb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyOwEACXJlZmVyZW5jZQEAZyhMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7TGphdmEvbGFuZy9TdHJpbmc7TG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI7KVYBAAVjbGF6egEAcChMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7TG9yZy9vc2dpL2ZyYW1ld29yay9GaWx0ZXI7TG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI7KVYBAARvcGVuAQADKClWAQAEKFopVgEACnJlZmVyZW5jZXMBACZbTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEAEHRyYWNrQWxsU2VydmljZXMBABRnZXRJbml0aWFsUmVmZXJlbmNlcwEATShaTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7KVtMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAMZmlsdGVyU3RyaW5nAQAKRXhjZXB0aW9ucwEABWNsb3NlAQAhTGphdmEvbGFuZy9JbGxlZ2FsU3RhdGVFeGNlcHRpb247AQABaQEACG91dGdvaW5nAQANYWRkaW5nU2VydmljZQEAOShMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7KUxqYXZhL2xhbmcvT2JqZWN0OwEAD21vZGlmaWVkU2VydmljZQEAOihMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7TGphdmEvbGFuZy9PYmplY3Q7KVYBAAdzZXJ2aWNlAQAOcmVtb3ZlZFNlcnZpY2UBAA53YWl0Rm9yU2VydmljZQEAFShKKUxqYXZhL2xhbmcvT2JqZWN0OwEAB3RpbWVvdXQBAAFKAQAGb2JqZWN0BwDoAQAUZ2V0U2VydmljZVJlZmVyZW5jZXMBACgoKVtMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2U7AQAGbGVuZ3RoAQAEa2V5cwEAF0xqYXZhL3V0aWwvRW51bWVyYXRpb247AQATZ2V0U2VydmljZVJlZmVyZW5jZQEAJygpTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOwEACHByb3BlcnR5AQAHcmFua2luZwEAAmlkAQAFbWluSWQBAAhyYW5raW5ncwEAAltJAQAFY291bnQBAAptYXhSYW5raW5nAQAFaW5kZXgBAApnZXRTZXJ2aWNlAQALZ2V0U2VydmljZXMBABUoKVtMamF2YS9sYW5nL09iamVjdDsBAAdvYmplY3RzAQATW0xqYXZhL2xhbmcvT2JqZWN0OwEAFCgpTGphdmEvbGFuZy9PYmplY3Q7AQAGcmVtb3ZlAQAoKExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTspVgEABHNpemUBAAMoKUkBABBnZXRUcmFja2luZ0NvdW50AQAIbW9kaWZpZWQBAAhmaW5hbGl6ZQcA6QEAClNvdXJjZUZpbGUBABNTZXJ2aWNlVHJhY2tlci5qYXZhDABhAG8MAFwAXQwATwBQDABYAFkMAFcAVgwAUwBUAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgEADChzZXJ2aWNlLmlkPQwA6gDrAQAKc2VydmljZS5pZAwA7ADtDADuAO8BAAEpDABVAFYHAPAMAPEA8gwAUQBSAQApb3JnL29zZ2kvZnJhbWV3b3JrL0ludmFsaWRTeW50YXhFeGNlcHRpb24BACJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uAQAjdW5leHBlY3RlZCBJbnZhbGlkU3ludGF4RXhjZXB0aW9uOiAMAPMA7wwAYQD0AQANKG9iamVjdENsYXNzPQcA9QEAHmphdmEvbGFuZy9OdWxsUG9pbnRlckV4Y2VwdGlvbgwAbgBwDABaAFsBAC9vcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXIkQWxsVHJhY2tlZAwAYQD2AQAsb3JnL29zZ2kvdXRpbC90cmFja2VyL1NlcnZpY2VUcmFja2VyJFRyYWNrZWQMAPcA+AwAdAB1AQAjb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWZlcmVuY2UMAPkA+gEAGmphdmEvbGFuZy9SdW50aW1lRXhjZXB0aW9uDAD7AG8MAPwA/QwAiAD9DAB4AG8MAIgAiQwA/gD/AQAfamF2YS9sYW5nL0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbgwBAACfDACYAH0MAQEBAgEAGXRpbWVvdXQgdmFsdWUgaXMgbmVnYXRpdmUMAJgAnQwAoAChDAEDAQQMAIsBBQcBBgwBBwCdDABeAFkBAA9zZXJ2aWNlLnJhbmtpbmcBABFqYXZhL2xhbmcvSW50ZWdlcgwBCAChAQAOamF2YS9sYW5nL0xvbmcMAQkBCgwBCwEMAQAQamF2YS9sYW5nL09iamVjdAwAXwBgDACNAI4BACRvcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXIBAC5vcmcvb3NnaS91dGlsL3RyYWNrZXIvU2VydmljZVRyYWNrZXJDdXN0b21pemVyAQAeamF2YS9sYW5nL0ludGVycnVwdGVkRXhjZXB0aW9uAQATamF2YS9sYW5nL1Rocm93YWJsZQEABmFwcGVuZAEALChMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQALZ2V0UHJvcGVydHkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEACHRvU3RyaW5nAQAUKClMamF2YS9sYW5nL1N0cmluZzsBACBvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dAEADGNyZWF0ZUZpbHRlcgEALyhMamF2YS9sYW5nL1N0cmluZzspTG9yZy9vc2dpL2ZyYW1ld29yay9GaWx0ZXI7AQAKZ2V0TWVzc2FnZQEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAEGphdmEvbGFuZy9TdHJpbmcBACkoTG9yZy9vc2dpL3V0aWwvdHJhY2tlci9TZXJ2aWNlVHJhY2tlcjspVgEAEmFkZFNlcnZpY2VMaXN0ZW5lcgEAOShMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VMaXN0ZW5lcjtMamF2YS9sYW5nL1N0cmluZzspVgEAEnNldEluaXRpYWxTZXJ2aWNlcwEAKShbTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVmZXJlbmNlOylWAQAUdHJhY2tJbml0aWFsU2VydmljZXMBABdnZXRBbGxTZXJ2aWNlUmVmZXJlbmNlcwEATChMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspW0xvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBABVyZW1vdmVTZXJ2aWNlTGlzdGVuZXIBACcoTG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlTGlzdGVuZXI7KVYBAAd1bnRyYWNrAQAMdW5nZXRTZXJ2aWNlAQAoKExvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTspWgEABHdhaXQBAAQoSilWAQAZKClMamF2YS91dGlsL0VudW1lcmF0aW9uOwEAFWphdmEvdXRpbC9FbnVtZXJhdGlvbgEAC25leHRFbGVtZW50AQAIaW50VmFsdWUBAAlsb25nVmFsdWUBAAMoKUoBAANnZXQBACYoTGphdmEvbGFuZy9PYmplY3Q7KUxqYXZhL2xhbmcvT2JqZWN0OwAhAEYAQgABAEcACwAYAEsATAABAE0AAAACAE4AFABPAFAAAAAUAFEAUgAAABAAUwBUAAAAEABVAFYAAAASAFcAVgAAABIAWABZAAAAAgBaAFsAAABCAFwAXQAAAEIAXgBZAAAAQgBfAGAAAAAVAAEAYQBiAAEAYwAAAQQABAAFAAAAfiq3AAEqArUAAiortQADKiy1AAQqAbUABSotxwAHKqcABC21AAYquwAHWbcACBIJtgAK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EQDJCgAfAMoKAB8AywgAzAoAHwDNCgAOAM4KAB8AzwoADgDQCwDRANILANEA0wcA1AoAUADVBwDWBwDXCgAiAMIKAFAA2AgA2QoAIgDaCADbCwC0ANwIAN0IAN4IAN8HAOAKACwAsggA4QoALADiCwC3AOMKACwA5AgA5QoALADmCgAsAOcKAFAA6AoAIQDpCgAhAOoKACEA6wcA7AgA7QcA7goAOwDvCADwBwDxCgBQAPIIAPMIAPQIAPUKAFAA9goAPgDpCgA+AOoKAD4A9woA+AD5CgD4APoHAPsHAPwHAP0LAP4A/wsBAAEBCgA7AQIKAAwAvgcBAwcBBAcBBQcBBgEAB2NvbnRleHQBACJMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7AQAOU0FYRkFDVE9SWU5BTUUBABJMamF2YS9sYW5nL1N0cmluZzsBAA1Db25zdGFudFZhbHVlAQAORE9NRkFDVE9SWU5BTUUBABNQQVJTRVJDTEFTU0ZJTEVQQVRICAEHAQAMU0FYQ0xBU1NGSUxFAQAMRE9NQ0xBU1NGSUxFAQAVU0FYRkFDVE9SWURFU0NSSVBUSU9OAQAVRE9NRkFDVE9SWURFU0NSSVBUSU9OAQARUEFSU0VSX1ZBTElEQVRJTkcBABVQQVJTRVJfTkFNRVNQQUNFQVdBUkUBAA5GQUNUT1JZTkFNRUtFWQEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAmTG9yZy9vc2dpL3V0aWwveG1sL1hNTFBhcnNlckFjdGl2YXRvcjsBAAVzdGFydAEAJShMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUNvbnRleHQ7KVYBAANpb2UBABVMamF2YS9pby9JT0V4Y2VwdGlvbjsBAAxwYXJzZXJCdW5kbGUBABtMb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZTsBAApFeGNlcHRpb25zAQAEc3RvcAEAGmdldFBhcnNlckZhY3RvcnlDbGFzc05hbWVzAQAiKExqYXZhL25ldC9VUkw7KUxqYXZhL3V0aWwvVmVjdG9yOwEAB3BmY05hbWUBAApjb21tZW50SWR4AQABSQEAFnBhcnNlckZhY3RvcnlDbGFzc05hbWUBAAJpcwEAFUxqYXZhL2lvL0lucHV0U3RyZWFtOwEAAmJyAQAYTGphdmEvaW8vQnVmZmVyZWRSZWFkZXI7AQAJcGFyc2VyVXJsAQAOTGphdmEvbmV0L1VSTDsBAAF2AQASTGphdmEvdXRpbC9WZWN0b3I7AQAScmVnaXN0ZXJTQVhQYXJzZXJzAQAVKExqYXZhL3V0aWwvVmVjdG9yOylWAQAHZmFjdG9yeQEAJExqYXZheC94bWwvcGFyc2Vycy9TQVhQYXJzZXJGYWN0b3J5OwEACnByb3BlcnRpZXMBABVMamF2YS91dGlsL0hhc2h0YWJsZTsBAAFlAQAXTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBAAVpbmRleAEAF3BhcnNlckZhY3RvcnlDbGFzc05hbWVzAQAXc2V0RGVmYXVsdFNBWFByb3BlcnRpZXMBAD0oTGphdmF4L3htbC9wYXJzZXJzL1NBWFBhcnNlckZhY3Rvcnk7TGphdmEvdXRpbC9IYXNodGFibGU7SSlWAQAFcHJvcHMBABBzZXRTQVhQcm9wZXJ0aWVzAQA8KExqYXZheC94bWwvcGFyc2Vycy9TQVhQYXJzZXJGYWN0b3J5O0xqYXZhL3V0aWwvSGFzaHRhYmxlOylWAQAHcGNlX3ZhbAEAFUxqYXZhL2xhbmcvRXhjZXB0aW9uOwEAB3BjZV9uc2EBAAp2YWxpZGF0aW5nAQABWgEADm5hbWVzcGFjZWF3YXJlAQAScmVnaXN0ZXJET01QYXJzZXJzAQAqTGphdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3Rvcnk7AQAXc2V0RGVmYXVsdERPTVByb3BlcnRpZXMBAEMoTGphdmF4L3htbC9wYXJzZXJzL0RvY3VtZW50QnVpbGRlckZhY3Rvcnk7TGphdmEvdXRpbC9IYXNodGFibGU7SSlWAQAQc2V0RE9NUHJvcGVydGllcwEAQihMamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTtMamF2YS91dGlsL0hhc2h0YWJsZTspVgEACmdldEZhY3RvcnkBACYoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvT2JqZWN0OwEABGNuZmUBACJMamF2YS9sYW5nL0NsYXNzTm90Rm91bmRFeGNlcHRpb247AQACaWUBACJMamF2YS9sYW5nL0luc3RhbnRpYXRpb25FeGNlcHRpb247AQADaWFlAQAiTGphdmEvbGFuZy9JbGxlZ2FsQWNjZXNzRXhjZXB0aW9uOwEACmdldFNlcnZpY2UBAFcoTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7TG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVnaXN0cmF0aW9uOylMamF2YS9sYW5nL09iamVjdDsBABJMamF2YS9sYW5nL09iamVjdDsBAANmY2UBAC1MamF2YXgveG1sL3BhcnNlcnMvRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsBAAZidW5kbGUBAAxyZWdpc3RyYXRpb24BAChMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWdpc3RyYXRpb247AQAEc3JlZgEAJUxvcmcvb3NnaS9mcmFtZXdvcmsvU2VydmljZVJlZmVyZW5jZTsBAAx1bmdldFNlcnZpY2UBAFgoTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7TG9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlUmVnaXN0cmF0aW9uO0xqYXZhL2xhbmcvT2JqZWN0OylWAQAHc2VydmljZQEAClNvdXJjZUZpbGUBABdYTUxQYXJzZXJBY3RpdmF0b3IuamF2YQwAYwBkDABUAFUHAQgMAQkBCgEANS9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5BwELDAEMAQ0MAHIAcwwAgACBAQA7L01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkMAJUAgQEAE2phdmEvaW8vSU9FeGNlcHRpb24MAQ4AZAEAK2phdmF4L3htbC9wYXJzZXJzL0ZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IMAGMBDwEAEGphdmEvdXRpbC9WZWN0b3IMAGMBEAcBEQwBEgETAQAWamF2YS9pby9CdWZmZXJlZFJlYWRlcgEAGWphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIMAGMBFAwAYwEVDAEWARcMARgBFwwBGQEaAQABIwwBGwEcDAEdAR4MAR8BIAwBIQEiBwEjDAEkASUMASYBJwEAEGphdmEvbGFuZy9TdHJpbmcMAJsAnAEAImphdmF4L3htbC9wYXJzZXJzL1NBWFBhcnNlckZhY3RvcnkBABNqYXZhL3V0aWwvSGFzaHRhYmxlDACKAIsBABJwYXJzZXIuZmFjdG9yeW5hbWUMASgBKQEAImphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3RvcnkMASoBKwEAE3NlcnZpY2UuZGVzY3JpcHRpb24BABtBIEpBWFAgQ29tcGxpYW50IFNBWCBQYXJzZXIBAAtzZXJ2aWNlLnBpZAEAFmphdmEvbGFuZy9TdHJpbmdCdWZmZXIBACNqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5LgwBLAEtDAEuAS8MASwBMAEAAS4MASwBMQwBMgEXDACNAI4MATMBNAwBNQE0DAE2ATcBABNqYXZhL2xhbmcvRXhjZXB0aW9uAQAVcGFyc2VyLm5hbWVzcGFjZUF3YXJlAQARamF2YS9sYW5nL0Jvb2xlYW4MAGMBNAEAEXBhcnNlci52YWxpZGF0aW5nAQAoamF2YXgveG1sL3BhcnNlcnMvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQwAlwCYAQAoamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeQEAG0EgSkFYUCBDb21wbGlhbnQgRE9NIFBhcnNlcgEAKWphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkuDACZAJoMATgBOQcBOgwBOwE8DAE9AScBACBqYXZhL2xhbmcvQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgEAIGphdmEvbGFuZy9JbnN0YW50aWF0aW9uRXhjZXB0aW9uAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24HAT4MAT8BQAcBQQwBQgCcDAFDASUBACRvcmcvb3NnaS91dGlsL3htbC9YTUxQYXJzZXJBY3RpdmF0b3IBABBqYXZhL2xhbmcvT2JqZWN0AQAib3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZUFjdGl2YXRvcgEAIW9yZy9vc2dpL2ZyYW1ld29yay9TZXJ2aWNlRmFjdG9yeQEAEy9NRVRBLUlORi9zZXJ2aWNlcy8BACBvcmcvb3NnaS9mcmFtZXdvcmsvQnVuZGxlQ29udGV4dAEACWdldEJ1bmRsZQEAHSgpTG9yZy9vc2dpL2ZyYW1ld29yay9CdW5kbGU7AQAZb3JnL29zZ2kvZnJhbWV3b3JrL0J1bmRsZQEAC2dldFJlc291cmNlAQAiKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9uZXQvVVJMOwEAD3ByaW50U3RhY2tUcmFjZQEAGChMamF2YS9sYW5nL0V4Y2VwdGlvbjspVgEABChJKVYBAAxqYXZhL25ldC9VUkwBAApvcGVuU3RyZWFtAQAXKClMamF2YS9pby9JbnB1dFN0cmVhbTsBABgoTGphdmEvaW8vSW5wdXRTdHJlYW07KVYBABMoTGphdmEvaW8vUmVhZGVyOylWAQAIcmVhZExpbmUBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEABHRyaW0BAAZsZW5ndGgBAAMoKUkBAAdpbmRleE9mAQAVKExqYXZhL2xhbmcvU3RyaW5nOylJAQAKYWRkRWxlbWVudAEAFShMamF2YS9sYW5nL09iamVjdDspVgEACXN1YnN0cmluZwEAFihJSSlMamF2YS9sYW5nL1N0cmluZzsBAAhlbGVtZW50cwEAGSgpTGphdmEvdXRpbC9FbnVtZXJhdGlvbjsBABVqYXZhL3V0aWwvRW51bWVyYXRpb24BAA9oYXNNb3JlRWxlbWVudHMBAAMoKVoBAAtuZXh0RWxlbWVudAEAFCgpTGphdmEvbGFuZy9PYmplY3Q7AQADcHV0AQA4KExqYXZhL2xhbmcvT2JqZWN0O0xqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAA9yZWdpc3RlclNlcnZpY2UBAGQoTGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9PYmplY3Q7TGphdmEvdXRpbC9EaWN0aW9uYXJ5OylMb3JnL29zZ2kvZnJhbWV3b3JrL1NlcnZpY2VSZWdpc3RyYXRpb247AQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAtnZXRCdW5kbGVJZAEAAygpSgEA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dHlwZS9tZXRhdHlwZS54c2Q8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pgo8IS0tIAovKgogKiAkSGVhZGVyOiAvY3ZzaG9tZS9idWlsZC94bWxucy9tZXRhdHlwZS9tZXRhdHlwZS54c2QsdiAxLjE5IDIwMDYvMDMvMTQgMDE6MjE6NDEgaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCi0tPgo8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9tZXRhdHlwZS92MS4wLjAiCgl4bWxuczptZXRhdHlwZT0iaHR0cDovL3d3dy5vc2dpLm9yZy94bWxucy9tZXRhdHlwZS92MS4wLjAiPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJNZXRhRGF0YSI+CgkJPHNlcXVlbmNlPgoJCQk8ZWxlbWVudCBuYW1lPSJPQ0QiIHR5cGU9Im1ldGF0eXBlOk9DRCIgbWluT2NjdXJzPSIwIgoJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CgkJCTxlbGVtZW50IG5hbWU9IkRlc2lnbmF0ZSIgdHlwZT0ibWV0YXR5cGU6RGVzaWduYXRlIgoJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KCQk8L3NlcXVlbmNlPgoJCTxhdHRyaWJ1dGUgbmFtZT0ibG9jYWxpemF0aW9uIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+Cgk8L2NvbXBsZXhUeXBlPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJPQ0QiPgoJCTxzZXF1ZW5jZT4KCQkJPGVsZW1lbnQgbmFtZT0iQUQiIHR5cGU9Im1ldGF0eXBlOkFEIiBtaW5PY2N1cnM9IjEiCgkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KCQkJPGVsZW1lbnQgbmFtZT0iSWNvbiIgdHlwZT0ibWV0YXR5cGU6SWNvbiIgbWluT2NjdXJzPSIwIgoJCQkJbWF4T2NjdXJzPSIxIiAvPgoJCTwvc2VxdWVuY2U+CgkJPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgoJCTxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KCTwvY29tcGxleFR5cGU+CgoJPGNvbXBsZXhUeXBlIG5hbWU9IkFEIj4KCQk8c2VxdWVuY2U+CgkJCTxlbGVtZW50IG5hbWU9Ik9wdGlvbiIgdHlwZT0ibWV0YXR5cGU6T3B0aW9uIiBtaW5PY2N1cnM9IjAiCgkJCQltYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KCQk8L3NlcXVlbmNlPgoJCTxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9Im9wdGlvbmFsIiAvPgoJCTxhdHRyaWJ1dGUgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KCQk8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJtZXRhdHlwZTpTY2FsYXIiIHVzZT0icmVxdWlyZWQiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJjYXJkaW5hbGl0eSIgdHlwZT0iaW50IiB1c2U9Im9wdGlvbmFsIgoJCQlkZWZhdWx0PSIwIiAvPgoJCTxhdHRyaWJ1dGUgbmFtZT0ibWluIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJtYXgiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KCQk8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KCQk8YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJib29sZWFuIiB1c2U9Im9wdGlvbmFsIgoJCQlkZWZhdWx0PSJ0cnVlIiAvPgoJPC9jb21wbGV4VHlwZT4KCgk8Y29tcGxleFR5cGUgbmFtZT0iT2JqZWN0Ij4KCQk8c2VxdWVuY2U+CgkJCTxlbGVtZW50IG5hbWU9IkF0dHJpYnV0ZSIgdHlwZT0ibWV0YXR5cGU6QXR0cmlidXRlIgoJCQkJbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KCQk8L3NlcXVlbmNlPgoJCTxhdHRyaWJ1dGUgbmFtZT0ib2NkcmVmIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Cgk8L2NvbXBsZXhUeXBlPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJBdHRyaWJ1dGUiPgoJCTxzZXF1ZW5jZT4KCQkJPGVsZW1lbnQgbmFtZT0iVmFsdWUiIHR5cGU9InN0cmluZyIgbWluT2NjdXJzPSIwIgoJCQkJbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+CgkJPC9zZXF1ZW5jZT4KCQk8YXR0cmlidXRlIG5hbWU9ImFkcmVmIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50IiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+Cgk8L2NvbXBsZXhUeXBlPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJEZXNpZ25hdGUiPgoJCTxzZXF1ZW5jZT4KCQkJPGVsZW1lbnQgbmFtZT0iT2JqZWN0IiB0eXBlPSJtZXRhdHlwZTpPYmplY3QiIG1pbk9jY3Vycz0iMSIKCQkJCW1heE9jY3Vycz0iMSIgLz4KCQk8L3NlcXVlbmNlPgoJCTxhdHRyaWJ1dGUgbmFtZT0icGlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5UGlkIiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJidW5kbGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIgLz4KCQk8YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIKCQkJdXNlPSJvcHRpb25hbCIgLz4KCQk8YXR0cmlidXRlIG5hbWU9Im1lcmdlIiB0eXBlPSJib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIKCQkJdXNlPSJvcHRpb25hbCIgLz4KCTwvY29tcGxleFR5cGU+CgoJPHNpbXBsZVR5cGUgbmFtZT0iU2NhbGFyIj4KCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTdHJpbmciIC8+CgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iTG9uZyIgLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUiIC8+CgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iRmxvYXQiIC8+CgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iSW50ZWdlciIgLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJCeXRlIiAvPgoJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkNoYXIiIC8+CgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQm9vbGVhbiIgLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydCIgLz4KCQk8L3Jlc3RyaWN0aW9uPgoJPC9zaW1wbGVUeXBlPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJPcHRpb24iPgoJCTxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KCQk8YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Cgk8L2NvbXBsZXhUeXBlPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJJY29uIj4KCQk8YXR0cmlidXRlIG5hbWU9InJlc291cmNlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJwb3NpdGl2ZUludGVnZXIiIHVzZT0icmVxdWlyZWQiIC8+Cgk8L2NvbXBsZXhUeXBlPgoKCTxlbGVtZW50IG5hbWU9Ik1ldGFEYXRhIiB0eXBlPSJtZXRhdHlwZTpNZXRhRGF0YSIgLz4KPC9zY2hlbWE+UEsDBAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAKAAAAeG1sbnMvc2NyL1BLAwQKAAAAAABrUu404VP5Q8ATAADAEwAAEQAAAHhtbG5zL3Njci9zY3IueHNkPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCEtLSAKLyoKICogJEhlYWRlcjogL2N2c2hvbWUvYnVpbGQveG1sbnMvc2NyL3Njci54c2QsdiAxLjEyIDIwMDYvMDcvMTEgMTM6Mjc6NDYgaGFyZ3JhdmUgRXhwICQKICogCiAqIENvcHlyaWdodCAoYykgT1NHaSBBbGxpYW5jZSAoMjAwNSwgMjAwNikuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqIAogKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICoKICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICoKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICovCi0tPgkJCjxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cub3NnaS5vcmcveG1sbnMvc2NyL3YxLjAuMCIgeG1sbnM6c2NyPSJodHRwOi8vd3d3Lm9zZ2kub3JnL3htbG5zL3Njci92MS4wLjAiPgoJPGFubm90YXRpb24+CgkJPGRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgY29tcG9uZW50IGRlc2NyaXB0aW9ucyB1c2VkIGJ5IHRoZSBTZXJ2aWNlIENvbXBvbmVudCBSdW50aW1lIChTQ1IpLgpDb21wb25lbnQgZGVzY3JpcHRpb24gZG9jdW1lbnRzIG1heSBiZSBlbWJlZGRlZCBpbiBvdGhlciBYTUwgZG9jdW1lbnRzLiBUaGUgU0NSIHdpbGwKcHJvY2VzcyBhbGwgWE1MIGRvY3VtZW50cyBsaXN0ZWQgaW4gdGhlIFNlcnZpY2UtQ29tcG9uZW50IG1hbmlmZXN0IGhlYWRlciBvZiBhIGJ1bmRsZS4gClhNTCBkb2N1bWVudHMgY29udGFpbmluZyBjb21wb25lbnQgZGVzY3JpcHRpb25zIG1heSBjb250YWluIGEgc2luZ2xlLCByb290IGNvbXBvbmVudCAKZWxlbWVudCBvciBvbmUgb3IgbW9yZSBjb21wb25lbnQgZWxlbWVudHMgZW1iZWRkZWQgaW4gYSBsYXJnZXIgZG9jdW1lbnQuIFVzZSBvZiB0aGUgCm5hbWVzcGFjZSBpcyBvcHRpb25hbCBpZiB0aGUgZG9jdW1lbnQgb25seSBjb250YWlucyBhIHJvb3QgY29tcG9uZW50IGVsZW1lbnQuIEluIHRoaXMgCmNhc2UsIHRoZSBzY3IgbmFtZXNwYWNlIGlzIGFzc3VtZWQuIE90aGVyd2lzZSB0aGUgbmFtZXNwYWNlIG11c3QgYmUgdXNlZC4KCQk8L2RvY3VtZW50YXRpb24+Cgk8L2Fubm90YXRpb24+CgoJPGVsZW1lbnQgbmFtZT0iY29tcG9uZW50IiB0eXBlPSJzY3I6VGNvbXBvbmVudCIvPgoKCTxjb21wbGV4VHlwZSBuYW1lPSJUY29tcG9uZW50Ij4KCQk8YW5ub3RhdGlvbj4KCQkJPGRvY3VtZW50YXRpb24geG1sOmxhbmc9ImVuIj4KCQkJSW1wbGVtZW50YXRpb25zIG9mIFNDUiBtdXN0IG5vdCByZXF1aXJlIGNvbXBvbmVudCBkZXNjcmlwdGlvbnMgdG8gc3BlY2lmeSB0aGUgc3ViZWxlbWVudHMgCgkJCW9mIHRoZSBjb21wb25lbnQgZWxlbWVudCBpbiB0aGUgb3JkZXIgYXMgcmVxdWlyZWQgYnkgdGhlIHNjaGVtYS4gU0NSIGltcGxlbWVudGF0aW9ucyBtdXN0IAoJCQlhbGxvdyBvdGhlciBvcmRlcmluZ3Mgc2luY2UgYXJiaXRyYXJ5IG9yZGVyaW5ncyBkbyBub3QgYWZmZWN0IHRoZSBtZWFuaW5nIG9mIHRoZSBjb21wb25lbnQgCgkJCWRlc2NyaXB0aW9uLiBPbmx5IHRoZSByZWxhdGl2ZSBvcmRlcmluZyBvZiBwcm9wZXJ0eSBhbmQgcHJvcGVydGllcyBlbGVtZW50IGhhdmUgbWVhbmluZy4KCQkJPC9kb2N1bWVudGF0aW9uPgoJCTwvYW5ub3RhdGlvbj4KCQk8c2VxdWVuY2U+CgkJCTxlbGVtZW50IG5hbWU9ImltcGxlbWVudGF0aW9uIiB0eXBlPSJzY3I6VGltcGxlbWVudGF0aW9uIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0iMSIvPgoJCQk8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgoJCQkJPGVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9InNjcjpUcHJvcGVydHkiLz4KCQkJCTxlbGVtZW50IG5hbWU9InByb3BlcnRpZXMiIHR5cGU9InNjcjpUcHJvcGVydGllcyIvPgoJCQk8L2Nob2ljZT4KCQkJPGVsZW1lbnQgbmFtZT0ic2VydmljZSIgdHlwZT0ic2NyOlRzZXJ2aWNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgoJCQk8ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UiIHR5cGU9InNjcjpUcmVmZXJlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CgkJPC9zZXF1ZW5jZT4KCQk8YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9ImJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIHVzZT0ib3B0aW9uYWwiLz4KCQk8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InRva2VuIiB1c2U9InJlcXVpcmVkIi8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5IiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KCQk8YXR0cmlidXRlIG5hbWU9ImltbWVkaWF0ZSIgdHlwZT0iYm9vbGVhbiIgdXNlPSJvcHRpb25hbCIvPgoJPC9jb21wbGV4VHlwZT4KCgk8Y29tcGxleFR5cGUgbmFtZT0iVGltcGxlbWVudGF0aW9uIj4KCQk8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ0b2tlbiIgdXNlPSJyZXF1aXJlZCIvPgoJPC9jb21wbGV4VHlwZT4KCgk8Y29tcGxleFR5cGUgbmFtZT0iVHByb3BlcnR5Ij4KCQk8c2ltcGxlQ29udGVudD4KCQkJPGV4dGVuc2lvbiBiYXNlPSJzdHJpbmciPgoJCQkJPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KCQkJCTxhdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIvPgoJCQkJPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzY3I6VGphdmFUeXBlcyIgZGVmYXVsdD0iU3RyaW5nIiB1c2U9Im9wdGlvbmFsIi8+CgkJCTwvZXh0ZW5zaW9uPgoJCTwvc2ltcGxlQ29udGVudD4KCTwvY29tcGxleFR5cGU+CgoJPGNvbXBsZXhUeXBlIG5hbWU9IlRwcm9wZXJ0aWVzIj4KCQk8YXR0cmlidXRlIG5hbWU9ImVudHJ5IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KCTwvY29tcGxleFR5cGU+CgoJPGNvbXBsZXhUeXBlIG5hbWU9IlRzZXJ2aWNlIj4KCQk8c2VxdWVuY2U+CgkJCTxlbGVtZW50IG5hbWU9InByb3ZpZGUiIHR5cGU9InNjcjpUcHJvdmlkZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgoJCTwvc2VxdWVuY2U+CgkJPGF0dHJpYnV0ZSBuYW1lPSJzZXJ2aWNlZmFjdG9yeSIgdHlwZT0iYm9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIHVzZT0ib3B0aW9uYWwiLz4KCTwvY29tcGxleFR5cGU+CgoJPGNvbXBsZXhUeXBlIG5hbWU9IlRwcm92aWRlIj4KCQk8YXR0cmlidXRlIG5hbWU9ImludGVyZmFjZSIgdHlwZT0idG9rZW4iIHVzZT0icmVxdWlyZWQiLz4KCTwvY29tcGxleFR5cGU+CgoJPGNvbXBsZXhUeXBlIG5hbWU9IlRyZWZlcmVuY2UiPgoJCTxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0iTk1UT0tFTiIgdXNlPSJyZXF1aXJlZCIvPgoJCTxhdHRyaWJ1dGUgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJ0b2tlbiIgdXNlPSJyZXF1aXJlZCIvPgoJCTxhdHRyaWJ1dGUgbmFtZT0iY2FyZGluYWxpdHkiIHR5cGU9InNjcjpUY2FyZGluYWxpdHkiIGRlZmF1bHQ9IjEuLjEiIHVzZT0ib3B0aW9uYWwiLz4KCQk8YXR0cmlidXRlIG5hbWU9InBvbGljeSIgdHlwZT0ic2NyOlRwb2xpY3kiIGRlZmF1bHQ9InN0YXRpYyIgdXNlPSJvcHRpb25hbCIvPgoJCTxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0ib3B0aW9uYWwiLz4KCQk8YXR0cmlidXRlIG5hbWU9ImJpbmQiIHR5cGU9InRva2VuIiB1c2U9Im9wdGlvbmFsIi8+CgkJPGF0dHJpYnV0ZSBuYW1lPSJ1bmJpbmQiIHR5cGU9InRva2VuIiB1c2U9Im9wdGlvbmFsIi8+Cgk8L2NvbXBsZXhUeXBlPgoKCTxzaW1wbGVUeXBlIG5hbWU9IlRqYXZhVHlwZXMiPgoJCTxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPgoJCQk8ZW51bWVyYXRpb24gdmFsdWU9IlN0cmluZyIvPgoJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkxvbmciLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJEb3VibGUiLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJGbG9hdCIvPgoJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkludGVnZXIiLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJCeXRlIi8+CgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iQ2hhciIvPgoJCQk8ZW51bWVyYXRpb24gdmFsdWU9IkJvb2xlYW4iLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJTaG9ydCIvPgoJCTwvcmVzdHJpY3Rpb24+Cgk8L3NpbXBsZVR5cGU+CgoJPHNpbXBsZVR5cGUgbmFtZT0iVGNhcmRpbmFsaXR5Ij4KCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSIwLi4xIi8+CgkJCTxlbnVtZXJhdGlvbiB2YWx1ZT0iMC4ubiIvPgoJCQk8ZW51bWVyYXRpb24gdmFsdWU9IjEuLjEiLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSIxLi5uIi8+CgkJPC9yZXN0cmljdGlvbj4KCTwvc2ltcGxlVHlwZT4KCgk8c2ltcGxlVHlwZSBuYW1lPSJUcG9saWN5Ij4KCQk8cmVzdHJpY3Rpb24gYmFzZT0ic3RyaW5nIj4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJzdGF0aWMiLz4KCQkJPGVudW1lcmF0aW9uIHZhbHVlPSJkeW5hbWljIi8+CgkJPC9yZXN0cmljdGlvbj4KCTwvc2ltcGxlVHlwZT4KCjwvc2NoZW1hPlBLAQIUABQACAAIAEuY7jQwP27P5RgAAE9aAAAUAAAAAAAAAAAAAAAAAAAAAABNRVRBLUlORi9NQU5JRkVTVC5NRlBLAQIUABQACAAIAEyY7jQEoRYIfRkAAOJUAAAQAAAAAAAAAAAAAAAAACcZAABNRVRBLUlORi9PU0dJLlNGUEsBAhQAFAAIAAgATJjuNJAZvDaQCAAAqA0AABEAAAAAAAAAAAAAAAAA4jIAAE1FVEEtSU5GL09TR0kuUlNBUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAsTsAAE1FVEEtSU5GL1BLAQIKAAoAAAAAAGtS7jS0tOKGXiwAAF4sAAAHAAAAAAAAAAAAAAAAANg7AABMSUNFTlNFUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAAAW2gAAE9TR0ktT1BUL1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAIJoAABPU0dJLU9QVC9zcmMvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAArWgAAE9TR0ktT1BUL3NyYy9vcmcvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAABYAAAAAAAAAAAAAAAAA3GgAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9QSwECCgAKAAAAAABrUu40AAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAAAAQaQAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACEAAAAAAAAAAAAAAAAATGkAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL1BLAQIKAAoAAAAAAGtS7jRBEyBcOSQAADkkAAAzAAAAAAAAAAAAAAAAAItpAABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jbS9Db25maWd1cmF0aW9uLmphdmFQSwECCgAKAAAAAABrUu40ANdOdAgtAAAILQAAOAAAAAAAAAAAAAAAAAAVjgAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkFkbWluLmphdmFQSwECCgAKAAAAAABrUu40nzto36oTAACqEwAAOAAAAAAAAAAAAAAAAABzuwAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV2ZW50LmphdmFQSwECCgAKAAAAAABrUu40a5qiDbsMAAC7DAAAPAAAAAAAAAAAAAAAAABzzwAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5qYXZhUEsBAgoACgAAAAAAa1LuNBAo9zO3BwAAtwcAADsAAAAAAAAAAAAAAAAAiNwAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25MaXN0ZW5lci5qYXZhUEsBAgoACgAAAAAAa1LuNHFFr2OfFwAAnxcAAD0AAAAAAAAAAAAAAAAAmOQAAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QZXJtaXNzaW9uLmphdmFQSwECCgAKAAAAAABrUu40ArDX8b8WAAC/FgAAOQAAAAAAAAAAAAAAAACS/AAAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vQ29uZmlndXJhdGlvblBsdWdpbi5qYXZhUEsBAgoACgAAAAAAa1LuNAJYiUHdFAAA3RQAADQAAAAAAAAAAAAAAAAAqBMBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL01hbmFnZWRTZXJ2aWNlLmphdmFQSwECCgAKAAAAAABrUu40J1HaQpgYAACYGAAAOwAAAAAAAAAAAAAAAADXKAEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vTWFuYWdlZFNlcnZpY2VGYWN0b3J5LmphdmFQSwECCgAKAAAAAABrUu407wlIpX4BAAB+AQAALQAAAAAAAAAAAAAAAADIQQEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY20vcGFja2FnZS5odG1sUEsBAgoACgAAAAAAa1LuNEf9N5wMAAAADAAAACwAAAAAAAAAAAAAAAAAkUMBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NtL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAA50MBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9QSwECCgAKAAAAAABrUu40aBqhDQkLAAAJCwAAPwAAAAAAAAAAAAAAAAAtRAEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudENvbnN0YW50cy5qYXZhUEsBAgoACgAAAAAAa1LuNA7STQ4cHgAAHB4AAD0AAAAAAAAAAAAAAAAAk08BAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRDb250ZXh0LmphdmFQSwECCgAKAAAAAABrUu40I2ekwkkKAABJCgAAPwAAAAAAAAAAAAAAAAAKbgEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEV4Y2VwdGlvbi5qYXZhUEsBAgoACgAAAAAAa1LuNGgvqas0CAAANAgAAD0AAAAAAAAAAAAAAAAAsHgBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRGYWN0b3J5LmphdmFQSwECCgAKAAAAAABrUu401sRYoMkGAADJBgAAPgAAAAAAAAAAAAAAAAA/gQEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L0NvbXBvbmVudEluc3RhbmNlLmphdmFQSwECCgAKAAAAAABrUu40VOQCVJEBAACRAQAANAAAAAAAAAAAAAAAAABkiAEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L3BhY2thZ2UuaHRtbFBLAQIKAAoAAAAAAGtS7jTFnwGuDAAAAAwAAAAzAAAAAAAAAAAAAAAAAEeKAQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvcGFja2FnZWluZm9QSwECCgAKAAAAAABrUu40AAAAAAAAAAAAAAAAJQAAAAAAAAAAAAAAAACkigEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL1BLAQIKAAoAAAAAAGtS7jT29yDjdAoAAHQKAAAzAAAAAAAAAAAAAAAAAOeKAQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvQ29uc3RhbnRzLmphdmFQSwECCgAKAAAAAABrUu40ttAe/ugIAADoCAAAMAAAAAAAAAAAAAAAAACslQEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL0RldmljZS5qYXZhUEsBAgoACgAAAAAAa1LuNBx2fHNsEQAAbBEAADAAAAAAAAAAAAAAAAAA4p4BAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXIuamF2YVBLAQIKAAoAAAAAAGtS7jSK8m1fZQoAAGUKAAA3AAAAAAAAAAAAAAAAAJywAQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9kZXZpY2UvRHJpdmVyTG9jYXRvci5qYXZhUEsBAgoACgAAAAAAa1LuNHzxBiYnCQAAJwkAADgAAAAAAAAAAAAAAAAAVrsBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9Ecml2ZXJTZWxlY3Rvci5qYXZhUEsBAgoACgAAAAAAa1LuNEIZXJ6GBQAAhgUAAC8AAAAAAAAAAAAAAAAA08QBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9NYXRjaC5qYXZhUEsBAgoACgAAAAAAa1LuNFvgAYqDAQAAgwEAADEAAAAAAAAAAAAAAAAApsoBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2RldmljZS9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40hK4atwwAAAAMAAAAMAAAAAAAAAAAAAAAAAB4zAEAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvZGV2aWNlL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAA0swBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1BLAQIKAAoAAAAAAGtS7jT8y/lJDhUAAA4VAAAuAAAAAAAAAAAAAAAAABTNAQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudC5qYXZhUEsBAgoACgAAAAAAa1LuNEfa0ryUBwAAlAcAADMAAAAAAAAAAAAAAAAAbuIBAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50QWRtaW4uamF2YVBLAQIKAAoAAAAAAGtS7jT7s8Fg0BIAANASAAA3AAAAAAAAAAAAAAAAAFPqAQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9FdmVudENvbnN0YW50cy5qYXZhUEsBAgoACgAAAAAAa1LuNB/TEoX9CQAA/QkAADUAAAAAAAAAAAAAAAAAeP0BAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L0V2ZW50SGFuZGxlci5qYXZhUEsBAgoACgAAAAAAa1LuNI88rSusOAAArDgAADgAAAAAAAAAAAAAAAAAyAcCAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L1RvcGljUGVybWlzc2lvbi5qYXZhUEsBAgoACgAAAAAAa1LuNOpaEdeHAQAAhwEAADAAAAAAAAAAAAAAAAAAykACAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2V2ZW50L3BhY2thZ2UuaHRtbFBLAQIKAAoAAAAAAGtS7jSErhq3DAAAAAwAAAAvAAAAAAAAAAAAAAAAAJ9CAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9ldmVudC9wYWNrYWdlaW5mb1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAPhCAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9odHRwL1BLAQIKAAoAAAAAAGtS7jRRav20oRwAAKEcAAAzAAAAAAAAAAAAAAAAADlDAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBDb250ZXh0LmphdmFQSwECCgAKAAAAAABrUu40cDZN648eAACPHgAAMwAAAAAAAAAAAAAAAAArYAIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9IdHRwU2VydmljZS5qYXZhUEsBAgoACgAAAAAAa1LuNOeNPuRiCwAAYgsAADoAAAAAAAAAAAAAAAAAC38CAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2h0dHAvTmFtZXNwYWNlRXhjZXB0aW9uLmphdmFQSwECCgAKAAAAAABrUu40ST7KvYUBAACFAQAALwAAAAAAAAAAAAAAAADFigIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40R/03nAwAAAAMAAAALgAAAAAAAAAAAAAAAACXjAIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaHR0cC9wYWNrYWdlaW5mb1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAhAAAAAAAAAAAAAAAAAO+MAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9pby9QSwECCgAKAAAAAABrUu40BdO34BgKAAAYCgAANwAAAAAAAAAAAAAAAAAujQIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vQ29ubmVjdGlvbkZhY3RvcnkuamF2YVBLAQIKAAoAAAAAAGtS7jSkcQsRZBoAAGQaAAA2AAAAAAAAAAAAAAAAAJuXAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9pby9Db25uZWN0b3JTZXJ2aWNlLmphdmFQSwECCgAKAAAAAABrUu40YkLAiZYBAACWAQAALQAAAAAAAAAAAAAAAABTsgIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvaW8vcGFja2FnZS5odG1sUEsBAgoACgAAAAAAa1LuNMWfAa4MAAAADAAAACwAAAAAAAAAAAAAAAAANLQCAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2lvL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACIAAAAAAAAAAAAAAAAAirQCAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9QSwECCgAKAAAAAABrUu40Y7C9dsQOAADEDgAALwAAAAAAAAAAAAAAAADKtAIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ0VudHJ5LmphdmFQSwECCgAKAAAAAABrUu40IdstDnQHAAB0BwAAMgAAAAAAAAAAAAAAAADbwwIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ0xpc3RlbmVyLmphdmFQSwECCgAKAAAAAABrUu40Y/WIV0cOAABHDgAANwAAAAAAAAAAAAAAAACfywIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbG9nL0xvZ1JlYWRlclNlcnZpY2UuamF2YVBLAQIKAAoAAAAAAGtS7jTr1b2x7RMAAO0TAAAxAAAAAAAAAAAAAAAAADvaAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9sb2cvTG9nU2VydmljZS5qYXZhUEsBAgoACgAAAAAAa1LuNMHi80t5AQAAeQEAAC4AAAAAAAAAAAAAAAAAd+4CAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL2xvZy9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40BswshQwAAAAMAAAALQAAAAAAAAAAAAAAAAA88AIAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbG9nL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACcAAAAAAAAAAAAAAAAAk/ACAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL1BLAQIKAAoAAAAAAGtS7jRx2UnROicAADonAAA/AAAAAAAAAAAAAAAAANjwAgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9BdHRyaWJ1dGVEZWZpbml0aW9uLmphdmFQSwECCgAKAAAAAABrUu40bJV064wGAACMBgAAPwAAAAAAAAAAAAAAAABvGAMAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVJbmZvcm1hdGlvbi5qYXZhUEsBAgoACgAAAAAAa1LuNLlAC4GBCAAAgQgAADwAAAAAAAAAAAAAAAAAWB8DAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlUHJvdmlkZXIuamF2YVBLAQIKAAoAAAAAAGtS7jRHhSpSmAgAAJgIAAA7AAAAAAAAAAAAAAAAADMoAwBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVNlcnZpY2UuamF2YVBLAQIKAAoAAAAAAGtS7jStN1wGLBAAACwQAABBAAAAAAAAAAAAAAAAACQxAwBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9PYmplY3RDbGFzc0RlZmluaXRpb24uamF2YVBLAQIKAAoAAAAAAGtS7jQQ6kMJjgEAAI4BAAAzAAAAAAAAAAAAAAAAAK9BAwBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40hK4atwwAAAAMAAAAMgAAAAAAAAAAAAAAAACOQwMAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvcGFja2FnZWluZm9QSwECCgAKAAAAAABrUu40AAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAADqQwMAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvcHJlZnMvUEsBAgoACgAAAAAAa1LuNDrWCFDLCQAAywkAAD4AAAAAAAAAAAAAAAAALEQDAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbi5qYXZhUEsBAgoACgAAAAAAa1LuNP6hOliuhgAAroYAADQAAAAAAAAAAAAAAAAAU04DAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzLmphdmFQSwECCgAKAAAAAABrUu404XGGKIwHAACMBwAAOwAAAAAAAAAAAAAAAABT1QMAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvcHJlZnMvUHJlZmVyZW5jZXNTZXJ2aWNlLmphdmFQSwECCgAKAAAAAABrUu40EDS+AocBAACHAQAAMAAAAAAAAAAAAAAAAAA43QMAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvcHJlZnMvcGFja2FnZS5odG1sUEsBAgoACgAAAAAAa1LuNISuGrcMAAAADAAAAC8AAAAAAAAAAAAAAAAADd8DAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACsAAAAAAAAAAAAAAAAAZt8DAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3Byb3Zpc2lvbmluZy9QSwECCgAKAAAAAABrUu40bt/DcKYiAACmIgAAQwAAAAAAAAAAAAAAAACv3wMAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvcHJvdmlzaW9uaW5nL1Byb3Zpc2lvbmluZ1NlcnZpY2UuamF2YVBLAQIKAAoAAAAAAGtS7jQvqrsPlAEAAJQBAAA3AAAAAAAAAAAAAAAAALYCBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS9wcm92aXNpb25pbmcvcGFja2FnZS5odG1sUEsBAgoACgAAAAAAa1LuNISuGrcMAAAADAAAADYAAAAAAAAAAAAAAAAAnwQEAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3Byb3Zpc2lvbmluZy9wYWNrYWdlaW5mb1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAjAAAAAAAAAAAAAAAAAP8EBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1BLAQIKAAoAAAAAAGtS7jTAJVpvOhAAADoQAAAyAAAAAAAAAAAAAAAAAEAFBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBBY3Rpb24uamF2YVBLAQIKAAoAAAAAAGtS7jR6n3cgYSoAAGEqAAAyAAAAAAAAAAAAAAAAAMoVBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBEZXZpY2UuamF2YVBLAQIKAAoAAAAAAGtS7jRubgozJA4AACQOAAA5AAAAAAAAAAAAAAAAAHtABABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBFdmVudExpc3RlbmVyLmphdmFQSwECCgAKAAAAAABrUu40tsRtpsIJAADCCQAANQAAAAAAAAAAAAAAAAD2TgQAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QRXhjZXB0aW9uLmphdmFQSwECCgAKAAAAAABrUu40sRZAxZoMAACaDAAAMAAAAAAAAAAAAAAAAAALWQQAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9VUG5QSWNvbi5qYXZhUEsBAgoACgAAAAAAa1LuNJ2QWSMtBgAALQYAAD4AAAAAAAAAAAAAAAAA82UEAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUExvY2FsU3RhdGVWYXJpYWJsZS5qYXZhUEsBAgoACgAAAAAAa1LuNHPBfnNNGAAATRgAADMAAAAAAAAAAAAAAAAAfGwEAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VwbnAvVVBuUFNlcnZpY2UuamF2YVBLAQIKAAoAAAAAAGtS7jTax+f1qCcAAKgnAAA5AAAAAAAAAAAAAAAAABqFBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91cG5wL1VQblBTdGF0ZVZhcmlhYmxlLmphdmFQSwECCgAKAAAAAABrUu40gmRnpXQBAAB0AQAALwAAAAAAAAAAAAAAAAAZrQQAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40hK4atwwAAAAMAAAALgAAAAAAAAAAAAAAAADargQAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXBucC9wYWNrYWdlaW5mb1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAAADKvBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vUEsBAgoACgAAAAAAa1LuNFeUDWeoEQAAqBEAADoAAAAAAAAAAAAAAAAAeK8EAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9BdXRob3JpemF0aW9uLmphdmFQSwECCgAKAAAAAABrUu40RZbs/jgYAAA4GAAAMgAAAAAAAAAAAAAAAAB4wQQAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL0dyb3VwLmphdmFQSwECCgAKAAAAAABrUu408u9Dm4IQAACCEAAAMQAAAAAAAAAAAAAAAAAA2gQAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL1JvbGUuamF2YVBLAQIKAAoAAAAAAGtS7jQH9m4NKBAAACgQAAAxAAAAAAAAAAAAAAAAANHqBABPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlci5qYXZhUEsBAgoACgAAAAAAa1LuNP4w5wj/GQAA/xkAADYAAAAAAAAAAAAAAAAASPsEAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW4uamF2YVBLAQIKAAoAAAAAAGtS7jSJirUHGQ0AABkNAAA7AAAAAAAAAAAAAAAAAJsVBQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluRXZlbnQuamF2YVBLAQIKAAoAAAAAAGtS7jQXmdhziwYAAIsGAAA+AAAAAAAAAAAAAAAAAA0jBQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluTGlzdGVuZXIuamF2YVBLAQIKAAoAAAAAAGtS7jSAj93tOU4AADlOAABAAAAAAAAAAAAAAAAAAPQpBQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluUGVybWlzc2lvbi5qYXZhUEsBAgoACgAAAAAAa1LuNLH/sUeJAQAAiQEAADQAAAAAAAAAAAAAAAAAi3gFAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40hK4atwwAAAAMAAAAMwAAAAAAAAAAAAAAAABmegUAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2UvdXNlcmFkbWluL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACgAAAAAAAAAAAAAAAAAw3oFAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9QSwECCgAKAAAAAABrUu409WmtP24HAABuBwAAOgAAAAAAAAAAAAAAAAAJewUAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL0Jhc2ljRW52ZWxvcGUuamF2YVBLAQIKAAoAAAAAAGtS7jRDSyruOhIAADoSAAA1AAAAAAAAAAAAAAAAAM+CBQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQ29uc3VtZXIuamF2YVBLAQIKAAoAAAAAAGtS7jRCA3Jb8Q0AAPENAAA1AAAAAAAAAAAAAAAAAFyVBQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vRW52ZWxvcGUuamF2YVBLAQIKAAoAAAAAAGtS7jSPVULyvhYAAL4WAAA1AAAAAAAAAAAAAAAAAKCjBQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vUHJvZHVjZXIuamF2YVBLAQIKAAoAAAAAAGtS7jRedDXpBzAAAAcwAAAxAAAAAAAAAAAAAAAAALG6BQBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZS5qYXZhUEsBAgoACgAAAAAAa1LuNKE61fV/HAAAfxwAADYAAAAAAAAAAAAAAAAAB+sFAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlQWRtaW4uamF2YVBLAQIKAAoAAAAAAGtS7jRYF17QCiQAAAokAAA7AAAAAAAAAAAAAAAAANoHBgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluRXZlbnQuamF2YVBLAQIKAAoAAAAAAGtS7jQ3Jq/wVwsAAFcLAAA+AAAAAAAAAAAAAAAAAD0sBgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUFkbWluTGlzdGVuZXIuamF2YVBLAQIKAAoAAAAAAGtS7jTNLOMKCikAAAopAAA6AAAAAAAAAAAAAAAAAPA3BgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vV2lyZUNvbnN0YW50cy5qYXZhUEsBAgoACgAAAAAAa1LuNKG5UpWjNAAAozQAADsAAAAAAAAAAAAAAAAAUmEGAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9XaXJlUGVybWlzc2lvbi5qYXZhUEsBAgoACgAAAAAAa1LuNMx7AMKKAQAAigEAADQAAAAAAAAAAAAAAAAATpYGAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40xZ8BrgwAAAAMAAAAMwAAAAAAAAAAAAAAAAAqmAYAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3NlcnZpY2Uvd2lyZWFkbWluL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAABsAAAAAAAAAAAAAAAAAh5gGAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAnAAAAAAAAAAAAAAAAAMCYBgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9QSwECCgAKAAAAAABrUu40oA5RjpdCAACXQgAANwAAAAAAAAAAAAAAAAAFmQYAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvTWVhc3VyZW1lbnQuamF2YVBLAQIKAAoAAAAAAGtS7jQ2QAVjUw4AAFMOAAAxAAAAAAAAAAAAAAAAAPHbBgBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9TdGF0ZS5qYXZhUEsBAgoACgAAAAAAa1LuNBTMNyVMQgAATEIAADAAAAAAAAAAAAAAAAAAk+oGAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL21lYXN1cmVtZW50L1VuaXQuamF2YVBLAQIKAAoAAAAAAGtS7jRt55rHhwEAAIcBAAAzAAAAAAAAAAAAAAAAAC0tBwBPU0dJLU9QVC9zcmMvb3JnL29zZ2kvdXRpbC9tZWFzdXJlbWVudC9wYWNrYWdlLmh0bWxQSwECCgAKAAAAAABrUu40xP+f3wsAAAALAAAAMgAAAAAAAAAAAAAAAAAFLwcAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvbWVhc3VyZW1lbnQvcGFja2FnZWluZm9QSwECCgAKAAAAAABrUu40AAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAABgLwcAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvcG9zaXRpb24vUEsBAgoACgAAAAAAa1LuNFpam8XJIAAAySAAADEAAAAAAAAAAAAAAAAAoi8HAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL3Bvc2l0aW9uL1Bvc2l0aW9uLmphdmFQSwECCgAKAAAAAABrUu40RLAvlHsBAAB7AQAAMAAAAAAAAAAAAAAAAAC6UAcAT1NHSS1PUFQvc3JjL29yZy9vc2dpL3V0aWwvcG9zaXRpb24vcGFja2FnZS5odG1sUEsBAgoACgAAAAAAa1LuNMT/n98LAAAACwAAAC8AAAAAAAAAAAAAAAAAg1IHAE9TR0ktT1BUL3NyYy9vcmcvb3NnaS91dGlsL3Bvc2l0aW9uL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAACMAAAAAAAAAAAAAAAAA21IHAE9TR0ktT1BUL3Ny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aXNzaW9uQ29sbGVjdGlvbi5jbGFzc1BLAQIKAAoAAAAAAGtS7jS24o81bgEAAG4BAAAtAAAAAAAAAAAAAAAAAFpwCABvcmcvb3NnaS9zZXJ2aWNlL2NtL0NvbmZpZ3VyYXRpb25QbHVnaW4uY2xhc3NQSwECCgAKAAAAAABrUu40IxT9JfYAAAD2AAAAKAAAAAAAAAAAAAAAAAATcggAb3JnL29zZ2kvc2VydmljZS9jbS9NYW5hZ2VkU2VydmljZS5jbGFzc1BLAQIKAAoAAAAAAGtS7jThAbQ7aQEAAGkBAAAvAAAAAAAAAAAAAAAAAE9zCABvcmcvb3NnaS9zZXJ2aWNlL2NtL01hbmFnZWRTZXJ2aWNlRmFjdG9yeS5jbGFzc1BLAQIKAAoAAAAAAGtS7jRH/TecDAAAAAwAAAAfAAAAAAAAAAAAAAAAAAV1CABvcmcvb3NnaS9zZXJ2aWNlL2NtL3BhY2thZ2VpbmZvUEsBAgoACgAAAAAAa1LuNAAAAAAAAAAAAAAAABsAAAAAAAAAAAAAAAAATnUIAG9yZy9vc2dpL3NlcnZpY2UvY29tcG9uZW50L1BLAQIKAAoAAAAAAGtS7jS6YceiyAEAAMgBAAAzAAAAAAAAAAAAAAAAAId1CABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRDb25zdGFudHMuY2xhc3NQSwECCgAKAAAAAABrUu40FqlMbvsCAAD7AgAAMQAAAAAAAAAAAAAAAACgdwgAb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50Q29udGV4dC5jbGFzc1BLAQIKAAoAAAAAAGtS7jQhS75lLgQAAC4EAAAzAAAAAAAAAAAAAAAAAOp6CABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9Db21wb25lbnRFeGNlcHRpb24uY2xhc3NQSwECCgAKAAAAAABrUu40IgcyGOsAAADrAAAAMQAAAAAAAAAAAAAAAABpfwgAb3JnL29zZ2kvc2VydmljZS9jb21wb25lbnQvQ29tcG9uZW50RmFjdG9yeS5jbGFzc1BLAQIKAAoAAAAAAGtS7jSOGEtg0wAAANMAAAAyAAAAAAAAAAAAAAAAAKOACABvcmcvb3NnaS9zZXJ2aWNlL2NvbXBvbmVudC9D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0QgAb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9QSwECCgAKAAAAAABrUu40KoKjojQDAAA0AwAAMwAAAAAAAAAAAAAAAAAv0ggAb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9BdHRyaWJ1dGVEZWZpbml0aW9uLmNsYXNzUEsBAgoACgAAAAAAa1LuNGjHkqI6AQAAOgEAADMAAAAAAAAAAAAAAAAAtNUIAG9yZy9vc2dpL3NlcnZpY2UvbWV0YXR5cGUvTWV0YVR5cGVJbmZvcm1hdGlvbi5jbGFzc1BLAQIKAAoAAAAAAGtS7jQV+1nONQEAADUBAAAwAAAAAAAAAAAAAAAAAD/XCABvcmcvb3NnaS9zZXJ2aWNlL21ldGF0eXBlL01ldGFUeXBlUHJvdmlkZXIuY2xhc3NQSwECCgAKAAAAAABrUu40J86VemMBAABjAQAALwAAAAAAAAAAAAAAAADC2AgAb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9NZXRhVHlwZVNlcnZpY2UuY2xhc3NQSwECCgAKAAAAAABrUu40C5HDYQsCAAALAgAANQAAAAAAAAAAAAAAAABy2ggAb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9PYmplY3RDbGFzc0RlZmluaXRpb24uY2xhc3NQSwECCgAKAAAAAABrUu40hK4atwwAAAAMAAAAJQAAAAAAAAAAAAAAAADQ3AgAb3JnL29zZ2kvc2VydmljZS9tZXRhdHlwZS9wYWNrYWdlaW5mb1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAXAAAAAAAAAAAAAAAAAB/dCABvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1BLAQIKAAoAAAAAAGtS7jQxJUD6rgMAAK4DAAAyAAAAAAAAAAAAAAAAAFTdCABvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL0JhY2tpbmdTdG9yZUV4Y2VwdGlvbi5jbGFzc1BLAQIKAAoAAAAAAGtS7jQqazVtPwUAAD8FAAAoAAAAAAAAAAAAAAAAAFLhCABvcmcvb3NnaS9zZXJ2aWNlL3ByZWZzL1ByZWZlcmVuY2VzLmNsYXNzUEsBAgoACgAAAAAAa1LuNKRwP/hXAQAAVwEAAC8AAAAAAAAAAAAAAAAA1+YIAG9yZy9vc2dpL3Nl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aW4vVXNlckFkbWluRXZlbnQuY2xhc3NQSwECCgAKAAAAAABrUu402WByu9UAAADVAAAAMgAAAAAAAAAAAAAAAACMFQkAb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluTGlzdGVuZXIuY2xhc3NQSwECCgAKAAAAAABrUu40IpPghJkVAACZFQAANAAAAAAAAAAAAAAAAACxFgkAb3JnL29zZ2kvc2VydmljZS91c2VyYWRtaW4vVXNlckFkbWluUGVybWlzc2lvbi5jbGFzc1BLAQIKAAoAAAAAAGtS7jShHhFLfgoAAH4KAAA+AAAAAAAAAAAAAAAAAJwsCQBvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9Vc2VyQWRtaW5QZXJtaXNzaW9uQ29sbGVjdGlvbi5jbGFzc1BLAQIKAAoAAAAAAGtS7jSErhq3DAAAAAwAAAAmAAAAAAAAAAAAAAAAAHY3CQBvcmcvb3NnaS9zZXJ2aWNlL3VzZXJhZG1pbi9wYWNrYWdlaW5mb1BLAQIKAAoAAAAAAGtS7jQAAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAAAMY3CQBvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9QSwECCgAKAAAAAABrUu40Z2rUZXIDAAByAwAALgAAAAAAAAAAAAAAAAD/NwkAb3JnL29zZ2kvc2VydmljZS93aXJlYWRtaW4vQmFzaWNFbnZlbG9wZS5jbGFzc1BLAQIKAAoAAAAAAGtS7jSyg0dEDAEAAAwBAAApAAAAAAAAAAAAAAAAAL07CQBvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Db25zdW1lci5jbGFzc1BLAQIKAAoAAAAAAGtS7jTpJhJB7AAAAOwAAAApAAAAAAAAAAAAAAAAABA9CQBvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9FbnZlbG9wZS5jbGFzc1BLAQIKAAoAAAAAAGtS7jTqm6qYCgEAAAoBAAApAAAAAAAAAAAAAAAAAEM+CQBvcmcvb3NnaS9zZXJ2aWNlL3dpcmVhZG1pbi9Qcm9kdWNlci5jbGFzc1BLAQIKAAoAAAAAAGtS7jRYS4+0vQEAAL0BAAAlAAAAAAAAAAAAAAAAAJQ/CQBvcmcvb3NnaS9zZXJ2aWNlL3dp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