ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS8uZ2l0aWdub3JlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2NzhhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTcgQEAKKyMgZWNsaXBzZQorLmNsYXNzcGF0aAorLnByb2plY3QKKy5zZXR0aW5ncy8KK2Jpbi8KKworIyBncmFkbGUKKy5ncmFkbGUKK2J1aWxkLworCisjIGludGVsbGlqCisuaWRlYS8KK291dC8KKyouaXByCisqLmltbAorKi5pd3MKKy9iaW4vCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTElDRU5TRS50eHQgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZTA5NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDI3NyBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wCisKKyAgICBUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRQorICAgIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04KKyAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworICBhKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICBEaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKKyAgYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorICAgICBpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKyAgICAgaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKyAgd2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20KKyAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICJvcmlnaW5hdGVzIiBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5CisgIHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4KKyAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgIGFyZSBub3QgTW9kaWZpZWQgV29ya3MuCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKK2FyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUKK29yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCitBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQKK29yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisKKyJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyCitmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBQcm9ncmFtIGFuZCBmb3Igd2hpY2ggdGhlCitlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCityZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4KKworIk1vZGlmaWVkIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0gdGhhdAorcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCitjb250ZW50cyBvZiB0aGUgUHJvZ3JhbSwgaW5jbHVkaW5nLCBmb3IgcHVycG9zZXMgb2YgY2xhcml0eSBhbnkgbmV3IGZpbGUKK2luIFNvdXJjZSBDb2RlIGZvcm0gdGhhdCBjb250YWlucyBhbnkgY29udGVudHMgb2YgdGhlIFByb2dyYW0uIE1vZGlmaWVkCitXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsCitpbnRlcmZhY2VzLCB0eXBlcywgY2xhc3Nlcywgc3RydWN0dXJlcywgb3IgZmlsZXMgb2YgdGhlIFByb2dyYW0gc29sZWx5CitpbiBlYWNoIGNhc2UgaW4gb3JkZXIgdG8gbGluayB0bywgYmluZCBieSBuYW1lLCBvciBzdWJjbGFzcyB0aGUgUHJvZ3JhbQorb3IgTW9kaWZpZWQgV29ya3MgdGhlcmVvZi4KKworIkRpc3RyaWJ1dGUiIG1lYW5zIHRoZSBhY3RzIG9mIGEpIGRpc3RyaWJ1dGluZyBvciBiKSBtYWtpbmcgYXZhaWxhYmxlCitpbiBhbnkgbWFubmVyIHRoYXQgZW5hYmxlcyB0aGUgdHJhbnNmZXIgb2YgYSBjb3B5LgorCisiU291cmNlIENvZGUiIG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworbW9kaWZpY2F0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwKK2RvY3VtZW50YXRpb24gc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworIlNlY29uZGFyeSBMaWNlbnNlIiBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorVmVyc2lvbiAyLjAsIG9yIGFueSBsYXRlciB2ZXJzaW9ucyBvZiB0aGF0IGxpY2Vuc2UsIGluY2x1ZGluZyBhbnkKK2V4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcyBpZGVudGlmaWVkIGJ5IHRoZSBpbml0aWFsCitDb250cmlidXRvci4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKKyAgYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwKKyAgcHVibGljbHkgcGVyZm9ybSwgRGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKKyAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKworICBiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIHBhdGVudAorICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsCisgIGlmIGFueSwgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbAorICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0CisgIHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uCisgIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUKKyAgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKKyAgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCisgIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUKKyAgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCisgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMKKyAgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKKyAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKKyAgcmlnaHRzIGFuZCBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5CisgIGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbAorICBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5CisgIHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBEaXN0cmlidXRlIHRoZQorICBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZQorICBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCisgIGQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzCisgIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50CisgIHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKyAgZSkgTm90d2l0aHN0YW5kaW5nIHRoZSB0ZXJtcyBvZiBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UsIG5vCisgIENvbnRyaWJ1dG9yIG1ha2VzIGFkZGl0aW9uYWwgZ3JhbnRzIHRvIGFueSBSZWNpcGllbnQgKG90aGVyIHRoYW4KKyAgdGhvc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCdzCisgIHJlY2VpcHQgb2YgdGhlIFByb2dyYW0gdW5kZXIgdGhlIHRlcm1zIG9mIGEgU2Vjb25kYXJ5IExpY2Vuc2UKKyAgKGlmIHBlcm1pdHRlZCB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAzKS4KKworMy4gUkVRVUlSRU1FTlRTCisKKzMuMSBJZiBhIENvbnRyaWJ1dG9yIERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtIGluIGFueSBmb3JtLCB0aGVuOgorCisgIGEpIHRoZSBQcm9ncmFtIG11c3QgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSBhcyBTb3VyY2UgQ29kZSwgaW4KKyAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgIHRoZSBQcm9ncmFtIHdpdGggYSBzdGF0ZW1lbnQgdGhhdCB0aGUgU291cmNlIENvZGUgZm9yIHRoZSBQcm9ncmFtCisgIGlzIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kIGluZm9ybXMgUmVjaXBpZW50cyBob3cgdG8KKyAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZTsgYW5kCisKKyAgYikgdGhlIENvbnRyaWJ1dG9yIG1heSBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIHVuZGVyIGEgbGljZW5zZQorICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgIGkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCisgICAgIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kCisgICAgIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcworICAgICBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKKyAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCisgICAgIGlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cycgcmlnaHRzCisgICAgIGluIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBzZWN0aW9uIDMuMjsgYW5kCisKKyAgICAgaXYpIHJlcXVpcmVzIGFueSBzdWJzZXF1ZW50IGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBieSBhbnkKKyAgICAgcGFydHkgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMKKyAgICAgb2YgdGhpcyBzZWN0aW9uIDMuCisKKzMuMiBXaGVuIHRoZSBQcm9ncmFtIGlzIERpc3RyaWJ1dGVkIGFzIFNvdXJjZSBDb2RlOgorCisgIGEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZQorICBQcm9ncmFtIChpKSBpcyBjb21iaW5lZCB3aXRoIG90aGVyIG1hdGVyaWFsIGluIGEgc2VwYXJhdGUgZmlsZSBvcgorICBmaWxlcyBtYWRlIGF2YWlsYWJsZSB1bmRlciBhIFNlY29uZGFyeSBMaWNlbnNlLCBhbmQgKGlpKSB0aGUgaW5pdGlhbAorICBDb250cmlidXRvciBhdHRhY2hlZCB0byB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KKyAgRXhoaWJpdCBBIG9mIHRoaXMgQWdyZWVtZW50LCB0aGVuIHRoZSBQcm9ncmFtIG1heSBiZSBtYWRlIGF2YWlsYWJsZQorICB1bmRlciB0aGUgdGVybXMgb2Ygc3VjaCBTZWNvbmRhcnkgTGljZW5zZXMsIGFuZAorCisgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mCisgIHRoZSBQcm9ncmFtLgorCiszLjMgQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQsIHBhdGVudCwKK3RyYWRlbWFyaywgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zCitvZiBsaWFiaWxpdHkgKCJub3RpY2VzIikgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbSBmcm9tIGFueSBjb3B5IG9mCit0aGUgUHJvZ3JhbSB3aGljaCB0aGV5IERpc3RyaWJ1dGUsIHByb3ZpZGVkIHRoYXQgQ29udHJpYnV0b3JzIG1heSBhZGQKK3RoZWlyIG93biBhcHByb3ByaWF0ZSBub3RpY2VzLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcword2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCitsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLAordGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAorb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKK2xpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5CitvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikgYWdhaW5zdCBhbnkgbG9zc2VzLAorZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMKK2FuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0KK2luIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdAorYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkCitpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZAorQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCit3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLAorYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55CityZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CitwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCitwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQorY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKK2Fsb25lLiBVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8KK2RlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UKK2NsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvCitwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5Cit0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIgorQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgorSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRgorVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCithcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwKK3Jpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50LAoraW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMKK29yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgQU5EIFRPIFRIRSBFWFRFTlQKK1BFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVywgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMKK1NIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUCitQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCitDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUKK0VYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlcgorYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCittaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eQorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlCitQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlCitvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MKK3JpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YKK3RpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKK3JpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlCithbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4KK0hvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKK2dyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCitidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzIGNvcHlyaWdodGVkIGFuZAorbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZAorcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgordGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQKK1N0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24KK2lzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlCityZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZQorZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nCit2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitEaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzCityZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsCitDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cworQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLgorCitFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQKK3JlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwKK2VzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQKK3VuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAordG8gYmUgZW5mb3JjZWFibGUgYnkgYW55IGVudGl0eSB0aGF0IGlzIG5vdCBhIENvbnRyaWJ1dG9yIG9yIFJlY2lwaWVudC4KK05vIHRoaXJkLXBhcnR5IGJlbmVmaWNpYXJ5IHJpZ2h0cyBhcmUgY3JlYXRlZCB1bmRlciB0aGlzIEFncmVlbWVudC4KKworRXhoaWJpdCBBIC0gRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlCisKKyJUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcKK1NlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGgKK2luIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlLCB2LiAyLjAgYXJlIHNhdGlzZmllZDoge25hbWUgbGljZW5zZShzKSwKK3ZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uIgorCisgIFNpbXBseSBpbmNsdWRpbmcgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgdGhpcyBFeGhpYml0IEEKKyAgaXMgbm90IHN1ZmZpY2llbnQgdG8gbGljZW5zZSB0aGUgU291cmNlIENvZGUgdW5kZXIgU2Vjb25kYXJ5IExpY2Vuc2VzLgorCisgIElmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCisgIGZpbGUsIHRoZW4gWW91IG1heSBpbmNsdWRlIHRoZSBub3RpY2UgaW4gYSBsb2NhdGlvbiAoc3VjaCBhcyBhIExJQ0VOU0UKKyAgZmlsZSBpbiBhIHJlbGV2YW50IGRpcmVjdG9yeSkgd2hlcmUgYSByZWNpcGllbnQgd291bGQgYmUgbGlrZWx5IHRvCisgIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuCisKKyAgWW91IG1heSBhZGQgYWRkaXRpb25hbCBhY2N1cmF0ZSBub3RpY2VzIG9mIGNvcHlyaWdodCBvd25lcnNoaXAuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTk9USUNFLnR4dCBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9OT1RJQ0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjgxYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvTk9USUNFLnR4dApAQCAtMCwwICsxLDM4MiBAQAorIyBOb3RpY2VzIGZvciBFY2xpcHNlIE1ETXxCTAorCitUaGlzIGNvbnRlbnQgaXMgcHJvZHVjZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIEVjbGlwc2UgTURNfEJMIHByb2plY3QsCitpdCBpcyBhIHByb2plY3Qgb2YgdGhlIG9wZW5NRE0oUikgRWNsaXBzZSBXb3JraW5nIEdyb3VwLgorCisqIFByb2plY3QgaG9tZTogaHR0cHM6Ly9wcm9qZWN0cy5lY2xpcHNlLm9yZy9wcm9qZWN0cy90ZWNobm9sb2d5Lm1kbWJsCisKKyMjIFRyYWRlbWFya3MKKworRWNsaXBzZSBNRE18QkwsIE1ETXxCTCBhbmQgRWNsaXBzZSBvcGVuTURNKFIpIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcworb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4KKworIyMgQ29weXJpZ2h0CisKK0FsbCBjb250ZW50IGlzIHRoZSBwcm9wZXJ0eSBvZiB0aGUgZm9sbG93aW5nIHJlc3BlY3RpdmUgYXV0aG9ycyBvciB0aGVpciBlbXBsb3llcnMuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgYXV0aG9yc2hpcCBvZiBjb250ZW50LCBwbGVhc2UgY29uc3VsdCB0aGUgbGlzdGVkCitzb3VyY2UgY29kZSByZXBvc2l0b3J5IGxvZ3MuCisKK0NvcHlyaWdodCAoYykgMjAxNi0yMDE5IEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICitDb3B5cmlnaHQgKGMpIDIwMTYtMjAyMCBQZWFrIFNvbHV0aW9uIEdtYkgKK0NvcHlyaWdodCAoYykgMjAxNy0yMDE4IHNjaWVuY2UgKyBjb21wdXRpbmcgQUcgVHVlYmluZ2VuIChBVE9TIFNFKQorQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggQ2Fub28gRW5naW5lZXJpbmcgQUcKK0NvcHlyaWdodCAoYykgMjAxNyBGbG9yaWFuIFNjaG1pdHQKK0NvcHlyaWdodCAoYykgMjAxNy0yMDIwIEFuZ2VsaWthIFdpdHRlaworQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgRWxla3Ryb25pc2NoZSBGYWhyd2Vya3N5c3RlbWUgR01CSAorQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgS2FyYWt1biBBRworQ29weXJpZ2h0IChjKSAyMDE4LTIwMjAgQWxleGFuZGVyIE5laG1lcgorCisjIyBEZWNsYXJlZCBQcm9qZWN0IExpY2Vuc2VzCisKK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQordGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorCisjIyBTb3VyY2UgQ29kZQorCitUaGUgcHJvamVjdCBtYWludGFpbnMgdGhlIGZvbGxvd2luZyBzb3VyY2UgY29kZSByZXBvc2l0b3JpZXM6CisKK29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5naXQJICAgIC0gVGhlIG9wZW5NRE0oUikgQVBJLgorb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0LmdpdAkgICAgLSBFeHRlbnNpb24gb2YgdGhlIG9wZW5NRE0oUikgQVBJIGNvbnRhaW5pbmcgZGVmYXVsdCBlbGVtZW50cy4KK29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5naXQJLSBPRFMgaW1wbGVtZW50YXRpb24gb2YgcGVyc2lzdGVuY2UgYWRhcHRlci4KK29yZy5lY2xpcHNlLm1kbS5udWNsZXVzLmdpdAkgICAgICAgIC0gQ29yZSBidWlsZGluZyBibG9ja3MgZm9yIHRoZSBvcGVuTURNIEJ1c2luZXNzIExvZ2ljIGFuZCBXZWIgRnJvbnRlbmQuCisKKyMjIFRoaXJkLXBhcnR5IENvbnRlbnQKKworVGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4KK0lmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZworaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0bwordGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuCisKK2FudGxyNC00LjUuMy5qYXIoMi41LjMpCisgICAgKiBMaWNlbnNlOiBOZXcgQlNEIGxpY2Vuc2UKKworYW9wYWxsaWFuY2UtcmVwYWNrYWdlZC0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2NvbW1vbnMtY29kZWMtMS4yLmphciAoMS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLWh0dHBjbGllbnQtMy4xLmphciAgKDMuMSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworY29tbW9ucy1sYW5nMy0zLjguMS5qYXIgKDMuOC4xKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLXRleHQtMS42LmphciAoMS42KQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitnc29uLTIuNy5qYXIgKDIuNykKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR29vZ2xlIEd1YXZhIFZlcnNpb246IDI1LjAtanJlICAoMjUuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworR3JhZGxlIFdyYXBwZXIgKDQuMTAuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworaGsyLWFwaS0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMLTEuMQorCitoazItbG9jYXRvci0yLjUuMC1iMDUuamFyKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworaGsyLXV0aWxzLTIuNS4wLWIwNS5qYXIgKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworamFja3Nvbi1hbm5vdGF0aW9ucy0yLjkuMC5qYXIgICgyLjkuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1jb3JlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1kYXRhYmluZC0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1iYXNlLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyLTIuOS4yLmphcigyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamFja3Nvbi1tb2R1bGUtamF4Yi1hbm5vdGF0aW9ucy0yLjkuMi5qYXIgICgyLjkuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamF2YXNzaXN0LTMuMjAuMC1HQS5qYXIgICgyLjIwLjAtR0EpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgMi4wCisKK2pjbC1vdmVyLXNsZjRqLTEuNy4yNS5qYXIoMS43LjI1KQorICAgICogTGljZW5zZTogTUlUIExpY2Vuc2UKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbAorICAgICogUHJvamVjdCBVUkw6ICBodHRwczovL3d3dy5zbGY0ai5vcmcKKyAgICAqIFNvdXJjZSBVUkw6ICAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0agorCitqZXJzZXktY2xpZW50LTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1jb21tb24tMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtMi4yMy4yLmphciAgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi4yMy4zLmphcigyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1ndWF2YS0yLjIzLjIuamFyICAoMi4yMy4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqZXJzZXktbWVkaWEtamF4Yi0yLjIzLjIuamFyKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LW1lZGlhLXNzZS0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1tZWRpYS1tdWx0aXBhcnQtMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktc2VydmVyLTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworbG9nNGotb3Zlci1zbGY0ai0xLjcuMjUuamFyICgxLjcuMjUpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK2xvZ2JhY2stY2xhc3NpYy0xLjIuMy5qYXIoMS4yLjMpCisgICAgKiBMaWNlbnNlOiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMAorCitsb2diYWNrLWNvcmUtMS4yLjMuamFyKDEuMi4zKQorICAgICogTGljZW5zZTogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAxLjAKKworbWltZXB1bGwtMS45LjYuamFyICgxLjkuNCkKKyAgICAqIExpY2Vuc2U6IENEREwKKworb3BlbmF0ZngtMC43LjQuamFyICgwLjcuNCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworb3NnaS1yZXNvdXJjZS1sb2NhdG9yLTEuMC4xLmphcigxLjAuMSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworcHJvdG9idWYtamF2YS0zLjIuMC5qYXIgKDMuMi4wKQorICAgICogTGljZW5zZTogTmV3IEJTRCBsaWNlbnNlCisKK3Byb3RvYnVmLWphdmEtdXRpbC0zLjIuMC5qYXIgICgzLjIuMCkKKyAgICAqIExpY2Vuc2U6IE5ldyBCU0QgbGljZW5zZQorCitzd2FnZ2VyLWFubm90YXRpb25zLTIuMC44LmphciAoMi4wLjgpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK3N3YWdnZXItdWktMy4yMy4wLmphciAoMy4yMy4wKQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitzbGY0ai1hcGktMS43LjI1LmphciAgKDEuNy4yNSkKKyAgICAqIExpY2Vuc2U6IE1JVCBsaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vd3d3LnNsZjRqLm9yZy9saWNlbnNlLmh0bWwKKyAgICAqIFByb2plY3QgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vcW9zLWNoL3NsZjRqCisgICAgKiBTb3VyY2UgVVJMOiAgaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0ai9yZWxlYXNlcy90YWcvdl8xLjcuMjUKKworc3RheDItYXBpLTMuMS40LmphciAoMy4xLjQpCisgICAgKiBMaWNlbnNlOiBCU0QtMi1DbGF1c2UKKwordmFsaWRhdGlvbi1hcGktMS4xLjAuRmluYWwuamFyICgxLjEuMC5GaW5hbCkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK3ZhdnItMC45LjEtc291cmNlcy5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKwordmF2ci1tYXRjaC0wLjkuMS5qYXIgKDAuOS4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKword29vZHN0b3gtY29yZS1hc2wtNC40LjEuamFyICg0LjQuMSkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKKworRkZBTUZBTUZBTSBTaWxrIEljb24sIFZlcnNpb24gMS4zCisgICAgKiBMaWNlbnNlOiBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBMaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAvCisgICAgKiBQcm9qZWN0OiBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisgICAgKiBTb3VyY2U6ICBodHRwOi8vd3d3LmZhbWZhbWZhbS5jb20vbGFiL2ljb25zL3NpbGsvCisKK0Bhbmd1bGFyL2FuaW1hdGlvbnM6Ny4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvYW5pbWF0aW9ucworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvY2RrOjcuMS4xCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8vYXBpCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjEuMQorCisKK0Bhbmd1bGFyL2NvbW1vbkA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9jb21tb24KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40cgorCitAYW5ndWxhci9jb21waWxlckA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9jb3JlQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2Zvcm1zQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2h0dHBANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXJANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcm91dGVyQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK2Jvb3RzdHJhcEA0LjEuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcAorCitjbGFzcy10cmFuc2Zvcm1lckAwLjEuNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS90eXBlc3RhY2svY2xhc3MtdHJhbnNmb3JtZXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL2NsYXNzLXRyYW5zZm9ybWVyCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcGxlZXJvY2svY2xhc3MtdHJhbnNmb3JtZXIKKworY29yZS1qc0AyLjYuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL3JlbGVhc2VzL3RhZy92Mi42LjAKKworZmlsZS1zYXZlckAxLjMuMworICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9yYXcvbWFzdGVyL0xJQ0VOU0UubWQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzCisKK2ZvbnQtYXdlc29tZUA0LjcuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUvYmxvYi9tYXN0ZXIvTElDRU5TRS50eHQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL0ZvcnRBd2Vzb21lL0ZvbnQtQXdlc29tZQorCituZzItc3BsaXQtcGFuZUAxLjMuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZS9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZQorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3dhbm5hYmVnZWVrL25nMi1zcGxpdC1wYW5lCisKK25neC1ib290c3RyYXBAMy4xLjIKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC9ibG9iL3YzLjEuMi9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3ZhbG9yLXNvZnR3YXJlLmNvbS9uZ3gtYm9vdHN0cmFwCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vdmFsb3Itc29mdHdhcmUvbmd4LWJvb3RzdHJhcC90cmVlL3YzLjEuMgorCitAbmd4LXRyYW5zbGF0ZS9jb3JlQDExLjAuMQorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2NvcmUvYmxvYi92MTEuMC4xL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvY29yZQorCitAbmd4LXRyYW5zbGF0ZS9odHRwLWxvYWRlckA0LjAuMAorICAgICogTGljZW5zZTogTUlUIAorICAgICogTGljZW5jZSBQYXRoOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyL2Jsb2IvdjQuMC4wL0xJQ0VOU0UgIAorICAgICogUHJvamVjdCBVUkw6ICAgIGh0dHA6Ly93d3cubmd4LXRyYW5zbGF0ZS5jb20vCisgICAgKiBTb3VyY2UgVVJMOiAgICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvaHR0cC1sb2FkZXIvdHJlZS92NC4wLjAKKworcHJpbWVpY29uczoxLjAuMAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1laWNvbnMvYmxvYi8xLjAuMC9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZWljb25zL3RyZWUvMS4wLjAKKworcHJpbWVuZ0A3LjAuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1lbmcvYmxvYi83LjAuMS9MSUNFTlNFLm1kCisgICAgKiBQcm9qZWN0OiBodHRwczovL3d3dy5wcmltZWZhY2VzLm9yZy9wcmltZW5nCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZW5nL3RyZWUvNy4wLjEKKworcnhqc0A2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMworCityeGpzLWNvbXBhdDo2LjMuMworICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9yeGpzLWRldi5maXJlYmFzZWFwcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvdHJlZS82LjMuMy9jb21wYXQKKwordHNsaWJAMS45LjAKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvdHNsaWIvdHJlZS8xLjkuMAorCit6b25lLmpzQDAuOC4yNgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhcgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9yZWxlYXNlcy90YWcvdjAuOC4yNgorCitPTUcgRXZlbnQgU2VydmljZSBTcGVjaWZpY2F0aW9uICgxLjIpCisKKyogTGljZW5zZTogTGljZW5zZVJlZiAtIE9iamVjdC1NYW5hZ2VtZW50LUdyb3VwLUxpY2Vuc2UKKyogUHJvamVjdDogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yLworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9FVk5ULzEuMi9wZGYKKworT01HIE5vdGlmaWNhdGlvbiBTZXJ2aWNlIFNwZWNpZmljYXRpb24gKDEuMSkKKworKiBMaWNlbnNlOiBMaWNlbnNlUmVmIC0gT2JqZWN0LU1hbmFnZW1lbnQtR3JvdXAtTGljZW5zZQorKiBQcm9qZWN0OiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULworKiBTb3VyY2U6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xL1BERgorCitvZHM1MzAuaWRsCitEYXRlOiBIb2VoZW5raXJjaGVuLCAwNi8wMS8yMDE2CisiVGhlIEFTQU0gQm9hcmQgb2YgRGlyZWN0b3JzIHJlbGVhc2VzIHRoZSBJREwgZmlsZXMgZm9yIHVzZSB1bmRlciB0aGUgRVBMIHRvIHRoZSBFY2xpcHNlIElXRyBvcGVuTURNLgorVGhpcyBpcyB2YWxpZCBmb3IgYWxsIHZlcnNpb25zIG9mIEFTQU0gT0RTIDUuMy54LgorVGhpcyBwZXJtaXNzaW9uIGlzIHZhbGlkIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIEVjbGlwc2Ugd2lsbCBub3QgbW9kaWZ5IHRoZSBmaWxlLiIKKworQXZhbG9uRXZlbnQuaWRsLCBDb3JiYUZpbGVTZXJ2ZXIuaWRsCitEYXRlOiAwOC8xNS8yMDE2CisiSGVyZXdpdGgsIHdlIHJlbGVhc2UgdGhlIGdlbmVyYXRlZCBDbGllbnQtU291cmNlLUNvZGUgZ2VuZXJhdGVkIGZyb20gb3VyIENPUkJBIElETHMsIG5hbWVseQorKiBDT1JCQU5vdGlmaWNhdGlvbiBTZXJ2aWNlIChnZW5lcmF0ZWQgZnJvbSDigJ5BdmFsb25FdmVudC5pZGzigJ0pCisqIENPUkJBRmlsZVNlcnZlciAoZ2VuZXJhdGVkIGZyb20g4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCksCitVbmRlciB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAoRVBMKS4gVGhpcyBhZ3JlZW1lbnQgZG9lcyBub3QgaW5jbHVkZSB0aGUg4oCeQXZhbG9uRXZlbnQuaWRs4oCcIGFuZAor4oCeQ29yYmFGaWxlU2VydmVyLmlkbOKAnCBpdHNlbGYsIHdoaWNoIHJlbWFpbiBwcm90ZWN0ZWQgcHJvcGVydHkgb2YgSGlnaFFTb2Z0LiAiCisKKyMjIENyeXB0b2dyYXBoeQorCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5CittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzCitwZXJtaXR0ZWQuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvYnVpbGQuZ3JhZGxlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2J1aWxkLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQyYjAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworZGVzY3JpcHRpb24gPSAnTURNIEFQSSAtIEJhc2UgTW9kZWwnCitncm91cCA9ICdvcmcuZWNsaXBzZS5tZG0nCit2ZXJzaW9uID0gJzUuMi4wTTEnCisKK2FwcGx5IHBsdWdpbjogJ2phdmEnCithcHBseSBwbHVnaW46ICdtYXZlbicKK2FwcGx5IHBsdWdpbjogJ2VjbGlwc2UnCisKK3JlcG9zaXRvcmllcyB7CisgICAgbWF2ZW5Mb2NhbCgpCisgICAgbWF2ZW5DZW50cmFsKCkKK30KKworZGVwZW5kZW5jaWVzIHsKKyAgICAvLyB0ZXN0aW5nCisgICAgdGVzdENvbXBpbGUgJ2p1bml0Omp1bml0OjQuMTInCisgICAgdGVzdENvbXBpbGUgJ29yZy5tb2NraXRvOm1vY2tpdG8tY29yZToyLjEzLjAnIAorICAgIHRlc3RDb21waWxlICdvcmcuYXNzZXJ0ajphc3NlcnRqLWNvcmU6My42LjInCit9CisKK2phciB7CisJbWV0YUluZiB7IGZyb20gJ05PVElDRS50eHQnIH0KKwltZXRhSW5mIHsgZnJvbSAnTElDRU5TRS50eHQnIH0KK30KKwordGFzayBzb3VyY2VzSmFyKHR5cGU6IEphciwgZGVwZW5kc09uOiBjbGFzc2VzKSB7CisJY2xhc3NpZmllciA9ICdzb3VyY2VzJworCWZyb20gc291cmNlU2V0cy5tYWluLmFsbFNvdXJjZQorfQorCithcnRpZmFjdHMgeworCWFyY2hpdmVzIHNvdXJjZXNKYXIKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNTQzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitzb3VyY2VDb21wYXRpYmlsaXR5PTEuOAordGFyZ2V0Q29tcGF0aWJpbGl0eT0xLjgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMyNjVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmUwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQ0KK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cw0KK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FDQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMNCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00LjEwLjItYmluLnppcA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3LmJhdCBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU2NDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK0ByZW0NCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MNCitAcmVtDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsDQorDQorc2V0IERJUk5BTUU9JX5kcDANCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uDQorc2V0IEFQUF9CQVNFX05BTUU9JX5uMA0KK3NldCBBUFBfSE9NRT0lRElSTkFNRSUNCisNCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lg0KK3NldCBERUZBVUxUX0pWTV9PUFRTPQ0KKw0KK0ByZW0gRmluZCBqYXZhLmV4ZQ0KK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUNCisNCitzZXQgSkFWQV9FWEU9amF2YS5leGUNCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQ0KK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6ZmluZEphdmFGcm9tSmF2YUhvbWUNCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lDQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQ0KKw0KK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6aW5pdA0KK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMNCisNCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncw0KKw0KKzp3aW45eE1FX2FyZ3MNCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLg0KK3NldCBDTURfTElORV9BUkdTPQ0KK3NldCBfU0tJUD0yDQorDQorOndpbjl4TUVfYXJnc19zbHVycA0KK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlDQorDQorc2V0IENNRF9MSU5FX0FSR1M9JSoNCisNCis6ZXhlY3V0ZQ0KK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQ0KKw0KK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXINCisNCitAcmVtIEV4ZWN1dGUgR3JhZGxlDQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlDQorDQorOmVuZA0KK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kDQorDQorOmZhaWwNCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YNCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSENCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQ0KK2V4aXQgL2IgMQ0KKw0KKzptYWluRW5kDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwNCisNCis6b21lZ2ENCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvaW5pdGlhbF9jb21taXQubWQgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UvaW5pdGlhbF9jb21taXQubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9pbml0aWFsX2NvbW1pdC5tZApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NldHRpbmdzLmdyYWRsZSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zZXR0aW5ncy5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4Y2UxOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zZXR0aW5ncy5ncmFkbGUKQEAgLTAsMCArMSwxNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCityb290UHJvamVjdC5uYW1lID0gJ29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZScKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlQXBwbGljYXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUFwcGxpY2F0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYTM5NzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUFwcGxpY2F0aW9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmZpbGUuRmlsZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoU2VydmljZTsKKworLyoqCisgKiBCYXNlIGFwcGxpY2F0aW9uIGNvbnRleHQgcmVwcmVzZW50cyBhIGNvbm5lY3Rpb24vc2Vzc2lvbiB0byB0aGUgdW5kZXJseWluZworICogZGF0YSBzdG9yZS4gSXQgcHJvdmlkZXMgYWNjZXNzIHRvIG1hbmFnZXJzIGFuZCBzZXJ2aWNlcy4KKyAqCisgKiBAcGFyYW0gPFM+IFR5cGUgb2YgdGhlIGNvbm5lY3RlZCBlbnRpdHkgZmFjdG9yeS4KKyAqIEBwYXJhbSA8VD4gVHlwZSBvZiB0aGUgY29ubmVjdGVkIGVudGl0eSBtYW5hZ2VyLgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmFzZUFwcGxpY2F0aW9uQ29udGV4dDxTIGV4dGVuZHMgQmFzZUVudGl0eUZhY3RvcnksIFQgZXh0ZW5kcyBCYXNlRW50aXR5TWFuYWdlcj4KKwkJZXh0ZW5kcyBBdXRvQ2xvc2VhYmxlIHsKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VydmljZSBsb2FkcyBlbnRpdGllcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHN1Y2ggc2VydmljZSBpcyBhdmFpbGFibGUuCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxUPiBnZXRFbnRpdHlNYW5hZ2VyKCkgeworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VydmljZSBjcmVhdGVzIG5ldyBlbnRpdGllcy4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBubyBzdWNoIHNlcnZpY2UgaXMgYXZhaWxhYmxlLgorCSAqLworCWRlZmF1bHQgT3B0aW9uYWw8Uz4gZ2V0RW50aXR5RmFjdG9yeSgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJfQorCisJLyoqCisJICogVGhlIHJldHVybmVkIHNlcnZpY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCdzIG1ldGEgZGF0YS4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBubyBzdWNoIHNlcnZpY2UgaXMgYXZhaWxhYmxlLgorCSAqIEBzZWUgTW9kZWxNYW5hZ2VyCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxNb2RlbE1hbmFnZXI+IGdldE1vZGVsTWFuYWdlcigpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJfQorCisJLyoqCisJICogVGhlIHJldHVybmVkIHNlcnZpY2UgcHJvdmlkZXMgYWR2YW5jZWQgc2VhcmNoIGNhcGFiaWxpdGllcyBmb3Igc3VwcG9ydGVkCisJICogZW50aXR5IHR5cGVzLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHN1Y2ggc2VydmljZSBpcyBhdmFpbGFibGUuCisJICogQHNlZSBTZWFyY2hTZXJ2aWNlCisJICovCisJZGVmYXVsdCBPcHRpb25hbDxTZWFyY2hTZXJ2aWNlPiBnZXRTZWFyY2hTZXJ2aWNlKCkgeworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VydmljZSBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGxvdyBsZXZlbCBxdWVyeSBBUEkuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgbm8gc3VjaCBzZXJ2aWNlIGlzIGF2YWlsYWJsZS4KKwkgKiBAc2VlIFF1ZXJ5U2VydmljZQorCSAqLworCWRlZmF1bHQgT3B0aW9uYWw8UXVlcnlTZXJ2aWNlPiBnZXRRdWVyeVNlcnZpY2UoKSB7CisJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCX0KKworCS8qKgorCSAqIFRoZSByZXR1cm5lZCBzZXJ2aWNlIGFsbG93cyB0byBkb3dubG9hZCBsaW5rZWQgZmlsZXMgZnJvbSB0aGUgZmlsZSBzdG9yYWdlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHN1Y2ggc2VydmljZSBpcyBhdmFpbGFibGUuCisJICogQHNlZSBGaWxlU2VydmljZQorCSAqLworCWRlZmF1bHQgT3B0aW9uYWw8RmlsZVNlcnZpY2U+IGdldEZpbGVTZXJ2aWNlKCkgeworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBUaGUgcmV0dXJuZWQgc2VydmljZSBhbGxvd3MgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciBmb3IgZXZlbnRzIGF0IGEKKwkgKiByZWdpc3RyYXRpb24gc2VydmljZS4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBubyBzdWNoIHNlcnZpY2UgaXMgYXZhaWxhYmxlLgorCSAqIEBzZWUgTm90aWZpY2F0aW9uU2VydmljZQorCSAqLworCWRlZmF1bHQgT3B0aW9uYWw8Tm90aWZpY2F0aW9uU2VydmljZT4gZ2V0Tm90aWZpY2F0aW9uU2VydmljZSgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIG1hcCB3aXRoIGFsbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMsIHdoaWNoIHdoZXJlIGdpdmVuIHRvCisJICogaW5pdGlhbGl6ZSB0aGlzIGNvbnRleHQuCisJICogCisJICogQHJldHVybiBtYXAgd2l0aCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKwkgKi8KKwlNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhcmFtZXRlcnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBBUEkgaW1wbGVtZW50YXRpb24uCisJICogVGhlIGV4YWN0IGNvbnRlbnQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgYWRhcHRlciBhbmQgaXQgaXMgaW50ZW5kZWQgdG8gYmUKKwkgKiBpbnRlcnByZXRlZCBieSB0aGUgY2xpZW50LgorCSAqIAorCSAqIEByZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgdHlwZSBvZiB0aGUgdW5kZXJseWluZyBBUEkgaW1wbGVtZW50YXRpb24uCisJICovCisJU3RyaW5nIGdldEFkYXB0ZXJUeXBlKCk7CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIEJhc2VDb250ZXh0LgorCSAqIAorCSAqIFRoaXMgY2xvc2VzIGFsbCB1bmRlcmx5aW5nIG1hbmFnZXJzIGFuZCBzZXJ2aWNlcy4KKwkgKi8KKwl2b2lkIGNsb3NlKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUFwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjIwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUFwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5RmFjdG9yeTsKKworLyoqCisgKiBUYWtlcyBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYW5kIHByb2R1Y2VzIGEgY29ycmVzcG9uZGluZyBiYXNlIGFwcGxpY2F0aW9uCisgKiBjb250ZXh0LgorICoKKyAqIEBwYXJhbSA8VD4gVHlwZSBvZiB0aGUgY29ubmVjdGVkIGVudGl0eSBtYW5hZ2VyLgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmFzZUFwcGxpY2F0aW9uQ29udGV4dEZhY3Rvcnk8VCBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbkNvbnRleHQ8PyBleHRlbmRzIEJhc2VFbnRpdHlGYWN0b3J5LCA/IGV4dGVuZHMgQmFzZUVudGl0eU1hbmFnZXI+PiB7CisKKwkvKioKKwkgKiBUYWtlcyBnaXZlbiBjb25uZWN0aW9uIHBhcmFtZXRlcnMgYW5kIGNyZWF0ZXMgYSBuZXcgY29udGV4dCwgd2hpY2ggaXMKKwkgKiBwZXJtYW5lbnRseSBjb25uZWN0ZWQgd2l0aCBjb25maWd1cmVkIGRhdGEgc291cmNlLgorCSAqCisJICogQHBhcmFtIGNvbm5lY3Rpb25QYXJhbWV0ZXJzIFRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCisJICogQHJldHVybiBUaGUgY29ubmVjdGVkIGNvbnRleHQgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gY29ubmVjdCB0byBhIGRhdGEgc291cmNlLgorCSAqLworCVQgY29ubmVjdChNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUVudGl0eU1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlRW50aXR5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjU2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQmFzZUVudGl0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI4NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5SZWFkUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dERlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVkVmFsdWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CisKKy8qKgorICogUHJvdmlkZXMgYnVzaW5lc3MgbGF5ZXIgQ1JVRCBvcGVyYXRpb25zIGFuZCBzZXJ2aWNlcyAoQ1JFQVRFLCBSRUFELCBVUERBVEUsCisgKiBJTlNFUlQpLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIEJhc2VFbnRpdHlNYW5hZ2VyIHsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnZpcm9ubWVudH0gdGhpcyBlbnRpdHkgbWFuYWdlciBpcyBjb25uZWN0ZWQgdG8uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgRW52aXJvbm1lbnR9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSB7QGNvZGUKKwkgKiAJCUVudmlyb25tZW50fSAgICAgICAgLgorCSAqLworCUVudmlyb25tZW50IGxvYWRFbnZpcm9ubWVudCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFVzZXJ9IHdoaWNoIHdhcyB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIHVuZGVybHlpbmcgZGF0YQorCSAqIHNvdXJjZS4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiB0aGUgZGF0YSBzb3VyY2UgY29ubmVjdGlvbiBpcyB1c2VyCisJICogICAgICAgICBpbmRlcGVuZGVudCwgd2hpY2ggaXMgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHtAY29kZSBVc2VyfS4KKwkgKi8KKwlkZWZhdWx0IE9wdGlvbmFsPFVzZXI+IGxvYWRMb2dnZWRPblVzZXIoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBlbnRpdHkgaWRlbnRpZmllZCBieSBnaXZlbiBlbnRpdHkgY2xhc3MgYW5kIGl0cyBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdHkuCisJICogQHBhcmFtIGluc3RhbmNlSUQgIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIFRoZSBlbnRpdHkgd2l0aCBnaXZlbiBpbnN0YW5jZSBJRCBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZW50aXR5LgorCSAqLworCWRlZmF1bHQgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgbG9hZChDbGFzczxUPiBlbnRpdHlDbGFzcywgU3RyaW5nIGluc3RhbmNlSUQpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTGlzdDxUPiBlbnRpdGllcyA9IGxvYWQoZW50aXR5Q2xhc3MsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaW5zdGFuY2VJRCkpOworCQlpZiAoZW50aXRpZXMuc2l6ZSgpICE9IDEpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBlbnRpdHkgYnkgaW5zdGFuY2UgSUQuIik7CisJCX0KKwkJcmV0dXJuIGVudGl0aWVzLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgZW50aXRpZXMgaWRlbnRpZmllZCBieSBnaXZlbiBlbnRpdHkgY2xhc3MgYW5kIGl0cyBpbnN0YW5jZSBJRHMuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVHlwZSBvZiB0aGUgcmV0dXJuZWQgZW50aXRpZXMuCisJICogQHBhcmFtIGluc3RhbmNlSURzIFRoZSBpbnN0YW5jZSBJRHMgdG8gbG9hZC4gSWYgYSBpbnN0YW5jZSBJRCBkb2VzIG5vdCBleGlzdCwKKwkgKiAgICAgICAgICAgICAgICAgICAgaXQgaXMgaWdub3JlZC4KKwkgKiBAcmV0dXJuIEVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIGxpc3QuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGVudGl0aWVzLgorCSAqLworCTxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyBhbGwgYXZhaWxhYmxlIGVudGl0aWVzIG9mIGdpdmVuIHR5cGUuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGlsZQorCSAqIHdvcmtpbmcgd2l0aCB0eXBlcyB3aG9zZSBhbW91bnQgaXMga25vd24gdG8gYmUgZmFpcmx5IHNtYWxsIChlLmcuOgorCSAqIHtAY29kZSBVbml0fSwge0Bjb2RlIFF1YW50aXR5fSwgZXRjLikuIElmIGEgdHlwZSBpcyBnaXZlbiB3aGVyZSB0aG91c2FuZAorCSAqIGluc3RhbmNlcyBleGlzdCAoZS5nLjoge0Bjb2RlIFRlc3R9KSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2QgaXMKKwkgKiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4gVGhlIGZvbGxvd2luZyBpbnZvY2F0aW9uIG1pZ2h0IHRha2UgaXRzIHRpbWUgdG8KKwkgKiBjb21wbGV0ZSBvciBldmVuIHJlc3VsdCBpbiBhbiBleGNlcHRpb24gYXMgc29vbiBhcyB0b28gbWFueSByZXN1bHRzIGFyZQorCSAqIGZvdW5kOgorCSAqCisJICogPHByZT4KKwkgKiB7CisJICogCSYjNjQ7Y29kZQorCSAqIAlMaXN0PFRlc3Q+IHRlc3RzID0gZW50aXR5TWFuYWdlci5sb2FkQWxsKFRlc3QuY2xhc3MpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcmV0dXJuIEVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZW50aXRpZXMuCisJICogQHNlZSAjbG9hZEFsbChDbGFzcywgU3RyaW5nKQorCSAqLworCWRlZmF1bHQgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZEFsbChDbGFzczxUPiBlbnRpdHlDbGFzcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbG9hZEFsbChlbnRpdHlDbGFzcywgIioiKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyBhbGwgYXZhaWxhYmxlIGVudGl0aWVzIG9mIGdpdmVuIHR5cGUgd2hvc2UgbmFtZSBmdWxmaWxscyB0aGUgZ2l2ZW4KKwkgKiBwYXR0ZXJuLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgd2hpbGUgd29ya2luZyB3aXRoIHR5cGVzIHdob3NlIGFtb3VudCBpcyBrbm93bgorCSAqIHRvIGJlIGZhaXJseSBzbWFsbCAoZS5nLjoge0Bjb2RlIFVuaXR9LCB7QGNvZGUgUXVhbnRpdHl9LCBldGMuKS4gSWYgYSB0eXBlIGlzCisJICogZ2l2ZW4gd2hlcmUgdGhvdXNhbmQgaW5zdGFuY2VzIGV4aXN0IChlLmcuOiB7QGNvZGUgVGVzdH0pIHRoZSBiZWhhdmlvciBvZgorCSAqIHRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLiBUaGUgZm9sbG93aW5nIGludm9jYXRpb24gbWlnaHQgdGFrZQorCSAqIGl0cyB0aW1lIHRvIGNvbXBsZXRlIG9yIGV2ZW4gcmVzdWx0IGluIGFuIGV4Y2VwdGlvbiBhcyBzb29uIGFzIHRvbyBtYW55CisJICogcmVzdWx0cyBhcmUgZm91bmQ6CisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCS8vIHJldHJpZXZlIGFsbCB0ZXN0cyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICdFeGFtcGxlJworCSAqIAlMaXN0PFRlc3Q+IHRlc3RzID0gZW50aXR5TWFuYWdlci5sb2FkQWxsKFRlc3QuY2xhc3MsICJFeGFtcGxlKiIpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gcGF0dGVybiAgICAgSXMgYWx3YXlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZAorCSAqICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6ICI/IiBmb3Igb25lIG1hdGNoaW5nIGNoYXJhY3RlciBhbmQKKwkgKiAgICAgICAgICAgICAgICAgICAgIioiIGZvciBhIHNlcXVlbmNlIG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMuCisJICogQHJldHVybiBNYXRjaGVkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgZW50aXRpZXMuCisJICogQHNlZSAjbG9hZEFsbChDbGFzcykKKwkgKi8KKwk8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdHJpbmcgcGF0dGVybikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgcGFyZW50IGVudGl0eSBmb3IgZ2l2ZW4gY2hpbGQuIEVhY2ggbW9kZWxlZCBlbnRpdHkgcHJvdmlkZXMgcHVibGljCisJICogZmllbGRzIGZvciBhdmFpbGFibGUgcGFyZW50IGVudGl0eSB0eXBlcyBlLmcuOgorCSAqCisJICogPHByZT4KKwkgKiB7CisJICogCSYjNjQ7Y29kZQorCSAqIAlPcHRpb25hbDxUZXN0PiBwYXJlbnRUZXN0ID0gZW50aXR5TWFuYWdlci5sb2FkUGFyZW50KHRlc3RTdGVwLCBUZXN0U3RlcC5QQVJFTlRfVFlQRV9URVNUKTsKKwkgKiB9CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgcGFyZW50IHR5cGUuCisJICogQHBhcmFtIGNoaWxkICAgICAgIFRoZSBjaGlsZCBlbnRpdHkuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFRoZSBkZXNpcmVkIHBhcmVudCBlbnRpdHkgdHlwZS4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgcGFyZW50IGVudGl0eSBjb3VsZCBub3QgYmUgZm91bmQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgcGFyZW50IGVudGl0eS4KKwkgKi8KKwk8VCBleHRlbmRzIEVudGl0eT4gT3B0aW9uYWw8VD4gbG9hZFBhcmVudChFbnRpdHkgY2hpbGQsIENsYXNzPFQ+IGVudGl0eUNsYXNzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIExvYWRzIGFsbCByZWxhdGVkIGNoaWxkcmVuIG9mIGdpdmVuIHR5cGUgZm9yIGdpdmVuIHBhcmVudCBlbnRpdHkuIEVhY2gKKwkgKiBtb2RlbGVkIGVudGl0eSBwcm92aWRlcyBwdWJsaWMgZmllbGRzIGZvciBhdmFpbGFibGUgY2hpbGQgZW50aXR5IHR5cGVzIGUuZy46CisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCUxpc3Q8Q2hhbm5lbD4gY2hhbm5lbHMgPSBlbnRpdHlNYW5hZ2VyLmxvYWRDaGlsZHJlbihtZWFzdXJlbWVudCwgTWVhc3VyZW1lbnQuQ0hJTERfVFlQRV9DSEFOTkVMKTsKKwkgKiB9CisJICogPC9wcmU+CisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgY2hpbGQgdHlwZS4KKwkgKiBAcGFyYW0gcGFyZW50ICAgICAgVGhlIHBhcmVudCBlbnRpdHkuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFRoZSBkZXNpcmVkIGNoaWxkIGVudGl0eSB0eXBlLgorCSAqIEByZXR1cm4gUmVsYXRlZCBjaGlsZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGNoaWxkcmVuLgorCSAqIEBzZWUgI2xvYWRDaGlsZHJlbihFbnRpdHksIENsYXNzLCBTdHJpbmcpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQ2hpbGRyZW4oRW50aXR5IHBhcmVudCwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRDaGlsZHJlbihwYXJlbnQsIGVudGl0eUNsYXNzLCAiKiIpOworCX0KKworCS8qKgorCSAqIExvYWRzIGFsbCByZWxhdGVkIGNoaWxkcmVuIG9mIGdpdmVuIHR5cGUgZm9yIGdpdmVuIHBhcmVudCBlbnRpdHkgd2hvc2UgbmFtZQorCSAqIGZ1bGZpbGxzIHRoZSBnaXZlbiBwYXR0ZXJuLiBFYWNoIG1vZGVsZWQgZW50aXR5IHByb3ZpZGVzIHB1YmxpYyBmaWVsZHMgZm9yCisJICogYXZhaWxhYmxlIGNoaWxkIGVudGl0eSB0eXBlcyBlLmcuOgorCSAqCisJICogPHByZT4KKwkgKiB7CisJICogCSYjNjQ7Y29kZQorCSAqIAlMaXN0PFRlc3RTdGVwPiB0ZXN0U3RlcHMgPSBlbnRpdHlNYW5hZ2VyLmxvYWRDaGlsZHJlbih0ZXN0LCBUZXN0LkNISUxEX1RZUEVfVEVTVFNURVAsICJFeGFtcGxlKiIpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCBjaGlsZCB0eXBlLgorCSAqIEBwYXJhbSBwYXJlbnQgICAgICBUaGUgcGFyZW50IGVudGl0eS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVGhlIGRlc2lyZWQgY2hpbGQgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIHBhdHRlcm4gICAgIElzIGFsd2F5cyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQKKwkgKiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcyBmb2xsb3dzOiAiPyIgZm9yIG9uZSBtYXRjaGluZyBjaGFyYWN0ZXIgYW5kCisJICogICAgICAgICAgICAgICAgICAgICIqIiBmb3IgYSBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gTWF0Y2hlZCBjaGlsZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGNoaWxkcmVuLgorCSAqIEBzZWUgI2xvYWRDaGlsZHJlbihFbnRpdHksIENsYXNzKQorCSAqLworCTxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRDaGlsZHJlbihFbnRpdHkgcGFyZW50LCBDbGFzczxUPiBlbnRpdHlDbGFzcywgU3RyaW5nIHBhdHRlcm4pCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIFF1ZXJpZXMgYXZhaWxhYmxlIHtAbGluayBDb250ZXh0VHlwZX0gZm9yIGdpdmVuIHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHREZXNjcmliYWJsZSBFaXRoZXIgYSB7QGxpbmsgVGVzdFN0ZXB9IG9yIGEge0BsaW5rIE1lYXN1cmVtZW50fQorCSAqIEByZXR1cm4ge0Bjb2RlIExpc3R9IGNvbnRhaW5zIHRoZSB7QGNvZGUgQ29udGV4dFR5cGV9IG9mIGVhY2ggcmVmZXJlbmNlZAorCSAqICAgICAgICAge0BsaW5rIENvbnRleHRSb290fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBxdWVyeSB0aGUgYXZhaWxhYmxlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBDb250ZXh0VHlwZX1zLgorCSAqLworCUxpc3Q8Q29udGV4dFR5cGU+IGxvYWRDb250ZXh0VHlwZXMoQ29udGV4dERlc2NyaWJhYmxlIGNvbnRleHREZXNjcmliYWJsZSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgcmVxdWVzdGVkIHtAbGluayBDb250ZXh0Um9vdH1zIGZvciBnaXZlbgorCSAqIHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHREZXNjcmliYWJsZSBFaXRoZXIgYSB7QGxpbmsgVGVzdFN0ZXB9IG9yIHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHBhcmFtIGNvbnRleHRUeXBlcyAgICAgICBUaGUgcmVxdWVzdGVkIGNvbnRleHQgdHlwZXMuIElmIG9taXR0ZWQsIGFsbCB0eXBlcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGJlIGxvYWRlZC4KKwkgKiBAcmV0dXJuIFRoZSBvcmRlcmVkIGNvbnRleHRzIGZvciBnaXZlbiB7QGNvZGUgVGVzdFN0ZXB9IG9yIHRoZSBtZWFzdXJlZCBvbmVzCisJICogICAgICAgICBmb3Ige0Bjb2RlIE1lYXN1cmVtZW50fSBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTWFwfS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUge0Bjb2RlCisJICogCQlDb250ZXh0Um9vdH0gICAgICAgIHMuCisJICogQHNlZSBDb250ZXh0VHlwZQorCSAqLworCU1hcDxDb250ZXh0VHlwZSwgQ29udGV4dFJvb3Q+IGxvYWRDb250ZXh0cyhDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlLCBDb250ZXh0VHlwZS4uLiBjb250ZXh0VHlwZXMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICAgVGhlIGVudGl0eQorCSAqIEBwYXJhbSByZWxhdGlvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uLCB3aGljaCBlbnRpdGllcyBzaG91bGQgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgIGxvYWRlZC4KKwkgKiBAcGFyYW0gcmVsYXRlZENsYXNzIENsYXNzIG9mIHRoZSByZWxhdGVkIGVudGl0aWVzLgorCSAqIEByZXR1cm4gVGhlIHJlbGF0ZWQgZW50aXRpZXMgZm9yIHRoZSBnaXZlbiB7QGxpbmsgRW50aXR5fSBhbmQgcmVsYXRpb25OYW1lCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZFJlbGF0ZWRFbnRpdGllcyhFbnRpdHkgZW50aXR5LCBTdHJpbmcgcmVsYXRpb25OYW1lLCBDbGFzczxUPiByZWxhdGVkQ2xhc3MpOworCisJLyoqCisJICogUmV0cmlldmVzIHRoZSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IGFzIHNwZWNpZmllZCBieSB0aGUgZ2l2ZW4KKwkgKiB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFByb3ZpZGVzIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbnMgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHtAY29kZSBNZWFzdXJlZFZhbHVlc30gaW4gYSB7QGNvZGUgTGlzdH0gYXMgc3BlY2lmaWVkIGluCisJICogICAgICAgICB0aGUgZ2l2ZW4ge0Bjb2RlIFJlYWRSZXF1ZXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBhY2Nlc3MgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKi8KKwlMaXN0PE1lYXN1cmVkVmFsdWVzPiByZWFkTWVhc3VyZWRWYWx1ZXMoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVHJhbnNhY3Rpb259IGZvciBtb2RpZnlpbmcgYWNjZXNzLgorCSAqCisJICogQHJldHVybiBBIG5ldyB7QGNvZGUgVHJhbnNhY3Rpb259IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBhIG5ldworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgVHJhbnNhY3Rpb259LgorCSAqLworCVRyYW5zYWN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIFJldHVybnMgbGlua3MgdG8gdGhlIGdpdmVuIGVudGl0aWVzIGluIHRoZSBkYXRhIHN0b3JlLiBUaGUgZm9ybWF0IG9mIHRoZQorCSAqIGxpbmtzIGlzIGFkYXB0ZXIgc3BlY2lmaWMgYW5kIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgZGF0YSBzdG9yZS4gVGhlIGxpbmtzCisJICogY2FuIGJlIHVzZWQgYnkgdGhlIGNsaWVudCB0byBkaXJlY3RseSBhY2Nlc3MgdGhlIGVudGl0aWVzIGJ5IGJ5cGFzc2luZyB0aGUKKwkgKiBNRE0gQVBJLCBpZiB0aGUgY2xpZW50IGlzIGNhcGFibGUgb2YgYWNjZXNzaW5nIHRoZSBhZGFwdGVycyBkYXRhIHN0b3JlLiBUaGUKKwkgKiBjbGllbnQgY2FuIGludm9rZSB7QGxpbmsgQmFzZUFwcGxpY2F0aW9uQ29udGV4dCNnZXRBZGFwdGVyVHlwZSgpfSB0byBnZXQgdGhlCisJICogdHlwZSBvZiB0aGUgYWRhcHRlci4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXRpZXMgdGhlIEVudGl0aWVzIGZvciB3aGljaCB0aGUgbGlua3MgYXJlIHJldHJpZXZlZAorCSAqIEByZXR1cm4gdGhlIGxpbmtzIHRvIHRoZSBnaXZlbiBlbnRpdGllcyBpbiB0aGUgZGF0YSBzdG9yZSBhYnN0cmFjdGVkIGJ5IHRoZQorCSAqICAgICAgICAgY3VycmVudCBhZGFwdGVyLiBUaGUgbWFwIGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgZW50aXRpZXMgYXMga2V5cyBhbmQKKwkgKiAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIGxpbmtzIGFzIHZhbHVlcy4KKwkgKi8KKwlNYXA8RW50aXR5LCBTdHJpbmc+IGdldExpbmtzKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcyk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQ29ubmVjdGlvbkV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0Nvbm5lY3Rpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDcxMTIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0Nvbm5lY3Rpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCisvKioKKyAqIFRocm93biB0byBpbmRpY2F0ZSAoZGlzLSljb25uZWN0IGVycm9ycyB3aXRoIGEgZGF0YSBzb3VyY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTI5OTY4NTcwNTE4NjQ4NDk3Mkw7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgQ29ubmVjdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworCQlzdXBlcihtZXNzYWdlKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtZXNzYWdlICAgVGhlIGVycm9yIG1lc3NhZ2UuCisJICogQHBhcmFtIHRocm93YWJsZSBUaGUgb3JpZ2luIGNhdXNlLgorCSAqLworCXB1YmxpYyBDb25uZWN0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIHRocm93YWJsZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0YjVlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCisvKioKKyAqIFRoaXMgZXhjZXB0aW9uIGluZGljYXRlcyB0aGF0IGEgc2VydmljZSBpcyBub3QgcHJvdmlkZWQgYnkgYW4gYWRhcHRlci4KKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTQ4Mjk2MTgwMzY5NTg5Mjk0MTVMOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY2xhenogdGhlIHNlcnZpY2UgdGhhdCBpcyBub3QgcHJvdmlkZWQKKwkgKi8KKwlwdWJsaWMgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKENsYXNzPD8+IGNsYXp6KSB7CisJCXN1cGVyKCJUaGUgc2VydmljZSAnIiArIGNsYXp6ICsgIicgaXMgbm90IGltcGxlbWVudGVkISIpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9UcmFuc2FjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1RyYW5zYWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNzhmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9UcmFuc2FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Xcml0ZVJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlZFZhbHVlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBidXNpbmVzcyBsYXllciB3cml0ZSBvcGVyYXRpb25zIChDUkVBVEUsIFVQREFURSwgREVMRVRFKS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBUcmFuc2FjdGlvbiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvLyBUT0RPOiBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYSBhdHRhY2ggYSBsaXN0ZW5lcgorCS8vIC0+IHByb2dyZXNzIG5vdGlmaWNhdGlvbiB1cGRhdGVzIHdoaWxlIHVwbG9hZGluZyBmaWxlcworCS8vIC0+IGFueSBvdGhlciB1c2VmdWwgaW5mb3JtYXRpb25zPyEKKworCS8qKgorCSAqIFBlcnNpc3RzIGdpdmVuIGVudGl0aWVzIGFuZCBpbXBsaWNpdGx5IHVwZGF0ZXMgdGhlaXIgaW5zdGFuY2UgSURzLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgIE1vc3QgY29tbW9uIHR5cGUgb2YgdGhlIGdpdmVuIGVudGl0aWVzLgorCSAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllcyB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgd3JpdGluZyBlbnRpdGllcy4KKwkgKi8KKwk8VCBleHRlbmRzIEVudGl0eT4gdm9pZCBjcmVhdGUoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBVcGRhdGVzIGdpdmVuIGVudGl0aWVzLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgIE1vc3QgY29tbW9uIHR5cGUgb2YgdGhlIGdpdmVuIGVudGl0aWVzLgorCSAqIEBwYXJhbSBlbnRpdGllcyBFbnRpdGllcyB0aGF0IHdpbGwgYmUgdXBkYXRlZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIHdyaXRpbmcgZW50aXRpZXMuCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IHZvaWQgdXBkYXRlKENvbGxlY3Rpb248VD4gZW50aXRpZXMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogRGVsZXRlcyBnaXZlbiBlbnRpdGllcy4gUmVsYXRlZCBjaGlsZHJlbiB3aWxsIGJlIHNlYXJjaGVkIGFuZCBhdXRvbWF0aWNhbGx5CisJICogcmVtb3ZlZC4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICBNb3N0IGNvbW1vbiB0eXBlIG9mIHRoZSBnaXZlbiBlbnRpdGllcy4KKwkgKiBAcGFyYW0gZW50aXRpZXMgRW50aXRpZXMgdGhhdCB3aWxsIGJlIGRlbGV0ZWQgKGluY2x1ZGluZyB0aGVpciBjaGlsZHJlbikuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBkZWxldGluZyBlbnRpdGllcy4KKwkgKi8KKwk8VCBleHRlbmRzIERlbGV0YWJsZT4gdm9pZCBkZWxldGUoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBDcmVhdGVzIHtAbGluayBNZWFzdXJlZFZhbHVlc30gYXMgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbgorCSAqIHtAbGluayBXcml0ZVJlcXVlc3R9cy4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3RzIFByb3ZpZGVzIGFsbCByZXF1aXJlZCBpbmZvcm1hdGlvbnMgdG8gcHJvY2VzcyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGNyZWF0ZSBzcGVjaWZpZWQgbWVhc3VyZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLgorCSAqLworCXZvaWQgd3JpdGVNZWFzdXJlZFZhbHVlcyhDb2xsZWN0aW9uPFdyaXRlUmVxdWVzdD4gd3JpdGVSZXF1ZXN0cykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBDb21taXQgdGhpcyB0cmFuc2FjdGlvbi4gQW55IGNoYW5nZXMgbWFkZSB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbiBiZWNvbWUKKwkgKiBwZXJtYW5lbnQuCisJICoKKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBjb21taXQgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwl2b2lkIGNvbW1pdCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogQWJvcnRzIChyb2xsYmFjaykgdGhpcyB0cmFuc2FjdGlvbi4gQW55IGNoYW5nZXMgbWFkZSB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbgorCSAqIHdpbGwgYmUgbG9zdC4KKwkgKi8KKwl2b2lkIGFib3J0KCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2ODI5YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbW9kZWxlZCBhdHRyaWJ1dGUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEVudGl0eVR5cGUKKyAqIEBzZWUgVmFsdWVUeXBlCisgKiBAc2VlIFZhbHVlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlUeXBlfSB0aGlzIGF0dHJpYnV0ZSBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUgb3duaW5nIHtAY29kZSBFbnRpdHlUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB1bml0IG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB1bml0IG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJU3RyaW5nIGdldFVuaXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBWYWx1ZVR5cGV9IG9mIHRoaXMgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFZhbHVlVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJVmFsdWVUeXBlIGdldFZhbHVlVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZW51bWVyYXRpb24ge0Bjb2RlIENsYXNzfSBhc3NvY2lhdGVkIHdpdGggdGhpcyB7QGNvZGUgQXR0cmlidXRlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGVudW1lcmF0aW9uIHtAY29kZSBDbGFzc30gYXNzb2NpYXRlZCB3aXRoIHRoaXMge0Bjb2RlIEF0dHJpYnV0ZX0KKwkgKiAgICAgICAgIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB0aGUge0BsaW5rIFZhbHVlVHlwZX0gb2YgdGhpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBBdHRyaWJ1dGV9IGlzIG5laXRoZXIKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVmFsdWVUeXBlI0VOVU1FUkFUSU9OfSBub3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVmFsdWVUeXBlI0VOVU1FUkFUSU9OX1NFUVVFTkNFfS4KKwkgKi8KKwlFbnVtZXJhdGlvbjw/PiBnZXRFbnVtT2JqKCk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFuZCBlbXB0eSB7QGxpbmsgVmFsdWV9LgorCSAqCisJICogQHJldHVybiBDcmVhdGVkIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVWYWx1ZSgpIHsKKwkJVmFsdWVUeXBlIHZhbHVlVHlwZSA9IGdldFZhbHVlVHlwZSgpOworCQlpZiAodmFsdWVUeXBlLmlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCXJldHVybiB2YWx1ZVR5cGUuY3JlYXRlKGdldEVudW1PYmooKSwgZ2V0TmFtZSgpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB2YWx1ZVR5cGUuY3JlYXRlKGdldE5hbWUoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZX0gd2l0aCBnaXZlbiBpbml0aWFsIHZhbHVlLgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSBpbml0aWFsIHZhbHVlLgorCSAqIEByZXR1cm4gQ3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgVmFsdWUgY3JlYXRlVmFsdWUoT2JqZWN0IGlucHV0KSB7CisJCXJldHVybiBjcmVhdGVWYWx1ZSgiIiwgaW5wdXQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFZhbHVlfSB3aXRoIGdpdmVuIHVuaXQgbmFtZSBhbmQgaW5pdGlhbCB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB1bml0ICBUaGUgbmFtZSBvZiB1bml0LgorCSAqIEBwYXJhbSBpbnB1dCBUaGUgaW5pdGlhbCB2YWx1ZS4KKwkgKiBAcmV0dXJuIENyZWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFZhbHVlIGNyZWF0ZVZhbHVlKFN0cmluZyB1bml0LCBPYmplY3QgaW5wdXQpIHsKKwkJcmV0dXJuIGNyZWF0ZVZhbHVlKHVuaXQsIHRydWUsIGlucHV0KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHNlcXVlbmNlIHtAbGluayBWYWx1ZX0gd2l0aCBnaXZlbiB1bml0IG5hbWUgYW5kIGluaXRpYWwgdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdW5pdCAgVGhlIG5hbWUgb2YgdW5pdC4KKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHJldHVybiBDcmVhdGVkIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVWYWx1ZVNlcShTdHJpbmcgdW5pdCwgT2JqZWN0IGlucHV0KSB7CisJCWlmIChnZXRWYWx1ZVR5cGUoKS5pc0VudW1lcmF0aW9uVHlwZSgpKSB7CisJCQlyZXR1cm4gY3JlYXRlRW51bWVyYXRpb25TZXF1ZW5jZSh1bml0LCBpbnB1dCk7CisJCX0KKwkJcmV0dXJuIGNyZWF0ZVZhbHVlU2VxdWVuY2UodW5pdCwgaW5wdXQpOworCX0KKworCWRlZmF1bHQgVmFsdWUgY3JlYXRlVmFsdWVTZXF1ZW5jZShTdHJpbmcgdW5pdCwgT2JqZWN0IGlucHV0KSB7CisJCVZhbHVlVHlwZSB2YWx1ZVR5cGUgPSBnZXRWYWx1ZVR5cGUoKTsKKwkJdHJ5IHsKKwkJCUZpZWxkIGZpZWxkID0gdmFsdWVUeXBlLmdldENsYXNzKCkuZ2V0RmllbGQodmFsdWVUeXBlLm5hbWUoKSArICJfU0VRVUVOQ0UiKTsKKwkJCVZhbHVlVHlwZTw/PiBzZXF1ZW5jZVZhbHVlVHlwZSA9IChWYWx1ZVR5cGU8Pz4pIGZpZWxkLmdldCh2YWx1ZVR5cGUpOworCQkJcmV0dXJuIHNlcXVlbmNlVmFsdWVUeXBlLmNyZWF0ZShnZXROYW1lKCksIHVuaXQsIHRydWUsIGlucHV0KTsKKworCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB8IENsYXNzQ2FzdEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbid0IGZpZ3VyZSBvdXQgc2VxdWVuY2UgdHlwZSBmb3IgIiArIHZhbHVlVHlwZS5uYW1lKCkpOworCQl9CisJfQorCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVFbnVtZXJhdGlvblNlcXVlbmNlKFN0cmluZyB1bml0LCBPYmplY3QgaW5wdXQpIHsKKwkJVmFsdWVUeXBlIHZhbHVlVHlwZSA9IGdldFZhbHVlVHlwZSgpLnRvU2VxdWVuY2VUeXBlKCk7CisJCXJldHVybiB2YWx1ZVR5cGUuY3JlYXRlKGdldE5hbWUoKSwgdW5pdCwgdHJ1ZSwgaW5wdXQsIGdldEVudW1PYmooKS5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFZhbHVlfSB3aXRoIGdpdmVuIHVuaXQgbmFtZSwgaW5pdGlhbCB2YWxpZCBmbGFnIGFuZAorCSAqIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHVuaXQgIFRoZSBuYW1lIG9mIHVuaXQuCisJICogQHBhcmFtIHZhbGlkIFRoZSBpbml0aWFsIHZhbGlkIGZsYWcuCisJICogQHBhcmFtIGlucHV0IFRoZSBpbml0aWFsIHZhbHVlLgorCSAqIEByZXR1cm4gQ3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgVmFsdWUgY3JlYXRlVmFsdWUoU3RyaW5nIHVuaXQsIGJvb2xlYW4gdmFsaWQsIE9iamVjdCBpbnB1dCkgeworCQlWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlID0gZ2V0VmFsdWVUeXBlKCk7CisJCWlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0TmFtZSgpLCB1bml0LCB2YWxpZCwgaW5wdXQsIGdldEVudW1PYmooKS5nZXROYW1lKCkpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0TmFtZSgpLCB1bml0LCB2YWxpZCwgaW5wdXQpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgcmV0dXJuZWQuCisJICovCisJQE92ZXJyaWRlCisJU3RyaW5nIHRvU3RyaW5nKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0NoaWxkcmVuU3RvcmUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0NoaWxkcmVuU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDJhNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvQ2hpbGRyZW5TdG9yZS5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKKworLyoqCisgKiBIb2xkcyByZWxhdGVkIGVudGl0aWVzIG9mIGFueSBraW5kIGFuZCBrZWVwcyB0cmFjayBvZiBtb2RpZmljYXRpb25zLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2hpbGRyZW5TdG9yZSB7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gY3VycmVudCA9IG5ldyBIYXNoTWFwPD4oMCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIERlbGV0YWJsZT4sIExpc3Q8PyBleHRlbmRzIERlbGV0YWJsZT4+IHJlbW92ZWQgPSBuZXcgSGFzaE1hcDw+KDApOworCisJLyoqCisJICogUmV0dXJucyBjdXJyZW50IHNldCBvZiByZWxhdGVkIGNoaWxkcmVuIG1hcHBlZCBieSB0aGVpciB0eXBlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTWFwfSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIE1hcDxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZ2V0Q3VycmVudCgpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChjdXJyZW50KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnQgc2V0IG9mIHJlbW92ZWQgcmVsYXRlZCBjaGlsZHJlbiBtYXBwZWQgYnkgdGhlaXIgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIE1hcH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBNYXA8Q2xhc3M8PyBleHRlbmRzIERlbGV0YWJsZT4sIExpc3Q8PyBleHRlbmRzIERlbGV0YWJsZT4+IGdldFJlbW92ZWQoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVtb3ZlZCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyByZWxhdGVkIGNoaWxkIGVudGl0aWVzIG9mIGdpdmVuIHR5cGUuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgRGVzaXJlZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBEZWxldGFibGU+IExpc3Q8VD4gZ2V0KENsYXNzPFQ+IGVudGl0eUNsYXNzKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0PFQ+KSBjdXJyZW50LmNvbXB1dGVJZkFic2VudChlbnRpdHlDbGFzcywgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkpOworCX0KKworCS8qKgorCSAqIFNvcnRzIHRoZSBjaGlsZCBlbnRpdGllcyB3aXRoIGdpdmVuIHtAY29kZSBDb21wYXJhdG9yfS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBEZXNpcmVkIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHBhcmFtIGNvbXBhcmF0b3IgIFVzZWQgZm9yIHNvcnRpbmcuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIDxUIGV4dGVuZHMgRGVsZXRhYmxlPiB2b2lkIHNvcnQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CisJCUxpc3Q8VD4gY2hpbGRyZW4gPSAoTGlzdDxUPikgY3VycmVudC5nZXQoZW50aXR5Q2xhc3MpOworCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgeworCQkJY2hpbGRyZW4uc29ydChjb21wYXJhdG9yKTsKKwkJfQorCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4gY2hpbGQgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGNoaWxkIFRoZSBuZXcgY2hpbGQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgYWRkKERlbGV0YWJsZSBjaGlsZCkgeworCQlyZW1vdmVkLmdldE9yRGVmYXVsdChjaGlsZC5nZXRDbGFzcygpLCBuZXcgQXJyYXlMaXN0PD4oKSkucmVtb3ZlKGNoaWxkKTsKKwkJKChMaXN0PERlbGV0YWJsZT4pIGN1cnJlbnQuY29tcHV0ZUlmQWJzZW50KGNoaWxkLmdldENsYXNzKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpKS5hZGQoY2hpbGQpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgZ2l2ZW4gY2hpbGQgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGNoaWxkIFRoZSBjaGlsZCB3aGljaCB3aWxsIGJlIHJlbW92ZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIHZvaWQgcmVtb3ZlKERlbGV0YWJsZSBjaGlsZCkgeworCQlMaXN0PERlbGV0YWJsZT4gY2hpbGRyZW4gPSAoTGlzdDxEZWxldGFibGU+KSBjdXJyZW50LmdldE9yRGVmYXVsdChjaGlsZC5nZXRDbGFzcygpLCBuZXcgQXJyYXlMaXN0PD4oKSk7CisJCWlmIChjaGlsZHJlbi5yZW1vdmUoY2hpbGQpICYmIGNoaWxkLmdldElEKCkgIT0gbnVsbCAmJiBjaGlsZC5nZXRJRCgpLmxlbmd0aCgpID4gMCkgeworCQkJKChMaXN0PERlbGV0YWJsZT4pIHJlbW92ZWQuY29tcHV0ZUlmQWJzZW50KGNoaWxkLmdldENsYXNzKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpKS5hZGQoY2hpbGQpOworCQl9CisJfQorCisJLyoqCisJICogQ2xlYW4gdXAgbGlzdCBvZiByZW1vdmVkIGVudGl0aWVzLgorCSAqLworCXZvaWQgYXBwbHkoKSB7CisJCXJlbW92ZWQuY2xlYXIoKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9Db3JlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9Db3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNzFkMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0NvcmUuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFscyBvZiBhbnkgZW50aXR5OgorICoKKyAqIDx1bD4KKyAqIDxsaT5uYW1lIG9mIHRoZSBkYXRhIHNvdXJjZTwvbGk+CisgKiA8bGk+bmFtZSBvZiB0aGUgdHlwZTwvbGk+CisgKiA8bGk+aW5zdGFuY2UgSUQ8L2xpPgorICogPGxpPnZhbHVlczwvbGk+CisgKiA8bGk+YWRkZWQvcmVtb3ZlZCBmaWxlIGxpbmtzPC9saT4KKyAqIDxsaT5yZWxhdGVkIGVudGl0aWVzPC9saT4KKyAqIDxsaT5wYXJlbnQvY2hpbGQgZW50aXRpZXM8L2xpPgorICogPC91bD4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBDb3JlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlIHRoaXMgZW50aXR5IHdhcyByZXRyaWV2ZWQgZnJvbS4KKwkgKgorCSAqIEByZXR1cm4gTmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuCisJICovCisJU3RyaW5nIGdldFNvdXJjZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIElEIG9yIHtAY29kZSAwfSBpZiB0aGlzIGluc3RhbmNlIGlzIG5vdCB5ZXQgcGVyc2lzdGVkLgorCSAqCisJICogQHJldHVybiBUaGUgaW5zdGFuY2UgSUQgaXMgcmV0dXJuZWQuCisJICovCisJU3RyaW5nIGdldElEKCk7CisKKwkvKioKKwkgKiBTZXRzIGFuIGluc3RhbmNlIElELgorCSAqCisJICogQHBhcmFtIGluc3RhbmNlSUQgVGhlIG5ldyBpbnN0YW5jZSBJRC4KKwkgKi8KKwl2b2lkIHNldElEKFN0cmluZyBpbnN0YW5jZUlEKTsKKworCS8qKgorCSAqIFJldHVybnMgPGk+YWxsPC9pPiB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMgb2YgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFZhbHVlcyBtYXBwZWQgYnkgdGhlaXIgbmFtZSBhcmUgcmV0dXJuZWQuCisJICovCisJTWFwPFN0cmluZywgVmFsdWU+IGdldFZhbHVlcygpOworCisJLyoqCisJICogSGlkZXMge0BsaW5rIFZhbHVlfSBjb250YWluZXJzIHdob3NlIG5hbWUgaXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBuYW1lcworCSAqIHtAY29kZSBDb2xsZWN0aW9ufS4gRS5nLiBoaWRlIGF0dHJpYnV0ZXMgZnJvbSBhIENhdGFsb2dDb21wb25lbnQgd2hlbiBub3QKKwkgKiB1c2VkIGluIGEgVGVtcGxhdGVDb21wb25lbnQuCisJICoKKwkgKiBAcGFyYW0gbmFtZXMgTmFtZXMgb2YgdGhlIHtAY29kZSBWYWx1ZX0gd2hpY2ggc2hhbGwgYmUgaGlkZGVuLgorCSAqLworCXZvaWQgaGlkZVZhbHVlcyhDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpOworCisJLyoqCisJICogUmV0dXJucyA8aT5hbGw8L2k+IHtAbGluayBWYWx1ZX0gY29udGFpbmVycywgaW5jbHVkaW5nIHRoZSBoaWRkZW4gb25lcy4KKwkgKgorCSAqIEByZXR1cm4gQWxsIHtAY29kZSBWYWx1ZX0gY29udGFpbmVycyBhcmUgcmV0dXJuZWQuCisJICovCisJTWFwPFN0cmluZywgVmFsdWU+IGdldEFsbFZhbHVlcygpOworCisJLyoqCisJICogUmV0dXJucyBhbGwgbmV3bHkgYWRkZWQge0BsaW5rIEZpbGVMaW5rfS4KKwkgKgorCSAqIEByZXR1cm4gTmV3IHtAY29kZSBGaWxlTGlua31zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IExpc3Q8RmlsZUxpbms+IGdldEFkZGVkRmlsZUxpbmtzKCkgeworCQlQcmVkaWNhdGU8RmlsZUxpbms+IGlzUmVtb3RlID0gRmlsZUxpbms6OmlzUmVtb3RlOworCisJCUxpc3Q8RmlsZUxpbms+IGZpbGVMaW5rcyA9IGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLmZpbHRlcih2IC0+IHYuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGluaygpKQorCQkJCS5maWx0ZXIoVmFsdWU6OmlzVmFsaWQpLm1hcCh2IC0+IChGaWxlTGluaykgdi5leHRyYWN0KCkpLmZpbHRlcihpc1JlbW90ZS5uZWdhdGUoKSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PFZhbHVlPiB2YWx1ZXMgPSBnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIodiAtPiB2LmdldFZhbHVlVHlwZSgpLmlzRmlsZUxpbmtTZXF1ZW5jZSgpKQorCQkJCS5maWx0ZXIoVmFsdWU6OmlzVmFsaWQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJZm9yIChWYWx1ZSB2YWx1ZSA6IHZhbHVlcykgeworCQkJQXJyYXlzLnN0cmVhbSgoRmlsZUxpbmtbXSkgdmFsdWUuZXh0cmFjdCgpKS5maWx0ZXIoaXNSZW1vdGUubmVnYXRlKCkpLmZvckVhY2goZmlsZUxpbmtzOjphZGQpOworCQl9CisKKwkJcmV0dXJuIGZpbGVMaW5rczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCByZW1vdmVkIHtAbGluayBGaWxlTGlua31zLgorCSAqCisJICogQHJldHVybiBSZW1vdmVkIHtAY29kZSBGaWxlTGlua31zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IExpc3Q8RmlsZUxpbms+IGdldFJlbW92ZWRGaWxlTGlua3MoKSB7CisJCVByZWRpY2F0ZTxGaWxlTGluaz4gaXNSZW1vdGUgPSBGaWxlTGluazo6aXNSZW1vdGU7CisKKwkJTGlzdDxGaWxlTGluaz4gZmlsZUxpbmtzID0gZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHYgLT4gdi5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rKCkpCisJCQkJLmZpbHRlcihWYWx1ZTo6aXNNb2RpZmllZCkubWFwKHYgLT4gKEZpbGVMaW5rKSB2LmV4dHJhY3RJbml0aWFsKCkpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorCQkJCS5maWx0ZXIoaXNSZW1vdGUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJTGlzdDxWYWx1ZT4gdmFsdWVzID0gZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKHYgLT4gdi5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rU2VxdWVuY2UoKSkKKwkJCQkuZmlsdGVyKFZhbHVlOjp3YXNWYWxpZCkuZmlsdGVyKFZhbHVlOjppc01vZGlmaWVkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCWZvciAoVmFsdWUgdmFsdWUgOiB2YWx1ZXMpIHsKKwkJCUxpc3Q8RmlsZUxpbms+IGN1cnJlbnQgPSBBcnJheXMuYXNMaXN0KChGaWxlTGlua1tdKSB2YWx1ZS5leHRyYWN0KCkpOworCQkJQXJyYXlzLnN0cmVhbSgoRmlsZUxpbmtbXSkgdmFsdWUuZXh0cmFjdEluaXRpYWwoKSkuZmlsdGVyKGZsIC0+ICFjdXJyZW50LmNvbnRhaW5zKGZsKSkKKwkJCQkJLmZvckVhY2goZmlsZUxpbmtzOjphZGQpOworCQl9CisKKwkJcmV0dXJuIGZpbGVMaW5rczsKKwl9CisKKwkvKioKKwkgKiBBcHBsaWVzIG1vZGlmaWNhdGlvbnMgbWFkZSB0byB0aGUgZW50aXR5IHN0b3JlcyBhbmQge0BsaW5rIFZhbHVlfSBjb250YWluZXJzLgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgdHJhbnNhY3Rpb24gaXMgZmluYWxpemVkIChhbGwgb3BlcmF0aW9ucworCSAqIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpIHRvIHJlZmxlY3QgdGhlIG5ldyBzdGF0ZSBpbiB0aGUgY29yZS4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgYXBwbHkoKSB7CisJCS8vIGFwcGx5IHRoZSByZW1vdmVkIHN0YXRlIHRvIG11dGFibGUgZW50aXRpZXMKKwkJZ2V0TXV0YWJsZVN0b3JlKCkuYXBwbHkoKTsKKworCQkvLyBhcHBseSB0aGUgcmVtb3ZlZCBzdGF0ZSB0byBjaGlsZHJlbgorCQlnZXRDaGlsZHJlblN0b3JlKCkuYXBwbHkoKTsKKworCQkvLyBhcHBseSBtb2RpZmllZCB2YWx1ZXMKKwkJZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKFZhbHVlOjppc01vZGlmaWVkKS5mb3JFYWNoKFZhbHVlOjphcHBseSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbXV0YWJsZSB7QGxpbmsgRW50aXR5U3RvcmV9LiBIb2xkcyBlbnRpdGllcyB3aXRoIG11dGFibGUKKwkgKiAoZWRpdGFibGUpIHJlbGF0aW9ucyB0byB0aGUgZW50aXR5IGJvdW5kIHRvIHRoaXMgY29yZSBpbnN0YW5jZS4gVGhpcyBzdG9yZQorCSAqIG9ubHkgY29udGFpbnMgYWx3YXlzIG9ubHkgb25lIHJlbGF0aW9uIGZvciBvbmUgZW50aXR5LiBGb3IgY2hpbGQgcmVsYXRpb25zCisJICogdXNlIHtAbGluayBDaGlsZHJlblN0b3JlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG11dGFibGUge0Bjb2RlIEVudGl0eVN0b3JlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlFbnRpdHlTdG9yZSBnZXRNdXRhYmxlU3RvcmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBlcm1hbmVudCB7QGxpbmsgRW50aXR5U3RvcmV9LiBIb2xkcyBlbnRpdGllcyB3aXRoIGltbXV0YWJsZQorCSAqIChub24tZWRpdGFibGUpIHJlbGF0aW9ucyB0byB0aGUgZW50aXR5IGJvdW5kIHRvIHRoaXMgY29yZSBpbnN0YW5jZS4gRS5nLgorCSAqIHJlbGF0aW9ucyB0byB0aGUgcGFyZW50IGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHBlcm1hbmVudCB7QGNvZGUgRW50aXR5U3RvcmV9IGlzIHJldHVybmVkLgorCSAqLworCUVudGl0eVN0b3JlIGdldFBlcm1hbmVudFN0b3JlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2hpbGRyZW5TdG9yZX0uIFRoaXMgc3RvcmUgaG9sZHMgY2hpbGQgZW50aXRpZXMgd2l0aAorCSAqIHJlbGF0aW9ucyB0byB0aGUgZW50aXR5IGJvdW5kIHRvIHRoaXMgY29yZSBpbnN0YW5jZS4KKwkgKiAKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ2hpbGRyZW5TdG9yZX0gaXMgcmV0dXJuZWQuCisJICovCisJLy8gVE9ETyAoOC4xMS4yMDE3OyBGbG9yaWFuIFNjaG1pdHQsIEFuZ2VsaWthIFdpdHRlaykKKwkvLyBFbnRpdGllcyB3aXRoIG1vcmUgdGhhbiBvbmUgcmVsYXRlZCBlbnRpdHkgdGhhdCBkbyBub3QgcmVmZXIgdG8gY2hpbGRyZW4sCisJLy8gaGF2ZSBhbHNvIHRvIGdvIGhlcmUsCisJLy8gYXMgaXQgaXMgbm90IHBlcm1pdHRlZCB0byBnbyB0byB0aGUgb3RoZXIgc3RvcmVzLiBEb2VzIHRoaXMgd29yayBhdCBhbGw/CisJQ2hpbGRyZW5TdG9yZSBnZXRDaGlsZHJlblN0b3JlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVsYXRpb25TdG9yZX0uIFRoaXMgc3RvcmUgaG9sZHMgcmVsYXRlZCBlbnRpdGllcyBmb3IgTiB0bworCSAqIE0gcmVsYXRpb25zLgorCSAqIAorCSAqIEByZXR1cm4gVGhlIHtAbGluayBSZWxhdGlvblN0b3JlfSBpcyByZXR1cm5lZAorCSAqLworCVJlbGF0aW9uU3RvcmUgZ2V0TnRvTVN0b3JlKCk7CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0RlZmF1bHRDb3JlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9EZWZhdWx0Q29yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NmQ0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9EZWZhdWx0Q29yZS5qYXZhCkBAIC0wLDAgKzEsMjAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKKworLyoqCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGludGVybmFscyBvZiBhbnkgZW50aXR5OgorICoKKyAqIDx1bD4KKyAqIDxsaT5uYW1lIG9mIHRoZSBkYXRhIHNvdXJjZTwvbGk+CisgKiA8bGk+bmFtZSBvZiB0aGUgdHlwZTwvbGk+CisgKiA8bGk+aW5zdGFuY2UgSUQ8L2xpPgorICogPGxpPnZhbHVlczwvbGk+CisgKiA8bGk+YWRkZWQvcmVtb3ZlZCBmaWxlIGxpbmtzPC9saT4KKyAqIDxsaT5yZWxhdGVkIGVudGl0aWVzPC9saT4KKyAqIDxsaT5wYXJlbnQvY2hpbGQgZW50aXRpZXM8L2xpPgorICogPC91bD4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRDb3JlIGltcGxlbWVudHMgQ29yZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlTdG9yZSBwZXJtYW5lbnRFbnRpdHlTdG9yYWdlID0gbmV3IEVudGl0eVN0b3JlKCk7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlTdG9yZSBtdXRhYmxlRW50aXR5U3RvcmFnZSA9IG5ldyBFbnRpdHlTdG9yZSgpOworCXByaXZhdGUgZmluYWwgQ2hpbGRyZW5TdG9yZSBjaGlsZHJlblN0b3JlID0gbmV3IENoaWxkcmVuU3RvcmUoKTsKKwlwcml2YXRlIGZpbmFsIFJlbGF0aW9uU3RvcmUgbnRvTVN0b3JlID0gbmV3IFJlbGF0aW9uU3RvcmUoKTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVmFsdWU+IHZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFZhbHVlPiBoaWRkZW5WYWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGVOYW1lOworCisJcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VJRDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDb3JlfSBpbml0aWFsaXplZCB3aXRoIGEgcXVlcmllZCB7QGxpbmsgUmVjb3JkfS4KKwkgKgorCSAqIEBwYXJhbSByZWNvcmQgVGhlIHF1ZXJpZWQge0Bjb2RlIFJlY29yZH0uCisJICovCisJcHVibGljIERlZmF1bHRDb3JlKFJlY29yZCByZWNvcmQpIHsKKwkJc2V0SUQocmVjb3JkLmdldElEKCkpOworCQl2YWx1ZXMucHV0QWxsKHJlY29yZC5nZXRWYWx1ZXMoKSk7CisJCXZhbHVlcy5yZW1vdmUoRW50aXR5LkFUVFJfSUQpOworCisJCS8vIHJlbW92ZSBhbnkgY29udGFpbmVkIHJlbGF0aW9uIGF0dHJpYnV0ZXMKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gcmVjb3JkLmdldEVudGl0eVR5cGUoKTsKKwkJZW50aXR5VHlwZS5nZXRSZWxhdGlvbnMoKS5zdHJlYW0oKS5tYXAoUmVsYXRpb246OmdldE5hbWUpLmZvckVhY2godmFsdWVzOjpyZW1vdmUpOworCisJCXNvdXJjZU5hbWUgPSBlbnRpdHlUeXBlLmdldFNvdXJjZU5hbWUoKTsKKwkJdHlwZU5hbWUgPSBlbnRpdHlUeXBlLmdldE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3RzIGEgbmV3IGVtcHR5IHtAbGluayBDb3JlfS4gVGhlIElEIGlzIHNldCB0byBhbiBlbXB0eSBTdHJpbmcuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICovCisJcHVibGljIERlZmF1bHRDb3JlKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlzZXRJRCgiIik7CisJCXZhbHVlcy5wdXRBbGwoZW50aXR5VHlwZS5jcmVhdGVWYWx1ZXMoKSk7CisJCXZhbHVlcy5yZW1vdmUoRW50aXR5LkFUVFJfSUQpOworCisJCXNvdXJjZU5hbWUgPSBlbnRpdHlUeXBlLmdldFNvdXJjZU5hbWUoKTsKKwkJdHlwZU5hbWUgPSBlbnRpdHlUeXBlLmdldE5hbWUoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gc291cmNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIHR5cGVOYW1lOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldElEKCkgeworCQlyZXR1cm4gaW5zdGFuY2VJRDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGluc3RhbmNlSUQpIHsKKwkJdGhpcy5pbnN0YW5jZUlEID0gaW5zdGFuY2VJRDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIFZhbHVlPiBnZXRWYWx1ZXMoKSB7CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVWYWx1ZXMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7CisJCWlmIChuYW1lcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfQorCisJCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgeworCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMucmVtb3ZlKG5hbWUpOworCQkJaWYgKG5hbWUgIT0gbnVsbCkgeworCQkJCWhpZGRlblZhbHVlcy5wdXQobmFtZSwgdmFsdWUpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0QWxsVmFsdWVzKCkgeworCQlpZiAoaGlkZGVuVmFsdWVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIHZhbHVlczsKKwkJfQorCisJCU1hcDxTdHJpbmcsIFZhbHVlPiBhbGxWYWx1ZXMgPSBuZXcgSGFzaE1hcDw+KHZhbHVlcyk7CisJCWFsbFZhbHVlcy5wdXRBbGwoaGlkZGVuVmFsdWVzKTsKKwkJcmV0dXJuIGFsbFZhbHVlczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZSgpIHsKKwkJcmV0dXJuIG11dGFibGVFbnRpdHlTdG9yYWdlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5U3RvcmUgZ2V0UGVybWFuZW50U3RvcmUoKSB7CisJCXJldHVybiBwZXJtYW5lbnRFbnRpdHlTdG9yYWdlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2hpbGRyZW5TdG9yZSBnZXRDaGlsZHJlblN0b3JlKCkgeworCQlyZXR1cm4gY2hpbGRyZW5TdG9yZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uU3RvcmUgZ2V0TnRvTVN0b3JlKCkgeworCQlyZXR1cm4gbnRvTVN0b3JlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRW50aXR5U3RvcmUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0VudGl0eVN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5ZWUzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0VudGl0eVN0b3JlLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CisKKy8qKgorICogSG9sZHMgcmVsYXRlZCBlbnRpdGllcyBvZiBhbnkga2luZCBhbmQga2VlcHMgdHJhY2sgb2YgbW9kaWZpY2F0aW9ucy4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudGl0eVN0b3JlIHsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRW50aXR5PiBjdXJyZW50ID0gbmV3IEhhc2hNYXA8PigwKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEVudGl0eT4gcmVtb3ZlZCA9IG5ldyBIYXNoTWFwPD4oMCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnQgc2V0IG9mIHJlbGF0ZWQgZW50aXRpZXMuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBDb2xsZWN0aW9ufSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIENvbGxlY3Rpb248RW50aXR5PiBnZXRDdXJyZW50KCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihjdXJyZW50LnZhbHVlcygpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnQgc2V0IG9mIHJlbW92ZWQgcmVsYXRlZCBlbnRpdGllcy4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIENvbGxlY3Rpb259IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgQ29sbGVjdGlvbjxFbnRpdHk+IGdldFJlbW92ZWQoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHJlbW92ZWQudmFsdWVzKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgcmVsYXRlZCBlbnRpdHkgaWRlbnRpZmllZCBieSBnaXZlbiBlbnRpdHkgY2xhc3MuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSByZWxhdGVkIGVudGl0eSBpcyByZXR1cm5lZCBvciBudWxsIG9mIG5vdCBkZWZpbmVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gVCBnZXQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHsKKwkJcmV0dXJuIGdldChlbnRpdHlDbGFzcy5nZXRTaW1wbGVOYW1lKCksIGVudGl0eUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHJlbGF0ZWQgZW50aXR5IGlkZW50aWZpZWQgYnkgZ2l2ZW4gZW50aXR5IGNsYXNzLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICBUaGUgZGVzaXJlZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gcmVsYXRpb25OYW1lIFRoZSByZWxhdGlvbiBuYW1lIHRoZSBlbnRpdHkgaXMgcmVmZXJlbmNlZCBieS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSByZWxhdGVkIGVudGl0eSBpcyByZXR1cm5lZCBvciBudWxsIG9mIG5vdCBkZWZpbmVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gVCBnZXQoU3RyaW5nIHJlbGF0aW9uTmFtZSwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHsKKwkJcmV0dXJuIGVudGl0eUNsYXNzLmNhc3QoY3VycmVudC5nZXQocmVsYXRpb25OYW1lKSk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgYSByZWxhdGVkIGVudGl0eSB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSBuZXcgcmVsYXRlZCBlbnRpdHkuCisJICovCisJcHVibGljIHZvaWQgc2V0KEVudGl0eSBlbnRpdHkpIHsKKwkJc2V0KGVudGl0eS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgZW50aXR5KTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBhIHJlbGF0ZWQgZW50aXR5IHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgVGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHRoZSBlbnRpdHkgaXMgcmVmZXJlbmNlZCBieS4KKwkgKiBAcGFyYW0gZW50aXR5IFRoZSBuZXcgcmVsYXRlZCBlbnRpdHkuCisJICovCisJcHVibGljIHZvaWQgc2V0KFN0cmluZyBuYW1lLCBFbnRpdHkgZW50aXR5KSB7CisJCUVudGl0eSBvbGQgPSBjdXJyZW50LnB1dChuYW1lLCBlbnRpdHkpOworCQlpZiAob2xkICE9IG51bGwpIHsKKwkJCXJlbW92ZWQucHV0KG5hbWUsIG9sZCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGEgcmVsYXRlZCBlbnRpdHkgZm9yIGdpdmVuIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKSB7CisJCVN0cmluZyBrZXkgPSBlbnRpdHlDbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisJCXJlbW92ZShrZXksIGVudGl0eUNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGEgcmVsYXRlZCBlbnRpdHkgZm9yIGdpdmVuIHJlbGF0aW9uIG5hbWUgYW5kIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGhlIGVudGl0eSBpcyByZWZlcmVuY2VkIGJ5LgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICovCisJcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBuYW1lLCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcykgeworCQlFbnRpdHkgb2xkID0gY3VycmVudC5yZW1vdmUobmFtZSk7CisJCWlmIChvbGQgIT0gbnVsbCkgeworCQkJcmVtb3ZlZC5wdXQobmFtZSwgb2xkKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgcmVsYXRlZCBlbnRpdHkgaWRlbnRpZmllZCBieSBnaXZlbiBlbnRpdHkgY2xhc3MgYW5kCisJICoge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUgcmVsYXRlZCBlbnRpdHkgaXMgcmV0dXJuZWQgb3IgbnVsbCBvZiBub3QgZGVmaW5lZC4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgZ2V0KENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlyZXR1cm4gZW50aXR5Q2xhc3MuY2FzdChjdXJyZW50LmdldChjcmVhdGVDb250ZXh0VHlwZUtleShlbnRpdHlDbGFzcywgY29udGV4dFR5cGUpKSk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgYSByZWxhdGVkIGVudGl0eSB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgICAgVGhlIG5ldyByZWxhdGVkIGVudGl0eS4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldChFbnRpdHkgZW50aXR5LCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlTdHJpbmcga2V5ID0gY3JlYXRlQ29udGV4dFR5cGVLZXkoZW50aXR5LmdldENsYXNzKCksIGNvbnRleHRUeXBlKTsKKwkJRW50aXR5IG9sZCA9IGN1cnJlbnQucHV0KGtleSwgZW50aXR5KTsKKwkJaWYgKG9sZCAhPSBudWxsKSB7CisJCQlyZW1vdmVkLnB1dChrZXksIG9sZCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGEgcmVsYXRlZCBlbnRpdHkgZm9yIGdpdmVuIGVudGl0eSBjbGFzcyBhbmQge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZW1vdmUoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCVN0cmluZyBrZXkgPSBjcmVhdGVDb250ZXh0VHlwZUtleShlbnRpdHlDbGFzcywgY29udGV4dFR5cGUpOworCQlFbnRpdHkgb2xkID0gY3VycmVudC5yZW1vdmUoa2V5KTsKKwkJaWYgKG9sZCAhPSBudWxsKSB7CisJCQlyZW1vdmVkLnB1dChrZXksIG9sZCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbGVhbiB1cCBsaXN0IG9mIHJlbW92ZWQgZW50aXRpZXMuCisJICovCisJdm9pZCBhcHBseSgpIHsKKwkJcmVtb3ZlZC5jbGVhcigpOworCX0KKworCS8qKgorCSAqIEdlbmVyYXRlcyBhIGtleSBmcm9tIGdpdmVuIGVudGl0eSBjbGFzcyBhbmQge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBJZGVudGlmaWVyIHBhcnQgMS4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgSWRlbnRpZmllciBwYXJ0IDIuCisJICogQHJldHVybiBBIGNvbnRleHQgdHlwZSBkZXBlbmRlbnQga2V5IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVDb250ZXh0VHlwZUtleShDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJcmV0dXJuIGVudGl0eUNsYXNzLmdldFNpbXBsZU5hbWUoKSArICdfJyArIGNvbnRleHRUeXBlOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0VudGl0eVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL0VudGl0eVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU2N2ViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvRW50aXR5VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbW9kZWxlZCBlbnRpdHkgdHlwZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgQXR0cmlidXRlCisgKiBAc2VlIFJlbGF0aW9uCisgKiBAc2VlIFJlbGF0aW9uVHlwZQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eVR5cGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuCisJICoKKwkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIGRhdGEgc291cmNlIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXRTb3VyY2VOYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGlzIGVudGl0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBUaGUgSUQgaXMgcmV0dXJuZWQuCisJICovCisJU3RyaW5nIGdldElkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB7QGxpbmsgQXR0cmlidXRlfXMgb2YgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBSZWxhdGlvbiBhdHRyaWJ1dGVzIGFyZSA8aT5ub3Q8L2k+IHBhcnQgb2YgdGhlIHJldHVybmVkCisJICoge0Bjb2RlIExpc3R9LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IG1heSBiZSBpbW11dGFibGUuCisJICovCisJTGlzdDxBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIElEIHtAbGluayBBdHRyaWJ1dGV9IG9mIHRoaXMgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBJRCB7QGNvZGUgQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAc2VlIEVudGl0eSNBVFRSX0lECisJICovCisJZGVmYXVsdCBBdHRyaWJ1dGUgZ2V0SURBdHRyaWJ1dGUoKSB7CisJCXJldHVybiBnZXRBdHRyaWJ1dGUoRW50aXR5LkFUVFJfSUQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUge0BsaW5rIEF0dHJpYnV0ZX0gb2YgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUge0Bjb2RlIEF0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHNlZSBFbnRpdHkjQVRUUl9OQU1FCisJICovCisJZGVmYXVsdCBBdHRyaWJ1dGUgZ2V0TmFtZUF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZShFbnRpdHkuQVRUUl9OQU1FKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtaW1lIHR5cGUge0BsaW5rIEF0dHJpYnV0ZX0gZm9yIHRoaXMgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBtaW1lIHR5cGUge0Bjb2RlIEF0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHNlZSBFbnRpdHkjQVRUUl9NSU1FVFlQRQorCSAqLworCWRlZmF1bHQgQXR0cmlidXRlIGdldE1pbWVUeXBlQXR0cmlidXRlKCkgeworCQlyZXR1cm4gZ2V0QXR0cmlidXRlKEVudGl0eS5BVFRSX01JTUVUWVBFKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGVpdGhlciB0aGUge0BsaW5rIEF0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gbmFtZSBvciB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIHJlbGF0aW9uIHtAY29kZSBBdHRyaWJ1dGV9IChmb3JlaWduIGtleSkgYXMgcmV0dXJuZWQgYnkKKwkgKiB7QGxpbmsgUmVsYXRpb24jZ2V0QXR0cmlidXRlKCl9LgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIHtAY29kZSBBdHRyaWJ1dGV9IGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgbmVpdGhlciBhbiB7QGNvZGUgQXR0cmlidXRlfSBub3IgYQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBSZWxhdGlvbn0gd2l0aCBnaXZlbiBuYW1lIGV4aXN0cy4KKwkgKi8KKwlBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIHtAbGluayBSZWxhdGlvbn1zIHRvIG90aGVyIGVudGl0eSB0eXBlcy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBtYXkgYmUgaW1tdXRhYmxlLgorCSAqLworCUxpc3Q8UmVsYXRpb24+IGdldFJlbGF0aW9ucygpOworCisJLyoqCisJICogUmV0dXJucyBhbGwge0BsaW5rIFJlbGF0aW9ufXMgdG8gYWxsb3dlZCBwYXJlbnQgZW50aXR5IHR5cGVzLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IG1heSBiZSBpbW11dGFibGUuCisJICovCisJTGlzdDxSZWxhdGlvbj4gZ2V0UGFyZW50UmVsYXRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUgY2hpbGQge0BsaW5rIFJlbGF0aW9ufXMgd2hvc2UgcmVsYXRpb25zaGlwIGlzCisJICoge0BsaW5rIFJlbGF0aW9uVHlwZSNGQVRIRVJfQ0hJTER9LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IG1heSBiZSBpbW11dGFibGUuCisJICovCisJTGlzdDxSZWxhdGlvbj4gZ2V0Q2hpbGRSZWxhdGlvbnMoKTsKKworCS8qKgorCSAqIFJldHVybnMgYWxsIGNoaWxkIHtAbGluayBSZWxhdGlvbn1zIHdob3NlIHJlbGF0aW9uc2hpcCBpcworCSAqIHtAbGluayBSZWxhdGlvblR5cGUjSU5GT30uCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gbWF5IGJlIGltbXV0YWJsZS4KKwkgKi8KKwlMaXN0PFJlbGF0aW9uPiBnZXRJbmZvUmVsYXRpb25zKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB7QGxpbmsgUmVsYXRpb259cyB3aG9zZSByZWxhdGlvbnNoaXAgaXMgb2YgdGhlIGdpdmVuIHR5cGUuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb25UeXBlIFRoZSByZWxhdGlvbnNoaXAgdHlwZS4KKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gbWF5IGJlIGltbXV0YWJsZS4KKwkgKi8KKwlMaXN0PFJlbGF0aW9uPiBnZXRSZWxhdGlvbnMoUmVsYXRpb25UeXBlIHJlbGF0aW9uVHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEge0BsaW5rIFJlbGF0aW9ufSB0byBnaXZlbiB0YXJnZXQgZW50aXR5IHR5cGUuIEF0IGZpcnN0IGl0IGlzIHRyaWVkCisJICogdG8gZmluZCBhIHVuYW1iaWd1b3VzIHtAY29kZSBSZWxhdGlvbn0gdG8gZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9LiBJZiB0aGlzCisJICogZmFpbHMgaXQgaXMgdHJpZWQgdG8gaWRlbnRpZnkgaXQgYnkgdGhlIG5hbWUgb2YgdGhlIGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSB0YXJnZXQgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIFJlbGF0aW9ufSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgYSByZWxhdGlvbiB0byBnaXZlbiB0YXJnZXQgZW50aXR5CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlSZWxhdGlvbiBnZXRSZWxhdGlvbihFbnRpdHlUeXBlIHRhcmdldCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVsYXRpb259IHdpdGggZ2l2ZW4gdGFyZ2V0IGVudGl0eSB0eXBlIGFuZCByZWxhdGlvbiBuYW1lLgorCSAqCisJICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlIG9mIHRoZSByZXF1ZXN0ZWQge0Bjb2RlIFJlbGF0aW9ufS4KKwkgKiBAcGFyYW0gbmFtZSAgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQge0Bjb2RlIFJlbGF0aW9ufS4KKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBSZWxhdGlvbn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBSZWxhdGlvbn0gd2l0aCBnaXZlbiB0YXJnZXQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkgdHlwZSBhbmQgbmFtZSBkb2VzIG5vdCBleGlzdC4KKwkgKiBAc2VlICNnZXRSZWxhdGlvbihFbnRpdHlUeXBlKQorCSAqLworCVJlbGF0aW9uIGdldFJlbGF0aW9uKEVudGl0eVR5cGUgdGFyZ2V0LCBTdHJpbmcgbmFtZSk7CisKKwkvKioKKwkgKiBDcmVhdGVzIGZvciBlYWNoIHtAbGluayBBdHRyaWJ1dGV9IGEgY29ycmVzcG9uZGluZyBlbXB0eSB7QGxpbmsgVmFsdWV9IGFuZAorCSAqIHJldHVybnMgdGhlbSBtYXBwZWQgYnkgdGhlaXIgbmFtZS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyBjcmVhdGVkIGVtcHR5IHtAY29kZSBWYWx1ZX1zIG1hcHBlZCBieSB0aGVpciBuYW1lLgorCSAqLworCWRlZmF1bHQgTWFwPFN0cmluZywgVmFsdWU+IGNyZWF0ZVZhbHVlcygpIHsKKwkJcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5zdHJlYW0oKS5tYXAoQXR0cmlidXRlOjpjcmVhdGVWYWx1ZSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFZhbHVlOjpnZXROYW1lLCBGdW5jdGlvbi5pZGVudGl0eSgpKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGVudGl0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGlzIGVudGl0eSB0eXBlIGlzIHJldHVybmVkLgorCSAqLworCUBPdmVycmlkZQorCVN0cmluZyB0b1N0cmluZygpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9Nb2RlbE1hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL01vZGVsTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjhmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9Nb2RlbE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKKworLyoqCisgKiBQcm92aWRlcyBhY2Nlc3MgdG8gYW55IG1vZGVsZWQge0BsaW5rIEVudGl0eVR5cGV9IHdpdGhpbiBhbiB1bmRlcmx5aW5nCisgKiBhcHBsaWNhdGlvbiBtb2RlbC4gQSB7QGxpbmsgUXVlcnl9LCBjcmVhdGVkIGJ5IHRoaXMgc2VydmljZSwgdXNlcyB0aGVzZQorICoge0Bjb2RlIEVudGl0eVR5cGV9cyB0byBhY2Nlc3MgY29ycmVzcG9uZGluZyByZWNvcmRzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIE1vZGVsTWFuYWdlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJTGlzdDxFbnRpdHlUeXBlPiBsaXN0RW50aXR5VHlwZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlUeXBlfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5IEl0cyB0eXBlIG5hbWUgaXMgdXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4ge0Bjb2RlIEVudGl0eVR5cGV9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBlbnRpdHkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gZ2V0RW50aXR5VHlwZShlbnRpdHkuZ2V0VHlwZU5hbWUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBlbnRpdHkgY2xhc3MgdHlwZS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiB7QGNvZGUgRW50aXR5VHlwZX0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGVudGl0eSBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIEVudGl0eVR5cGV9IGZvciBnaXZlbiB0eXBlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgZXhpc3QuCisJICovCisJRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlUeXBlfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4gZW50aXR5IGNsYXNzIGFuZAorCSAqIHtAbGluayBDb250ZXh0VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiB7QGNvZGUgRW50aXR5VHlwZX0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIGVudGl0eSBjbGFzcyBhbmQge0Bjb2RlCisJICogCQlDb250ZXh0VHlwZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBFbnRpdHlUeXBlfSBmb3IgZ2l2ZW4gdHlwZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCUVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZShDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIHtAY29kZSBFbnRpdHlUeXBlfSB3aXRoIGdpdmVuIG5hbWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBFbnRpdHlUeXBlfSB3aXRoIGdpdmVuIG5hbWUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoU3RyaW5nIG5hbWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gSUQuCisJICoKKwkgKiBAcGFyYW0gaWQgVXNlZCBhcyBJRC4KKwkgKiBAcmV0dXJuIHtAY29kZSBFbnRpdHlUeXBlfSB3aXRoIGdpdmVuIElEIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB7QGNvZGUgRW50aXR5VHlwZX0gd2l0aCBnaXZlbiBJRAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCUVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZUJ5SWQoU3RyaW5nIGlkKTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL1JlbGF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9SZWxhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MDBiYzAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9SZWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgbW9kZWxlZCByZWxhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRW50aXR5VHlwZQorICogQHNlZSBSZWxhdGlvblR5cGUKKyAqLworcHVibGljIGludGVyZmFjZSBSZWxhdGlvbiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgbmFtZSBvZiB0aGlzIHJlbGF0aW9uLgorCSAqCisJICogQHJldHVybiBUaGUgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogVGhlIHNvdXJjZSB7QGxpbmsgRW50aXR5VHlwZX0gb2YgdGhpcyByZWxhdGlvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNvdXJjZSB7QGNvZGUgRW50aXR5VHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJRW50aXR5VHlwZSBnZXRTb3VyY2UoKTsKKworCS8qKgorCSAqIFRoZSB0YXJnZXQge0BsaW5rIEVudGl0eVR5cGV9IG9mIHRoaXMgcmVsYXRpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB0YXJnZXQge0Bjb2RlIEVudGl0eVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCUVudGl0eVR5cGUgZ2V0VGFyZ2V0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVsYXRpb25UeXBlfSB0eXBlIGZvciB0aGlzIHJlbGF0aW9uLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFJlbGF0aW9uVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJUmVsYXRpb25UeXBlIGdldFJlbGF0aW9uVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZm9yZWlnbiBrZXkge0BsaW5rIEF0dHJpYnV0ZX0gZm9yIHRoaXMge0BsaW5rIFJlbGF0aW9ufS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGZvcmVpZ24ga2V5IHtAY29kZSBBdHRyaWJ1dGV9IGlzIHJldHVybmVkLgorCSAqLworCUF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYW5kIGVtcHR5IHtAbGluayBWYWx1ZX0gd2l0aCB7QGxpbmsgVmFsdWVUeXBlI0xPTkd9LgorCSAqCisJICogQHJldHVybiBDcmVhdGVkIHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBWYWx1ZSBjcmVhdGVWYWx1ZSgpIHsKKwkJcmV0dXJuIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKGdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHJlbGF0aW9uLgorCSAqCisJICogQHJldHVybiBOYW1lIG9mIHRoaXMgcmVsYXRpb24gaXMgcmV0dXJuZWQuCisJICovCisJQE92ZXJyaWRlCisJU3RyaW5nIHRvU3RyaW5nKCk7CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIHJlbGF0aW9uIGlzIG9mIHRoZSBzYW1lIHtAbGluayBSZWxhdGlvblR5cGV9IGFzIHRoZSBnaXZlbgorCSAqIG9uZSBhbmQgd2hldGhlciB0aGUgZm9yZWlnbiBrZXkgaXMgaW4gdGhlIHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5IHR5cGUKKwkgKiAob3IsIGluIG90aGVyIHdvcmRzLCBpZiB0aGVyZSBtYXkgYmUgYXQgbW9zdCAxIHJlbGF0ZWQgZGVzdGluYXRpb24gb2JqZWN0KS4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvblR5cGUgVGhlIHtAY29kZSBSZWxhdGlvblR5cGV9LgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gdGhpcyByZWxhdGlvbidzIHtAY29kZSBSZWxhdGlvblR5cGV9IGlzIGVxdWFsCisJICogICAgICAgICB3aXRoIHRoZSBnaXZlbiBvbmUgYW5kIGl0IGlzIGlzIGFuIG91dGdvaW5nIHJlbGF0aW9uLgorCSAqLworCWJvb2xlYW4gaXNPdXRnb2luZyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKTsKKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgcmVsYXRpb24gaXMgb2YgdGhlIHNhbWUge0BsaW5rIFJlbGF0aW9uVHlwZX0gYXMgdGhlIGdpdmVuCisJICogb25lIGFuZCB3aGV0aGVyIHRoZSBmb3JlaWduIGtleSBpcyBpbiB0aGUgdGFibGUgb2YgdGhlIHRhcmdldCBlbnRpdHkgdHlwZQorCSAqIChvciwgaW4gb3RoZXIgd29yZHMsIGlmIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIHJlbGF0ZWQgZGVzdGluYXRpb24KKwkgKiBvYmplY3RzKS4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvblR5cGUgVGhlIHtAY29kZSBSZWxhdGlvblR5cGV9LgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gdGhpcyByZWxhdGlvbidzIHtAY29kZSBSZWxhdGlvblR5cGV9IGlzIGVxdWFsCisJICogICAgICAgICB3aXRoIHRoZSBnaXZlbiBvbmUgYW5kIGl0IGlzIGlzIGFuIGluY29taW5nIHJlbGF0aW9uLgorCSAqLworCWJvb2xlYW4gaXNJbmNvbWluZyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKTsKKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgcmVsYXRpb24gaXMgYSBOIHRvIE0gcmVsYXRpb24uCisJICogCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHJlbGF0aW9uIGlzIE4gdG8gTS4KKwkgKi8KKwlib29sZWFuIGlzTnRvTSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvUmVsYXRpb25TdG9yZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvUmVsYXRpb25TdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjBjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvYWRhcHRlci9SZWxhdGlvblN0b3JlLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworCisvKioKKyAqIEhvbGRzIHJlbGF0ZWQgZW50aXRpZXMgb2YgYW55IGtpbmQgYW5kIGtlZXBzIHRyYWNrIG9mIG1vZGlmaWNhdGlvbnMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWxhdGlvblN0b3JlIHsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gYWRkZWQgPSBuZXcgSGFzaE1hcDw+KDApOworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gcmVtb3ZlZCA9IG5ldyBIYXNoTWFwPD4oMCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGN1cnJlbnQgc2V0IG9mIHJlbGF0ZWQgY2hpbGRyZW4gbWFwcGVkIGJ5IHRoZWlyIHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBNYXB9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZ2V0QWRkZWQoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoYWRkZWQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudCBzZXQgb2YgcmVtb3ZlZCByZWxhdGVkIGNoaWxkcmVuIG1hcHBlZCBieSB0aGVpciB0eXBlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTWFwfSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8PyBleHRlbmRzIERlbGV0YWJsZT4+IGdldFJlbW92ZWQoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVtb3ZlZCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyByZWxhdGVkIGNoaWxkIGVudGl0aWVzIG9mIGdpdmVuIHR5cGUuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgRGVzaXJlZCBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBEZWxldGFibGU+IExpc3Q8VD4gZ2V0KFN0cmluZyByZWxhdGlvbikgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgoTGlzdDxUPikgYWRkZWQuY29tcHV0ZUlmQWJzZW50KHJlbGF0aW9uLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKSk7CisJfQorCisJLyoqCisJICogU29ydHMgdGhlIGNoaWxkIGVudGl0aWVzIHdpdGggZ2l2ZW4ge0Bjb2RlIENvbXBhcmF0b3J9LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIERlc2lyZWQgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gY29tcGFyYXRvciAgVXNlZCBmb3Igc29ydGluZy4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBEZWxldGFibGU+IHZvaWQgc29ydChTdHJpbmcgcmVsYXRpb24sIENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CisJCUxpc3Q8VD4gY2hpbGRyZW4gPSAoTGlzdDxUPikgYWRkZWQuZ2V0KHJlbGF0aW9uKTsKKwkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKKwkJCWNoaWxkcmVuLnNvcnQoY29tcGFyYXRvcik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIGNoaWxkIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBjaGlsZCBUaGUgbmV3IGNoaWxkLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgcmVsYXRpb24sIERlbGV0YWJsZSByZWxhdGVkRW50aXR5KSB7CisJCXJlbW92ZWQuZ2V0T3JEZWZhdWx0KHJlbGF0aW9uLCBuZXcgQXJyYXlMaXN0PD4oKSkucmVtb3ZlKHJlbGF0ZWRFbnRpdHkpOworCQkoKExpc3Q8RGVsZXRhYmxlPikgYWRkZWQuY29tcHV0ZUlmQWJzZW50KHJlbGF0aW9uLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKSkuYWRkKHJlbGF0ZWRFbnRpdHkpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgZ2l2ZW4gY2hpbGQgZW50aXR5LgorCSAqCisJICogQHBhcmFtIHJlbGF0ZWRFbnRpdHkgVGhlIGNoaWxkIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIHJlbGF0aW9uLCBEZWxldGFibGUgcmVsYXRlZEVudGl0eSkgeworCQlhZGRlZC5nZXRPckRlZmF1bHQocmVsYXRpb24sIG5ldyBBcnJheUxpc3Q8PigpKS5yZW1vdmUocmVsYXRlZEVudGl0eSk7CisJCSgoTGlzdDxEZWxldGFibGU+KSByZW1vdmVkLmNvbXB1dGVJZkFic2VudChyZWxhdGlvbiwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkpLmFkZChyZWxhdGVkRW50aXR5KTsKKwl9CisKKwkvKioKKwkgKiBDbGVhbiB1cCBsaXN0IG9mIHJlbW92ZWQgZW50aXRpZXMuCisJICovCisJdm9pZCBhcHBseSgpIHsKKwkJcmVtb3ZlZC5jbGVhcigpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL1JlbGF0aW9uVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL2FkYXB0ZXIvUmVsYXRpb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiOWNkNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9hZGFwdGVyL1JlbGF0aW9uVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlcjsKKworLyoqCisgKiBSZWxhdGlvblR5cGUgZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEVudGl0eVR5cGUKKyAqIEBzZWUgUmVsYXRpb24KKyAqLworcHVibGljIGVudW0gUmVsYXRpb25UeXBlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXByZXNlbnRzIGEgaGllcmFyY2hpY2FsIHJlbGF0aW9uIGJldHdlZW4gdHdvIHtAbGluayBFbnRpdHlUeXBlfXMgZS5nLjoKKwkgKiB7QGNvZGUgVGVzdH0gYW5kIHtAY29kZSBUZXN0U3RlcH0uCisJICovCisJRkFUSEVSX0NISUxELAorCisJLyoqCisJICogUmVwcmVzZW50cyBhbiBpbmZvcm1hdGlvbmFsIHJlbGF0aW9uIGJldHdlZW4gdHdvIHtAbGluayBFbnRpdHlUeXBlfXMgZS5nLjoKKwkgKiB7QGNvZGUgTWVhc3VyZW1lbnR9IGFuZCB7QGNvZGUgUGFyYW1ldGVyU2V0fS4KKwkgKi8KKwlJTkZPLAorCisJLyoqCisJICogUmVwcmVzZW50cyBhbiBpbmhlcml0YW5jZSByZWxhdGlvbiBiZXR3ZWVuIHR3byB7QGxpbmsgRW50aXR5VHlwZX1zLgorCSAqLworCUlOSEVSSVRBTkNFCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9maWxlL0ZpbGVTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvZmlsZS9GaWxlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTUyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvZmlsZS9GaWxlU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CisKKy8qKgorICogUHJvdmlkZXMgc3RyZWFtIGFuZCBkb3dubG9hZCBvcGVyYXRpb25zIHRvIGFjY2VzcyBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBGaWxlU2VydmljZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBTZXF1ZW50aWFsIGRvd25sb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zIGludG8gZ2l2ZW4gdGFyZ2V0IHtAY29kZQorCSAqIFBhdGh9LiBSZW1vdGUgcGF0aHMgbGlua2VkIG11bHRpcGxlIHRpbWVzIGFyZSBkb3dubG9hZGVkIG9ubHkgb25jZS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSB0YXJnZXQgICAgTXVzdCBiZSBhIGRpcmVjdG9yeS4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZG93bmxvYWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRvd25sb2FkIGZpbGVzLgorCSAqLworCWRlZmF1bHQgdm9pZCBkb3dubG9hZFNlcXVlbnRpYWwoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZG93bmxvYWRTZXF1ZW50aWFsKGVudGl0eSwgdGFyZ2V0LCBmaWxlTGlua3MsIG51bGwpOworCX0KKworCS8qKgorCSAqIFNlcXVlbnRpYWwgZG93bmxvYWQgb2YgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgaW50byBnaXZlbiB0YXJnZXQge0Bjb2RlCisJICogUGF0aH0uIFJlbW90ZSBwYXRocyBsaW5rZWQgbXVsdGlwbGUgdGltZXMgYXJlIGRvd25sb2FkZWQgb25seSBvbmNlLiBUaGUKKwkgKiBkb3dubG9hZCBwcm9ncmVzcyBtYXkgYmUgdHJhY2VkIHdpdGggYSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgICAgICAgICBNdXN0IGJlIGEgZGlyZWN0b3J5LgorCSAqIEBwYXJhbSBmaWxlTGlua3MgICAgICAgIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZG93bmxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBkb3dubG9hZCBmaWxlcy4KKwkgKi8KKwl2b2lkIGRvd25sb2FkU2VxdWVudGlhbChFbnRpdHkgZW50aXR5LCBQYXRoIHRhcmdldCwgQ29sbGVjdGlvbjxGaWxlTGluaz4gZmlsZUxpbmtzLAorCQkJUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKwkvKioKKwkgKiBQYXJhbGxlbCBkb3dubG9hZCBvZiBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cyBpbnRvIGdpdmVuIHRhcmdldCB7QGNvZGUKKwkgKiBQYXRofS4gUmVtb3RlIHBhdGhzIGxpbmtlZCBtdWx0aXBsZSB0aW1lcyBhcmUgZG93bmxvYWRlZCBvbmx5IG9uY2UuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgIE11c3QgYmUgYSBkaXJlY3RvcnkuCisJICogQHBhcmFtIGZpbGVMaW5rcyBDb2xsZWN0aW9uIG9mIHtAY29kZSBGaWxlTGlua31zIHRvIGRvd25sb2FkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBkb3dubG9hZCBmaWxlcy4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgZG93bmxvYWRQYXJhbGxlbChFbnRpdHkgZW50aXR5LCBQYXRoIHRhcmdldCwgQ29sbGVjdGlvbjxGaWxlTGluaz4gZmlsZUxpbmtzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlkb3dubG9hZFBhcmFsbGVsKGVudGl0eSwgdGFyZ2V0LCBmaWxlTGlua3MsIG51bGwpOworCX0KKworCS8qKgorCSAqIFBhcmFsbGVsIGRvd25sb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zIGludG8gZ2l2ZW4gdGFyZ2V0IHtAY29kZQorCSAqIFBhdGh9LiBSZW1vdGUgcGF0aHMgbGlua2VkIG11bHRpcGxlIHRpbWVzIGFyZSBkb3dubG9hZGVkIG9ubHkgb25jZS4gVGhlCisJICogZG93bmxvYWQgcHJvZ3Jlc3MgbWF5IGJlIHRyYWNlZCB3aXRoIGEgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgICAgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIHRhcmdldCAgICAgICAgICAgTXVzdCBiZSBhIGRpcmVjdG9yeS4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzICAgICAgICBDb2xsZWN0aW9uIG9mIHtAY29kZSBGaWxlTGlua31zIHRvIGRvd25sb2FkLgorCSAqIEBwYXJhbSBwcm9ncmVzc0xpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZG93bmxvYWQgZmlsZXMuCisJICovCisJdm9pZCBkb3dubG9hZFBhcmFsbGVsKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbjsKKworCisJLyoqCisJICogRG93bmxvYWRzIGdpdmVuIHtAbGluayBGaWxlTGlua30gaW50byBnaXZlbiB0YXJnZXQge0Bjb2RlIFBhdGh9LgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgTXVzdCBiZSBhIGRpcmVjdG9yeS4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua30gdG8gZG93bmxvYWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRvd25sb2FkIGZpbGUuCisJICovCisJZGVmYXVsdCB2b2lkIGRvd25sb2FkKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBGaWxlTGluayBmaWxlTGluaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZG93bmxvYWQoZW50aXR5LCB0YXJnZXQsIGZpbGVMaW5rLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBEb3dubG9hZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSBpbnRvIGdpdmVuIHRhcmdldCB7QGNvZGUgUGF0aH0uIFRoZSBkb3dubG9hZAorCSAqIHByb2dyZXNzIG1heSBiZSB0cmFjZWQgd2l0aCBhIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgICAgICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSB0YXJnZXQgICAgICAgICAgIE11c3QgYmUgYSBkaXJlY3RvcnkuCisJICogQHBhcmFtIGZpbGVMaW5rICAgICAgICAgVGhlIHtAY29kZSBGaWxlTGlua30gdG8gZG93bmxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBkb3dubG9hZCBmaWxlLgorCSAqLworCXZvaWQgZG93bmxvYWQoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIEZpbGVMaW5rIGZpbGVMaW5rLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIE9wZW5zIGFuIHtAY29kZSBJbnB1dFN0cmVhbX0gZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30uIFRoZSByZXR1cm5lZCBzdHJlYW0KKwkgKiBzaG91bGQgYmUgY29uc3VtZWQgd2l0aCBhIHRyeS13aXRoLXJlc291cmNlcyBzdGF0ZW1lbnQgdG8gZW5zdXJlIHRoZSBzdHJlYW0KKwkgKiBpcyBjbG9zZWQgcHJvcGVybHksIGUuZzoKKwkgKgorCSAqIDxwcmU+CisJICogdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG9wZW5TdHJlYW0oZW50aXR5LCBmaWxlTGluaykpIHsKKwkgKiAJLy8gZG8gc29tZXRoaW5nIHVzZWZ1bAorCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIGZpbGVMaW5rIFRoZSB7QGNvZGUgRmlsZUxpbmt9IHRvIGJlIHByb3ZpZGVkIGFzIGEgc3RyZWFtLgorCSAqIEByZXR1cm4gQSBjb25zdW1hYmxlIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHByb3ZpZGUgYXMgc3RyZWFtLgorCSAqLworCWRlZmF1bHQgSW5wdXRTdHJlYW0gb3BlblN0cmVhbShFbnRpdHkgZW50aXR5LCBGaWxlTGluayBmaWxlTGluaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG9wZW5TdHJlYW0oZW50aXR5LCBmaWxlTGluaywgbnVsbCk7CisJfQorCisJLyoqCisJICogT3BlbnMgYW4ge0Bjb2RlIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfS4gVGhlIHByb2dyZXNzIG9mIHRoZQorCSAqIHN0cmVhbSBjb25zdW1wdGlvbiBtYXkgYmUgdHJhY2VkIHdpdGggYSBwcm9ncmVzcyBsaXN0ZW5lci4gVGhlIHJldHVybmVkCisJICogc3RyZWFtIHNob3VsZCBiZSBjb25zdW1lZCB3aXRoIGEgdHJ5LXdpdGgtcmVzb3VyY2VzIHN0YXRlbWVudCB0byBlbnN1cmUgdGhlCisJICogc3RyZWFtIGlzIGNsb3NlZCBwcm9wZXJseSwgZS5nOgorCSAqCisJICogPHByZT4KKwkgKiB0cnkgKElucHV0U3RyZWFtIGlzID0gb3BlblN0cmVhbShlbnRpdHksIGZpbGVMaW5rKSkgeworCSAqIAkvLyBkbyBzb21ldGhpbmcgdXNlZnVsCisJICogfQorCSAqIDwvcHJlPgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgICAgICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICAgICAgIFRoZSB7QGNvZGUgRmlsZUxpbmt9IHRvIGJlIHByb3ZpZGVkIGFzIGEgc3RyZWFtLgorCSAqIEBwYXJhbSBwcm9ncmVzc0xpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKiBAcmV0dXJuIEEgY29uc3VtYWJsZSB7QGNvZGUgSW5wdXRTdHJlYW19IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBwcm92aWRlIGFzIHN0cmVhbS4KKwkgKi8KKwlJbnB1dFN0cmVhbSBvcGVuU3RyZWFtKEVudGl0eSBlbnRpdHksIEZpbGVMaW5rIGZpbGVMaW5rLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIExvYWRzIHRoZSBmaWxlIHNpemUgZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30uIFRoZSBmaWxlIHNpemUgaXMgc3RvcmVkIGluCisJICogdGhlIGdpdmVuIHtAY29kZSBGaWxlTGlua30uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSBmaWxlTGluayBUaGUge0Bjb2RlIEZpbGVMaW5rfSB3aG9zZSBmaWxlIHNpemUgaXMgcmVxdWVzdGVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIGZpbGUgc2l6ZS4KKwkgKi8KKwl2b2lkIGxvYWRTaXplKEVudGl0eSBlbnRpdHksIEZpbGVMaW5rIGZpbGVMaW5rKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5uZXIgY2xhc3NlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEEge0BsaW5rIEZpbGVTZXJ2aWNlfSBjb25zdW1lciBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGdldCBub3RpZmllZAorCSAqIGFib3V0IHN0cmVhbSBvciBkb3dubG9hZCBwcm9ncmVzcy4KKwkgKi8KKwlARnVuY3Rpb25hbEludGVyZmFjZQorCWludGVyZmFjZSBQcm9ncmVzc0xpc3RlbmVyIHsKKworCQkvKioKKwkJICogUHJvZ3Jlc3Mgbm90aWZpY2F0aW9uLgorCQkgKgorCQkgKiBAcGFyYW0gYnl0ZXMgICBOdW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMgc2luY2UgbGFzdCBub3RpZmljYXRpb24uCisJCSAqIEBwYXJhbSBwZXJjZW50IFRoZSBvdmVyYWxsIHBlcmNlbnRhZ2UsIHdoZXJlIHBlcmNlbnQgcCAmaXNpbjsgWzAuMCwgMS4wXS4KKwkJICovCisJCXZvaWQgcHJvZ3Jlc3MoaW50IGJ5dGVzLCBmbG9hdCBwZXJjZW50KTsKKworCX0KKwkKKwkvKioKKwkgKiBTZXF1ZW50aWFsIHVwbG9hZCBvZiBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cy4gTG9jYWwge0BsaW5rIFBhdGh9cyBsaW5rZWQKKwkgKiBtdWx0aXBsZSB0aW1lcyBhcmUgdXBsb2FkZWQgb25seSBvbmNlLiBUaGUgdXBsb2FkIHByb2dyZXNzIG1heSBiZSB0cmFjZWQgd2l0aAorCSAqIGEgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgICAgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIGZpbGVMaW5rcyAgICAgICAgQ29sbGVjdGlvbiBvZiB7QGNvZGUgRmlsZUxpbmt9cyB0byB1cGxvYWQuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgVGhlIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byB1cGxvYWQgZmlsZXMuCisJICovCisJcHVibGljIHZvaWQgdXBsb2FkU2VxdWVudGlhbChFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uOworCisJLyoqCisJICogUGFyYWxsZWwgdXBsb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zLiBMb2NhbCB7QGxpbmsgUGF0aH1zIGxpbmtlZAorCSAqIG11bHRpcGxlIHRpbWVzIGFyZSB1cGxvYWRlZCBvbmx5IG9uY2UuIFRoZSB1cGxvYWQgcHJvZ3Jlc3MgbWF5IGJlIHRyYWNlZCB3aXRoCisJICogYSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzICAgICAgICBDb2xsZWN0aW9uIG9mIHtAY29kZSBGaWxlTGlua31zIHRvIHVwbG9hZC4KKwkgKiBAcGFyYW0gcHJvZ3Jlc3NMaXN0ZW5lciBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGxvYWRQYXJhbGxlbChFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIERlbGV0ZXMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfXMgZm9ybSB0aGUgcmVtb3RlIHN0b3JhZ2UuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5ICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmtzIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gZGVsZXRlLgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZShFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MpOworCisJLyoqCisJICogRGVsZXRlcyBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9IGZvcm0gdGhlIHJlbW90ZSBzdG9yYWdlLgorCSAqCisJICogQHBhcmFtIGVudGl0eSAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua31zIHRvIGRlbGV0ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGUoRW50aXR5IGVudGl0eSwgRmlsZUxpbmsgZmlsZUxpbmspOworCisKKworCisKKworCisKKworCisKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0FueVR5cGVWYWx1ZXNCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvQW55VHlwZVZhbHVlc0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzJkMWVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0FueVR5cGVWYWx1ZXNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKKworLyoqCisgKiBUaGlzIGJ1aWxkZXIgYWRkcyB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IG9mIHR5cGVzIGxpc3RlZCBiZWxvdy4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhIHNlcXVlbmNlIHdoZXJlIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSB2YWxpZC4KKyAqIEFkZGl0aW9uYWxseSBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgdmFsaWRpdHkgZmxhZyBmb3IgZWFjaCBzaW5nbGUgdmFsdWUuCisgKiBJbiBlaXRoZXIgY2FzZSBuZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUge0Bjb2RlCisgKiBudWxsfS4gRnVydGhlcm1vcmUgaWYgdmFsdWVzIGFuZCBmbGFncyBhcmUgZ2l2ZW4sIHRoZW4gdGhlaXIgbGVuZ3RoIG11c3QgYmUKKyAqIGVxdWFsLgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNTVFJJTkd9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNEQVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjQk9PTEVBTn08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0JZVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNTSE9SVH08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0lOVEVHRVJ9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNMT05HfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRkxPQVR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNET1VCTEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFX1NUUkVBTX08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUX0NPTVBMRVh9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNET1VCTEVfQ09NUExFWH08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZJTEVfTElOS308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0JMT0J9PC9saT4KKyAqIDwvdWw+CisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbnlUeXBlVmFsdWVzQnVpbGRlciBleHRlbmRzIENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvLgorCSAqLworCUFueVR5cGVWYWx1ZXNCdWlsZGVyKFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3QpIHsKKwkJc3VwZXIod3JpdGVSZXF1ZXN0KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBTdHJpbmd9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIGdsb2JhbAorCSAqIHZhbGlkaXR5IGZsYWcsIHdoaWNoIG1lYW5zIHRoZSBnaXZlbiBzZXF1ZW5jZSBkb2VzIG5vdCBjb250YWluIGFueQorCSAqIHtAY29kZSBudWxsfSB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgU3RyaW5nfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHN0cmluZ1ZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuU1RSSU5HLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgU3RyaW5nfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgU3RyaW5nfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gZmxhZ3MgIFRoZSB2YWxpZGl0eSBmbGFncyBmb3IgZWFjaCB7QGNvZGUgU3RyaW5nfSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHN0cmluZ1ZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5TVFJJTkcsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgTG9jYWxEYXRlVGltZX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiBnbG9iYWwgdmFsaWRpdHkgZmxhZywgd2hpY2ggbWVhbnMgdGhlIGdpdmVuIHNlcXVlbmNlIGRvZXMgbm90IGNvbnRhaW4gYW55CisJICoge0Bjb2RlIG51bGx9IHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBMb2NhbERhdGVUaW1lfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW5kZXBlbmRlbnRCdWlsZGVyIGRhdGVWYWx1ZXMoTG9jYWxEYXRlVGltZVtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5EQVRFLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgTG9jYWxEYXRlVGltZX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiB2YWxpZGl0eSBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIExvY2FsRGF0ZVRpbWV9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBMb2NhbERhdGVUaW1lfSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgSW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW5kZXBlbmRlbnRCdWlsZGVyIGRhdGVWYWx1ZXMoTG9jYWxEYXRlVGltZVtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkRBVEUsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgYm9vbGVhbn0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgZ2xvYmFsCisJICogdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBib29sZWFufSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGJvb2xlYW5WYWx1ZXMoYm9vbGVhbltdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5CT09MRUFOLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgYm9vbGVhbn0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgdmFsaWRpdHkKKwkgKiBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGJvb2xlYW59IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBib29sZWFufSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGJvb2xlYW5WYWx1ZXMoYm9vbGVhbltdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJPT0xFQU4sIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFdyaXRlUmVxdWVzdEZpbmFsaXplcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgYnl0ZVtdfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLCB3aGljaCBtZWFucyB0aGUgZ2l2ZW4gc2VxdWVuY2UgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGJ5dGVbXX0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBieXRlU3RyZWFtVmFsdWVzKGJ5dGVbXVtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5CWVRFX1NUUkVBTSwgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGJ5dGVbXX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgdmFsaWRpdHkKKwkgKiBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGJ5dGVbXX0gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIGJ5dGVbXX0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBieXRlU3RyZWFtVmFsdWVzKGJ5dGVbXVtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJZVEVfU1RSRUFNLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLCB3aGljaCBtZWFucyB0aGUgZ2l2ZW4gc2VxdWVuY2UgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIEZpbGVMaW5rfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0RmluYWxpemVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGZpbGVMaW5rVmFsdWVzKEZpbGVMaW5rW10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZJTEVfTElOSywgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYQorCSAqIHZhbGlkaXR5IGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgRmlsZUxpbmt9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBGaWxlTGlua30gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBmaWxlTGlua1ZhbHVlcyhGaWxlTGlua1tdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZJTEVfTElOSywgdmFsdWVzLCBmbGFncyk7CisJCXJldHVybiBuZXcgV3JpdGVSZXF1ZXN0RmluYWxpemVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvLyBUT0RPOiBpcyBpdCBwb3NzaWJsZSB0byBwcm92aWRlIGEgYmxvYiBmb3IgZWFjaCByb3cgb3IgaXMgdGhlIGJsb2IgZm9yCisJLy8gdGhlIHdob2xlIGNvbHVtbj8hCisJLy8gd2UgYXNzdW1lIHRoZSBsYXR0ZXIgLSBvbmUgYmxvYiBmb3IgdGhlIHdob2xlIGNvbHVtbiEKKwlwdWJsaWMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIGJsb2JWYWx1ZShPYmplY3QgdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJMT0IsIHZhbHVlcyk7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IGltcGxlbWVudGVkLiIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0Jhc2VWYWx1ZXNCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvQmFzZVZhbHVlc0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYzYmNhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0Jhc2VWYWx1ZXNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworCisvKioKKyAqIFRoaXMgaXMgYSBiYXNlIHZhbHVlcyBidWlsZGVyIHByb3ZpZGVzIG1ldGhvZHMgZm9yIGNvbmZpZ3VyaW5nIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworYWJzdHJhY3QgY2xhc3MgQmFzZVZhbHVlc0J1aWxkZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyBhbmQgY29ycmVzcG9uZGluZworCSAqICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFNjYWxhclR5cGV9IHdpbGwgYmUgYXBwbGllZCB0by4KKwkgKi8KKwlCYXNlVmFsdWVzQnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXRoaXMud3JpdGVSZXF1ZXN0ID0gd3JpdGVSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcm90ZWN0ZWQgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4gdmFsdWUgc2VxdWVuY2UgYW5kIHNldHMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNjYWxhclR5cGV9IGFzCisJICogdGhlIHJhdyB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyVHlwZSBUaGUge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqIEBwYXJhbSB2YWx1ZXMgICAgIFRoZSBhcnJheSB2YWx1ZSBzZXF1ZW5jZSBtdXN0IGJlIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB3aXRoCisJICogICAgICAgICAgICAgICAgICAgdGhlIHR5cGUgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZSBzY2FsYXJUeXBlLCBPYmplY3QgdmFsdWVzKSB7CisJCWlmICh2YWx1ZXMgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWVzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIG51bGwuIik7CisJCX0KKworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRSYXdTY2FsYXJUeXBlKHNjYWxhclR5cGUpOworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRWYWx1ZXModmFsdWVzKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHZhbHVlIHNlcXVlbmNlLCBhc3NvY2lhdGVkIHZhbGlkaXR5IGZsYWdzIGFuZCBzZXRzIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNjYWxhclR5cGV9IGFzIHRoZSByYXcge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgVGhlIHtAY29kZSBTY2FsYXJUeXBlfS4KKwkgKiBAcGFyYW0gdmFsdWVzICAgICBUaGUgYXJyYXkgdmFsdWUgc2VxdWVuY2UgbXVzdCBiZSBhc3NpZ25tZW50IGNvbXBhdGlibGUgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICogQHBhcmFtIGZsYWdzICAgICAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHZhbHVlIGluIHRoZSB2YWx1ZXMgc2VxdWVuY2UuCisJICovCisJcHJvdGVjdGVkIGZpbmFsIHZvaWQgY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUgc2NhbGFyVHlwZSwgT2JqZWN0IHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCBmbGFncyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsKKwkJfSBlbHNlIGlmIChBcnJheS5nZXRMZW5ndGgodmFsdWVzKSAhPSBmbGFncy5sZW5ndGgpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxlbmd0aCBvZiB2YWx1ZXMgYW5kIGZsYWdzIG11c3QgYmUgZXF1YWwuIik7CisJCX0KKworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRSYXdTY2FsYXJUeXBlKHNjYWxhclR5cGUpOworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRWYWx1ZXModmFsdWVzLCBmbGFncyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgV3JpdGVSZXF1ZXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgV3JpdGVSZXF1ZXN0IGdldFdyaXRlUmVxdWVzdCgpIHsKKwkJcmV0dXJuIHdyaXRlUmVxdWVzdDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Db21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0NvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjViMzdlYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Db21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRvdWJsZUNvbXBsZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZsb2F0Q29tcGxleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKKworLyoqCisgKiBUaGlzIGJ1aWxkZXIgYWRkcyB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IG9mIHR5cGVzIGxpc3RlZCBiZWxvdy4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhIHNlcXVlbmNlIHdoZXJlIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSB2YWxpZC4KKyAqIEFkZGl0aW9uYWxseSBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgdmFsaWRpdHkgZmxhZyBmb3IgZWFjaCBzaW5nbGUgdmFsdWUuCisgKiBJbiBlaXRoZXIgY2FzZSBuZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUge0Bjb2RlCisgKiBudWxsfS4gRnVydGhlcm1vcmUgaWYgdmFsdWVzIGFuZCBmbGFncyBhcmUgZ2l2ZW4sIHRoZW4gdGhlaXIgbGVuZ3RoIG11c3QgYmUKKyAqIGVxdWFsLgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRkxPQVRfQ09NUExFWH08L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXIgZXh0ZW5kcyBOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvLgorCSAqLworCUNvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyKFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3QpIHsKKwkJc3VwZXIod3JpdGVSZXF1ZXN0KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBGbG9hdENvbXBsZXh9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhCisJICogZ2xvYmFsIHZhbGlkaXR5IGZsYWcsIHdoaWNoIG1lYW5zIHRoZSBnaXZlbiBzZXF1ZW5jZSBkb2VzIG5vdCBjb250YWluIGFueQorCSAqIHtAY29kZSBudWxsfSB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgRmxvYXRDb21wbGV4fSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0QnVpbGRlciBmbG9hdENvbXBsZXhWYWx1ZXMoRmxvYXRDb21wbGV4W10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgsIHZhbHVlcyk7CisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIEZsb2F0Q29tcGxleH0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiB2YWxpZGl0eSBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIEZsb2F0Q29tcGxleH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIEZsb2F0Q29tcGxleH0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEJ1aWxkZXIgZmxvYXRDb21wbGV4VmFsdWVzKEZsb2F0Q29tcGxleFtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFVuaXRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBEb3VibGVDb21wbGV4fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYQorCSAqIGdsb2JhbCB2YWxpZGl0eSBmbGFnLCB3aGljaCBtZWFucyB0aGUgZ2l2ZW4gc2VxdWVuY2UgZG9lcyBub3QgY29udGFpbiBhbnkKKwkgKiB7QGNvZGUgbnVsbH0gdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIERvdWJsZUNvbXBsZXh9IGFycmF5IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRCdWlsZGVyIGRvdWJsZUNvbXBsZXhWYWx1ZXMoRG91YmxlQ29tcGxleFtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCwgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBVbml0QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgRG91YmxlQ29tcGxleH0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEKKwkgKiB2YWxpZGl0eSBmbGFnIGZvciBlYWNoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIERvdWJsZUNvbXBsZXh9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBEb3VibGVDb21wbGV4fSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0QnVpbGRlciBkb3VibGVDb21wbGV4VmFsdWVzKERvdWJsZUNvbXBsZXhbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCwgdmFsdWVzLCBmbGFncyk7CisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0V4dGVybmFsQ29tcG9uZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvRXh0ZXJuYWxDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjJlMjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0V4dGVybmFsQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworcHVibGljIGZpbmFsIGNsYXNzIEV4dGVybmFsQ29tcG9uZW50IHsKKworCS8vIFRPRE8KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9JbmRlcGVuZGVudEJ1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9JbmRlcGVuZGVudEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk0MmNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL0luZGVwZW5kZW50QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworCisvKioKKyAqIFRoaXMgYnVpbGRlciBhbGxvd3MgdG8gY29uZmlndXJlIG51bWVyaWNhbGx5IHNvcnRhYmxlIG1lYXN1cmVkIHZhbHVlcyB0byBiZQorICogaW5kZXBlbmRlbnQsIHdoaWNoIG1lYW5zIHRoZSBtZWFzdXJlZCB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aG9zZSBvZiBvdGhlcgorICoge0BsaW5rIENoYW5uZWx9cyB3aXRoaW4gdGhlaXIgY29tbW9uIHtAbGluayBDaGFubmVsR3JvdXB9LiBUaGUgbnVtZXJpY2FsbHkKKyAqIHNvcnRhYmxlIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3c6CisgKgorICogPHVsPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RBVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgSW5kZXBlbmRlbnRCdWlsZGVyIGV4dGVuZHMgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9LCB3aG9zZSBtZWFzdXJlZCB2YWx1ZXMgb2YgdGhlCisJICogICAgICAgICAgICAgICAgICAgICB1bmRlcmx5aW5nIHtAbGluayBDaGFubmVsfSBtYXkgYmUgbWFya2VkIGFzIGluZGVwZW5kZW50LgorCSAqLworCUluZGVwZW5kZW50QnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXN1cGVyKHdyaXRlUmVxdWVzdCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVHJpZ2dlcnMgdGhlIG1lYXN1cmVkIHZhbHVlcyBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2hhbm5lbH0gdG8gYmUKKwkgKiBpbmRlcGVuZGVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBXcml0ZVJlcXVlc3RGaW5hbGl6ZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIgaW5kZXBlbmRlbnQoKSB7CisJCWdldFdyaXRlUmVxdWVzdCgpLnNldEluZGVwZW5kZW50KCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFRyaWdnZXJzIHRoZSBtZWFzdXJlZCB2YWx1ZXMgb2YgdGhlIHVuZGVybHlpbmcge0BsaW5rIENoYW5uZWx9IHRvIGJlCisJICogaW5kZXBlbmRlbnQgb3Igbm90LCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHNwZWNpZmllZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBXcml0ZVJlcXVlc3RGaW5hbGl6ZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBXcml0ZVJlcXVlc3RGaW5hbGl6ZXIgaW5kZXBlbmRlbnQoYm9vbGVhbiBpbmRlcGVuZGVudCkgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRJbmRlcGVuZGVudChpbmRlcGVuZGVudCk7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL051bWVyaWNhbFZhbHVlc0J1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9OdW1lcmljYWxWYWx1ZXNCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViYWViMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9OdW1lcmljYWxWYWx1ZXNCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKKworLyoqCisgKiBUaGlzIGJ1aWxkZXIgYWRkcyB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IG9mIHR5cGVzIGxpc3RlZCBiZWxvdy4KKyAqIEl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhIHNlcXVlbmNlIHdoZXJlIGFsbCBvZiBpdHMgdmFsdWVzIGFyZSB2YWxpZC4KKyAqIEFkZGl0aW9uYWxseSBpdCBpcyBwb3NzaWJsZSB0byBwcm92aWRlIGEgdmFsaWRpdHkgZmxhZyBmb3IgZWFjaCBzaW5nbGUgdmFsdWUuCisgKiBJbiBlaXRoZXIgY2FzZSBuZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgYXJlIGFsbG93ZWQgdG8gYmUge0Bjb2RlCisgKiBudWxsfS4gRnVydGhlcm1vcmUgaWYgdmFsdWVzIGFuZCBmbGFncyBhcmUgZ2l2ZW4sIHRoZW4gdGhlaXIgbGVuZ3RoIG11c3QgYmUKKyAqIGVxdWFsLgorICoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgTnVtZXJpY2FsVmFsdWVzQnVpbGRlciBleHRlbmRzIEJhc2VWYWx1ZXNCdWlsZGVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB3cml0ZVJlcXVlc3QgVGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IGdpdmVuIHZhbHVlcyB3aWxsIGJlIGFkZGVkIHRvLgorCSAqLworCU51bWVyaWNhbFZhbHVlc0J1aWxkZXIoV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdCkgeworCQlzdXBlcih3cml0ZVJlcXVlc3QpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGJ5dGV9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIGdsb2JhbAorCSAqIHZhbGlkaXR5IGZsYWcuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGJ5dGVWYWx1ZXMoYnl0ZVtdIHZhbHVlcykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5CWVRFLCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGJ5dGV9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIHZhbGlkaXR5CisJICogZmxhZyBmb3IgZWFjaCBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBieXRlfSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gZmxhZ3MgIFRoZSB2YWxpZGl0eSBmbGFncyBmb3IgZWFjaCB7QGNvZGUgYnl0ZX0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGJ5dGVWYWx1ZXMoYnl0ZVtdIHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkJZVEUsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIHNob3J0fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIHNob3J0fSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIgc2hvcnRWYWx1ZXMoc2hvcnRbXSB2YWx1ZXMpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuU0hPUlQsIHZhbHVlcyk7CisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgc2hvcnR9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIHZhbGlkaXR5CisJICogZmxhZyBmb3IgZWFjaCBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBzaG9ydH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIHNob3J0fSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIgc2hvcnRWYWx1ZXMoc2hvcnRbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5TSE9SVCwgdmFsdWVzLCBmbGFncyk7CisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgaW50fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGludH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGludGVnZXJWYWx1ZXMoaW50W10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLklOVEVHRVIsIHZhbHVlcyk7CisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGNvZGUgaW50fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgaW50fSBhcnJheSBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gZmxhZ3MgIFRoZSB2YWxpZGl0eSBmbGFncyBmb3IgZWFjaCB7QGNvZGUgaW50fSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGZpbmFsIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIgaW50ZWdlclZhbHVlcyhpbnRbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5JTlRFR0VSLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBsb25nfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSBnbG9iYWwKKwkgKiB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIGxvbmd9IGFycmF5IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBsb25nVmFsdWVzKGxvbmdbXSB2YWx1ZXMpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuTE9ORywgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBsb25nfSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgbG9uZ30gYXJyYXkgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZ3MgZm9yIGVhY2gge0Bjb2RlIGxvbmd9IHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBsb25nVmFsdWVzKGxvbmdbXSB2YWx1ZXMsIGJvb2xlYW5bXSBmbGFncykgeworCQljcmVhdGVWYWx1ZXMoU2NhbGFyVHlwZS5MT05HLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBmbG9hdH0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgZ2xvYmFsCisJICogdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBmbG9hdH0gYXJyYXkgc2VxdWVuY2UuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGZsb2F0VmFsdWVzKGZsb2F0W10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkZMT0FULCB2YWx1ZXMpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGZsb2F0fSB2YWx1ZXMgdG8gdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHdpdGggYSB2YWxpZGl0eQorCSAqIGZsYWcgZm9yIGVhY2ggZ2l2ZW4gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSB7QGNvZGUgZmxvYXR9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBmbG9hdH0gdmFsdWUuCisJICogQHJldHVybiBUaGUge0BsaW5rIFVuaXRJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGZsb2F0VmFsdWVzKGZsb2F0W10gdmFsdWVzLCBib29sZWFuW10gZmxhZ3MpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuRkxPQVQsIHZhbHVlcywgZmxhZ3MpOworCQlyZXR1cm4gbmV3IFVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0Bjb2RlIGRvdWJsZX0gdmFsdWVzIHRvIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aXRoIGEgZ2xvYmFsCisJICogdmFsaWRpdHkgZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBkb3VibGV9IGFycmF5IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBkb3VibGVWYWx1ZXMoZG91YmxlW10gdmFsdWVzKSB7CisJCWNyZWF0ZVZhbHVlcyhTY2FsYXJUeXBlLkRPVUJMRSwgdmFsdWVzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAY29kZSBkb3VibGV9IHZhbHVlcyB0byB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gd2l0aCBhIHZhbGlkaXR5CisJICogZmxhZyBmb3IgZWFjaCBnaXZlbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZXMgVGhlIHtAY29kZSBkb3VibGV9IGFycmF5IHNlcXVlbmNlLgorCSAqIEBwYXJhbSBmbGFncyAgVGhlIHZhbGlkaXR5IGZsYWdzIGZvciBlYWNoIHtAY29kZSBkb3VibGV9IHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBVbml0SW5kZXBlbmRlbnRCdWlsZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmluYWwgVW5pdEluZGVwZW5kZW50QnVpbGRlciBkb3VibGVWYWx1ZXMoZG91YmxlW10gdmFsdWVzLCBib29sZWFuW10gZmxhZ3MpIHsKKwkJY3JlYXRlVmFsdWVzKFNjYWxhclR5cGUuRE9VQkxFLCB2YWx1ZXMsIGZsYWdzKTsKKwkJcmV0dXJuIG5ldyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1JlYWRSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmYjgwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMjY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWxsIHJlcXVpcmVkIGluZm9ybWF0aW9ucyB0byBsb2FkIG1lYXN1cmVkIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlYWRSZXF1ZXN0IHsKKwlwdWJsaWMgZW51bSBWYWx1ZXNNb2RlIHsKKwkJLyoqCisJCSAqIE1lYXN1cmVkVmFsdWVzIHdpbGwgY29udGFpbiB0aGUgZmluYWwgdmFsdWVzLCBjYWxjdWxhdGVkIGZvciBub24tZXhwbGljaXQKKwkJICogc2VxdWVuY2UgcmVwcmVzZW50YXRpb25zIHVzaW5nIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhbmQsIGlmIGFwcGxpY2FibGUsIHRoZQorCQkgKiByYXcgdmFsdWVzLiBObyBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcKKwkJICogTWVhc3VyZWRWYWx1ZXMsIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSB3aWxsIGJlIEVYUExJQ0lULgorCQkgKi8KKwkJQ0FMQ1VMQVRFRCwKKwkJLyoqCisJCSAqIE1lYXN1cmVkVmFsdWVzIHdpbGwgY29udGFpbiB0aGUgKHJhdykgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXMKKwkJICogcHJlc2VudCBpbiB0aGUgc3RvcmFnZS4KKwkJICovCisJCVNUT1JBR0UKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBNYXA8Q2hhbm5lbCwgVW5pdD4gY2hhbm5lbHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwOworCisJcHJpdmF0ZSBib29sZWFuIGxvYWRBbGxDaGFubmVsczsKKworCXByaXZhdGUgaW50IHJlcXVlc3RTaXplID0gMTAwXzAwMDsKKwlwcml2YXRlIGludCBzdGFydEluZGV4OworCisJcHJpdmF0ZSBWYWx1ZXNNb2RlIHZhbHVlc01vZGUgPSBWYWx1ZXNNb2RlLkNBTENVTEFURUQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcmVhZFJlcXVlc3QgVGhlIHByZXZpb3VzIHtAbGluayBSZWFkUmVxdWVzdH0uCisJICovCisJUmVhZFJlcXVlc3QoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHsKKwkJdGhpcyhyZWFkUmVxdWVzdC5nZXRDaGFubmVsR3JvdXAoKSk7CisJCWNoYW5uZWxzLnB1dEFsbChyZWFkUmVxdWVzdC5nZXRDaGFubmVscygpKTsKKwkJbG9hZEFsbENoYW5uZWxzID0gcmVhZFJlcXVlc3QubG9hZEFsbENoYW5uZWxzOworCQlyZXF1ZXN0U2l6ZSA9IHJlYWRSZXF1ZXN0LmdldFJlcXVlc3RTaXplKCk7CisJCXN0YXJ0SW5kZXggPSByZWFkUmVxdWVzdC5nZXRTdGFydEluZGV4KCkgKyByZWFkUmVxdWVzdC5nZXRSZXF1ZXN0U2l6ZSgpOworCQl2YWx1ZXNNb2RlID0gcmVhZFJlcXVlc3QuZ2V0VmFsdWVzTW9kZSgpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNoYW5uZWxHcm91cCBUaGUge0BsaW5rIENoYW5uZWxHcm91cH0gaXMgdGhlIHNvdXJjZSBlbnRpdHkgdG8gYWNjZXNzCisJICogICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZCB2YWx1ZXMuCisJICovCisJcHJpdmF0ZSBSZWFkUmVxdWVzdChDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwKSB7CisJCXRoaXMuY2hhbm5lbEdyb3VwID0gY2hhbm5lbEdyb3VwOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFJlYWRSZXF1ZXN0QnVpbGRlcn0gd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIENoYW5uZWxHcm91cH0KKwkgKiBhcyB0aGUgc291cmNlIGVudGl0eSBmb3IgdGhlIHJlcXVlc3RlZCBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiA8cHJlPgorCSAqIFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0MSA9IFJlYWRSZXF1ZXN0LmNyZWF0ZShDaGFubmVsR3JvdXApLmFsbENoYW5uZWxzKCkgLy8gbG9hZAorCSAqIAkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZXMKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYWxsCisJICogCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHJlbGF0ZWQKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hhbm5lbHMKKwkgKiAJCS5hbGxWYWx1ZXMoKSAvLyBsb2FkIGFsbCB2YWx1ZXMgb2YgZWFjaCBjaGFubmVsCisJICogCQkuZ2V0KCk7CisJICoKKwkgKiBSZWFkUmVxdWVzdCByZWFkUmVxdWVzdDIgPSBSZWFkUmVxdWVzdC5jcmVhdGUoQ2hhbm5lbEdyb3VwKS5jaGFubmVscyhjaGFubmVsMSwgY2hhbm5lbDIpIC8vIGxvYWQKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lYXN1cmVkCisJICogCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZXMKKwkgKiAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCisJICogCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGVzZQorCSAqIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gY2hhbm5lbHMKKwkgKiAJCS5yZXF1ZXN0U2l6ZSgxXzAwMCkgLy8gbG9hZCAxMDAwIHZhbHVlcyBvZiBlYWNoIGNoYW5uZWwgKGRlZmF1bHQKKwkgKiAJCQkJCQkJLy8gaXMgMTAwXzAwMCkKKwkgKiAJCS5nZXQoKTsKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBjaGFubmVsR3JvdXAgVXNlZCB0byBhY2Nlc3MgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0QnVpbGRlcn0uCisJICovCisJcHVibGljIHN0YXRpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgY3JlYXRlKENoYW5uZWxHcm91cCBjaGFubmVsR3JvdXApIHsKKwkJcmV0dXJuIG5ldyBSZWFkUmVxdWVzdEJ1aWxkZXIobmV3IFJlYWRSZXF1ZXN0KGNoYW5uZWxHcm91cCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlbGVjdGVkIHtAbGluayBDaGFubmVsfXMgd2hvc2UgdmFsdWVzIHdpbGwgYmUgbG9hZGVkIGFuZCB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIHtAbGluayBVbml0fSBjb25maWd1cmF0aW9uLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIE1hcH0gaXMgZW1wdHksIGlmIHRoaXMgcmVxdWVzdCBpcyBjb25maWd1cmVkIHRvCisJICogICAgICAgICBsb2FkIHZhbHVlcyBvZiBhbGwgcmVsYXRlZCB7QGNvZGUgQ2hhbm5lbH1zLgorCSAqLworCXB1YmxpYyBNYXA8Q2hhbm5lbCwgVW5pdD4gZ2V0Q2hhbm5lbHMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoY2hhbm5lbHMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBDaGFubmVsR3JvdXB9IHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0aGUgc291cmNlIGVudGl0eSB0bworCSAqIGFjY2VzcyBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBtZWFzdXJlZCB2YWx1ZXMgc291cmNlLCB0aGUge0Bjb2RlIENoYW5uZWxHcm91cH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENoYW5uZWxHcm91cCBnZXRDaGFubmVsR3JvdXAoKSB7CisJCXJldHVybiBjaGFubmVsR3JvdXA7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdG8gbG9hZCBtZWFzdXJlZCB2YWx1ZXMgb2YgYWxsIHJlbGF0ZWQge0BsaW5rIENoYW5uZWx9cy4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJlcXVlc3QgaXMgY29uZmlndXJlZCB0byBsb2FkIHZhbHVlcyBvZiBhbGwge0Bjb2RlCisJICogCQlDaGFubmVsfXMuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNMb2FkQWxsQ2hhbm5lbHMoKSB7CisJCXJldHVybiBsb2FkQWxsQ2hhbm5lbHM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IGFyZSBsb2FkZWQgcGVyIHtAbGluayBDaGFubmVsfSAuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciB7QGNvZGUgQ2hhbm5lbH0gcGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBpbnQgZ2V0UmVxdWVzdFNpemUoKSB7CisJCXJldHVybiByZXF1ZXN0U2l6ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvdmVyYWxsIGluZGV4IG9mIHRoZSBtZWFzdXJlZCB2YWx1ZXMgd2l0aGluIHRoZSB1bmRlcmx5aW5nCisJICoge0BsaW5rIENoYW5uZWxHcm91cH0uIFRoaXMgaW5kZXggaXMgdXNlZCB3aGlsZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdCBhbmQKKwkgKiBtZWFucyBob3cgbWFueSB2YWx1ZXMgb2YgdGhlIHZhbHVlcyBzZXF1ZW5jZXMgd2lsbCBiZSBza2lwcGVkLgorCSAqCisJICogQHJldHVybiBUaGUgb3ZlcmFsbCBzdGFydCBpbmRleCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKSB7CisJCXJldHVybiBzdGFydEluZGV4OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtsaW5rIFZhbHVlc01vZGV9IGZvciBtZWFzdXJlZCB2YWx1ZXMgcmV0cmlldmFsLgorCSAqCisJICogQHJldHVybiBUaGUgdmFsdWVzTW9kZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWVzTW9kZSBnZXRWYWx1ZXNNb2RlKCkgeworCQlyZXR1cm4gdmFsdWVzTW9kZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBhIG5ldyB7QGxpbmsgQ2hhbm5lbH0gd2hvc2UgbWVhc3VyZWQgdmFsdWVzIGhhdmUgdG8gYmUgbG9hZGVkLiBUaGUKKwkgKiBtZWFzdXJlZCB2YWx1ZXMgd2lsbCBiZSByZXRyaWV2ZWQgaW4gdGhlIHVuaXQgdGhleSB3ZXJlIHN0b3JlZC4KKwkgKgorCSAqIEBwYXJhbSBjaGFubmVsIFRoaXMge0Bjb2RlIENoYW5uZWx9IGhhcyB0byByZWxhdGVkIHRvIHRoZSB1bmRlcmx5aW5nCisJICogICAgICAgICAgICAgICAge0BsaW5rIENoYW5uZWxHcm91cH0uCisJICovCisJdm9pZCBhZGRDaGFubmVsKENoYW5uZWwgY2hhbm5lbCkgeworCQlhZGRDaGFubmVsKGNoYW5uZWwsIGNoYW5uZWwuZ2V0VW5pdCgpKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbmV3IHtAbGluayBDaGFubmVsfSB3aG9zZSBtZWFzdXJlZCB2YWx1ZXMgaGF2ZSB0byBiZSBsb2FkZWQuIFRoZQorCSAqIG1lYXN1cmVkIHZhbHVlcyB3aWxsIGJlIHJldHJpZXZlZCBpbiB0aGUgZ2l2ZW4gdW5pdC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGUgcHJvY2Vzc2luZyBvZiB0aGlzIHJlcXVlc3QgbWF5IGZhaWwgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvCisJICogY29udmVydCB0aGUgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIGNoYW5uZWwgVGhpcyB7QGNvZGUgQ2hhbm5lbH0gaGFzIHRvIHJlbGF0ZWQgdG8gdGhlIHVuZGVybHlpbmcKKwkgKiAgICAgICAgICAgICAgICB7QGxpbmsgQ2hhbm5lbEdyb3VwfS4KKwkgKiBAcGFyYW0gdW5pdCAgICB7QGNvZGUgVW5pdH0gdGhlIG1lYXN1cmVkIHZhbHVlcyBoYXZlIHRvIGJlIGxvYWRlZCBpbi4KKwkgKi8KKwl2b2lkIGFkZENoYW5uZWwoQ2hhbm5lbCBjaGFubmVsLCBVbml0IHVuaXQpIHsKKwkJY2hhbm5lbHMucHV0KGNoYW5uZWwsIHVuaXQpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhpcyByZXF1ZXN0IHRvIHJldHJpZXZlIG1lYXN1cmVkIHZhbHVlcyBvZiBhbGwgcmVsYXRlZAorCSAqIHtAbGluayBDaGFubmVsfXMuCisJICovCisJdm9pZCBzZXRMb2FkQWxsQ2hhbm5lbHMoKSB7CisJCWxvYWRBbGxDaGFubmVscyA9IHRydWU7CisJCWNoYW5uZWxzLmNsZWFyKCk7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IHdpbGwgYmUgbG9hZGVkIHBlciB7QGxpbmsgQ2hhbm5lbH0gd2hpbGUKKwkgKiBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgcmVxdWVzdCBzaXplIGlzIHplcm8sIHRoZW4gYWxsIGF2YWlsYWJsZSBtZWFzdXJlZCB2YWx1ZXMKKwkgKiB3aWxsIGJlIGxvYWRlZCBmb3IgZWFjaCBjb25maWd1cmVkIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSByZXF1ZXN0U2l6ZSBUaGUgbnVtYmVyIG9mIHZhbHVlcyBsb2FkZWQgcGVyIHtAY29kZSBDaGFubmVsfS4KKwkgKi8KKwl2b2lkIHNldFJlcXVlc3RTaXplKGludCByZXF1ZXN0U2l6ZSkgeworCQl0aGlzLnJlcXVlc3RTaXplID0gcmVxdWVzdFNpemU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbnVtYmVyIG9mIHZhbHVlcyB0aGF0IHdpbGwgYmUgc2tpcHBlZC4KKwkgKgorCSAqIEBwYXJhbSBzdGFydEluZGV4IFRoZSBudW1iZXIgb2YgdmFsdWVzIHRoYXQgd2lsbCBiZSBza2lwcGVkLgorCSAqLworCXZvaWQgc2V0U3RhcnRJbmRleChpbnQgc3RhcnRJbmRleCkgeworCQl0aGlzLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIHtAbGluayBWYWx1ZXNNb2RlfSBmb3IgbWVhc3VyZWQgdmFsdWVzIHJldHJpZXZhbC4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzTW9kZSBUaGUge0BsaW5rIFZBbHVlc01vZGV9IHRvIHNldC4KKwkgKi8KKwl2b2lkIHNldFZhbHVlc01vZGUoVmFsdWVzTW9kZSB2YWx1ZXNNb2RlKSB7CisJCXRoaXMudmFsdWVzTW9kZSA9IHZhbHVlc01vZGU7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhlcmUgYXJlIHN0aWxsIG1vcmUgdmFsdWVzIHRvIHJldHJpZXZlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG1vcmUgdmFsdWVzIHRvIHJldHJpZXZlLgorCSAqLworCWJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJcmV0dXJuIGdldFN0YXJ0SW5kZXgoKSArIGdldFJlcXVlc3RTaXplKCkgPCBnZXRDaGFubmVsR3JvdXAoKS5nZXROdW1iZXJPZlZhbHVlcygpLmludFZhbHVlKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvUmVhZFJlcXVlc3RCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvUmVhZFJlcXVlc3RCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1YzYxNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuUmVhZFJlcXVlc3QuVmFsdWVzTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKKworLyoqCisgKiBCdWlsZHMgbWVhc3VyZWQgdmFsdWVzIHJlYWQgcmVxdWVzdCBjb25maWd1cmF0aW9ucy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlYWRSZXF1ZXN0QnVpbGRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBSZWFkUmVxdWVzdCByZWFkUmVxdWVzdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSByZWFkUmVxdWVzdCBUaGUge0BsaW5rIFJlYWRSZXF1ZXN0fSB0aGF0IHdpbGwgYmUgY29uZmlndXJlZC4KKwkgKi8KKwlSZWFkUmVxdWVzdEJ1aWxkZXIoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHsKKwkJdGhpcy5yZWFkUmVxdWVzdCA9IHJlYWRSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBSZWFkUmVxdWVzdH0gdG8gcmV0cmlldmUgbWVhc3VyZWQgdmFsdWVzIG9mIGFsbCByZWxhdGVkCisJICoge0BsaW5rIENoYW5uZWx9cy4KKwkgKgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgYWxsQ2hhbm5lbHMoKSB7CisJCXJlYWRSZXF1ZXN0LnNldExvYWRBbGxDaGFubmVscygpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBDaGFubmVsfXMgdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiB7QGNvZGUgQ2hhbm5lbH1zIGFkZGVkIHdpdGggdGhpcyBtZXRob2Qgd2lsbCBiZSBpZ25vcmVkLCBvbmNlCisJICoge0BsaW5rICNhbGxDaGFubmVscygpfSB3YXMgY2FsbGVkLgorCSAqCisJICogQHBhcmFtIGNoYW5uZWxzIFRoZSB7QGNvZGUgQ2hhbm5lbH1zIHdob3NlIG1lYXN1cmVkIHZhbHVlcyB3aWxsIGJlIGxvYWRlZC4KKwkgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUmVhZFJlcXVlc3RCdWlsZGVyIGNoYW5uZWxzKExpc3Q8Q2hhbm5lbD4gY2hhbm5lbHMpIHsKKwkJY2hhbm5lbHMuZm9yRWFjaChyZWFkUmVxdWVzdDo6YWRkQ2hhbm5lbCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIENoYW5uZWx9cyB0byB0aGUgdW5kZXJseWluZyB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IHtAY29kZSBDaGFubmVsfXMgYWRkZWQgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIGlnbm9yZWQsIG9uY2UKKwkgKiB7QGxpbmsgI2FsbENoYW5uZWxzKCl9IHdhcyBjYWxsZWQuCisJICoKKwkgKiBAcGFyYW0gY2hhbm5lbHMgVGhlIHtAY29kZSBDaGFubmVsfXMgd2hvc2UgbWVhc3VyZWQgdmFsdWVzIHdpbGwgYmUgbG9hZGVkLgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgY2hhbm5lbHMoQ2hhbm5lbC4uLiBjaGFubmVscykgeworCQlBcnJheXMuc3RyZWFtKGNoYW5uZWxzKS5mb3JFYWNoKHJlYWRSZXF1ZXN0OjphZGRDaGFubmVsKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgQ2hhbm5lbH0gdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiB7QGNvZGUgQ2hhbm5lbH0gYWRkZWQgd2l0aCB0aGlzIG1ldGhvZCB3aWxsIGJlIGlnbm9yZWQsIG9uY2UKKwkgKiB7QGxpbmsgI2FsbENoYW5uZWxzKCl9IHdhcyBjYWxsZWQuCisJICoKKwkgKiBAcGFyYW0gY2hhbm5lbCBUaGUge0Bjb2RlIENoYW5uZWx9IHdob3NlIG1lYXN1cmVkIHZhbHVlcyB3aWxsIGJlIGxvYWRlZC4KKwkgKiBAcGFyYW0gdW5pdCAgICBUaGUgdW5pdCBvZiB0aGUgbG9hZGVkIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUmVhZFJlcXVlc3RCdWlsZGVyIGNoYW5uZWwoQ2hhbm5lbCBjaGFubmVsLCBVbml0IHVuaXQpIHsKKwkJcmVhZFJlcXVlc3QuYWRkQ2hhbm5lbChjaGFubmVsLCB1bml0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUgdmFsdWVzTW9kZS4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWVzTW9kZSB7QGxpbmsgVmFsdWVzTW9kZX0gdG8gdXNlIGZvciB0aGUgcmVhZCByZXF1ZXN0LgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEJ1aWxkZXIgdmFsdWVzTW9kZShSZWFkUmVxdWVzdC5WYWx1ZXNNb2RlIHZhbHVlc01vZGUpIHsKKwkJcmVhZFJlcXVlc3Quc2V0VmFsdWVzTW9kZSh2YWx1ZXNNb2RlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0fSB0byBsb2FkIGFsbCBtZWFzdXJlZCB2YWx1ZXMgb2YgZWFjaAorCSAqIGNvbmZpZ3VyZWQge0BsaW5rIENoYW5uZWx9IGFuZCByZXR1cm5zIHRoZSBjb25maWd1cmVkIHtAY29kZQorCSAqIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBCZWZvcmUgY2FsbGluZyB0aGlzIHRoZSB7QGNvZGUgQ2hhbm5lbH1zIHdob3NlIG1lYXN1cmVkIHZhbHVlcworCSAqIGhhdmUgdG8gYmUgbG9hZGVkIG11c3QgYmUgY29uZmlndXJlZC4KKwkgKgorCSAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdCBhbGxWYWx1ZXMoKSB7CisJCXJlYWRSZXF1ZXN0LnNldFN0YXJ0SW5kZXgoMCk7CisJCXJlYWRSZXF1ZXN0LnNldFJlcXVlc3RTaXplKDApOworCQlyZXR1cm4gcmVhZFJlcXVlc3Q7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0fSB0byBsb2FkIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHZhbHVlcyBmb3IKKwkgKiBlYWNoIHtAbGluayBDaGFubmVsfS4gdGhpcyBpcyBhIHRlcm1pbmFsIG9wZXJhdGlvbiByZXR1cm5pbmcgdGhlIGJ1aWx0CisJICoge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgcmVxdWVzdCBzaXplIGlzIHplcm8sIHRoZW4gYWxsIGF2YWlsYWJsZSBtZWFzdXJlZCB2YWx1ZXMKKwkgKiB3aWxsIGJlIGxvYWRlZCBmb3IgZWFjaCBjb25maWd1cmVkIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSByZXF1ZXN0U2l6ZSBUaGUgcmVxdWVzdCBzaXplLgorCSAqIEByZXR1cm4gdGhlIHtAbGluayBSZWFkUmVxdWVzdH0KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIHJlcXVlc3Qgc2l6ZSBpcyBzbWFsbGVyIHRoYW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdCB2YWx1ZXMoaW50IHJlcXVlc3RTaXplKSB7CisJCXJlYWRSZXF1ZXN0LnNldFN0YXJ0SW5kZXgoMCk7CisJCXJlYWRSZXF1ZXN0LnNldFJlcXVlc3RTaXplKHJlcXVlc3RTaXplKTsKKwkJcmV0dXJuIHJlYWRSZXF1ZXN0OworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBSZWFkUmVxdWVzdH0gdG8gbG9hZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB2YWx1ZXMKKwkgKiBmcm9tIGEgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGZvciBlYWNoIHtAbGluayBDaGFubmVsfS4gdGhpcyBpcyBhIHRlcm1pbmFsCisJICogb3BlcmF0aW9uIHJldHVybmluZyB0aGUgYnVpbHQge0BsaW5rIFJlYWRSZXF1ZXN0fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgcmVxdWVzdCBzaXplIGlzIHplcm8sIHRoZW4gYWxsIGF2YWlsYWJsZSBtZWFzdXJlZCB2YWx1ZXMKKwkgKiB3aWxsIGJlIGxvYWRlZCBmb3IgZWFjaCBjb25maWd1cmVkIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSBzdGFydEluZGV4ICBUaGUgc3RhcnQgaW5kZXguCisJICogQHBhcmFtIHJlcXVlc3RTaXplIFRoZSByZXF1ZXN0IHNpemUuCisJICogQHJldHVybiB0aGUge0BsaW5rIFJlYWRSZXF1ZXN0fQorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB0aGUgcmVxdWVzdCBzaXplIGlzIHNtYWxsZXIgdGhhbiAwCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIHN0YXJ0IGluZGV4IGlzIHNtYWxsZXIgdGhhbiAwLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdCB2YWx1ZXMoaW50IHN0YXJ0SW5kZXgsIGludCByZXF1ZXN0U2l6ZSkgeworCQlyZWFkUmVxdWVzdC5zZXRTdGFydEluZGV4KHN0YXJ0SW5kZXgpOworCQlyZWFkUmVxdWVzdC5zZXRSZXF1ZXN0U2l6ZShyZXF1ZXN0U2l6ZSk7CisJCXJldHVybiByZWFkUmVxdWVzdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFuIHtAbGluayBSZWFkUmVxdWVzdEl0ZXJhYmxlfSB0byBpdGVyYXRlIG92ZXIgYWxsIGF2YWlsYWJsZQorCSAqIHtAbGluayBSZWFkUmVxdWVzdH1zLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFJlYWRSZXF1ZXN0SXRlcmFibGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBSZWFkUmVxdWVzdEl0ZXJhYmxlIGNyZWF0ZUl0ZXJhYmxlKCkgeworCQlyZXR1cm4gbmV3IFJlYWRSZXF1ZXN0SXRlcmFibGUocmVhZFJlcXVlc3QpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1JlYWRSZXF1ZXN0SXRlcmFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdEl0ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MjdiNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9SZWFkUmVxdWVzdEl0ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGlzIGFuIHJlYWQgcmVxdWVzdCBpdGVyYWJsZSBmb3IgY29tZm9ydGFibGUgcHJvY2Vzc2luZyBvZiBzdWJzZXF1ZW50CisgKiB7QGxpbmsgUmVhZFJlcXVlc3R9cworICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVhZFJlcXVlc3RJdGVyYWJsZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPFJlYWRSZXF1ZXN0PiwgSXRlcmF0b3I8UmVhZFJlcXVlc3Q+IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0OworCXByaXZhdGUgaW50IGNvdW50OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFRoZSB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqLworCVJlYWRSZXF1ZXN0SXRlcmFibGUoUmVhZFJlcXVlc3QgcmVhZFJlcXVlc3QpIHsKKwkJdGhpcy5yZWFkUmVxdWVzdCA9IHJlYWRSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQlyZXR1cm4gY291bnQgPT0gMCB8fCByZWFkUmVxdWVzdC5oYXNOZXh0KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBSZWFkUmVxdWVzdCBuZXh0KCkgeworCQlpZiAoaGFzTmV4dCgpKSB7CisJCQlyZWFkUmVxdWVzdCA9IGNvdW50ID09IDAgPyByZWFkUmVxdWVzdCA6IG5ldyBSZWFkUmVxdWVzdChyZWFkUmVxdWVzdCk7CisJCQljb3VudCsrOworCQkJcmV0dXJuIHJlYWRSZXF1ZXN0OworCQl9CisKKwkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIlN1YnNlcXVlbnQgcmVhZCByZXF1ZXN0IGlzIG5vdCBhdmFpbGFibGUuIik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJdGVyYXRvcjxSZWFkUmVxdWVzdD4gaXRlcmF0b3IoKSB7CisJCXJldHVybiB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1VuaXRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvVW5pdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM1MTcyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1VuaXRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworCisvKioKKyAqIFRoaXMgYnVpbGRlciBhbGxvd3MgdG8gc3BlY2lmeSBhIHNvdXJjZSB7QGxpbmsgVW5pdH0gd2hpY2ggaXMgZGlmZmVyZW50IHRvCisgKiB0aGUgb3JpZ2luIHtAY29kZSBVbml0fSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2hhbm5lbH0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVbml0QnVpbGRlciBleHRlbmRzIFdyaXRlUmVxdWVzdEZpbmFsaXplciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSwgd2hvc2UgbWVhc3VyZWQgdmFsdWUncyBzb3VyY2UKKwkgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBVbml0fSBtYXkgYmUgZGVmaW5lZC4KKwkgKi8KKwlVbml0QnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXN1cGVyKHdyaXRlUmVxdWVzdCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU2V0cyBhIHNvdXJjZSB7QGxpbmsgVW5pdH0gZm9yIHRoZSBwcmV2aW91c2x5IGRlZmluZWQgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIHNvdXJjZVVuaXQgVGhlIHNvdXJjZSB7QGNvZGUgVW5pdH0uCisJICogQHJldHVybiBUaGUge0BsaW5rIFdyaXRlUmVxdWVzdEZpbmFsaXplcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFdyaXRlUmVxdWVzdEZpbmFsaXplciBzb3VyY2VVbml0KFVuaXQgc291cmNlVW5pdCkgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTb3VyY2VVbml0KHNvdXJjZVVuaXQpOworCQlyZXR1cm4gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Vbml0SW5kZXBlbmRlbnRCdWlsZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvVW5pdEluZGVwZW5kZW50QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjE1ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvVW5pdEluZGVwZW5kZW50QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGE7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworCisvKioKKyAqIFRoaXMgYnVpbGRlciBhbGxvd3MgdG8gc3BlY2lmeSBhIHNvdXJjZSB7QGxpbmsgVW5pdH0gd2hpY2ggaXMgZGlmZmVyZW50IHRvCisgKiB0aGUgb3JpZ2luIHtAY29kZSBVbml0fSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgQ2hhbm5lbH0uIEluIEFkZGl0aW9uIHRvCisgKiB0aGF0IHRoaXMgYnVpbGRlciBhbGxvd3MgdG8gY29uZmlndXJlIG51bWVyaWNhbGx5IHNvcnRhYmxlIG1lYXN1cmVkIHZhbHVlcyB0bworICogYmUgaW5kZXBlbmRlbnQsIHdoaWNoIG1lYW5zIHRoZSBtZWFzdXJlZCB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aG9zZSBvZgorICogb3RoZXIge0BsaW5rIENoYW5uZWx9cyB3aXRoaW4gdGhlaXIgY29tbW9uIHtAbGluayBDaGFubmVsR3JvdXB9LiBUaGUKKyAqIG51bWVyaWNhbGx5IHNvcnRhYmxlIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3c6CisgKgorICogPHVsPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RBVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKyAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVW5pdEluZGVwZW5kZW50QnVpbGRlciBleHRlbmRzIEluZGVwZW5kZW50QnVpbGRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aG9zZSBtZWFzdXJlZCB2YWx1ZXMgc291cmNlCisJICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVW5pdH0gbWF5IGJlIGNoYW5nZWQgb3IgbWFya2VkIGFzIGluZGVwZW5kZW50LgorCSAqLworCVVuaXRJbmRlcGVuZGVudEJ1aWxkZXIoV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdCkgeworCQlzdXBlcih3cml0ZVJlcXVlc3QpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFNldHMgYSBzb3VyY2Uge0BsaW5rIFVuaXR9IGZvciB0aGUgcHJldmlvdXNseSBkZWZpbmVkIG1lYXN1cmVkIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2VVbml0IFRoZSBzb3VyY2Uge0Bjb2RlIFVuaXR9LgorCSAqIEByZXR1cm4gVGhlIHtAbGluayBJbmRlcGVuZGVudEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbmRlcGVuZGVudEJ1aWxkZXIgc291cmNlVW5pdChVbml0IHNvdXJjZVVuaXQpIHsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0U291cmNlVW5pdChzb3VyY2VVbml0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA4YmQ5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Xcml0ZVJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDM3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNlcXVlbmNlUmVwcmVzZW50YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVuaXQ7CisKKy8qKgorICogSG9sZHMgcmVxdWlyZWQgZGF0YSB0byB3cml0ZSBtYXNzIGRhdGEuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZVJlcXVlc3QgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgTGlzdDxFeHRlcm5hbENvbXBvbmVudD4gZXh0ZXJuYWxDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwOworCXByaXZhdGUgZmluYWwgQ2hhbm5lbCBjaGFubmVsOworCXByaXZhdGUgZmluYWwgQXhpc1R5cGUgYXhpc1R5cGU7CisKKwlwcml2YXRlIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwlwcml2YXRlIGRvdWJsZVtdIGdlbmVyYXRpb25QYXJhbWV0ZXJzOworCXByaXZhdGUgYm9vbGVhbiBpbmRlcGVuZGVudDsKKworCXByaXZhdGUgU2NhbGFyVHlwZSByYXdTY2FsYXJUeXBlOworCXByaXZhdGUgT2JqZWN0IHZhbHVlczsKKwlwcml2YXRlIGJvb2xlYW4gYWxsVmFsaWQ7CisJcHJpdmF0ZSBib29sZWFuW10gZmxhZ3M7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY2hhbm5lbEdyb3VwIFRoZSB7QGxpbmsgQ2hhbm5lbEdyb3VwfSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqIEBwYXJhbSBjaGFubmVsICAgICAgVGhlIHtAbGluayBDaGFubmVsfSBzcGVjaWZpZWQgbWFzcyBkYXRhIHdpbGwgYmUgZGVkaWNhdGVkCisJICogICAgICAgICAgICAgICAgICAgICB0by4KKwkgKiBAcGFyYW0gYXhpc1R5cGUgICAgIFRoZSB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoZSB3cml0dGVuIG1hc3MgZGF0YS4KKwkgKi8KKwlwcml2YXRlIFdyaXRlUmVxdWVzdChDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwLCBDaGFubmVsIGNoYW5uZWwsIEF4aXNUeXBlIGF4aXNUeXBlKSB7CisJCXRoaXMuY2hhbm5lbEdyb3VwID0gY2hhbm5lbEdyb3VwOworCQl0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworCQl0aGlzLmF4aXNUeXBlID0gYXhpc1R5cGU7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU3RhcnRzIGEgbmV3IHtAbGluayBXcml0ZVJlcXVlc3R9IGJ5IHJldHVybmluZyBhIHtAbGluayBXcml0ZVJlcXVlc3RCdWlsZGVyfS4KKwkgKgorCSAqIEBwYXJhbSBjaGFubmVsR3JvdXAgVGhlIHtAbGluayBDaGFubmVsR3JvdXB9IGZvciB0aGlzIHJlcXVlc3QuCisJICogQHBhcmFtIGNoYW5uZWwgICAgICBUaGUge0BsaW5rIENoYW5uZWx9IHNwZWNpZmllZCBtYXNzIGRhdGEgd2lsbCBiZSBkZWRpY2F0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgIHRvLgorCSAqIEBwYXJhbSBheGlzVHlwZSAgICAgVGhlIHtAbGluayBBeGlzVHlwZX0gb2YgdGhlIHdyaXR0ZW4gbWFzcyBkYXRhLgorCSAqIEByZXR1cm4gQSB7QGNvZGUgV3JpdGVSZXF1ZXN0QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBXcml0ZVJlcXVlc3RCdWlsZGVyIGNyZWF0ZShDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwLCBDaGFubmVsIGNoYW5uZWwsIEF4aXNUeXBlIGF4aXNUeXBlKSB7CisJCXJldHVybiBuZXcgV3JpdGVSZXF1ZXN0QnVpbGRlcihuZXcgV3JpdGVSZXF1ZXN0KGNoYW5uZWxHcm91cCwgY2hhbm5lbCwgYXhpc1R5cGUpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2hhbm5lbEdyb3VwfSBvZiB0aGlzIHJlcXVlc3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ2hhbm5lbEdyb3VwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2hhbm5lbEdyb3VwIGdldENoYW5uZWxHcm91cCgpIHsKKwkJcmV0dXJuIGNoYW5uZWxHcm91cDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2hhbm5lbH0gb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENoYW5uZWx9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDaGFubmVsIGdldENoYW5uZWwoKSB7CisJCXJldHVybiBjaGFubmVsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBBeGlzVHlwZX0gb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEF4aXNUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQXhpc1R5cGUgZ2V0QXhpc1R5cGUoKSB7CisJCXJldHVybiBheGlzVHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbn0gb2YgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSB7CisJCXJldHVybiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBvZiB0aGlzIHJlcXVlc3QuIFRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkCisJICogYXJyYXkgZGVwZW5kcyBvbiB0aGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IG9mIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBJbiBjYXNlIG9mIGFuIGltcGxpY2l0IHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIHRoaXMgbWV0aG9kIHdpbGwKKwkgKiBhbHdheXMgcmV0dXJuIGFuIGVtcHR5IGFycmF5IHNpbmNlIHRoZXNlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhcmUgY29ycmVjdGx5CisJICogdHlwZWQgYW5kIHN0b3JlZCBhcyBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiBAcmV0dXJuIElmIG5vbmUgYXZhaWxhYmxlLCB0aGVuIGFuIGVtcHR5IGFycmF5IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIGdlbmVyYXRpb25QYXJhbWV0ZXJzID09IG51bGwgPyBuZXcgZG91YmxlWzBdIDogZ2VuZXJhdGlvblBhcmFtZXRlcnMuY2xvbmUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbmRlcGVuZGVudCBmbGFnIG9mIHRoaXMgcmVxdWVzdC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1lYXN1cmVkIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRob3NlIG9mCisJICogICAgICAgICBvdGhlciB7QGxpbmsgQ2hhbm5lbH1zIHdpdGhpbiB0aGVpciBjb21tb24ge0BsaW5rIENoYW5uZWxHcm91cH0uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbmRlcGVuZGVudCgpIHsKKwkJcmV0dXJuIGluZGVwZW5kZW50OworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgcmVxdWVzdCBoYXMgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNpc0V4dGVybmFsKCl9CisJICogICAgICAgICByZXR1cm5zIHtAY29kZSBmYWxzZX0uCisJICogQHNlZSAjaGFzRXh0ZXJuYWxDb21wb25lbnRzKCkKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBoYXNWYWx1ZXMoKSB7CisJCXJldHVybiAhZ2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigpLmlzRXh0ZXJuYWwoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzdG9yZWQgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVzKCkgeworCQlpZiAoaGFzVmFsdWVzKCkpIHsKKwkJCXJldHVybiB2YWx1ZXM7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWYWx1ZXMgYXJlIG5vdCBhdmFpbGFibGUuIik7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyByZXF1ZXN0IGhhcyBtZWFzdXJlZCB2YWx1ZXMsIHN0b3JlZCBpbiBleHRlcm5hbGx5IGxpbmtlZAorCSAqIGZpbGVzLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNpc0V4dGVybmFsKCl9CisJICogICAgICAgICByZXR1cm5zIHtAY29kZSB0cnVlfS4KKwkgKiBAc2VlICNoYXNWYWx1ZXMoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc0V4dGVybmFsQ29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKS5pc0V4dGVybmFsKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbnMgZm9yIG1lYXN1cmVkIHZhbHVlcyBzdG9yZWQgaW4gZXh0ZXJuYWxseQorCSAqIHJlZmVyZW5jZWQgZmlsZXMuCisJICogCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiBjb25maWd1cmF0aW9ucyBhcmUgbm90IGF2YWlsYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxFeHRlcm5hbENvbXBvbmVudD4gZ2V0RXh0ZXJuYWxDb21wb25lbnRzKCkgeworCQlpZiAoIWhhc0V4dGVybmFsQ29tcG9uZW50cygpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFeHRlcm5hbCBjb21wb25lbnRzIGFyZSBub3QgYXZhaWxhYmxlLiIpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZXh0ZXJuYWxDb21wb25lbnRzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2NhbGFyVHlwZX0gb2YgdGhlIHN0b3JlZCBtZWFzdXJlZCB2YWx1ZSBzZXF1ZW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJhdyB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNjYWxhclR5cGUgZ2V0UmF3U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIHJhd1NjYWxhclR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY2FsY3VsYXRlZCB7QGxpbmsgU2NhbGFyVHlwZX0gd2hpY2ggcmVmbGVjdHMgdGhlIGZpbmFsCisJICoge0Bjb2RlIFNjYWxhclR5cGV9IG9mIHRoZSBnZW5lcmF0ZWQgbWVhc3VyZWQgdmFsdWUgc2VxdWVuY2UuIElmCisJICoge0BsaW5rICNnZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpfSByZXR1cm5zIGEgbm90IGVtcHR5IGFycmF5IGFuZAorCSAqIHtAbGluayAjZ2V0UmF3U2NhbGFyVHlwZSgpfSBpcyBhbiBpbnRlZ2VyIHR5cGUgKGJ5dGUsIHNob3J0LCBpbnQsIGxvbmcpLCB0aGVuCisJICogdGhlIHJldHVybmVkIHtAY29kZSBTY2FsYXJUeXBlfSBpcyBidW1wZWQgdG8gdGhlIG5leHQgc3VpdGFibGUgZmxvYXRpbmcgcG9pbnQKKwkgKiB0eXBlIGFzIGxpc3RlZCBiZWxvdzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjQllURX0gLSZndDsge0BsaW5rIFNjYWxhclR5cGUjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9IC0mZ3Q7IHtAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0lOVEVHRVJ9IC0mZ3Q7IHtAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0xPTkd9IC0mZ3Q7IHtAbGluayBTY2FsYXJUeXBlI0RPVUJMRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFRoZSBjYWxjdWxhdGVkIHtAY29kZSBTY2FsYXJUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU2NhbGFyVHlwZSBnZXRDYWxjdWxhdGVkU2NhbGFyVHlwZSgpIHsKKwkJaWYgKGdldEdlbmVyYXRpb25QYXJhbWV0ZXJzKCkubGVuZ3RoID4gMCAmJiBnZXRSYXdTY2FsYXJUeXBlKCkuaXNJbnRlZ2VyVHlwZSgpKSB7CisJCQlyZXR1cm4gZ2V0UmF3U2NhbGFyVHlwZSgpLmlzTG9uZygpID8gU2NhbGFyVHlwZS5ET1VCTEUgOiBTY2FsYXJUeXBlLkZMT0FUOworCQl9CisKKwkJcmV0dXJuIGdldFJhd1NjYWxhclR5cGUoKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBhbGwgbWVhc3VyZWQgdmFsdWVzIHdpdGhpbiB0aGUgd2hvbGUgc2VxdWVuY2UgYXJlIHZhbGlkLiBJZgorCSAqIHRoaXMgbWV0aG9kIHJldHVybnMge0Bjb2RlIHRydWV9LCB0aGVuIHtAbGluayAjZ2V0RmxhZ3MoKX0gd2lsbCByZXR1cm4gYW4KKwkgKiBlbXB0eSBhcnJheS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYWxsIG1lYXN1cmVkIHZhbHVlcyBhcmUgdmFsaWQuCisJICogQHNlZSAjZ2V0RmxhZ3MoKQorCSAqLworCXB1YmxpYyBib29sZWFuIGFyZUFsbFZhbGlkKCkgeworCQlyZXR1cm4gYWxsVmFsaWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsaWRpdHkgZmxhZ3Mgc2VxdWVuY2UgZm9yIHRoZSBzdG9yZWQgbWVhc3VyZWQgdmFsdWVzLiBJZgorCSAqIHtAbGluayAjYXJlQWxsVmFsaWQoKX0gcmV0dXJucyB7QGNvZGUgZmFsc2V9IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGFycmF5CisJICogd2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZSwgd2hlcmUgZWFjaCBmbGFnCisJICogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgbWVhc3VyZWQgdmFsdWUgaXMgdmFsaWQgb3Igbm90LgorCSAqCisJICogQHJldHVybiBUaGUgdmFsaWRpdHkgZmxhZ3Mgc2VxdWVuY2UgaXMgcmV0dXJuZWQuCisJICogQHNlZSAjYWxsVmFsaWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbltdIGdldEZsYWdzKCkgeworCQlyZXR1cm4gZmxhZ3MuY2xvbmUoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IGZvciB0aGlzIHJlcXVlc3QuCisJICoKKwkgKiBAcGFyYW0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbiBUaGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259LgorCSAqLworCXZvaWQgc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJdGhpcy5zZXF1ZW5jZVJlcHJlc2VudGF0aW9uID0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGdlbmVyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHBhcmFtIGdlbmVyYXRpb25QYXJhbWV0ZXJzIFRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMuCisJICovCisJdm9pZCBzZXRHZW5lcmF0aW9uUGFyYW1ldGVycyhkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVycykgeworCQl0aGlzLmdlbmVyYXRpb25QYXJhbWV0ZXJzID0gZ2VuZXJhdGlvblBhcmFtZXRlcnMuY2xvbmUoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBpbmRlcGVuZGVudCBmbGFnIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJdm9pZCBzZXRJbmRlcGVuZGVudCgpIHsKKwkJaW5kZXBlbmRlbnQgPSB0cnVlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGluZGVwZW5kZW50IGZsYWcgZm9yIHRoaXMgcmVxdWVzdCB0byB0aGUgdmFsdWUgc3BlY2lmaWVkLgorCSAqIAorCSAqIEBwYXJhbSBpbmRlcGVuZGVudCBUaGUgaW5kZXBlbmRlbnQgZmxhZy4KKwkgKi8KKwl2b2lkIHNldEluZGVwZW5kZW50KGJvb2xlYW4gaW5kZXBlbmRlbnQpIHsKKwkJdGhpcy5pbmRlcGVuZGVudCA9IGluZGVwZW5kZW50OworCX0KKworCS8qKgorCSAqIFRyaWdnZXJzIGFuIGFkanVzdG1lbnQgb2YgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoZQorCSAqIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBvZiB0aGlzIHJlcXVlc3QgdG8gbWF0Y2ggdGhlIHtAbGluayBDaGFubmVsfXMKKwkgKiBkZWZhdWx0IHtAbGluayBVbml0fS4KKwkgKgorCSAqIEBwYXJhbSBzb3VyY2VVbml0IFRoZSB7QGxpbmsgVW5pdH0gb2YgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKi8KKwl2b2lkIHNldFNvdXJjZVVuaXQoVW5pdCBzb3VyY2VVbml0KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ29udmVyc2lvbiBiZXR3ZWVuIHVuaXRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgcmF3IHtAbGluayBTY2FsYXJUeXBlfSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqCisJICogQHBhcmFtIHJhd1NjYWxhclR5cGUgVGhlIHtAbGluayBTY2FsYXJUeXBlfS4KKwkgKi8KKwl2b2lkIHNldFJhd1NjYWxhclR5cGUoU2NhbGFyVHlwZSByYXdTY2FsYXJUeXBlKSB7CisJCXRoaXMucmF3U2NhbGFyVHlwZSA9IHJhd1NjYWxhclR5cGU7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlIHdoZXJlIGVhY2ggdmFsdWUgaW4gdGhlIHNlcXVlbmNlIGlzCisJICogZXhwZWN0ZWQgdG8gYmUgdmFsaWQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVzIFRoZSBtZWFzdXJlZCB2YWx1ZSBzZXF1ZW5jZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNoYXNWYWx1ZXMoKX0gcmV0dXJucworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmYWxzZX0uCisJICovCisJdm9pZCBzZXRWYWx1ZXMoT2JqZWN0IHZhbHVlcykgeworCQlpZiAoaGFzVmFsdWVzKCkpIHsKKwkJCXRoaXMudmFsdWVzID0gdmFsdWVzOworCQkJYWxsVmFsaWQgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWVhc3VyZWQgdmFsdWVzIHN0b3JlZCBpbiBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBleHBlY3RlZC4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZSB3aGVyZSBlYWNoIHZhbHVlJ3MgdmFsaWRpdHkgaXMgc3BlY2lmaWVkIGluCisJICogdGhlIGdpdmVuIGZsYWdzIGFycmF5LgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUgbWVhc3VyZWQgdmFsdWUgc2VxdWVuY2UuCisJICogQHBhcmFtIGZsYWdzICBUaGUgdmFsaWRpdHkgZmxhZyBzZXF1ZW5jZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0BsaW5rICNoYXNWYWx1ZXMoKX0gcmV0dXJucworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmYWxzZX0uCisJICovCisJdm9pZCBzZXRWYWx1ZXMoT2JqZWN0IHZhbHVlcywgYm9vbGVhbltdIGZsYWdzKSB7CisJCWlmIChoYXNWYWx1ZXMoKSkgeworCQkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJCQl0aGlzLmZsYWdzID0gZmxhZ3MuY2xvbmUoKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lYXN1cmVkIHZhbHVlcyBzdG9yZWQgaW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMgZXhwZWN0ZWQuIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgY29uZmlndXJhdGlvbiBmb3IgbWVhc3VyZWQgdmFsdWVzIHN0b3JlZCBpbiBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4KKwkgKgorCSAqIEBwYXJhbSBleHRlcm5hbENvbXBvbmVudCBUaGUgbmV3IGNvbmZpZ3VyYXRpb24uCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHtAbGluayAjaGFzRXh0ZXJuYWxDb21wb25lbnRzKCl9CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorCSAqLworCXZvaWQgYWRkRXh0ZXJuYWxDb21wb25lbnQoRXh0ZXJuYWxDb21wb25lbnQgZXh0ZXJuYWxDb21wb25lbnQpIHsKKwkJaWYgKGhhc0V4dGVybmFsQ29tcG9uZW50cygpKSB7CisJCQlleHRlcm5hbENvbXBvbmVudHMuYWRkKGV4dGVybmFsQ29tcG9uZW50KTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lYXN1cmVkIHZhbHVlcyBleHBlY3RlZCIpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1dyaXRlUmVxdWVzdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2FlYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21hc3NkYXRhL1dyaXRlUmVxdWVzdEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCisvKioKKyAqIEJ1aWxkcyBtZWFzdXJlZCB2YWx1ZXMgd3JpdGUgcmVxdWVzdCBjb25maWd1cmF0aW9ucy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlUmVxdWVzdEJ1aWxkZXIgZXh0ZW5kcyBCYXNlVmFsdWVzQnVpbGRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB3aGljaCB3aWxsIGJlIGNvbmZpZ3VyZWQuCisJICovCisJV3JpdGVSZXF1ZXN0QnVpbGRlcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXN1cGVyKHdyaXRlUmVxdWVzdCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGFuIGV4cGxpY2l0IHNlcXVlbmNlIG9mCisJICogbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHJldHVybiBBbiB7QGxpbmsgQW55VHlwZVZhbHVlc0J1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEBzZWUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNFWFBMSUNJVAorCSAqLworCXB1YmxpYyBBbnlUeXBlVmFsdWVzQnVpbGRlciBleHBsaWNpdCgpIHsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUKTsKKwkJcmV0dXJuIG5ldyBBbnlUeXBlVmFsdWVzQnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGFuIGltcGxpY2l0IGNvbnN0YW50IHNlcXVlbmNlCisJICogb2YgbWVhc3VyZWQgdmFsdWVzLiBBbiBpbXBsaWNpdCBzZXF1ZW5jZSBhbGxvd3Mgb25seSBudW1lcmljYWwKKwkgKiB7QGxpbmsgU2NhbGFyVHlwZX1zIGFzIGxpc3RlZCBiZWxvdzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjQllURX08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNTSE9SVH08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjRE9VQkxFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBHaXZlbiBvZmZzZXQgd2lsbCBiZSBjYXN0IHRvIGFuIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB0eXBlLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgVGhlIHtAY29kZSBTY2FsYXJUeXBlfSBvZiBlYWNoIHNpbmdsZSBtZWFzdXJlZCB2YWx1ZSBpbiB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS4KKwkgKiBAcGFyYW0gb2Zmc2V0ICAgICBUaGUgY29uc3RhbnQgdmFsdWUuCisJICogQHJldHVybiBBbiB7QGxpbmsgVW5pdEJ1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLgorCSAqIEBzZWUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNJTVBMSUNJVF9DT05TVEFOVAorCSAqLworCXB1YmxpYyBVbml0QnVpbGRlciBpbXBsaWNpdENvbnN0YW50KFNjYWxhclR5cGUgc2NhbGFyVHlwZSwgZG91YmxlIG9mZnNldCkgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uSU1QTElDSVRfQ09OU1RBTlQpOworCisJCU9iamVjdCB2YWx1ZXM7CisJCWlmIChzY2FsYXJUeXBlLmlzQnl0ZSgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIG9mZnNldCB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNTaG9ydCgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgc2hvcnRbXSB7IChzaG9ydCkgb2Zmc2V0IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0ludGVnZXIoKSkgeworCQkJdmFsdWVzID0gbmV3IGludFtdIHsgKGludCkgb2Zmc2V0IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0xvbmcoKSkgeworCQkJdmFsdWVzID0gbmV3IGxvbmdbXSB7IChsb25nKSBvZmZzZXQgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzRmxvYXQoKSkgeworCQkJdmFsdWVzID0gbmV3IGZsb2F0W10geyAoZmxvYXQpIG9mZnNldCB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNEb3VibGUoKSkgeworCQkJdmFsdWVzID0gbmV3IGRvdWJsZVtdIHsgb2Zmc2V0IH07CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTY2FsYXIgdHlwZSAnIiArIHNjYWxhclR5cGUgKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJCWNyZWF0ZVZhbHVlcyhzY2FsYXJUeXBlLCB2YWx1ZXMpOworCisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGNyZWF0ZSBhbiBpbXBsaWNpdCBsaW5lYXIgc2VxdWVuY2Ugb2YKKwkgKiBtZWFzdXJlZCB2YWx1ZXMuIEFuIGltcGxpY2l0IHNlcXVlbmNlIGFsbG93cyBvbmx5IG51bWVyaWNhbAorCSAqIHtAbGluayBTY2FsYXJUeXBlfXMgYXMgbGlzdGVkIGJlbG93OgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0lOVEVHRVJ9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjTE9OR308L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNGTE9BVH08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNET1VCTEV9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IEdpdmVuIHN0YXJ0IGFuZCBpbmNyZW1lbnQgd2lsbCBiZSBjYXN0IHRvIGFuIGFzc2lnbm1lbnQKKwkgKiBjb21wYXRpYmxlIHR5cGUuCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyVHlwZSBUaGUge0Bjb2RlIFNjYWxhclR5cGV9IG9mIGVhY2ggc2luZ2xlIG1lYXN1cmVkIHZhbHVlIGluIHRoZQorCSAqICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLgorCSAqIEBwYXJhbSBzdGFydCAgICAgIFRoZSBzdGFydCB2YWx1ZSBvZiB0aGUgbGluZS4KKwkgKiBAcGFyYW0gaW5jcmVtZW50ICBUaGUgZ3JhZGllbnQgb2YgdGhlIGxpbmUuCisJICogQHJldHVybiBBbiB7QGxpbmsgVW5pdEluZGVwZW5kZW50QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfSBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI0lNUExJQ0lUX0xJTkVBUgorCSAqLworCXB1YmxpYyBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGltcGxpY2l0TGluZWFyKFNjYWxhclR5cGUgc2NhbGFyVHlwZSwgZG91YmxlIHN0YXJ0LCBkb3VibGUgaW5jcmVtZW50KSB7CisJCWdldFdyaXRlUmVxdWVzdCgpLnNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9MSU5FQVIpOworCisJCU9iamVjdCB2YWx1ZXM7CisJCWlmIChzY2FsYXJUeXBlLmlzQnl0ZSgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgYnl0ZVtdIHsgKGJ5dGUpIHN0YXJ0LCAoYnl0ZSkgaW5jcmVtZW50IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc1Nob3J0KCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBzaG9ydFtdIHsgKHNob3J0KSBzdGFydCwgKHNob3J0KSBpbmNyZW1lbnQgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzSW50ZWdlcigpKSB7CisJCQl2YWx1ZXMgPSBuZXcgaW50W10geyAoaW50KSBzdGFydCwgKGludCkgaW5jcmVtZW50IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0xvbmcoKSkgeworCQkJdmFsdWVzID0gbmV3IGxvbmdbXSB7IChsb25nKSBzdGFydCwgKGxvbmcpIGluY3JlbWVudCB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNGbG9hdCgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgZmxvYXRbXSB7IChmbG9hdCkgc3RhcnQsIChmbG9hdCkgaW5jcmVtZW50IH07CisJCX0gZWxzZSBpZiAoc2NhbGFyVHlwZS5pc0RvdWJsZSgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgZG91YmxlW10geyBzdGFydCwgaW5jcmVtZW50IH07CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTY2FsYXIgdHlwZSAnIiArIHNjYWxhclR5cGUgKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJCWNyZWF0ZVZhbHVlcyhzY2FsYXJUeXBlLCB2YWx1ZXMpOworCisJCXJldHVybiBuZXcgVW5pdEluZGVwZW5kZW50QnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGFuIGltcGxpY2l0IHNhdyBzZXF1ZW5jZSBvZgorCSAqIG1lYXN1cmVkIHZhbHVlcy4gQW4gaW1wbGljaXQgc2VxdWVuY2UgYWxsb3dzIG9ubHkgbnVtZXJpY2FsCisJICoge0BsaW5rIFNjYWxhclR5cGV9cyBhcyBsaXN0ZWQgYmVsb3c6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0JZVEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjU0hPUlR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFNjYWxhclR5cGUjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgU2NhbGFyVHlwZSNMT05HfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBTY2FsYXJUeXBlI0RPVUJMRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gR2l2ZW4gc3RhcnQsIGluY3JlbWVudCBhbmQgdmFsdWVzUGVyU2F3IHdpbGwgYmUgY2FzdCB0byBhbgorCSAqIGFzc2lnbm1lbnQgY29tcGF0aWJsZSB0eXBlLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgICBUaGUge0Bjb2RlIFNjYWxhclR5cGV9IG9mIGVhY2ggc2luZ2xlIG1lYXN1cmVkIHZhbHVlIGluCisJICogICAgICAgICAgICAgICAgICAgICB0aGUgc2VxdWVuY2UuCisJICogQHBhcmFtIHN0YXJ0ICAgICAgICBUaGUgc3RhcnQgdmFsdWUgb2YgZWFjaCBzYXcgY3ljbGUuCisJICogQHBhcmFtIGluY3JlbWVudCAgICBUaGUgaW5jcmVtZW50LgorCSAqIEBwYXJhbSB2YWx1ZXNQZXJTYXcgVGhlIG51bWJlciBvZiB2YWx1ZXMgcGVyIHNhdy4KKwkgKiBAcmV0dXJuIEFuIHtAbGluayBVbml0QnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHtAY29kZSBTY2FsYXJUeXBlfSBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI0lNUExJQ0lUX1NBVworCSAqLworCXB1YmxpYyBVbml0QnVpbGRlciBpbXBsaWNpdFNhdyhTY2FsYXJUeXBlIHNjYWxhclR5cGUsIGRvdWJsZSBzdGFydCwgZG91YmxlIGluY3JlbWVudCwgZG91YmxlIHZhbHVlc1BlclNhdykgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uSU1QTElDSVRfU0FXKTsKKworCQlPYmplY3QgdmFsdWVzOworCQlpZiAoc2NhbGFyVHlwZS5pc0J5dGUoKSkgeworCQkJdmFsdWVzID0gbmV3IGJ5dGVbXSB7IChieXRlKSBzdGFydCwgKGJ5dGUpIGluY3JlbWVudCwgKGJ5dGUpIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNTaG9ydCgpKSB7CisJCQl2YWx1ZXMgPSBuZXcgc2hvcnRbXSB7IChzaG9ydCkgc3RhcnQsIChzaG9ydCkgaW5jcmVtZW50LCAoc2hvcnQpIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNJbnRlZ2VyKCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBpbnRbXSB7IChpbnQpIHN0YXJ0LCAoaW50KSBpbmNyZW1lbnQsIChpbnQpIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgaWYgKHNjYWxhclR5cGUuaXNMb25nKCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBsb25nW10geyAobG9uZykgc3RhcnQsIChsb25nKSBpbmNyZW1lbnQsIChsb25nKSB2YWx1ZXNQZXJTYXcgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzRmxvYXQoKSkgeworCQkJdmFsdWVzID0gbmV3IGZsb2F0W10geyAoZmxvYXQpIHN0YXJ0LCAoZmxvYXQpIGluY3JlbWVudCwgKGZsb2F0KSB2YWx1ZXNQZXJTYXcgfTsKKwkJfSBlbHNlIGlmIChzY2FsYXJUeXBlLmlzRG91YmxlKCkpIHsKKwkJCXZhbHVlcyA9IG5ldyBkb3VibGVbXSB7IHN0YXJ0LCBpbmNyZW1lbnQsIHZhbHVlc1BlclNhdyB9OworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2NhbGFyIHR5cGUgJyIgKyBzY2FsYXJUeXBlICsgIicgaXMgbm90IHN1cHBvcnRlZC4iKTsKKwkJfQorCQljcmVhdGVWYWx1ZXMoc2NhbGFyVHlwZSwgdmFsdWVzKTsKKworCQkvLyBOT1RFOiBpZiBpdCBldmVyIHNob3VsZCBiZSByZXF1aXJlZCB0byBtYWtlIGEgY2hhbm5lbCBvZiB0aGlzIHR5cGUKKwkJLy8gYW4gaW5kZXBlbmRlbnQgb25lLCB0aGVuIHJldHVybiBhbiBVbml0SW5kZXBlbmRlbnRCdWlsZGVyIGluc3RlYWQhCisJCXJldHVybiBuZXcgVW5pdEJ1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGNyZWF0ZSBhIHJhdyBsaW5lYXIgc2VxdWVuY2Ugb2YKKwkgKiBtZWFzdXJlZCB2YWx1ZXMuCisJICoKKwkgKiBAcGFyYW0gb2Zmc2V0IFRoZSBvZmZzZXQgZm9yIGVhY2ggdmFsdWUuCisJICogQHBhcmFtIGZhY3RvciBUaGUgZmFjdG9yIGZvciBlYWNoIHZhbHVlLgorCSAqIEByZXR1cm4gQSB7QGxpbmsgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEBzZWUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiNSQVdfTElORUFSCisJICovCisJcHVibGljIENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHJhd0xpbmVhcihkb3VibGUgb2Zmc2V0LCBkb3VibGUgZmFjdG9yKSB7CisJCWdldFdyaXRlUmVxdWVzdCgpLnNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSKTsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0R2VuZXJhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdIHsgb2Zmc2V0LCBmYWN0b3IgfSk7CisJCXJldHVybiBuZXcgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXIoZ2V0V3JpdGVSZXF1ZXN0KCkpOworCX0KKworCS8qKgorCSAqIENvbmZpZ3VyZXMgdGhlIHtAbGluayBXcml0ZVJlcXVlc3R9IHRvIGNyZWF0ZSBhIHJhdyBwb2x5bm9taWFsIHNlcXVlbmNlIG9mCisJICogbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIGNvZWZmaWNpZW50cyBBdCBsZWFzdCAyIGNvZWZmaWNpZW50cyBtdXN0IGJlIHByb3ZpZGVkLgorCSAqIEByZXR1cm4gQSB7QGxpbmsgQ29tcGxleE51bWVyaWNhbFZhbHVlc0J1aWxkZXJ9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb2VmZmljaWVudHMgYXJlIG1pc3Npbmcgb3IgdGhlaXIKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggaXMgbGVzcyB0aGFuIDIuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI1JBV19QT0xZTk9NSUFMCisJICovCisJcHVibGljIENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyIHJhd1BvbHlub21pYWwoZG91YmxlLi4uIGNvZWZmaWNpZW50cykgeworCQlpZiAoY29lZmZpY2llbnRzID09IG51bGwgfHwgY29lZmZpY2llbnRzLmxlbmd0aCA8IDIpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJDb2VmZmljaWVudHMgZWl0aGVyIG1pc3Npbmcgb3IgdGhlaXIgbGVuZ3RoIGlzICIgKyAiaW5jb25zaXRlbnQgd2l0aCBnaXZlbiBncmFkZSIpOworCQl9CisKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbihTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19QT0xZTk9NSUFMKTsKKworCQlkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVycyA9IG5ldyBkb3VibGVbY29lZmZpY2llbnRzLmxlbmd0aCArIDFdOworCQlnZW5lcmF0aW9uUGFyYW1ldGVyc1swXSA9IGNvZWZmaWNpZW50cy5sZW5ndGggLSAxOworCQlTeXN0ZW0uYXJyYXljb3B5KGNvZWZmaWNpZW50cywgMCwgZ2VuZXJhdGlvblBhcmFtZXRlcnMsIDEsIGNvZWZmaWNpZW50cy5sZW5ndGgpOworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRHZW5lcmF0aW9uUGFyYW1ldGVycyhnZW5lcmF0aW9uUGFyYW1ldGVycyk7CisKKwkJLy8gVE9ETzogY3VycmVudGx5IGl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSBzdWNoIGEgY2hhbm5lbCBhcworCQkvLyBpbmRlcGVuZGVudAorCQkvLyBzaG91bGQgd2UgcHJldmVudCB0aGlzPyEKKwkJcmV0dXJuIG5ldyBDb21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlcihnZXRXcml0ZVJlcXVlc3QoKSk7CisJfQorCisJLyoqCisJICogQ29uZmlndXJlcyB0aGUge0BsaW5rIFdyaXRlUmVxdWVzdH0gdG8gY3JlYXRlIGEgcmF3IGxpbmVhciBjYWxpYnJhdGVkCisJICogc2VxdWVuY2Ugb2YgbWVhc3VyZWQgdmFsdWVzLgorCSAqCisJICogQHBhcmFtIG9mZnNldCAgICAgIFRoZSBvZmZzZXQgZm9yIGVhY2ggdmFsdWUuCisJICogQHBhcmFtIGZhY3RvciAgICAgIFRoZSBmYWN0b3IgZm9yIGVhY2ggdmFsdWUuCisJICogQHBhcmFtIGNhbGlicmF0aW9uIFRoZSBjYWxpYnJhdGlvbiBmYWN0b3IuCisJICogQHJldHVybiBBIHtAbGluayBDb21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlcn0gaXMgcmV0dXJuZWQuCisJICogQHNlZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uI1JBV19MSU5FQVJfQ0FMSUJSQVRFRAorCSAqLworCXB1YmxpYyBDb21wbGV4TnVtZXJpY2FsVmFsdWVzQnVpbGRlciByYXdMaW5lYXJDYWxpYnJhdGVkKGRvdWJsZSBvZmZzZXQsIGRvdWJsZSBmYWN0b3IsIGRvdWJsZSBjYWxpYnJhdGlvbikgeworCQlnZXRXcml0ZVJlcXVlc3QoKS5zZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9DQUxJQlJBVEVEKTsKKwkJZ2V0V3JpdGVSZXF1ZXN0KCkuc2V0R2VuZXJhdGlvblBhcmFtZXRlcnMobmV3IGRvdWJsZVtdIHsgb2Zmc2V0LCBmYWN0b3IsIGNhbGlicmF0aW9uIH0pOworCQlyZXR1cm4gbmV3IENvbXBsZXhOdW1lcmljYWxWYWx1ZXNCdWlsZGVyKGdldFdyaXRlUmVxdWVzdCgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0RmluYWxpemVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbWFzc2RhdGEvV3JpdGVSZXF1ZXN0RmluYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1N2U5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tYXNzZGF0YS9Xcml0ZVJlcXVlc3RGaW5hbGl6ZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB0ZXJtaW5hbCB7QGxpbmsgV3JpdGVSZXF1ZXN0fSBidWlsZCBvcGVyYXRpb24gdG8KKyAqIHJldHJpZXZlIHRoZSBjb25maWd1cmVkIHtAY29kZSBXcml0ZVJlcXVlc3R9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgV3JpdGVSZXF1ZXN0RmluYWxpemVyIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3Q7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSBjb25maWd1cmVkIHtAbGluayBXcml0ZVJlcXVlc3R9LgorCSAqLworCVdyaXRlUmVxdWVzdEZpbmFsaXplcihXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0KSB7CisJCXRoaXMud3JpdGVSZXF1ZXN0ID0gd3JpdGVSZXF1ZXN0OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbmZpZ3VyZWQge0BsaW5rIFdyaXRlUmVxdWVzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjb25maWd1cmVkIHtAY29kZSBXcml0ZVJlcXVlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmaW5hbCBXcml0ZVJlcXVlc3QgYnVpbGQoKSB7CisJCXJldHVybiBnZXRXcml0ZVJlcXVlc3QoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJvdGVjdGVkIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgV3JpdGVSZXF1ZXN0fS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBXcml0ZVJlcXVlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBmaW5hbCBXcml0ZVJlcXVlc3QgZ2V0V3JpdGVSZXF1ZXN0KCkgeworCQlyZXR1cm4gd3JpdGVSZXF1ZXN0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0F4aXNUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQXhpc1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTM1OTBkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0F4aXNUeXBlLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBheGlzIHR5cGUgZW51bWVyYXRpb24gYXMgZGVmaW5lZCBpbiB0aGUgQVNBTSBPRFMgTlZIIG1vZGVsLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDaGFubmVsCisgKi8KK3B1YmxpYyBjbGFzcyBBeGlzVHlwZSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWUgeworCisJLyoqCisJICogQSB7QGxpbmsgQ2hhbm5lbH0gb2YgdGhpcyB0eXBlIG1heSBiZSBkaXNwbGF5ZWQgYXMgdGhlIHgtYXhpcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEF4aXNUeXBlIFhfQVhJUyA9IG5ldyBBeGlzVHlwZSgiWF9BWElTIiwgMCk7CisKKwkvKioKKwkgKiBBIHtAbGluayBDaGFubmVsfSBvZiB0aGlzIHR5cGUgbWF5IGJlIGRpc3BsYXllZCBhcyB0aGUgeS1heGlzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQXhpc1R5cGUgWV9BWElTID0gbmV3IEF4aXNUeXBlKCJZX0FYSVMiLCAxKTsKKworCS8qKgorCSAqIEEge0BsaW5rIENoYW5uZWx9IG9mIHRoaXMgdHlwZSBtYXkgYmUgZGlzcGxheWVkIGFzIHRoZSB4LSBvciB5LWF4aXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBBeGlzVHlwZSBYWV9BWElTID0gbmV3IEF4aXNUeXBlKCJYWV9BWElTIiwgMik7CisKKwlwcml2YXRlIEF4aXNUeXBlKFN0cmluZyBuYW1lLCBpbnQgb3JkaW5hbCkgeworCQlzdXBlcihuYW1lLCBvcmRpbmFsKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBheGlzIHR5cGUgaXMge0BsaW5rICNYX0FYSVN9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzWEF4aXMoKSB7CisJCXJldHVybiBYX0FYSVMgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBheGlzIHR5cGUgaXMge0BsaW5rICNZX0FYSVN9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzWUF4aXMoKSB7CisJCXJldHVybiBZX0FYSVMgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBheGlzIHR5cGUgaXMge0BsaW5rICNYWV9BWElTfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1hZQXhpcygpIHsKKwkJcmV0dXJuIFhZX0FYSVMgPT0gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9CYXNlRW50aXR5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQmFzZUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQmFzZUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBUaGlzIGlzIGEgYmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgbW9kZWxlZCBlbnRpdGllcy4gQVBJIGNvbnN1bWVycyBzaG91bGQKKyAqIG5ldmVyIHVzZSB0aGlzIGNsYXNzIGluIGFueSB3YXksIGluc3RlYWQgdGhlIG1vc3QgY29tbW9uIGludGVyZmFjZSBzaG91bGQgYmUKKyAqIHVzZWQgKGUuZy46IHtAbGluayBFbnRpdHl9LCB7QGxpbmsgQ29udGV4dERlc2NyaWJhYmxlfSwgZXRjLikuIEFQSSBwcm9kdWNlcnMKKyAqIG11c3QgbGV0IHRoZWlyIHtAY29kZSBFbnRpdHl9IGltcGxlbWVudGF0aW9ucyBleHRlbmQgdGhpcyBjbGFzcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgQ29yZSBjb3JlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgQmFzZUVudGl0eShDb3JlIGNvcmUpIHsKKwkJdGhpcy5jb3JlID0gY29yZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldFNvdXJjZU5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRUeXBlTmFtZSgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldElEKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldElEKCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBWYWx1ZSBnZXRWYWx1ZShTdHJpbmcgbmFtZSkgeworCQlWYWx1ZSB2YWx1ZSA9IGdldENvcmUoKS5nZXRWYWx1ZXMoKS5nZXQobmFtZSk7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJWYWx1ZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgZG9lcyBub3QgZXhpc3QiKTsKKwkJfQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0VmFsdWVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGdldENvcmUoKS5nZXRWYWx1ZXMoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZyBwcmVmaXggPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJykudG9TdHJpbmcoKTsKKwkJcmV0dXJuIGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIsIHByZWZpeCwgIikiKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW50ZXJuYWxseSBzdG9yZWQge0BsaW5rIENvcmV9LgorCSAqCisJICogQHJldHVybiBUaGUge0BsaW5rIENvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBDb3JlIGdldENvcmUoKSB7CisJCXJldHVybiBjb3JlOworCX0KKworCS8qKgorCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBleHRyYWN0IHtAbGluayBDb3JlfSBvZiBnaXZlbiB7QGxpbmsgRW50aXR5fS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBFbnRpdHl9IHdob3NlIHtAY29kZSBDb3JlfSBpcyByZXF1aXJlZC4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29yZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBDb3JlIGdldENvcmUoRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gKChCYXNlRW50aXR5KSBlbnRpdHkpLmdldENvcmUoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9CYXNlRW50aXR5RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Jhc2VFbnRpdHlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNzVhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9CYXNlRW50aXR5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTY0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5DaGlsZHJlblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gYWJzdHJhY3QgZW50aXR5IGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBuZXcgZW50aXRpZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlRW50aXR5RmFjdG9yeSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDaGFubmVsfS4gVGhlIG5hbWUgb2YgdGhlIHJldHVybmVkIHtAY29kZSBDaGFubmVsfSBpcworCSAqIHJldHJpZXZlZCBmcm9tIGdpdmVuIHtAbGluayBRdWFudGl0eX0uCisJICoKKwkgKiBAcGFyYW0gbWVhc3VyZW1lbnQgVGhlIHBhcmVudCB7QGxpbmsgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSBxdWFudGl0eSAgICBUaGUge0Bjb2RlIFF1YW50aXR5fSBpcyB1c2VkIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENoYW5uZWx9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDaGFubmVsIGNyZWF0ZUNoYW5uZWwoTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQsIFF1YW50aXR5IHF1YW50aXR5KSB7CisJCXJldHVybiBjcmVhdGVDaGFubmVsKHF1YW50aXR5LmdldERlZmF1bHRDaGFubmVsTmFtZSgpLCBtZWFzdXJlbWVudCwgcXVhbnRpdHkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENoYW5uZWx9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENoYW5uZWx9LgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCBUaGUgcGFyZW50IHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHBhcmFtIHF1YW50aXR5ICAgIFRoZSB7QGNvZGUgUXVhbnRpdHl9IGlzIHVzZWQgZm9yIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2hhbm5lbH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENoYW5uZWwgY3JlYXRlQ2hhbm5lbChTdHJpbmcgbmFtZSwgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQsIFF1YW50aXR5IHF1YW50aXR5KSB7CisJCUNoYW5uZWwgY2hhbm5lbCA9IG5ldyBDaGFubmVsKGNyZWF0ZUNvcmUoQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNoYW5uZWwpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KG1lYXN1cmVtZW50KTsKKwkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZChjaGFubmVsKTsKKwkJZ2V0Q29yZShjaGFubmVsKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocXVhbnRpdHkuZ2V0RGVmYXVsdFVuaXQoKSk7CisJCWdldENvcmUoY2hhbm5lbCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHF1YW50aXR5KTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNoYW5uZWwuc2V0TmFtZShuYW1lKTsKKwkJY2hhbm5lbC5zZXREZXNjcmlwdGlvbihxdWFudGl0eS5nZXREZXNjcmlwdGlvbigpKTsKKwkJY2hhbm5lbC5zZXRJbnRlcnBvbGF0aW9uKEludGVycG9sYXRpb24uTk9ORSk7CisJCWNoYW5uZWwuc2V0U2NhbGFyVHlwZShxdWFudGl0eS5nZXREZWZhdWx0U2NhbGFyVHlwZSgpKTsKKwkJY2hhbm5lbC5zZXRSYW5rKHF1YW50aXR5LmdldERlZmF1bHRSYW5rKCkpOworCQljaGFubmVsLnNldFR5cGVTaXplKHF1YW50aXR5LmdldERlZmF1bHRUeXBlU2l6ZSgpKTsKKworCQlyZXR1cm4gY2hhbm5lbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDaGFubmVsR3JvdXB9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENoYW5uZWxHcm91cH0uCisJICogQHBhcmFtIG51bWJlck9mVmFsdWVzIFRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciBlYWNoIHJlbGF0ZWQge0BsaW5rIENoYW5uZWx9LgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCAgICBUaGUgcGFyZW50IHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2hhbm5lbEdyb3VwfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgbnVtYmVyT2ZWYWx1ZXMgaXMgbmVnYXRpdmUuCisJICovCisJcHVibGljIENoYW5uZWxHcm91cCBjcmVhdGVDaGFubmVsR3JvdXAoU3RyaW5nIG5hbWUsIGludCBudW1iZXJPZlZhbHVlcywgTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQpIHsKKwkJaWYgKG51bWJlck9mVmFsdWVzIDwgMCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIHZhbHVlcyBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAwLiIpOworCQl9CisKKwkJQ2hhbm5lbEdyb3VwIGNoYW5uZWxHcm91cCA9IG5ldyBDaGFubmVsR3JvdXAoY3JlYXRlQ29yZShDaGFubmVsR3JvdXAuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjaGFubmVsR3JvdXApLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KG1lYXN1cmVtZW50KTsKKwkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZChjaGFubmVsR3JvdXApOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2hhbm5lbEdyb3VwLnNldE5hbWUobmFtZSk7CisJCWNoYW5uZWxHcm91cC5zZXROdW1iZXJPZlZhbHVlcyhJbnRlZ2VyLnZhbHVlT2YobnVtYmVyT2ZWYWx1ZXMpKTsKKworCQlyZXR1cm4gY2hhbm5lbEdyb3VwOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSB0ZXN0U3RlcCAgICAgVGhlIHBhcmVudCB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqIEBwYXJhbSBjb250ZXh0Um9vdHMge0BsaW5rIENvbnRleHRSb290fXMgY29udGFpbmluZyB0aGUgZGVzY3JpcHRpdmUgZGF0YS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBNZWFzdXJlbWVudH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIE1lYXN1cmVtZW50IGNyZWF0ZU1lYXN1cmVtZW50KFN0cmluZyBuYW1lLCBUZXN0U3RlcCB0ZXN0U3RlcCwgQ29udGV4dFJvb3QuLi4gY29udGV4dFJvb3RzKSB7CisJCU1lYXN1cmVtZW50IG1lYXN1cmVtZW50ID0gbmV3IE1lYXN1cmVtZW50KGNyZWF0ZUNvcmUoTWVhc3VyZW1lbnQuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQodGVzdFN0ZXApOworCQlnZXRDb3JlKHRlc3RTdGVwKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKG1lYXN1cmVtZW50KTsKKwkJZm9yIChDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA6IGNvbnRleHRSb290cykgeworCQkJZ2V0Q29yZShtZWFzdXJlbWVudCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNvbnRleHRSb290LCBjb250ZXh0Um9vdC5nZXRDb250ZXh0VHlwZSgpKTsKKwkJfQorCisJCS8vIHByb3BlcnRpZXMKKwkJbWVhc3VyZW1lbnQuc2V0TmFtZShuYW1lKTsKKwkJbWVhc3VyZW1lbnQuc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisKKwkJcmV0dXJuIG1lYXN1cmVtZW50OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBhcmFtZXRlcn0gd2l0aCBpbml0aWFsaXplZCB3aXRoIGdpdmVuIHZhbHVlLgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJ9LgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJ9LgorCSAqIEBwYXJhbSB1bml0ICAgICAgICAgQW4gb3B0aW9uYWxseSByZWxhdGVkIHtAbGluayBVbml0fS4KKwkgKiBAcGFyYW0gcGFyYW1ldGVyU2V0IFRoZSBwYXJlbnQge0BsaW5rIFBhcmFtZXRlclNldH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUGFyYW1ldGVyfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIHtAY29kZSBQYXJhbWV0ZXJTZXR9IGFscmVhZHkKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBhIHtAY29kZSBQYXJhbWV0ZXJ9IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLgorCSAqIEBzZWUgUGFyYW1ldGVyI3NldE9iamVjdFZhbHVlKE9iamVjdCwgVW5pdCkKKwkgKi8KKwlwdWJsaWMgUGFyYW1ldGVyIGNyZWF0ZVBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBVbml0IHVuaXQsIFBhcmFtZXRlclNldCBwYXJhbWV0ZXJTZXQpIHsKKwkJaWYgKHBhcmFtZXRlclNldC5nZXRQYXJhbWV0ZXIobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlQYXJhbWV0ZXIgcGFyYW1ldGVyID0gbmV3IFBhcmFtZXRlcihjcmVhdGVDb3JlKFBhcmFtZXRlci5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHBhcmFtZXRlcikuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQocGFyYW1ldGVyU2V0KTsKKwkJZ2V0Q29yZShwYXJhbWV0ZXJTZXQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQocGFyYW1ldGVyKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXBhcmFtZXRlci5zZXROYW1lKG5hbWUpOworCQlwYXJhbWV0ZXIuc2V0T2JqZWN0VmFsdWUodmFsdWUsIHVuaXQpOworCisJCXJldHVybiBwYXJhbWV0ZXI7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUGFyYW1ldGVyU2V0fSBmb3IgZ2l2ZW4ge0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJTZXR9LgorCSAqIEBwYXJhbSB2ZXJzaW9uICAgICBWZXJzaW9uIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJTZXR9LgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCBUaGUgb3duaW5nIHtAY29kZSBNZWFzdXJlbWVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUGFyYW1ldGVyU2V0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUGFyYW1ldGVyU2V0IGNyZWF0ZVBhcmFtZXRlclNldChTdHJpbmcgbmFtZSwgU3RyaW5nIHZlcnNpb24sIE1lYXN1cmVtZW50IG1lYXN1cmVtZW50KSB7CisJCVBhcmFtZXRlclNldCBwYXJhbWV0ZXJTZXQgPSBuZXcgUGFyYW1ldGVyU2V0KGNyZWF0ZUNvcmUoUGFyYW1ldGVyU2V0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUocGFyYW1ldGVyU2V0KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChtZWFzdXJlbWVudCk7CisJCWdldENvcmUobWVhc3VyZW1lbnQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQocGFyYW1ldGVyU2V0KTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXBhcmFtZXRlclNldC5zZXROYW1lKG5hbWUpOworCQlwYXJhbWV0ZXJTZXQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKKworCQlyZXR1cm4gcGFyYW1ldGVyU2V0OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFBhcmFtZXRlclNldH0gZm9yIGdpdmVuIHtAbGluayBDaGFubmVsfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFBhcmFtZXRlclNldH0uCisJICogQHBhcmFtIHZlcnNpb24gVmVyc2lvbiBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgUGFyYW1ldGVyU2V0fS4KKwkgKiBAcGFyYW0gY2hhbm5lbCBUaGUgb3duaW5nIHtAY29kZSBDaGFubmVsfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBQYXJhbWV0ZXJTZXR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBQYXJhbWV0ZXJTZXQgY3JlYXRlUGFyYW1ldGVyU2V0KFN0cmluZyBuYW1lLCBTdHJpbmcgdmVyc2lvbiwgQ2hhbm5lbCBjaGFubmVsKSB7CisJCVBhcmFtZXRlclNldCBwYXJhbWV0ZXJTZXQgPSBuZXcgUGFyYW1ldGVyU2V0KGNyZWF0ZUNvcmUoUGFyYW1ldGVyU2V0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUocGFyYW1ldGVyU2V0KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjaGFubmVsKTsKKwkJZ2V0Q29yZShjaGFubmVsKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKHBhcmFtZXRlclNldCk7CisKKwkJLy8gcHJvcGVydGllcworCQlwYXJhbWV0ZXJTZXQuc2V0TmFtZShuYW1lKTsKKwkJcGFyYW1ldGVyU2V0LnNldFZlcnNpb24odmVyc2lvbik7CisKKwkJcmV0dXJuIHBhcmFtZXRlclNldDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBQaHlzaWNhbERpbWVuc2lvbn0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUGh5c2ljYWxEaW1lbnNpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBQaHlzaWNhbERpbWVuc2lvbiBjcmVhdGVQaHlzaWNhbERpbWVuc2lvbihTdHJpbmcgbmFtZSkgeworCQlQaHlzaWNhbERpbWVuc2lvbiBwaHlzaWNhbERpbWVuc2lvbiA9IG5ldyBQaHlzaWNhbERpbWVuc2lvbihjcmVhdGVDb3JlKFBoeXNpY2FsRGltZW5zaW9uLmNsYXNzKSk7CisKKwkJLy8gcHJvcGVydGllcworCQlwaHlzaWNhbERpbWVuc2lvbi5zZXROYW1lKG5hbWUpOworCQlwaHlzaWNhbERpbWVuc2lvbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0TWFzcyhJbnRlZ2VyLnZhbHVlT2YoMCkpOworCQlwaHlzaWNhbERpbWVuc2lvbi5zZXRUaW1lKEludGVnZXIudmFsdWVPZigwKSk7CisJCXBoeXNpY2FsRGltZW5zaW9uLnNldFRlbXBlcmF0dXJlKEludGVnZXIudmFsdWVPZigwKSk7CisJCXBoeXNpY2FsRGltZW5zaW9uLnNldEN1cnJlbnQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0TW9sYXJBbW91bnQoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0THVtaW5vdXNJbnRlbnNpdHkoSW50ZWdlci52YWx1ZU9mKDApKTsKKwkJcGh5c2ljYWxEaW1lbnNpb24uc2V0QW5nbGUoSW50ZWdlci52YWx1ZU9mKDApKTsKKworCQlyZXR1cm4gcGh5c2ljYWxEaW1lbnNpb247CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUXVhbnRpdHl9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFF1YW50aXR5fS4KKwkgKiBAcGFyYW0gZGVmYXVsdFVuaXQgVGhlIGRlZmF1bHQge0BsaW5rIFVuaXR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFF1YW50aXR5fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUXVhbnRpdHkgY3JlYXRlUXVhbnRpdHkoU3RyaW5nIG5hbWUsIFVuaXQgZGVmYXVsdFVuaXQpIHsKKwkJUXVhbnRpdHkgcXVhbnRpdHkgPSBuZXcgUXVhbnRpdHkoY3JlYXRlQ29yZShRdWFudGl0eS5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHF1YW50aXR5KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQoZGVmYXVsdFVuaXQpOworCisJCS8vIHByb3BlcnRpZXMKKwkJcXVhbnRpdHkuc2V0TmFtZShuYW1lKTsKKwkJcXVhbnRpdHkuc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisJCXF1YW50aXR5LnNldERlZmF1bHRSYW5rKEludGVnZXIudmFsdWVPZigxKSk7CisJCXF1YW50aXR5LnNldERlZmF1bHREaW1lbnNpb24obmV3IGludFtdIHsgMCB9KTsKKwkJcXVhbnRpdHkuc2V0RGVmYXVsdFR5cGVTaXplKEludGVnZXIudmFsdWVPZigxKSk7CisJCXF1YW50aXR5LnNldERlZmF1bHRDaGFubmVsTmFtZShuYW1lKTsKKwkJcXVhbnRpdHkuc2V0RGVmYXVsdFNjYWxhclR5cGUoU2NhbGFyVHlwZS5GTE9BVCk7CisKKwkJcXVhbnRpdHkuZ2V0VmFsdWUoIlZlcnNpb24iKS5zZXQoIjEiKTsKKwkJcXVhbnRpdHkuZ2V0VmFsdWUoIlZhbGlkRmxhZyIpLnNldChWZXJzaW9uU3RhdGUuVkFMSUQpOworCisJCXJldHVybiBxdWFudGl0eTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSB3aXRoIGEgcmVmZXJlbmNlIHRvIHRoZSBsb2dnZWQgaW4ge0BsaW5rIFVzZXJ9LCBpZgorCSAqIHRoZXJlIGlzIG9uZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZXN0IGNyZWF0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKKwkJVGVzdCB0ZXN0ID0gbmV3IFRlc3QoY3JlYXRlQ29yZShUZXN0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCU9wdGlvbmFsPFVzZXI+IHJlc3BvbnNpYmxlUGVyc29uID0gZ2V0TG9nZ2VkSW5Vc2VyKCk7CisJCWlmIChyZXNwb25zaWJsZVBlcnNvbi5pc1ByZXNlbnQoKSkgeworCQkJLy8gbWF5IGJlIG51bGwgaWYgdXNlciBlbnRpdGllcyBhcmUgbm90IGF2YWlsYWJsZQorCQkJZ2V0Q29yZSh0ZXN0KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQocmVzcG9uc2libGVQZXJzb24uZ2V0KCkpOworCQl9CisKKwkJLy8gcHJvcGVydGllcworCQl0ZXN0LnNldE5hbWUobmFtZSk7CisJCXRlc3Quc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisKKwkJcmV0dXJuIHRlc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVzdFN0ZXB9LgorCSAqIEBwYXJhbSB0ZXN0IFRoZSBwYXJlbnQge0BsaW5rIFRlc3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoU3RyaW5nIG5hbWUsIFRlc3QgdGVzdCkgeworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IG5ldyBUZXN0U3RlcChjcmVhdGVDb3JlKFRlc3RTdGVwLmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdFN0ZXApLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHRlc3QpOworCQlnZXRDb3JlKHRlc3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodGVzdFN0ZXApOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVzdFN0ZXAuc2V0TmFtZShuYW1lKTsKKwkJdGVzdFN0ZXAuc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZS5ub3coKSk7CisJCXRlc3RTdGVwLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CisKKwkJaWYgKHRlc3QuZ2V0SUQoKSAhPSBudWxsICYmIHRlc3QuZ2V0SUQoKS5sZW5ndGgoKSA+IDApIHsKKwkJCS8vIGhpZ2hlc3Qgc29ydCBpbmRleCBpbiB1c2Ugd2lsbCBiZSBxdWVyaWVkIGJlZm9yZSB3cml0dGVuCisJCQl0ZXN0U3RlcC5zZXRTb3J0SW5kZXgoSW50ZWdlci52YWx1ZU9mKC0xKSk7CisJCX0gZWxzZSB7CisJCQl0ZXN0U3RlcC5zZXRTb3J0SW5kZXgobmV4dEluZGV4KGdldENvcmUodGVzdCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldChUZXN0U3RlcC5jbGFzcykpKTsKKwkJfQorCisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBVbml0fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBVbml0fS4KKwkgKiBAcGFyYW0gcGh5c2ljYWxEaW1lbnNpb24gVGhlIHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVW5pdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFVuaXQgY3JlYXRlVW5pdChTdHJpbmcgbmFtZSwgUGh5c2ljYWxEaW1lbnNpb24gcGh5c2ljYWxEaW1lbnNpb24pIHsKKwkJVW5pdCB1bml0ID0gbmV3IFVuaXQoY3JlYXRlQ29yZShVbml0LmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodW5pdCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHBoeXNpY2FsRGltZW5zaW9uKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXVuaXQuc2V0TmFtZShuYW1lKTsKKwkJdW5pdC5zZXRPZmZzZXQoRG91YmxlLnZhbHVlT2YoMEQpKTsKKwkJdW5pdC5zZXRGYWN0b3IoRG91YmxlLnZhbHVlT2YoMUQpKTsKKworCQlyZXR1cm4gdW5pdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBVc2VyfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVXNlcn0uCisJICogQHBhcmFtIGdpdmVuTmFtZSBHaXZlbiBuYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBVc2VyfS4KKwkgKiBAcGFyYW0gc3VybmFtZSAgIFN1cm5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFVzZXJ9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFVzZXJ9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBVc2VyIGNyZWF0ZVVzZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBnaXZlbk5hbWUsIFN0cmluZyBzdXJuYW1lKSB7CisJCVVzZXIgdXNlciA9IG5ldyBVc2VyKGNyZWF0ZUNvcmUoVXNlci5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdXNlci5zZXROYW1lKG5hbWUpOworCQl1c2VyLnNldEdpdmVuTmFtZShnaXZlbk5hbWUpOworCQl1c2VyLnNldFN1cm5hbWUoc3VybmFtZSk7CisKKwkJcmV0dXJuIHVzZXI7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dFJvb3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENvbnRleHRSb290fS4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUge0BsaW5rIENvbnRleHRUeXBlfSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dFJvb3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENvbnRleHRSb290fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udGV4dFJvb3QgY3JlYXRlQ29udGV4dFJvb3QoU3RyaW5nIG5hbWUsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCUNvbnRleHRSb290IGNvbnRleHRSb290ID0gbmV3IENvbnRleHRSb290KGNyZWF0ZUNvcmUoQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSk7CisKKwkJLy8gcHJvcGVydGllcworCQljb250ZXh0Um9vdC5zZXROYW1lKG5hbWUpOworCQljb250ZXh0Um9vdC5zZXRWZXJzaW9uKFN0cmluZy52YWx1ZU9mKDApKTsKKworCQlyZXR1cm4gY29udGV4dFJvb3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dENvbXBvbmVudH0uCisJICogQHBhcmFtIGNvbnRleHRSb290IFRoZSBwYXJlbnQge0BsaW5rIENvbnRleHRSb290fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udGV4dENvbXBvbmVudCBjcmVhdGVDb250ZXh0Q29tcG9uZW50KFN0cmluZyBuYW1lLCBDb250ZXh0Um9vdCBjb250ZXh0Um9vdCkgeworCQlDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQgPSBuZXcgQ29udGV4dENvbXBvbmVudChjcmVhdGVDb3JlKG5hbWUsIENvbnRleHRDb21wb25lbnQuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjb250ZXh0Q29tcG9uZW50KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjb250ZXh0Um9vdCk7CisJCWdldENvcmUoY29udGV4dFJvb3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQoY29udGV4dENvbXBvbmVudCk7CisKKwkJLy8gcHJvcGVydGllcworCQljb250ZXh0Q29tcG9uZW50LnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIGNvbnRleHRDb21wb25lbnQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dFNlbnNvcn0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0U2Vuc29yfS4KKwkgKiBAcGFyYW0gY29udGV4dENvbXBvbmVudCBUaGUgcGFyZW50IHtAbGluayBDb250ZXh0Q29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0U2Vuc29yfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgQ29udGV4dFNlbnNvciBjcmVhdGVDb250ZXh0U2Vuc29yKFN0cmluZyBuYW1lLCBDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQpIHsKKwkJQ29udGV4dFNlbnNvciBjb250ZXh0U2Vuc29yID0gbmV3IENvbnRleHRTZW5zb3IoY3JlYXRlQ29yZShuYW1lLCBDb250ZXh0U2Vuc29yLmNsYXNzKSk7CisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNvbnRleHRTZW5zb3IpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KGNvbnRleHRDb21wb25lbnQpOworCQlnZXRDb3JlKGNvbnRleHRDb21wb25lbnQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQoY29udGV4dFNlbnNvcik7CisKKwkJLy8gcHJvcGVydGllcworCQljb250ZXh0U2Vuc29yLnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIGNvbnRleHRTZW5zb3I7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmV4dCB1c2FibGUgc29ydCBpbmRleCBmb3IgZ2l2ZW4ge0Bjb2RlIExpc3R9IG9mCisJICoge0BsaW5rIFNvcnRhYmxlfXMuCisJICoKKwkgKiBAcGFyYW0gc29ydGFibGVzIFRoZSB7QGNvZGUgU29ydGFibGV9IHdob3NlIG1heCBzb3J0IGluZGV4IHdpbGwgYmUgc2VhcmNoZWQuCisJICogQHJldHVybiB7QGNvZGUgMX0gaXMgcmV0dXJuZWQgaWYgZ2l2ZW4ge0Bjb2RlIExpc3R9IGlzIGVtcHR5LCBvdGhlcndpc2UgdGhlCisJICogICAgICAgICBtYXggc29ydCBpbmRleCBpbmNyZWFzZWQgYnkgMSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgbmV4dEluZGV4KExpc3Q8PyBleHRlbmRzIFNvcnRhYmxlPiBzb3J0YWJsZXMpIHsKKwkJT3B0aW9uYWw8SW50ZWdlcj4gbWF4SW5kZXggPSBzb3J0YWJsZXMuc3RyZWFtKCkubWF4KFNvcnRhYmxlLkNPTVBBUkFUT1IpLm1hcChTb3J0YWJsZTo6Z2V0U29ydEluZGV4KTsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZihtYXhJbmRleC5pc1ByZXNlbnQoKSA/IG1heEluZGV4LmdldCgpLmludFZhbHVlKCkgKyAxIDogMSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENoaWxkcmVuU3RvcmV9IGZvciBnaXZlbiB7QGxpbmsgQmFzZUVudGl0eX0uIFBsZWFzZSBiZQorCSAqIGF3YXJlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgaXMgc3ViamVjdCB0byB0aGUgYWRhcHRlciBjcmVhdGluZyBpdC4KKwkgKiBJdCBpcyB1cCB0byB0aGUgYWRhcHRlciB0byBkZWNpZGUgd2hpY2ggcmVsYXRlZCBlbnRpdGllcyBhcmUgaW5jbHVkZWQuIEFzCisJICogdGhlcmUgYXJlIGFkYXB0ZXIgc3BlY2lmaWMgZGV0YWlscyB0byB0aGUgY29udGVudHMgb2YgdGhlIHN0b3JlIGl0IHNob3VsZCBiZQorCSAqIHByb3RlY3RlZCBmcm9tIGV4dGVybmFsIGFjY2Vzcy4gVGhlcmVmb3JlIGJ5IGRlY2xhcmluZyB0aGlzIG1ldGhvZCBwcm90ZWN0ZWQsCisJICogdGhlIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBoaWRkZW4gZnJvbSBvdGhlciBjbGFzc2VzIHNpbmNlIHRoZSBvbmx5IGNsYXNzZXMKKwkgKiB3aGljaCBjYW4gYWNjZXNzIHRoZW0gKG91dHNpZGUgdGhpcyBwYWNrYWdlKSBhcmUgZGVyaXZhdGl2ZXMgb2YKKwkgKiBCYXNlRW50aXR5RmFjdG9yeSwgYW5kIGl0IGlzIHRocm91Z2ggc3VjaCBkZXJpdmF0aXZlcyB0aGF0IEJhc2VFbnRpdHkncworCSAqIFN0b3JlcyBzaG91bGQgYmUgYWNjZXNzZWQgZWxzZXdoZXJlIGlmIG5lZWRlZC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBCYXNlRW50aXR5fSB3aG9zZSB7QGNvZGUgQ2hpbGRyZW5TdG9yZX0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgcmV0dXJuZWQuCisJICogQHJldHVybiBUaGUge0Bjb2RlIENoaWxkcmVuU3RvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQ2hpbGRyZW5TdG9yZSBnZXRDaGlsZHJlblN0b3JlKEJhc2VFbnRpdHkgZW50aXR5KSB7CisJCXJldHVybiBnZXRDb3JlKGVudGl0eSkuZ2V0Q2hpbGRyZW5TdG9yZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG11dGFibGUge0BsaW5rIEVudGl0eVN0b3JlfSBmb3IgZ2l2ZW4ge0BsaW5rIEJhc2VFbnRpdHl9LiBQbGVhc2UKKwkgKiBiZSBhd2FyZSB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIGlzIHN1YmplY3QgdG8gdGhlIGFkYXB0ZXIgY3JlYXRpbmcKKwkgKiBpdC4gSXQgaXMgdXAgdG8gdGhlIGFkYXB0ZXIgdG8gZGVjaWRlIHdoaWNoIHJlbGF0ZWQgZW50aXRpZXMgYXJlIGluY2x1ZGVkLiBBcworCSAqIHRoZXJlIGFyZSBhZGFwdGVyIHNwZWNpZmljIGRldGFpbHMgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdG9yZSBpdCBzaG91bGQgYmUKKwkgKiBwcm90ZWN0ZWQgZnJvbSBleHRlcm5hbCBhY2Nlc3MuIFRoZXJlZm9yZSBieSBkZWNsYXJpbmcgdGhpcyBtZXRob2QgcHJvdGVjdGVkLAorCSAqIHRoZSByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgaXMgaGlkZGVuIGZyb20gb3RoZXIgY2xhc3NlcyBzaW5jZSB0aGUgb25seSBjbGFzc2VzCisJICogd2hpY2ggY2FuIGFjY2VzcyB0aGVtIChvdXRzaWRlIHRoaXMgcGFja2FnZSkgYXJlIGRlcml2YXRpdmVzIG9mCisJICogQmFzZUVudGl0eUZhY3RvcnksIGFuZCBpdCBpcyB0aHJvdWdoIHN1Y2ggZGVyaXZhdGl2ZXMgdGhhdCBCYXNlRW50aXR5J3MKKwkgKiBTdG9yZXMgc2hvdWxkIGJlIGFjY2Vzc2VkIGVsc2V3aGVyZSBpZiBuZWVkZWQuCisJICogCisJICoKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSB7QGNvZGUgQmFzZUVudGl0eX0gd2hvc2Uge0Bjb2RlIENoaWxkcmVuU3RvcmV9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgIHJldHVybmVkLgorCSAqIEByZXR1cm4gVGhlIG11dGFibGUge0Bjb2RlIEVudGl0eVN0b3JlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gZ2V0Q29yZShlbnRpdHkpLmdldE11dGFibGVTdG9yZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBlcm1hbmVudCB7QGxpbmsgRW50aXR5U3RvcmV9IGZvciBnaXZlbiB7QGxpbmsgQmFzZUVudGl0eX0uCisJICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgaXMgc3ViamVjdCB0byB0aGUgYWRhcHRlcgorCSAqIGNyZWF0aW5nIGl0LiBJdCBpcyB1cCB0byB0aGUgYWRhcHRlciB0byBkZWNpZGUgd2hpY2ggcmVsYXRlZCBlbnRpdGllcyBhcmUKKwkgKiBpbmNsdWRlZC4gQXMgdGhlcmUgYXJlIGFkYXB0ZXIgc3BlY2lmaWMgZGV0YWlscyB0byB0aGUgY29udGVudHMgb2YgdGhlIHN0b3JlCisJICogaXQgc2hvdWxkIGJlIHByb3RlY3RlZCBmcm9tIGV4dGVybmFsIGFjY2Vzcy4gVGhlcmVmb3JlIGJ5IGRlY2xhcmluZyB0aGlzCisJICogbWV0aG9kIHByb3RlY3RlZCwgdGhlIHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBoaWRkZW4gZnJvbSBvdGhlciBjbGFzc2VzCisJICogc2luY2UgdGhlIG9ubHkgY2xhc3NlcyB3aGljaCBjYW4gYWNjZXNzIHRoZW0gKG91dHNpZGUgdGhpcyBwYWNrYWdlKSBhcmUKKwkgKiBkZXJpdmF0aXZlcyBvZiBCYXNlRW50aXR5RmFjdG9yeSwgYW5kIGl0IGlzIHRocm91Z2ggc3VjaCBkZXJpdmF0aXZlcyB0aGF0CisJICogQmFzZUVudGl0eSdzIFN0b3JlcyBzaG91bGQgYmUgYWNjZXNzZWQgZWxzZXdoZXJlIGlmIG5lZWRlZC4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSB7QGNvZGUgQmFzZUVudGl0eX0gd2hvc2Uge0Bjb2RlIENoaWxkcmVuU3RvcmV9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgIHJldHVybmVkLgorCSAqIEByZXR1cm4gVGhlIHBlcm1hbmVudCB7QGNvZGUgRW50aXR5U3RvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgRW50aXR5U3RvcmUgZ2V0UGVybWFuZW50U3RvcmUoQmFzZUVudGl0eSBlbnRpdHkpIHsKKwkJcmV0dXJuIGdldENvcmUoZW50aXR5KS5nZXRQZXJtYW5lbnRTdG9yZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMge0BsaW5rIENvcmV9IG9mIGdpdmVuIHtAbGluayBFbnRpdHl9LiBVc2VzIHByb3RlY3RlZCBtZXRob2QgZnJvbQorCSAqIEJhc2VFbnRpdHksIHdoaWNoIGlzIGFjY2Vzc2libGUgaGVyZSBhcyBCYXNlRW50aXR5IHJlc2lkZXMgaW4gdGhlIHNhbWUKKwkgKiBwYWNrYWdlIGFzIEJhc2VFbnRpdHlGYWN0b3J5LiBCeSBkZWNsYXJpbmcgdGhpcyBtZXRob2QgcHJvdGVjdGVkLCB0aGUKKwkgKiBDb3JlLXJlbGF0ZWQgZnVuY3Rpb25hbGl0eSBpcyBoaWRkZW4gZnJvbSBvdGhlciBjbGFzc2VzIHNpbmNlIHRoZSBvbmx5CisJICogY2xhc3NlcyB3aGljaCBjYW4gYWNjZXNzIHRoZW0gKG91dHNpZGUgdGhpcyBwYWNrYWdlKSBhcmUgZGVyaXZhdGl2ZXMgb2YKKwkgKiBCYXNlRW50aXR5RmFjdG9yeSwgYW5kIGl0IGlzIHRocm91Z2ggc3VjaCBkZXJpdmF0aXZlcyB0aGF0IGEgQmFzZUVudGl0eSdzCisJICogQ29yZSBzaG91bGQgYmUgYWNjZXNzZWQgZWxzZXdoZXJlIGlmIG5lZWRlZC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHkgVGhlIHtAY29kZSBCYXNlRW50aXR5fSB3aG9zZSB7QGNvZGUgQ29yZX0gaXMgcmVxdWlyZWQuCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29yZSBnZXRDb3JlKEJhc2VFbnRpdHkgZW50aXR5KSB7CisJCXJldHVybiBlbnRpdHkuZ2V0Q29yZSgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQmFzZUVudGl0eX0gKG9yIGRlcml2YXRpdmUpIHdpdGggY29yZSBhcyB0aGUKKwkgKiBpbnN0YW5jZSdzIHtAbGluayBDb3JlfS4gQnkgZGVjbGFyaW5nIHRoaXMgbWV0aG9kIHByb3RlY3RlZCwgdGhlIENvcmUtcmVsYXRlZAorCSAqIGZ1bmN0aW9uYWxpdHkgaXMgaGlkZGVuIGZyb20gb3RoZXIgY2xhc3NlcyBzaW5jZSB0aGUgb25seSBjbGFzc2VzIHdoaWNoIGNhbgorCSAqIGFjY2VzcyB0aGVtIChvdXRzaWRlIHRoaXMgcGFja2FnZSkgYXJlIGRlcml2YXRpdmVzIG9mIEJhc2VFbnRpdHlGYWN0b3J5LCBhbmQKKwkgKiBpdCBpcyB0aHJvdWdoIHN1Y2ggZGVyaXZhdGl2ZXMgdGhhdCBhIEJhc2VFbnRpdHkncyBDb3JlIHNob3VsZCBiZSBhY2Nlc3NlZAorCSAqIGVsc2V3aGVyZSBpZiBuZWVkZWQuIDxicj4KKwkgKiA8YnI+CisJICogVGhpcyBtZXRob2QgYWNjZXNzZXMgdGhlICh1c3VhbGx5IHByb3RlY3RlZCkgQ29uc3RydWN0b3IoQ29yZSkgb2YgY2xhenosIHNvCisJICogdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzIGFuZCBjYWxsCisJICogc3VwZXIuY3JlYXRlQmFzZUVudGl0eSgpIGlmIHRoYXQgY29uc3RydWN0b3IgaXMgaW52aXNpYmxlIGZyb20gdGhlIGRlcml2ZWQKKwkgKiBjbGFzcy4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlLCBtdXN0IGV4dGVuZCB7QGxpbmsgQmFzZUVudGl0eX0uCisJICogQHBhcmFtIGNvcmUgIFRoZSB7QGxpbmsgQ29yZX0gdG8gdXNlIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZS4KKwkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlLgorCSAqLworCXByb3RlY3RlZCA8VCBleHRlbmRzIEJhc2VFbnRpdHk+IFQgY3JlYXRlQmFzZUVudGl0eShDbGFzczxUPiBjbGF6eiwgQ29yZSBjb3JlKSB7CisJCXRyeSB7CisJCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3IoQ29yZS5jbGFzcyk7CisJCQl0cnkgeworCQkJCXJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShjb3JlKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGFjY2VzcyBDb25zdHJ1Y3RvcihDb3JlKSBvZiBjbGFzcyAnIiArIGNsYXp6LmdldE5hbWUoKSArICInISIpOworCQkJfQorCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgZXhjKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBVc2VyfSB3aGljaCBpcyBib3VuZCB0byB0aGUgY3VycmVudCBzZXNzaW9uLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBVc2VyfSBlbnRpdGllcyBkbyBub3QgZXhpc3QuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IE9wdGlvbmFsPFVzZXI+IGdldExvZ2dlZEluVXNlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQ29yZX0gZm9yIGdpdmVuIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZW50aXR5IGNsYXNzIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFRoZSBlbnRpdHkgY2xhc3MuCisJICogQHJldHVybiBBIG5ldyB7QGNvZGUgQ29yZX0gaW5zdGFuY2UgaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIGFic3RyYWN0IDxUIGV4dGVuZHMgRW50aXR5PiBDb3JlIGNyZWF0ZUNvcmUoQ2xhc3M8VD4gZW50aXR5Q2xhc3MpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyB7QGxpbmsgQ29yZX0gZm9yIGdpdmVuIGVudGl0eSBjbGFzcyBhbmQge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZW50aXR5IGNsYXNzIHR5cGUuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFRoZSBlbnRpdHkgY2xhc3MuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqIEByZXR1cm4gQSBuZXcge0Bjb2RlIENvcmV9IGluc3RhbmNlIGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IHtAbGluayBDb3JlfSBmb3IgZ2l2ZW4gZW50aXR5IGNsYXNzIGFuZCB0eXBlIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGVudGl0eSBjbGFzcyB0eXBlLgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBOYW1lIG9mIHRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVGhlIGVudGl0eSBjbGFzcy4KKwkgKiBAcmV0dXJuIEEgbmV3IHtAY29kZSBDb3JlfSBpbnN0YW5jZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgYWJzdHJhY3QgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQmFzZVBhcmFtZXRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Jhc2VQYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWFiNzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Jhc2VQYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDQ0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gYWJzdHJhY3QgcGFyYW1ldGVyIHdoaWNoIGhvbGRzIGEgdmFsdWUgd2l0aCBvbmUgb2YgdGhlCisgKiBzdXBwb3J0ZWQge0BsaW5rIFZhbHVlVHlwZX1zIGxpc3RlZCBiZWxvdy4gVGhlIHZhbHVlIGlzIGludGVybmFsbHkgc3RvcmVkIGluCisgKiBpdHMge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24uIEFueSBtb2RlbGVkIGVudGl0eSB3aXRoIHN1Y2ggYSB1c2UgY2FzZQorICogc2hvdWxkIGV4dGVuZHMgdGhpcyBjbGFzcy4gQVBJIGNvbnN1bWVycyBzaG91bGQgbmV2ZXIgdXNlIHRoaXMgY2xhc3MgaW4gYW55CisgKiB3YXksIGluc3RlYWQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzIGhhdmUgdG8gYmUgdXNlZC4KKyAqCisgKiA8dWw+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RBVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JPT0xFQU59PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JZVEV9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NIT1JUfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNJTlRFR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNMT05HfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVH08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVF9DT01QTEVYfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNET1VCTEVfQ09NUExFWH08L2xpPgorICogPC91bD4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgI2dldFZpcnR1YWxWYWx1ZSgpCisgKiBAc2VlICNzZXRPYmplY3RWYWx1ZShPYmplY3QsIFVuaXQpCisgKiBAc2VlICNzZXRTdHJpbmdWYWx1ZShTdHJpbmcpCisgKiBAc2VlICNzZXREYXRlVmFsdWUoTG9jYWxEYXRlVGltZSkKKyAqIEBzZWUgI3NldEJvb2xlYW5WYWx1ZShCb29sZWFuKQorICogQHNlZSAjc2V0Qnl0ZVZhbHVlKEJ5dGUsIFVuaXQpCisgKiBAc2VlICNzZXRTaG9ydFZhbHVlKFNob3J0LCBVbml0KQorICogQHNlZSAjc2V0SW50ZWdlclZhbHVlKEludGVnZXIsIFVuaXQpCisgKiBAc2VlICNzZXRMb25nVmFsdWUoTG9uZywgVW5pdCkKKyAqIEBzZWUgI3NldEZsb2F0VmFsdWUoRmxvYXQsIFVuaXQpCisgKiBAc2VlICNzZXREb3VibGVWYWx1ZShEb3VibGUsIFVuaXQpCisgKiBAc2VlICNzZXRGbG9hdENvbXBsZXhWYWx1ZShGbG9hdENvbXBsZXgsIFVuaXQpCisgKiBAc2VlICNzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCwgVW5pdCkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQYXJhbWV0ZXIgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTY2FsYXJUeXBlLCBGdW5jdGlvbjxTdHJpbmcsIE9iamVjdD4+IFNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQID0gbmV3IEhhc2hNYXA8PigpOworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBhdHRyU2NhbGFyVHlwZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBhdHRyVmFsdWU7CisKKwlzdGF0aWMgeworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5TVFJJTkcsIHYgLT4gdik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkRBVEUsIHYgLT4gTG9jYWxEYXRlVGltZS5wYXJzZSh2LCBWYWx1ZS5MT0NBTF9EQVRFX1RJTUVfRk9STUFUVEVSKSk7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkJPT0xFQU4sIEJvb2xlYW46OnZhbHVlT2YpOworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5CWVRFLCBCeXRlOjp2YWx1ZU9mKTsKKwkJU0NBTEFSVFlQRV9GVU5DVElPTl9NQVAucHV0KFNjYWxhclR5cGUuU0hPUlQsIFNob3J0Ojp2YWx1ZU9mKTsKKwkJU0NBTEFSVFlQRV9GVU5DVElPTl9NQVAucHV0KFNjYWxhclR5cGUuSU5URUdFUiwgSW50ZWdlcjo6dmFsdWVPZik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkxPTkcsIExvbmc6OnZhbHVlT2YpOworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5GTE9BVCwgRmxvYXQ6OnZhbHVlT2YpOworCQlTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5wdXQoU2NhbGFyVHlwZS5ET1VCTEUsIERvdWJsZTo6dmFsdWVPZik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgsIEZsb2F0Q29tcGxleDo6dmFsdWVPZik7CisJCVNDQUxBUlRZUEVfRlVOQ1RJT05fTUFQLnB1dChTY2FsYXJUeXBlLkRPVUJMRV9DT01QTEVYLCBEb3VibGVDb21wbGV4Ojp2YWx1ZU9mKTsKKwl9CisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGF0dHJTY2FsYXJUeXBlIE5hbWUgb2YgdGhlIHtAbGluayBTY2FsYXJUeXBlfSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIGF0dHJWYWx1ZSAgICAgIE5hbWUgb2YgdGhlIHtAY29kZSBTdHJpbmd9IHZhbHVlIGF0dHJpYnV0ZS4KKwkgKiBAcGFyYW0gY29yZSAgICAgICAgICAgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgQmFzZVBhcmFtZXRlcihTdHJpbmcgYXR0clNjYWxhclR5cGUsIFN0cmluZyBhdHRyVmFsdWUsIENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwkJdGhpcy5hdHRyU2NhbGFyVHlwZSA9IGF0dHJTY2FsYXJUeXBlOworCQl0aGlzLmF0dHJWYWx1ZSA9IGF0dHJWYWx1ZTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgdmlydHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBhcmFtZXRlcidzIHZhbHVlLiBUaGlzIGlzIGRvbmUgYnkKKwkgKiBjb252ZXJ0aW5nIHRoZSBpbnRlcm5hbGx5IHN0b3JlZCB7QGNvZGUgU3RyaW5nfSB2YWx1ZSB0byB0eXBlIHNwZWNpZmllZCBieQorCSAqIHRoaXMgcGFyYW1ldGVyJ3Mge0BsaW5rIFZhbHVlVHlwZX0gKHRoZSBhbGxvd2VkIHR5cGVzIGFyZSBsaXN0ZWQgYmVsb3cpLiBUaGUKKwkgKiBuYW1lIG9mIHRoZSByZXR1cm5lZCB2aXJ0dWFsIHtAbGluayBWYWx1ZX0gaXMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIuCisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjU1RSSU5HfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjREFURX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JPT0xFQU59PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjU0hPUlR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjTE9OR308L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVRfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYSB2aXJ0dWFsIG9uZSBhbmQgaGVuY2UgaW50ZW5kZWQgZm9yCisJICogZGlzcGxheWluZyBwdXJwb3NlcyBvbmx5LiBUbyBjaGFuZ2UgdGhpcyBwYXJhbWV0ZXIncyB2YWx1ZSBvbmUgb2YgaXRzCisJICoge0Bjb2RlIHNldFhZVmFsdWV9IG1ldGhvZHMgaGFzIHRvIGJlIHVzZWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBWYWx1ZX0gd2l0aCB0aGUgY29udmVydGVkIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZSBnZXRWaXJ0dWFsVmFsdWUoKSB7CisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZSA9IGdldFNjYWxhclR5cGUoKTsKKwkJRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+IHR5cGVDb252ZXJ0ZXIgPSBTQ0FMQVJUWVBFX0ZVTkNUSU9OX01BUC5nZXQoc2NhbGFyVHlwZSk7CisKKwkJaWYgKHR5cGVDb252ZXJ0ZXIgPT0gbnVsbCkgeworCQkJcmV0dXJuIFZhbHVlVHlwZS5VTktOT1dOLmNyZWF0ZShnZXROYW1lKCkpOworCQl9CisKKwkJVmFsdWUgcGFyYW1ldGVyVmFsdWUgPSBnZXRQYXJhbWV0ZXJWYWx1ZSgpOworCQlPYmplY3QgdmFsdWUgPSBwYXJhbWV0ZXJWYWx1ZS5pc1ZhbGlkKCkgPyB0eXBlQ29udmVydGVyLmFwcGx5KHBhcmFtZXRlclZhbHVlLmV4dHJhY3QoKSkgOiBudWxsOworCQlyZXR1cm4gc2NhbGFyVHlwZS50b1NpbmdsZVZhbHVlVHlwZSgpLmNyZWF0ZShnZXROYW1lKCksIGdldFVuaXROYW1lKCksIHBhcmFtZXRlclZhbHVlLmlzVmFsaWQoKSwgdmFsdWUpOworCX0KKworCS8qKgorCSAqIFRha2VzIGdpdmVuIHZhbHVlIGFuZCBkZXRlcm1pbmVzIGl0cyB0eXBlLiBGaW5hbGx5IHZhbHVlIGFuZCB0aGUgb3B0aW9uYWwKKwkgKiB7QGNvZGUgVW5pdH0gYXJlIHBhc3NlZCB0byB0aGUgY29ycmVzcG9uZGluZyB7QGNvZGUgc2V0WFlWYWx1ZShYWSl9IG1ldGhvZCBhcworCSAqIGxpc3RlZCBiZWxvdy4gVGhlIHZhbHVlIGlzIGFsbG93ZWQgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGZvbGxvd2luZyB0eXBlczoKKwkgKiB7QGNvZGUgU3RyaW5nfSwge0Bjb2RlIExvY2FsRGF0ZVRpbWV9LCB7QGNvZGUgQm9vbGVhbn0sIHtAY29kZSBCeXRlfSwKKwkgKiB7QGNvZGUgU2hvcnR9LCB7QGNvZGUgSW50ZWdlcn0sIHtAY29kZSBMb25nfSwge0Bjb2RlIEZsb2F0fSwge0Bjb2RlIERvdWJsZX0sCisJICoge0Bjb2RlIEZsb2F0Q29tcGxleH0gYW5kIHtAY29kZSBEb3VibGVDb21wbGV4fS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBJZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIFN0cmluZ30sIHtAY29kZQorCSAqIExvY2FsRGF0ZVRpbWV9IG9yIGEge0Bjb2RlIEJvb2xlYW59LCB0aGVuIHRoZSBnaXZlbiB1bml0IGlzIGlnbm9yZWQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4KKwkgKiBAcGFyYW0gdW5pdCAgVGhlIG9wdGlvbmFsbHkgcmVsYXRlZCB7QGNvZGUgVW5pdH0uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkLgorCSAqIEBzZWUgI3NldFN0cmluZ1ZhbHVlKFN0cmluZykKKwkgKiBAc2VlICNzZXREYXRlVmFsdWUoTG9jYWxEYXRlVGltZSkKKwkgKiBAc2VlICNzZXRCb29sZWFuVmFsdWUoQm9vbGVhbikKKwkgKiBAc2VlICNzZXRCeXRlVmFsdWUoQnl0ZSwgVW5pdCkKKwkgKiBAc2VlICNzZXRTaG9ydFZhbHVlKFNob3J0LCBVbml0KQorCSAqIEBzZWUgI3NldEludGVnZXJWYWx1ZShJbnRlZ2VyLCBVbml0KQorCSAqIEBzZWUgI3NldExvbmdWYWx1ZShMb25nLCBVbml0KQorCSAqIEBzZWUgI3NldEZsb2F0VmFsdWUoRmxvYXQsIFVuaXQpCisJICogQHNlZSAjc2V0RG91YmxlVmFsdWUoRG91YmxlLCBVbml0KQorCSAqIEBzZWUgI3NldEZsb2F0Q29tcGxleFZhbHVlKEZsb2F0Q29tcGxleCwgVW5pdCkKKwkgKiBAc2VlICNzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCwgVW5pdCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RWYWx1ZShPYmplY3QgdmFsdWUsIFVuaXQgdW5pdCkgeworCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKwkJCXNldFN0cmluZ1ZhbHVlKChTdHJpbmcpIHZhbHVlKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExvY2FsRGF0ZVRpbWUpIHsKKwkJCXNldERhdGVWYWx1ZSgoTG9jYWxEYXRlVGltZSkgdmFsdWUpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikgeworCQkJc2V0Qm9vbGVhblZhbHVlKChCb29sZWFuKSB2YWx1ZSk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlKSB7CisJCQlzZXRCeXRlVmFsdWUoKEJ5dGUpIHZhbHVlLCB1bml0KTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNob3J0KSB7CisJCQlzZXRTaG9ydFZhbHVlKChTaG9ydCkgdmFsdWUsIHVuaXQpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikgeworCQkJc2V0SW50ZWdlclZhbHVlKChJbnRlZ2VyKSB2YWx1ZSwgdW5pdCk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKSB7CisJCQlzZXRMb25nVmFsdWUoKExvbmcpIHZhbHVlLCB1bml0KTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0KSB7CisJCQlzZXRGbG9hdFZhbHVlKChGbG9hdCkgdmFsdWUsIHVuaXQpOworCQl9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRG91YmxlKSB7CisJCQlzZXREb3VibGVWYWx1ZSgoRG91YmxlKSB2YWx1ZSwgdW5pdCk7CisJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdENvbXBsZXgpIHsKKwkJCXNldEZsb2F0Q29tcGxleFZhbHVlKChGbG9hdENvbXBsZXgpIHZhbHVlLCB1bml0KTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZUNvbXBsZXgpIHsKKwkJCXNldERvdWJsZUNvbXBsZXhWYWx1ZSgoRG91YmxlQ29tcGxleCkgdmFsdWUsIHVuaXQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlZhbHVlICciICsgdmFsdWUgKyAiJyBvZiB0eXBlICciICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiJyBpcyBub3Qgc3VwcG9ydGVkLiIpOworCQl9CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIGdpdmVuIHtAY29kZSBTdHJpbmd9IHZhbHVlLiBBbnkgZXhpc3RpbmcgcmVsYXRpb24KKwkgKiB0byBhIHtAbGluayBVbml0fSB3aWxsIGJlIHJlbW92ZWQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICovCisJcHVibGljIHZvaWQgc2V0U3RyaW5nVmFsdWUoU3RyaW5nIHZhbHVlKSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5TVFJJTkcpOworCQlnZXRQYXJhbWV0ZXJWYWx1ZSgpLnNldCh2YWx1ZSk7CisJCXNldFVuaXQobnVsbCk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBnaXZlbgorCSAqIHtAY29kZSBMb2NhbERhdGVUaW1lfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUKKwkgKiByZW1vdmVkLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERhdGVWYWx1ZShMb2NhbERhdGVUaW1lIHZhbHVlKSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5EQVRFKTsKKwkJZ2V0UGFyYW1ldGVyVmFsdWUoKS5zZXQodmFsdWUuZm9ybWF0KFZhbHVlLkxPQ0FMX0RBVEVfVElNRV9GT1JNQVRURVIpKTsKKwkJc2V0VW5pdChudWxsKTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHZhbHVlIHdpdGggdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIGdpdmVuCisJICoge0Bjb2RlIEJvb2xlYW59LiBBbnkgZXhpc3RpbmcgcmVsYXRpb24gdG8gYSB7QGxpbmsgVW5pdH0gd2lsbCBiZSByZW1vdmVkLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEJvb2xlYW5WYWx1ZShCb29sZWFuIHZhbHVlKSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5CT09MRUFOKTsKKwkJZ2V0UGFyYW1ldGVyVmFsdWUoKS5zZXQodmFsdWUudG9TdHJpbmcoKSk7CisJCXNldFVuaXQobnVsbCk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBnaXZlbgorCSAqIHtAY29kZSBCeXRlfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQgd2l0aAorCSAqIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0Qnl0ZVZhbHVlKEJ5dGUgdmFsdWUsIFVuaXQgdW5pdCkgeworCQlzZXRTY2FsYXJUeXBlKFNjYWxhclR5cGUuQllURSk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgU2hvcnR9LiBBbnkgZXhpc3RpbmcgcmVsYXRpb24gdG8gYSB7QGxpbmsgVW5pdH0gd2lsbCBiZSByZXBsYWNlZCB3aXRoCisJICogdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKwkgKiBAcGFyYW0gdW5pdCAgVGhlIHJlbGF0aW9uIHRvIGEgdW5pdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaG9ydFZhbHVlKFNob3J0IHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLlNIT1JUKTsKKwkJZ2V0UGFyYW1ldGVyVmFsdWUoKS5zZXQodmFsdWUudG9TdHJpbmcoKSk7CisJCXNldFVuaXQodW5pdCk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB2YWx1ZSB3aXRoIHRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBnaXZlbgorCSAqIHtAY29kZSBJbnRlZ2VyfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQKKwkgKiB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0SW50ZWdlclZhbHVlKEludGVnZXIgdmFsdWUsIFVuaXQgdW5pdCkgeworCQlzZXRTY2FsYXJUeXBlKFNjYWxhclR5cGUuSU5URUdFUik7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgTG9uZ30uIEFueSBleGlzdGluZyByZWxhdGlvbiB0byBhIHtAbGluayBVbml0fSB3aWxsIGJlIHJlcGxhY2VkIHdpdGgKKwkgKiB0aGUgZ2l2ZW4gb25lLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqIEBwYXJhbSB1bml0ICBUaGUgcmVsYXRpb24gdG8gYSB1bml0IGlzIG9wdGlvbmFsLgorCSAqLworCXB1YmxpYyB2b2lkIHNldExvbmdWYWx1ZShMb25nIHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLkxPTkcpOworCQlnZXRQYXJhbWV0ZXJWYWx1ZSgpLnNldCh2YWx1ZS50b1N0cmluZygpKTsKKwkJc2V0VW5pdCh1bml0KTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHZhbHVlIHdpdGggdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIGdpdmVuCisJICoge0Bjb2RlIEZsb2F0fS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQgd2l0aAorCSAqIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0RmxvYXRWYWx1ZShGbG9hdCB2YWx1ZSwgVW5pdCB1bml0KSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5GTE9BVCk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgRG91YmxlfS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUgcmVwbGFjZWQgd2l0aAorCSAqIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0RG91YmxlVmFsdWUoRG91YmxlIHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLkRPVUJMRSk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgdmFsdWUgd2l0aCB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgZ2l2ZW4KKwkgKiB7QGNvZGUgRmxvYXRDb21wbGV4fS4gQW55IGV4aXN0aW5nIHJlbGF0aW9uIHRvIGEge0BsaW5rIFVuaXR9IHdpbGwgYmUKKwkgKiByZXBsYWNlZCB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhpcyBwYXJhbWV0ZXIuCisJICogQHBhcmFtIHVuaXQgIFRoZSByZWxhdGlvbiB0byBhIHVuaXQgaXMgb3B0aW9uYWwuCisJICovCisJcHVibGljIHZvaWQgc2V0RmxvYXRDb21wbGV4VmFsdWUoRmxvYXRDb21wbGV4IHZhbHVlLCBVbml0IHVuaXQpIHsKKwkJc2V0U2NhbGFyVHlwZShTY2FsYXJUeXBlLkZMT0FUX0NPTVBMRVgpOworCQlnZXRQYXJhbWV0ZXJWYWx1ZSgpLnNldCh2YWx1ZS50b1N0cmluZygpKTsKKwkJc2V0VW5pdCh1bml0KTsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHZhbHVlIHdpdGggdGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIGdpdmVuCisJICoge0Bjb2RlIERvdWJsZUNvbXBsZXh9LiBBbnkgZXhpc3RpbmcgcmVsYXRpb24gdG8gYSB7QGxpbmsgVW5pdH0gd2lsbCBiZQorCSAqIHJlcGxhY2VkIHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKwkgKiBAcGFyYW0gdW5pdCAgVGhlIHJlbGF0aW9uIHRvIGEgdW5pdCBpcyBvcHRpb25hbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREb3VibGVDb21wbGV4VmFsdWUoRG91YmxlQ29tcGxleCB2YWx1ZSwgVW5pdCB1bml0KSB7CisJCXNldFNjYWxhclR5cGUoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCk7CisJCWdldFBhcmFtZXRlclZhbHVlKCkuc2V0KHZhbHVlLnRvU3RyaW5nKCkpOworCQlzZXRVbml0KHVuaXQpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgiKE5hbWUgPSAiKS5hcHBlbmQoZ2V0TmFtZSgpKTsKKworCQlzYi5hcHBlbmQoIiwgVmFsdWUgPSAiKTsKKwkJVmFsdWUgcGFyYW1ldGVyVmFsdWUgPSBnZXRQYXJhbWV0ZXJWYWx1ZSgpOworCQlpZiAocGFyYW1ldGVyVmFsdWUuaXNWYWxpZCgpKSB7CisJCQlzYi5hcHBlbmQoKFN0cmluZykgZ2V0UGFyYW1ldGVyVmFsdWUoKS5leHRyYWN0KCkpOworCQl9CisKKwkJT3B0aW9uYWw8VW5pdD4gdW5pdCA9IGdldFVuaXQoKTsKKwkJaWYgKHVuaXQuaXNQcmVzZW50KCkpIHsKKwkJCXNiLmFwcGVuZCgiIFsiKS5hcHBlbmQodW5pdC5nZXQoKS5nZXROYW1lKCkpLmFwcGVuZCgnXScpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBWYWx1ZX0gb2YgdGhpcyBwYXJhbWV0ZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoaXMgcGFyYW1ldGVyJ3Mge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFZhbHVlIGdldFBhcmFtZXRlclZhbHVlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoYXR0clZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzY2FsYXIgdmFsdWUgdHlwZSBvZiB0aGlzIHBhcmFtZXRlci4KKwkgKgorCSAqIEByZXR1cm4gVGhpcyBwYXJhbWV0ZXIncyBzY2FsYXIgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFNjYWxhclR5cGUgZ2V0U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKGF0dHJTY2FsYXJUeXBlKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgc2NhbGFyIHR5cGUgZm9yIHRoaXMgcGFyYW1ldGVyLgorCSAqCisJICogQHBhcmFtIHNjYWxhclR5cGUgVGhlIG5ldyB7QGNvZGUgU2NhbGFyVHlwZX0uCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFNjYWxhclR5cGUoU2NhbGFyVHlwZSBzY2FsYXJUeXBlKSB7CisJCWdldFZhbHVlKGF0dHJTY2FsYXJUeXBlKS5zZXQoc2NhbGFyVHlwZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRlZCB7QGxpbmsgVW5pdH0uIElmIG5vIHtAY29kZSBVbml0fSBpcyByZWxhdGVkLAorCSAqIGFuIGVtcHR5IHtAY29kZSBTdHJpbmd9IGlzIHJldHVybmVkIGluc3RlYWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSByZWxhdGVkIHtAY29kZSBVbml0fSBpcyByZXR1cm5lZCBvciBhbiBlbXB0eQorCSAqICAgICAgICAge0Bjb2RlIFN0cmluZ30uCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pdE5hbWUoKSB7CisJCU9wdGlvbmFsPFVuaXQ+IHVuaXQgPSBnZXRVbml0KCk7CisJCWlmICh1bml0LmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gdW5pdC5nZXQoKS5nZXROYW1lKCk7CisJCX0KKworCQlyZXR1cm4gIiI7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbiBvcHRpb25hbGx5IHJlbGF0ZWQge0BsaW5rIFVuaXR9LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBubyB7QGNvZGUgVW5pdH0gaXMgcmVsYXRlZC4KKwkgKi8KKwlwcml2YXRlIE9wdGlvbmFsPFVuaXQ+IGdldFVuaXQoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVW5pdC5jbGFzcykpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQge0BsaW5rIFVuaXR9IHJlbGF0aW9uIHdpdGggdGhlIGdpdmVuIG9uZSwgaWYgdGhlIHtAY29kZQorCSAqIE9wdGlvbmFsfSBpcyBub3QgZW1wdHkuIE90aGVyd2lzZSBhbnkgY3VycmVudCByZWxhdGlvbnMgaXMgcmVtb3ZlZC4KKwkgKgorCSAqIEBwYXJhbSB1bml0IFRoZSBuZXcge0Bjb2RlIFVuaXR9IG1heSBiZSB7QGNvZGUgbnVsbH0uCisJICovCisJcHJpdmF0ZSB2b2lkIHNldFVuaXQoVW5pdCB1bml0KSB7CisJCWlmICh1bml0ID09IG51bGwpIHsKKwkJCWdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5yZW1vdmUoVW5pdC5jbGFzcyk7CisJCX0gZWxzZSB7CisJCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHVuaXQpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ2hhbm5lbC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NoYW5uZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkxYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NoYW5uZWwuamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNoYW5uZWwgZW50aXR5IHR5cGUuIEVudGl0aWVzIG9mIHRoaXMgdHlwZSBhcmUgYmFzZWQgb24KKyAqIHtAbGluayBRdWFudGl0eX1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBNZWFzdXJlbWVudAorICogQHNlZSBDaGFubmVsR3JvdXAKKyAqIEBzZWUgQ29udGV4dFNlbnNvcgorICogQHNlZSBQYXJhbWV0ZXJTZXQKKyAqLworcHVibGljIGNsYXNzIENoYW5uZWwgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyBUT0RPIENoYW5uZWwgbWF5IGhhdmUgYSByZWxhdGlvbiB0byBhIHNlbnNvciEKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIE1lYXN1cmVtZW50fSBwYXJlbnQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPE1lYXN1cmVtZW50PiBQQVJFTlRfVFlQRV9NRUFTVVJFTUVOVCA9IE1lYXN1cmVtZW50LmNsYXNzOworCisJLyoqCisJICogVGhlIHtAbGluayBDaGFubmVsR3JvdXB9IHBhcmVudCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Q2hhbm5lbEdyb3VwPiBQQVJFTlRfVFlQRV9DSEFOTkVMR1JPVVAgPSBDaGFubmVsR3JvdXAuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFBhcmFtZXRlclNldH0gY2hpbGQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFBhcmFtZXRlclNldD4gQ0hJTERfVFlQRV9QQVJBTUVURVJTRVQgPSBQYXJhbWV0ZXJTZXQuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUgJ01pbmltdW0nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUlOSU1VTSA9ICJNaW5pbXVtIjsKKworCS8qKgorCSAqIFRoZSAnTWF4aW11bScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NQVhJTVVNID0gIk1heGltdW0iOworCisJLyoqCisJICogVGhlICdBdmVyYWdlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FWRVJBR0UgPSAiQXZlcmFnZSI7CisKKwkvKioKKwkgKiBUaGUgJ0RldmlhdGlvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERVZJQVRJT04gPSAiRGV2aWF0aW9uIjsKKworCS8qKgorCSAqIFRoZSAnU2NhbGFyVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TQ0FMQVJfVFlQRSA9ICJEYXRhVHlwZSI7CisKKwkvKioKKwkgKiBUaGUgJ0ludGVycG9sYXRpb24nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfSU5URVJQT0xBVElPTiA9ICJJbnRlcnBvbGF0aW9uIjsKKworCS8qKgorCSAqIFRoZSAnUmFuaycgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9SQU5LID0gIlJhbmsiOworCisJLyoqCisJICogVGhlICdUeXBlU2l6ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9UWVBFX1NJWkUgPSAiVHlwZVNpemUiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDaGFubmVsKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1pbmltdW0gdmFsdWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIERvdWJsZSBnZXRNaW5pbXVtKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NSU5JTVVNKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgbWluaW11bSB2YWx1ZSBmb3IgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHBhcmFtIG1pbmltdW0gVGhlIG5ldyBtaW5pbXVtIHZhbHVlLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pbmltdW0oRG91YmxlIG1pbmltdW0pIHsKKwkJZ2V0VmFsdWUoQVRUUl9NSU5JTVVNKS5zZXQobWluaW11bSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBEb3VibGUgZ2V0TWF4aW11bSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUFYSU1VTSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IG1heGltdW0gdmFsdWUgZm9yIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEBwYXJhbSBtYXhpbXVtIFRoZSBuZXcgbWF4aW11bSB2YWx1ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtKERvdWJsZSBtYXhpbXVtKSB7CisJCWdldFZhbHVlKEFUVFJfTUFYSU1VTSkuc2V0KG1heGltdW0pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHJldHVybiBUaGUgYXZlcmFnZSB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgRG91YmxlIGdldEF2ZXJhZ2UoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FWRVJBR0UpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBhdmVyYWdlIHZhbHVlIGZvciB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcGFyYW0gYXZlcmFnZSBUaGUgbmV3IGF2ZXJhZ2UgdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0QXZlcmFnZShEb3VibGUgYXZlcmFnZSkgeworCQlnZXRWYWx1ZShBVFRSX0FWRVJBR0UpLnNldChhdmVyYWdlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZXZpYXRpb24gdmFsdWUgb2YgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHJldHVybiBUaGUgZGV2aWF0aW9uIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBEb3VibGUgZ2V0RGV2aWF0aW9uKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERVZJQVRJT04pLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBkZXZpYXRpb24gdmFsdWUgZm9yIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEBwYXJhbSBkZXZpYXRpb24gVGhlIG5ldyBkZXZpYXRpb24gdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0RGV2aWF0aW9uKERvdWJsZSBkZXZpYXRpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERVZJQVRJT04pLnNldChkZXZpYXRpb24pOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTY2FsYXJUeXBlfSBvZiB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNjYWxhclR5cGUgZ2V0U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfU0NBTEFSX1RZUEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB7QGxpbmsgU2NhbGFyVHlwZX0gZm9yIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEBwYXJhbSBzY2FsYXJUeXBlIFRoZSBuZXcge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB7QGNvZGUgU2NhbGFyVHlwZX0gaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgU2NhbGFyVHlwZSNVTktOT1dOfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTY2FsYXJUeXBlKFNjYWxhclR5cGUgc2NhbGFyVHlwZSkgeworCQlpZiAoc2NhbGFyVHlwZS5pc1Vua25vd24oKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2NhbGFyIHR5cGUgY29uc3RhbnQgaXMgbm90IGFsbG93ZWQgdG8gYmUgJyIgKyBzY2FsYXJUeXBlICsgIicuIik7CisJCX0KKworCQlnZXRWYWx1ZShBVFRSX1NDQUxBUl9UWVBFKS5zZXQoc2NhbGFyVHlwZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEludGVycG9sYXRpb259IG9mIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBJbnRlcnBvbGF0aW9ufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZXJwb2xhdGlvbiBnZXRJbnRlcnBvbGF0aW9uKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9JTlRFUlBPTEFUSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgaW50ZXJwb2xhdGlvbiBmb3IgdGhpcyBjaGFubmVsLgorCSAqCisJICogQHBhcmFtIGludGVycG9sYXRpb24gVGhlIG5ldyB7QGNvZGUgSW50ZXJwb2xhdGlvbn0uCisJICovCisJcHVibGljIHZvaWQgc2V0SW50ZXJwb2xhdGlvbihJbnRlcnBvbGF0aW9uIGludGVycG9sYXRpb24pIHsKKwkJZ2V0VmFsdWUoQVRUUl9JTlRFUlBPTEFUSU9OKS5zZXQoaW50ZXJwb2xhdGlvbik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmFuayBvZiB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByYW5rIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldFJhbmsoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1JBTkspLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyByYW5rIGZvciB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcGFyYW0gcmFuayBUaGUgbmV3IHJhbmsuCisJICovCisJcHVibGljIHZvaWQgc2V0UmFuayhJbnRlZ2VyIHJhbmspIHsKKwkJZ2V0VmFsdWUoQVRUUl9SQU5LKS5zZXQocmFuayk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdHlwZSBzaXplIG9mIHRoaXMgY2hhbm5lbC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHR5cGUgc2l6ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRUeXBlU2l6ZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfVFlQRV9TSVpFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdHlwZSBzaXplIGZvciB0aGlzIGNoYW5uZWwuCisJICoKKwkgKiBAcGFyYW0gdHlwZVNpemUgVGhlIG5ldyB0eXBlIHNpemUuCisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZVNpemUoSW50ZWdlciB0eXBlU2l6ZSkgeworCQlnZXRWYWx1ZShBVFRSX1RZUEVfU0laRSkuc2V0KHR5cGVTaXplKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWxhdGVkIHtAbGluayBVbml0fS4KKwkgKgorCSAqIEByZXR1cm4gUmVsYXRlZCB7QGNvZGUgVW5pdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFVuaXQgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVW5pdC5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVsYXRlZCB7QGxpbmsgUXVhbnRpdHl9LgorCSAqCisJICogQHJldHVybiBSZWxhdGVkIHtAY29kZSBRdWFudGl0eX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFF1YW50aXR5IGdldFF1YW50aXR5KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChRdWFudGl0eS5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ2hhbm5lbEdyb3VwLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ2hhbm5lbEdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNmJkZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9DaGFubmVsR3JvdXAuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2hhbm5lbCBncm91cCBlbnRpdHkgdHlwZS4gSXQgYmVsb25ncyB0byBleGFjdGx5IG9uZQorICoge0BsaW5rIE1lYXN1cmVtZW50fSBhbmQgZ3JvdXBzIGEgc2V0IG9mIGl0cyB7QGxpbmsgQ2hhbm5lbH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ2hhbm5lbEdyb3VwIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIHtAbGluayBNZWFzdXJlbWVudH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxNZWFzdXJlbWVudD4gUEFSRU5UX1RZUEVfTUVBU1VSRU1FTlQgPSBNZWFzdXJlbWVudC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgQ2hhbm5lbH0gY2hpbGQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPENoYW5uZWw+IENISUxEX1RZUEVfQ0hBTk5FTCA9IENoYW5uZWwuY2xhc3M7CisKKwkvKioKKwkgKiBUaGUgJ051bWJlck9mVmFsdWVzJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05VTUJFUl9PRl9WQUxVRVMgPSAiU3ViTWF0cml4Tm9Sb3dzIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJQ2hhbm5lbEdyb3VwKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWVhc3VyZWQgdmFsdWVzIG9mIGVhY2ggcmVsYXRlZCB7QGxpbmsgQ2hhbm5lbH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgbWVhc3VyZWQgdmFsdWVzIHBlciB7QGNvZGUgQ2hhbm5lbH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0TnVtYmVyT2ZWYWx1ZXMoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX05VTUJFUl9PRl9WQUxVRVMpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBudW1iZXIgb2YgdmFsdWVzIGZvciB0aGlzIGNoYW5uZWwgZ3JvdXAuCisJICoKKwkgKiBAcGFyYW0gbnVtYmVyT2ZWYWx1ZXMgVGhlIG5ldyBudW1iZXIgb2YgdmFsdWVzLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE51bWJlck9mVmFsdWVzKEludGVnZXIgbnVtYmVyT2ZWYWx1ZXMpIHsKKwkJZ2V0VmFsdWUoQVRUUl9OVU1CRVJfT0ZfVkFMVUVTKS5zZXQobnVtYmVyT2ZWYWx1ZXMpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRDb21wb25lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJkM2JlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29udGV4dCBjb21wb25lbnQgZW50aXR5IHR5cGVzLiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcworICogYXJlIG9ubHkgcHJvdmlkZWQgLyBtYW5hZ2VkIHZpYSB0aGUgb3duaW5nIGRlc2NyaXB0aXZlIHtAbGluayBDb250ZXh0Um9vdH0uCisgKiBBZGRpdGlvbmFsbHkgaWYgdGhlIG93bmluZyB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIG9mIHR5cGUKKyAqIHtAbGluayBDb250ZXh0VHlwZSNURVNURVFVSVBNRU5UfSB0aGlzIGNvbnRleHQgY29tcG9uZW50IG1heSBoYXZlIHJlbGF0aW9ucworICogdG8ge0BsaW5rIENvbnRleHRTZW5zb3J9cyB3aG9zZSBuYW1lcyBoYXZlIHRvIGJlIHVuaXF1ZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIENvbnRleHRDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJQ29udGV4dENvbXBvbmVudChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRTZW5zb3J9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgQ29udGV4dFNlbnNvcn0uCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBhIHtAY29kZSBDb250ZXh0U2Vuc29yfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxDb250ZXh0U2Vuc29yPiBnZXRDb250ZXh0U2Vuc29yKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXRDb250ZXh0U2Vuc29ycygpLnN0cmVhbSgpLmZpbHRlcihjcyAtPiBjcy5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBDb250ZXh0U2Vuc29yfXMgcmVsYXRlZCB0byB0aGlzIGNvbnRleHQKKwkgKiBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PENvbnRleHRTZW5zb3I+IGdldENvbnRleHRTZW5zb3JzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoQ29udGV4dFNlbnNvci5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRSb290fSB0aGlzIGNvbnRleHQgY29tcG9uZW50IGJlbG9uZ3MgdG8uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQge0BsaW5rIENvbnRleHRSb290fS4KKwkgKi8KKwlwdWJsaWMgQ29udGV4dFJvb3QgZ2V0Q29udGV4dFJvb3QoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoQ29udGV4dFJvb3QuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBDb250ZXh0U2Vuc29yfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgQ29udGV4dFNlbnNvcn0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgQ29udGV4dFNlbnNvcn0gd2l0aCBnaXZlbiBuYW1lIGhhcworCSAqICAgICAgICAgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZUNvbnRleHRTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8Q29udGV4dFNlbnNvcj4gY2F0YWxvZ1NlbnNvciA9IGdldENvbnRleHRTZW5zb3IobmFtZSk7CisJCWlmIChjYXRhbG9nU2Vuc29yLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZShjYXRhbG9nU2Vuc29yLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PENvbnRleHRTZW5zb3I+IGNvbnRleHRTZW5zb3JzID0gZ2V0Q29udGV4dFNlbnNvcnMoKTsKKwkJaWYgKCFjb250ZXh0U2Vuc29ycy5pc0VtcHR5KCkpIHsKKwkJCXNiLmFwcGVuZCgiLCBDb250ZXh0U2Vuc29ycyA9ICIpLmFwcGVuZChjb250ZXh0U2Vuc29ycyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0RGVzY3JpYmFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0RGVzY3JpYmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVhNjlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHREZXNjcmliYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VFbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBUZXN0U3RlcH0gYW5kIHtAbGluayBNZWFzdXJlbWVudH0gZW50aXR5IHR5cGVzIGltcGxlbWVudCB0aGlzCisgKiBpbnRlcmZhY2UgdG8gaW5kaWNhdGUgdGhlIGF2YWlsYWJpbGl0eSBvZiBkZXNjcmlwdGl2ZSBjb250ZXh0IGRhdGEuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENvbnRleHRSb290CisgKiBAc2VlIENvbnRleHRDb21wb25lbnQKKyAqIEBzZWUgQ29udGV4dFNlbnNvcgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHREZXNjcmliYWJsZSBleHRlbmRzIEVudGl0eSB7CisJLyoqCisJICogUXVlcmllcyBhdmFpbGFibGUge0BsaW5rIENvbnRleHRUeXBlfSBmb3IgZ2l2ZW4ge0BsaW5rIENvbnRleHREZXNjcmliYWJsZX0uCisJICoKKwkgKiBAcGFyYW0gbWFuYWdlciBBbiBvYmplY3QgaW1wbGVtZW50aW5nIEJhc2VFbnRpdHlNYW5hZ2VyLgorCSAqIEByZXR1cm4ge0Bjb2RlIExpc3R9IGNvbnRhaW5zIHRoZSB7QGNvZGUgQ29udGV4dFR5cGV9IG9mIGVhY2ggcmVmZXJlbmNlZAorCSAqICAgICAgICAge0BsaW5rIENvbnRleHRSb290fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBxdWVyeSB0aGUgYXZhaWxhYmxlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBDb250ZXh0VHlwZX1zLgorCSAqLworCUxpc3Q8Q29udGV4dFR5cGU+IGxvYWRDb250ZXh0VHlwZXMoQmFzZUVudGl0eU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgcmVxdWVzdGVkIHtAbGluayBDb250ZXh0Um9vdH1zIGZvciBnaXZlbgorCSAqIHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqCisJICogQHBhcmFtIG1hbmFnZXIgICAgICBBbiBvYmplY3QgaW1wbGVtZW50aW5nIEJhc2VFbnRpdHlNYW5hZ2VyLgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZXMgVGhlIHJlcXVlc3RlZCBjb250ZXh0IHR5cGVzLiBJZiBvbWl0dGVkLCBhbGwgdHlwZXMgYXJlIGJlCisJICogICAgICAgICAgICAgICAgICAgICBsb2FkZWQuCisJICogQHJldHVybiBUaGUgb3JkZXJlZCBjb250ZXh0cyBmb3IgZ2l2ZW4ge0Bjb2RlIFRlc3RTdGVwfSBvciB0aGUgbWVhc3VyZWQgb25lcworCSAqICAgICAgICAgZm9yIHtAY29kZSBNZWFzdXJlbWVudH0gYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIE1hcH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHtAY29kZQorCSAqIAkJQ29udGV4dFJvb3R9ICAgICAgICBzLgorCSAqIEBzZWUgQ29udGV4dFR5cGUKKwkgKi8KKwlNYXA8Q29udGV4dFR5cGUsIENvbnRleHRSb290PiBsb2FkQ29udGV4dHMoQmFzZUVudGl0eU1hbmFnZXIgbWFuYWdlciwgQ29udGV4dFR5cGUuLi4gY29udGV4dFR5cGVzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Um9vdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRSb290LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5ZTFmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Um9vdC5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29udGV4dCByb290IGVudGl0eSB0eXBlcy4gVGhpcyBpcyB0aGUgcm9vdCBub2RlIG9mIHRoZQorICogZGVzY3JpcHRpdmUgY29tcG9uZW50IHN0cnVjdHVyZSBmb3IgYSB7QGxpbmsgQ29udGV4dFR5cGV9LiBUaGlzIGVsZW1lbnQgaXMKKyAqIHVzZWQgZm9yIGJvdGgsIG9yZGVyIGFuZCBtZWFzdXJlZCByZXN1bHQgZGVzY3JpcHRpb24gZGF0YS4gSWYgaXQgYmVsb25ncyB0bworICogYW4gb3JkZXIgZGVzY3JpcHRpb24sIHRoZW4gYSByZWxhdGlvbiB0byBhIHtAbGluayBUZXN0U3RlcH0gZXhpc3RzLiBPdGhlcndpc2UKKyAqIGl0IHJlcHJlc2VudHMgdGhlIGRlc2NyaXB0aW9uIG9mIGEgbWVhc3VyZW1lbnQgYW5kIHRoZXJlZm9yZSBoYXMgb25lIG9yZSBtb3JlCisgKiByZWxhdGlvbnMgdG8ge0BsaW5rIE1lYXN1cmVtZW50fXMuIEluIHRoZSBiYXNlIGFwcGxpY2F0aW9uIG1vZGVsIHRoZQorICogY29tcG9uZW50IHN0cnVjdHVyZSBpcyBwcm92aWRlZCBhcyBpcy4gQW4gZXh0ZW5zaW9uIG9mIHRoZSBiYXNlIGFwcGxpY2F0aW9uCisgKiBtb2RlbCBtYXkgZGVmaW5lIGEgdGVtcGxhdGUsIHRoZSBzdHJ1Y3R1cmUgb2YgY29udGFpbmVkCisgKiB7QGxpbmsgQ29udGV4dENvbXBvbmVudH1zIGFuZCB7QGxpbmsgQ29udGV4dFNlbnNvcn1zIHdpbGwgYmUgcmVzdHJpY3RlZCB0by4KKyAqIEFkZGl0aW9uYWxseSB0aGUgPGI+bmFtZXM8L2I+IG9mIGFsbCByZWxhdGVkIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fXMgaGF2ZQorICogdG8gYmUgdW5pcXVlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFJvb3QgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ1ZlcnNpb24nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJWZXJzaW9uIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDb250ZXh0Um9vdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJCWNvbnRleHRUeXBlID0gQ29udGV4dFR5cGUudmFsdWVPZihjb3JlLmdldFR5cGVOYW1lKCkudG9VcHBlckNhc2UoTG9jYWxlLlJPT1QpKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29udGV4dFR5cGV9IG9mIHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvbnRleHRUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoKSB7CisJCXJldHVybiBjb250ZXh0VHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENvbnRleHRDb21wb25lbnR9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPENvbnRleHRDb21wb25lbnQ+IGdldENvbnRleHRDb21wb25lbnQoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENvbnRleHRDb21wb25lbnRzKCkuc3RyZWFtKCkuZmlsdGVyKGNjIC0+IGNjLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENvbnRleHRDb21wb25lbnR9cyByZWxhdGVkIHRvIHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxDb250ZXh0Q29tcG9uZW50PiBnZXRDb250ZXh0Q29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KENvbnRleHRDb21wb25lbnQuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBDb250ZXh0Q29tcG9uZW50fSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgQ29udGV4dENvbXBvbmVudH0gdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIENvbnRleHRDb21wb25lbnR9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb250ZXh0Q29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPENvbnRleHRDb21wb25lbnQ+IGNvbnRleHRDb21wb25lbnQgPSBnZXRDb250ZXh0Q29tcG9uZW50KG5hbWUpOworCQlpZiAoY29udGV4dENvbXBvbmVudC5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUoY29udGV4dENvbXBvbmVudC5nZXQoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENvbnRleHRTZW5zb3J9cyByZWxhdGVkIHRvIHRoZQorCSAqIHtAbGluayBDb250ZXh0Q29tcG9uZW50fXMsIHdoaWNoIGFyZSBoZWxkIGJ5IHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IHdpbGwgYWx3YXlzIGJlIGVtcHR5IGlmIHRoaXMgY29udGV4dCByb290CisJICogICAgICAgICBpcyBvZiB0eXBlIHtAbGluayBDb250ZXh0VHlwZSNVTklUVU5ERVJURVNUfSBvcgorCSAqICAgICAgICAge0BsaW5rIENvbnRleHRUeXBlI1RFU1RTRVFVRU5DRX0uCisJICovCisJcHVibGljIExpc3Q8Q29udGV4dFNlbnNvcj4gZ2V0Q29udGV4dFNlbnNvcnMoKSB7CisJCWlmICghZ2V0Q29udGV4dFR5cGUoKS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJcmV0dXJuIGdldENvbnRleHRDb21wb25lbnRzKCkuc3RyZWFtKCkubWFwKENvbnRleHRDb21wb25lbnQ6OmdldENvbnRleHRTZW5zb3JzKS5jb2xsZWN0KEFycmF5TGlzdDo6bmV3LAorCQkJCUxpc3Q6OmFkZEFsbCwgTGlzdDo6YWRkQWxsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgY29udGV4dCByb290LgorCSAqCisJICogQHJldHVybiBUaGUgdmVyc2lvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1ZFUlNJT04pLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB2ZXJzaW9uIGZvciB0aGlzIGNvbnRleHQgcm9vdC4KKwkgKgorCSAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBuZXcgdmVyc2lvbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisJCWdldFZhbHVlKEFUVFJfVkVSU0lPTikuc2V0KHZlcnNpb24pOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoIkNvbnRleHRUeXBlID0gIikuYXBwZW5kKGdldENvbnRleHRUeXBlKCkpLmFwcGVuZCgiLCAiKTsKKwkJc2IuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisKKwkJTGlzdDxDb250ZXh0Q29tcG9uZW50PiBjb250ZXh0Q29tcG9uZW50cyA9IGdldENvbnRleHRDb21wb25lbnRzKCk7CisJCWlmICghY29udGV4dENvbXBvbmVudHMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgQ29udGV4dENvbXBvbmVudHMgPSAiKS5hcHBlbmQoY29udGV4dENvbXBvbmVudHMpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGFjY2VzcyB0aGUge0BsaW5rIENvbnRleHRSb290fXMgb2YgbmV3bHkgY3JlYXRlZAorCSAqIHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHREZXNjcmliYWJsZSBFaXRoZXIgYSB7QGxpbmsgVGVzdFN0ZXB9IG9yIGEge0BsaW5rIE1lYXN1cmVtZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29udGV4dFJvb3R9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBMaXN0PENvbnRleHRSb290PiBvZihDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlKSB7CisJCUxpc3Q8Q29udGV4dFJvb3Q+IGNvbnRleHRSb290cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlvZihjb250ZXh0RGVzY3JpYmFibGUsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpLmlmUHJlc2VudChjb250ZXh0Um9vdHM6OmFkZCk7CisJCW9mKGNvbnRleHREZXNjcmliYWJsZSwgQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKS5pZlByZXNlbnQoY29udGV4dFJvb3RzOjphZGQpOworCQlvZihjb250ZXh0RGVzY3JpYmFibGUsIENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpLmlmUHJlc2VudChjb250ZXh0Um9vdHM6OmFkZCk7CisJCXJldHVybiBjb250ZXh0Um9vdHM7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBDb250ZXh0Um9vdH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9IGZyb20gZ2l2ZW4KKwkgKiB7QGxpbmsgQ29udGV4dERlc2NyaWJhYmxlfS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0RGVzY3JpYmFibGUgRWl0aGVyIGEge0BsaW5rIFRlc3RTdGVwfSBvciBhIHtAbGluayBNZWFzdXJlbWVudH0uCisJICogQHBhcmFtIGNvbnRleHRUeXBlICAgICAgICBUaGUgcmVxdWVzdGVkIHtAY29kZSBDb250ZXh0VHlwZX0uCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENvbnRleHRSb290fSB3aXRoIGdpdmVuCisJICogICAgICAgICB7QGNvZGUgQ29udGV4dFR5cGV9IGRvZXMgbm90IGV4aXN0LgorCSAqLworCXByaXZhdGUgc3RhdGljIE9wdGlvbmFsPENvbnRleHRSb290PiBvZihDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKGNvbnRleHREZXNjcmliYWJsZSkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRTZW5zb3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3OWMxMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbnRleHQgc2Vuc29yIGVudGl0eSB0eXBlcy4gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MKKyAqIGFyZSBvbmx5IHByb3ZpZGVkIC8gbWFuYWdlZCB2aWEgdGhlIG93bmluZyB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0uIEEKKyAqIGNvbnRleHQgc2Vuc29yIG1heSBiZSByZWxhdGVkIHRvIGEge0BsaW5rIENoYW5uZWx9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFNlbnNvciBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDb250ZXh0U2Vuc29yKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gdGhpcyBjb250ZXh0IHNlbnNvciBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUgcGFyZW50IHtAbGluayBDb250ZXh0Q29tcG9uZW50fQorCSAqLworCXB1YmxpYyBDb250ZXh0Q29tcG9uZW50IGdldENvbnRleHRDb21wb25lbnQoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoQ29udGV4dENvbXBvbmVudC5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvQ29udGV4dFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGEzNTQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRUeXBlLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBDb250ZXh0IHR5cGUgZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENvbnRleHRSb290CisgKi8KK3B1YmxpYyBlbnVtIENvbnRleHRUeXBlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBIHtAbGluayBDb250ZXh0Um9vdH0gb2YgdGhpcyB0eXBlIHVuaXRlcyBtZXRhIGRhdGEgb2YgdGhlIHVuaXQgdW5kZXIgdGVzdC4KKwkgKi8KKwlVTklUVU5ERVJURVNULAorCisJLyoqCisJICogQSB7QGxpbmsgQ29udGV4dFJvb3R9IG9mIHRoaXMgdHlwZSB1bml0ZXMgbWV0YSBkYXRhIG9mIHRoZSB0ZXN0IGNvbmRpdGlvbnMuCisJICovCisJVEVTVFNFUVVFTkNFLAorCisJLyoqCisJICogQSB7QGxpbmsgQ29udGV4dFJvb3R9IG9mIHRoaXMgdHlwZSB1bml0ZXMgbWV0YSBkYXRhIG9mIHRoZSB1c2VkIGVxdWlwbWVudAorCSAqIChoYXJkd2FyZSBhbmQgc2Vuc29ycykuCisJICovCisJVEVTVEVRVUlQTUVOVDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbnRleHQgdHlwZSBpcyB7QGxpbmsgI1VOSVRVTkRFUlRFU1R9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVW5pdFVuZGVyVGVzdCgpIHsKKwkJcmV0dXJuIFVOSVRVTkRFUlRFU1QgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb250ZXh0IHR5cGUgaXMge0BsaW5rICNURVNUU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVGVzdFNlcXVlbmNlKCkgeworCQlyZXR1cm4gVEVTVFNFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29udGV4dCB0eXBlIGlzIHtAbGluayAjVEVTVEVRVUlQTUVOVH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUZXN0RXF1aXBtZW50KCkgeworCQlyZXR1cm4gVEVTVEVRVUlQTUVOVCA9PSB0aGlzOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0RhdGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EYXRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZGM3NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EYXRhYmxlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMgdGhlIHtAbGluayBFbnRpdHl9IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgZ2V0dGVyIGFuZAorICogc2V0dGVyIG1ldGhvZHMgZm9yIHRoZSAnRGF0ZUNyZWF0ZWQnIGZpZWxkIG9mIGFuIGVudGl0eS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBEYXRhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ0RhdGVDcmVhdGVkJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9EQVRFX0NSRUFURUQgPSAiRGF0ZUNyZWF0ZWQiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY3JlYXRpb24gdGltZSBzdGFtcCBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGNyZWF0aW9uIHRpbWUgc3RhbXAgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBMb2NhbERhdGVUaW1lIGdldERhdGVDcmVhdGVkKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9EQVRFX0NSRUFURUQpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXQgbmV3IGNyZWF0aW9uIHRpbWUgc3RhbXAgZm9yIHRoaXMgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGRhdGVDcmVhdGVkIFRoZSBuZXcgY3JlYXRpb24gdGltZSBzdGFtcC4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0RGF0ZUNyZWF0ZWQoTG9jYWxEYXRlVGltZSBkYXRlQ3JlYXRlZCkgeworCQlnZXRWYWx1ZShBVFRSX0RBVEVfQ1JFQVRFRCkuc2V0KGRhdGVDcmVhdGVkKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EZWxldGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9EZWxldGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTZkOTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0RlbGV0YWJsZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGltcGxlbWVudGluZyBlbnRpdHkgdHlwZXMgYXJlIGFsbG93ZWQKKyAqIHRvIGJlIGRlbGV0ZWQuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVsZXRhYmxlIGV4dGVuZHMgRW50aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Rlc2NyaWJhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRGVzY3JpYmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWEzMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Rlc2NyaWJhYmxlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBleHRlbmRzIHRoZSB7QGxpbmsgRW50aXR5fSBpbnRlcmZhY2UgYW5kIHByb3ZpZGVzIGdldHRlciBhbmQKKyAqIHNldHRlciBtZXRob2RzIGZvciB0aGUgJ0Rlc2NyaXB0aW9uJyBmaWVsZCBvZiBhbiBlbnRpdHkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVzY3JpYmFibGUgZXh0ZW5kcyBFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnRGVzY3JpcHRpb24nIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCVN0cmluZyBBVFRSX0RFU0NSSVBUSU9OID0gIkRlc2NyaXB0aW9uIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFU0NSSVBUSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVzY3JpcHRpb24gZm9yIHRoaXMgZW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBuZXcgZGVzY3JpcHRpb24uCisJICovCisJZGVmYXVsdCB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQlnZXRWYWx1ZShBVFRSX0RFU0NSSVBUSU9OKS5zZXQoZGVzY3JpcHRpb24pOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0RvdWJsZUNvbXBsZXguamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Eb3VibGVDb21wbGV4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3MGVlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Eb3VibGVDb21wbGV4LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29tcGxleCB2YWx1ZSB3aXRoIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiB0eXBlCisgKiB7QGNvZGUgZG91YmxlfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERvdWJsZUNvbXBsZXggeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgZG91YmxlIHJlOworCXByaXZhdGUgZmluYWwgZG91YmxlIGltOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHJlYWwgICAgICBUaGUgcmVhbCBwYXJ0LgorCSAqIEBwYXJhbSBpbWFnaW5hcnkgVGhlIGltYWdpbmFyeSBwYXJ0LgorCSAqLworCXB1YmxpYyBEb3VibGVDb21wbGV4KGRvdWJsZSByZWFsLCBkb3VibGUgaW1hZ2luYXJ5KSB7CisJCXJlID0gcmVhbDsKKwkJaW0gPSBpbWFnaW5hcnk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUGFyc2VzIGdpdmVuIHtAY29kZSBTdHJpbmd9IHdoZXJlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc2VwYXJhdGVkIGJ5CisJICogb25lIG9yIG1vcmUgYmxhbmtzLiBGdXJ0aGVybW9yZSBib3RoIG11c3QgYmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0aGF0IGNhbgorCSAqIGJlIHBhcnNlZCBieSBjYWxsaW5nIHtAbGluayBEb3VibGUjdmFsdWVPZihTdHJpbmcpfS4KKwkgKgorCSAqIEBwYXJhbSBzIFRoZSB7QGNvZGUgU3RyaW5nfSB0byBiZSBwYXJzZWQuCisJICogQHJldHVybiBUaGUgcGFyc2VkIHtAbGluayBEb3VibGVDb21wbGV4fSB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBjb21wbGV4IHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRG91YmxlQ29tcGxleCB2YWx1ZU9mKFN0cmluZyBzKSB7CisJCVN0cmluZ1tdIHZhbHVlcyA9IHMuc3BsaXQoIiArIik7CisJCWlmICh2YWx1ZXMubGVuZ3RoICE9IDIpIHsKKwkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBjb21wbGV4IHZhbHVlLiIpOworCQl9CisKKwkJcmV0dXJuIG5ldyBEb3VibGVDb21wbGV4KERvdWJsZS5wYXJzZURvdWJsZSh2YWx1ZXNbMF0pLCBEb3VibGUucGFyc2VEb3VibGUodmFsdWVzWzFdKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJlYWwgcGFydCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZG91YmxlIHJlYWwoKSB7CisJCXJldHVybiByZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbWFnaW5hcnkgcGFydCBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbWFnaW5hcnkgcGFydCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZG91YmxlIGltYWdpbmFyeSgpIHsKKwkJcmV0dXJuIGltOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBodW1hbiByZWFkYWJsZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICogVGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc2VwYXJhdGVkIHdpdGggYSBibGFuay4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQocmVhbCgpKS5hcHBlbmQoJyAnKS5hcHBlbmQoaW1hZ2luYXJ5KCkpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW50aXR5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0OGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnRpdHkuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogVGhpcyBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFueSBtb2RlbGVkIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhpcyB7QGNvZGUgQ29tcGFyYXRvcn0gY29tcGFyZXMgZW50aXRpZXMgYnkgdGhlaXIgbmFtZSBpbiBhc2NlbmRpbmcgb3JkZXIuCisJICovCisJQ29tcGFyYXRvcjxFbnRpdHk+IENPTVBBUkFUT1IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhFbnRpdHk6OmdldE5hbWUpOworCisJLyoqCisJICogVGhlICdNaW1lVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfTUlNRVRZUEUgPSAiTWltZVR5cGUiOworCisJLyoqCisJICogVGhlICdOYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9OQU1FID0gIk5hbWUiOworCisJLyoqCisJICogVGhlICdJZCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfSUQgPSAiSWQiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgdGhpcyBlbnRpdHkgd2FzIHJldHJpZXZlZCBmcm9tLgorCSAqCisJICogQHJldHVybiBOYW1lIG9mIHRoZSBkYXRhIHNvdXJjZS4KKwkgKi8KKwlTdHJpbmcgZ2V0U291cmNlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZW50aXR5IHR5cGUuCisJICoKKwkgKiBAcmV0dXJuIE5hbWUgb2YgdGhlIGVudGl0eSB0eXBlIGlzIHJldHVybmVkLgorCSAqLworCVN0cmluZyBnZXRUeXBlTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5zdGFuY2UgSUQgb3Ige0Bjb2RlIDB9IGlmIHRoaXMgaW5zdGFuY2UgaXMgbm90IHlldCBwZXJzaXN0ZWQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBJRCBpcyByZXR1cm5lZC4KKwkgKi8KKwlTdHJpbmcgZ2V0SUQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX05BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBuYW1lIGZvciB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZS4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX05BTUUpLnNldChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgTWltZVR5cGV9IG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE1pbWVUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IE1pbWVUeXBlIGdldE1pbWVUeXBlKCkgeworCQlyZXR1cm4gbmV3IE1pbWVUeXBlKGdldFZhbHVlKEFUVFJfTUlNRVRZUEUpLmV4dHJhY3QoKSk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcge0BsaW5rIE1pbWVUeXBlfSBmb3IgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG5ldyB7QGNvZGUgTWltZVR5cGV9LgorCSAqLworCWRlZmF1bHQgdm9pZCBzZXRNaW1lVHlwZShNaW1lVHlwZSBtaW1lVHlwZSkgeworCQlnZXRWYWx1ZShBVFRSX01JTUVUWVBFKS5zZXQobWltZVR5cGUudG9TdHJpbmcoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlfSBjb250YWluZXIgYXNzb2NpYXRlZCB3aXRoIGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHJldHVybiBUaGUge0Bjb2RlIFZhbHVlfSBjb250YWluZXIgaXMgcmV0dXJuZWQuCisJICovCisJVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpOworCisJLyoqCisJICogUmV0dXJucyA8aT5hbGw8L2k+IHtAbGluayBWYWx1ZX0gY29udGFpbmVycyBvZiB0aGlzIGVudGl0eSBtYXBwZWQgYnkgdGhlaXIKKwkgKiBuYW1lIChubyBtYXR0ZXIgYSB2YWx1ZSBpcyB2YWxpZCBvciBub3QpLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgTWFwfSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJTWFwPFN0cmluZywgVmFsdWU+IGdldFZhbHVlcygpOworCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBlbnRpdHkuCisJICovCisJQE92ZXJyaWRlCisJU3RyaW5nIHRvU3RyaW5nKCk7CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiBuYW1lIGVxdWFscyB0aGUgbmFtZSBvZiB0aGlzIGVudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBjaGVja2VkIG5hbWUuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBnaXZlbiBuYW1lIGVxdWFscyB0aGUgbmFtZSBvZiB0aGlzIGVudGl0eS4KKwkgKi8KKwlkZWZhdWx0IGJvb2xlYW4gbmFtZUVxdWFscyhTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhuYW1lKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnVtUmVnaXN0cnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnVtUmVnaXN0cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVkNTZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0VudW1SZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgc2luZ2xldG9uIGNsYXNzIHJlZ2lzdGVycyBnbG9iYWxseSBhdmFpbGFibGUgZW51bWVyYXRpb25zLgorICoKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudW1SZWdpc3RyeSB7CisKKwkvLyBzaW5nbGV0b24gaW5zdGFuY2UKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnVtUmVnaXN0cnkgaW5zdGFuY2UgPSBuZXcgRW51bVJlZ2lzdHJ5KCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FMQVJfVFlQRSA9ICJTY2FsYXJUeXBlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUlBPTEFUSU9OID0gIkludGVycG9sYXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OID0gIlNlcXVlbmNlUmVwcmVzZW50YXRpb24iOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1BFQ0lGSUNBVElPTiA9ICJUeXBlU3BlY2lmaWNhdGlvbiI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfVFlQRSA9ICJWYWx1ZVR5cGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fU1RBVEUgPSAiVmVyc2lvblN0YXRlIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX1RZUEUgPSAiQXhpc1R5cGUiOworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4+IGVudW1lcmF0aW9uczsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLiBOb3QgY2FsbGVkIGRpcmVjdGx5LiBVc2UgZ2V0SW5zdGFuY2UoKSBpbnN0ZWFkLgorCSAqLworCXByaXZhdGUgRW51bVJlZ2lzdHJ5KCkgeworCQllbnVtZXJhdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWFkZChJTlRFUlBPTEFUSU9OLCBuZXcgRW51bWVyYXRpb248SW50ZXJwb2xhdGlvbj4oSW50ZXJwb2xhdGlvbi5jbGFzcywgSU5URVJQT0xBVElPTikpOworCQlhZGQoU0NBTEFSX1RZUEUsIG5ldyBFbnVtZXJhdGlvbjxTY2FsYXJUeXBlPihTY2FsYXJUeXBlLmNsYXNzLCBTQ0FMQVJfVFlQRSkpOworCQlhZGQoU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT04sCisJCQkJbmV3IEVudW1lcmF0aW9uPFNlcXVlbmNlUmVwcmVzZW50YXRpb24+KFNlcXVlbmNlUmVwcmVzZW50YXRpb24uY2xhc3MsIFNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OKSk7CisJCWFkZChUWVBFX1NQRUNJRklDQVRJT04sIG5ldyBFbnVtZXJhdGlvbjxUeXBlU3BlY2lmaWNhdGlvbj4oVHlwZVNwZWNpZmljYXRpb24uY2xhc3MsIFRZUEVfU1BFQ0lGSUNBVElPTikpOworCQlhZGQoVkFMVUVfVFlQRSwgbmV3IEVudW1lcmF0aW9uPFZhbHVlVHlwZT4oVmFsdWVUeXBlLmNsYXNzLCBWQUxVRV9UWVBFKSk7CisJCWFkZChWRVJTSU9OX1NUQVRFLCBuZXcgRW51bWVyYXRpb248VmVyc2lvblN0YXRlPihWZXJzaW9uU3RhdGUuY2xhc3MsIFZFUlNJT05fU1RBVEUpKTsKKwkJYWRkKEFYSVNfVFlQRSwgbmV3IEVudW1lcmF0aW9uPEF4aXNUeXBlPihBeGlzVHlwZS5jbGFzcywgQVhJU19UWVBFKSk7CisJfQorCisJLyoqCisJICogYWRkcyBhIG5ldyBlbnVtZXJhdGlvbiB0byB0aGUgcmVnaXN0cnkKKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgdGhlIG5hbWUgdW5kZXIgd2hpY2ggdGhlIGVudW1lcmF0aW9uIGNhbiBiZSBhY2Nlc3NlZAorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbiB0aGUgZHluYW1pYyBlbnVtZXJhdGlvbiBvYmplY3QKKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIG5hbWUsIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBlbnVtZXJhdGlvbikgeworCQllbnVtZXJhdGlvbnMucHV0KG5hbWUsIGVudW1lcmF0aW9uKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXJlZCBlbnVtZXJhdGlvbgorCSAqIEByZXR1cm4gdGhlIGR5bmFtaWMgZW51bWVyYXRpb24gb2JqZWN0CisJICovCisJcHVibGljIEVudW1lcmF0aW9uPD8+IGdldChTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZW51bWVyYXRpb25zLmdldChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGlzIHNpbmdsZXRvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgRW51bVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgeworCQlyZXR1cm4gaW5zdGFuY2U7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0VudW1lcmF0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW51bWVyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWJkNGFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0VudW1lcmF0aW9uLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgY2xhc3Mgd2hpY2ggZHluYW1pY2FsbHkgYnVuZGxlcyBlbnVtZXJhdGlvbiB2YWx1ZXMKKyAqCisgKiBAcGFyYW0gPEU+CisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbjxFIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4geworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBFPiB2YWx1ZXM7CisKKwlwcml2YXRlIE1hcDxFLCBTdHJpbmc+IHJldnZhbHVlczsKKworCXByaXZhdGUgTWFwPEludGVnZXIsIFN0cmluZz4gb3JkaW5hbHM7CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIEludGVnZXI+IHJldm9yZGluYWxzOworCisJcHJpdmF0ZSBpbnQgbWF4b3JkaW5hbDsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisKKwlwcml2YXRlIENsYXNzPEU+IGVudW1jbGFzczsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLiBTdGF0aWMgZmllbGRzIGluIHRoZSBnaXZlbiBlbnVtY2xhc3Mgb2YgdGhlIHNhbWUgdHlwZSBhcmUgYWRkZWQKKwkgKiBhdXRvbWF0aWNhbGx5IGFzIGVudW0gdmFsdWVzLiBUaGlzIHdheSB5b3UgY2FuIHNpbXBseSBwcmVmaWxsIHRoZSBvYmplY3Qgd2l0aAorCSAqIHN0YXRpYyB2YWx1ZXMuCisJICogCisJICogQHBhcmFtIGVudW1jbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIGVudW1lcmF0aW9uIHZhbHVlcworCSAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0aW9uIGJ1bmRsZQorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyBFbnVtZXJhdGlvbihDbGFzczxFPiBlbnVtY2xhc3MsIFN0cmluZyBuYW1lKSB7CisJCXRoaXMubWF4b3JkaW5hbCA9IDA7CisJCXRoaXMudmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworCQl0aGlzLnJldnZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy5vcmRpbmFscyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy5yZXZvcmRpbmFscyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5lbnVtY2xhc3MgPSBlbnVtY2xhc3M7CisJCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkW10gZmllbGRzID0gZW51bWNsYXNzLmdldEZpZWxkcygpOworCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisJCQlpZiAoamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSAvLyBvbmx5CisJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZXhhbWluZQorCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHN0YXRpYworCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZpZWxkcworCQkJeworCQkJCU9iamVjdCBmaWVsZE9iamVjdDsKKwkJCQl0cnkgeworCQkJCQlmaWVsZE9iamVjdCA9IGZpZWxkLmdldChudWxsKTsKKwkJCQkJaWYgKCEoZW51bWNsYXNzLmlzSW5zdGFuY2UoZmllbGRPYmplY3QpKSkgeworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKwkJCQl9CisJCQkJU3RyaW5nIGZuYW1lID0gKChFbnVtZXJhdGlvblZhbHVlKSBmaWVsZE9iamVjdCkubmFtZSgpOworCQkJCWlmIChmbmFtZSA9PSBudWxsKSB7CisJCQkJCWZuYW1lID0gZmllbGQuZ2V0TmFtZSgpOworCQkJCQkoKEVudW1lcmF0aW9uVmFsdWUpIGZpZWxkT2JqZWN0KS5zZXROYW1lKGZuYW1lKTsKKwkJCQl9CisJCQkJYWRkVmFsdWUoKEUpIGZpZWxkT2JqZWN0KTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIGFkZHMgYSB2YWx1ZSB0byB0aGUgZHluYW1pYyBlbnVtZXJhdGlvbgorCSAqIAorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFZhbHVlKEUgZW51bWVyYXRpb24pIHsKKwkJZW51bWVyYXRpb24uc2V0T3duZXIodGhpcyk7CisJCVN0cmluZyBlbnVtZXJhdGlvbk5hbWUgPSBlbnVtZXJhdGlvbi5uYW1lKCk7CisJCUludGVnZXIgb3JkaW5hbCA9IGVudW1lcmF0aW9uLm9yZGluYWwoKTsKKwkJaWYgKG9yZGluYWwgPT0gbnVsbCkgeworCQkJb3JkaW5hbCA9ICsrbWF4b3JkaW5hbDsKKwkJCWVudW1lcmF0aW9uLnNldE9yZGluYWwob3JkaW5hbCk7CisJCX0gZWxzZSB7CisJCQltYXhvcmRpbmFsID0gTWF0aC5tYXgob3JkaW5hbCwgbWF4b3JkaW5hbCk7CisJCX0KKwkJdmFsdWVzLnB1dChlbnVtZXJhdGlvbk5hbWUsIGVudW1lcmF0aW9uKTsKKwkJcmV2dmFsdWVzLnB1dChlbnVtZXJhdGlvbiwgZW51bWVyYXRpb25OYW1lKTsKKwkJb3JkaW5hbHMucHV0KG9yZGluYWwsIGVudW1lcmF0aW9uTmFtZSk7CisJCXJldm9yZGluYWxzLnB1dChlbnVtZXJhdGlvbk5hbWUsIG9yZGluYWwpOworCX0KKworCS8qKgorCSAqIHJldHVybnMgdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBuYW1lCisJICogCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEUgdmFsdWVPZihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gdmFsdWVzLmdldChuYW1lKTsKKwl9CisKKwkvKioKKwkgKiByZXR1cm5zIHRoZSB2YWx1ZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gbnVtYmVyCisJICogCisJICogQHBhcmFtIG9yZGluYWwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEUgdmFsdWVPZihpbnQgb3JkaW5hbCkgeworCQlyZXR1cm4gdmFsdWVzLmdldChvcmRpbmFscy5nZXQob3JkaW5hbCkpOworCX0KKworCS8qKgorCSAqIHJldHVybnMgdGhlIG9yZGluYWwgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGVudW1lcmF0aW9uIHZhbHVlCisJICogCisJICogQHBhcmFtIGVudW12YWwKKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIGludCBvcmRpbmFsKEVudW1lcmF0aW9uVmFsdWUgZW51bXZhbCkgeworCQlyZXR1cm4gcmV2b3JkaW5hbHMuZ2V0KHJldnZhbHVlcy5nZXQoZW51bXZhbCkpOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBkeW5hbWljCisJICogICAgICAgICBlbnVtZXJhdGlvbgorCSAqLworCXB1YmxpYyBDbGFzczxFPiBnZXRFbnVtQ2xhc3MoKSB7CisJCXJldHVybiBlbnVtY2xhc3M7CisJfQorCisJLyoqCisJICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZHluYW1pYyBlbnVtZXJhdGlvbiBjb2xsZWN0aW9uCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnVtZXJhdGlvblZhbHVlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW51bWVyYXRpb25WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWQ3YzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW51bWVyYXRpb25WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogVGhpcyBjbGFzcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGEgamF2YSBlbnVtLiBUaGUgcmVhc29uIGZvciBpdHMKKyAqIGV4aXN0ZW5jZSBpcyB0aGF0IGNsYXNzaWMgZW51bXMgY2FuJ3QgYmUgZXh0ZW5kZWQgYnkgbmV3IHZhbHVlcy4gVGhpcyBjbGFzcworICogb24gdGhlIG90aGVyIGhhbmQgY2FuIGJlIGV4dGVuZGVkIGJ5IGphdmEncyBpbmhlcml0YW5jZSBtZWNoYW5pc20uCisgKiAKKyAqIEZvciBhIGJhc2ljIGVtdWxhdGlvbiBvZiBqYXZhIGVudW1zLCBqdXN0IGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBhZGQgc3RhdGljCisgKiBmaWVsZHMgd2hvc2UgdHlwZSBpcyBvZiB0aGUgZGVyaXZhdGl2ZSBjbGFzcy4KKyAqIAorICogVG8gYmUgYWJsZSB0byBhZGQgZHluYW1pY2FsbHkgZW51bSB2YWx1ZXMgYW5kIGZvciBmdWxsIGluaXRpYWxpemF0aW9uLCB5b3UKKyAqIHNob3VsZCBzZXQgYW4gb3duZXIgZW51bWVyYXRpb24gKGVpdGhlciBieSBjaG9vc2luZyB0aGUgcmlnaHQgY29uc3RydWN0b3Igb3IKKyAqIGJ5IGNhbGxpbmcgdGhlIHNldE93bmVyIG1ldGhvZCkKKyAqIAorICogQGF1dGhvciBGbG9yaWFuIFNjaG1pdHQKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCXByaXZhdGUgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBJbnRlZ2VyIG9yZGluYWw7CisKKwlwcml2YXRlIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBvd25lcjsKKworCS8qKgorCSAqIGV4cGxpY2l0bHkgc2V0IHRoZSBuYW1lIG9mIHRoaXMgZWxlbWVudC4KKwkgKgorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQl0aGlzLm5hbWUgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG5hbWUpOworCX0KKworCS8qKgorCSAqIGV4cGxpY2l0bHkgc2V0IHRoZSBvcmRpbmFsIG9mIHRoaXMgZWxlbWVudC4KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXRPcmRpbmFsKGludCBvcmRpbmFsKSB7CisJCXRoaXMub3JkaW5hbCA9IG9yZGluYWw7CisJfQorCisJLyoqCisJICogCisJICogc2V0IHRoZSBvd25lciBkeW5hbWljIGVudW1lcmF0aW9uIG9mIHRoaXMgb2JqZWN0LgorCSAqIAorCSAqIEBwYXJhbSBlcgorCSAqLworCXByb3RlY3RlZCB2b2lkIHNldE93bmVyKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBlcikgeworCQlvd25lciA9IGVyOworCX0KKworCS8qKgorCSAqIGdldCB0aGUgb3duZXIgZHluYW1pYyBlbnVtZXJhdGlvbiBvZiB0aGlzIG9iamVjdAorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgRW51bWVyYXRpb248PyBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IGdldE93bmVyKCkgeworCQlyZXR1cm4gb3duZXI7CisJfQorCisJLyoqCisJICogVGhpcyBDb25zdHJ1Y3RvciBpcyBwcm90ZWN0ZWQgdG8gYXZvaWQgYWNjaWRlbnRhbCBtaXN1c2UuCisJICogCisJICogYmUgc3VyZSB0byBpbml0aWFsaXplIHRoZSBlbnVtZXJhdGlvbiBmdWxseSwgYnkgZWl0aGVyIGFkZGluZyBpdCBhcyBhIHN0YXRpYworCSAqIGZpZWxkIGluIGFuIGV4dGVuZGluZyBjbGFzcywgb3Igc2V0dGluZyB0aGUgb3JkaW5hbCBieSBoYW5kLiBZb3UnbGwgYWxzbyBoYXZlCisJICogdG8gYWRkIHRoZSByZXN1bHRpbmcgb2JqZWN0IHRvIGEgRHluYW1pY0VudW1lcmF0aW9uIGZvciBpdCB0byBiZSBjb21wbGV0ZWx5CisJICogdXNhYmxlLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHJvdGVjdGVkIEVudW1lcmF0aW9uVmFsdWUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcyhuYW1lLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIENvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCB0byBhdm9pZCBhY2NpZGVudGFsIG1pc3VzZS4KKwkgKiAKKwkgKiBZb3UnbGwgaGF2ZSB0byBhZGQgdGhlIHJlc3VsdGluZyBvYmplY3QgdG8gYSBFbnVtZXJhdGlvbiBmb3IgaXQgdG8gYmUKKwkgKiBjb21wbGV0ZWx5IHVzYWJsZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZQorCSAqLworCXByb3RlY3RlZCBFbnVtZXJhdGlvblZhbHVlKFN0cmluZyBuYW1lLCBJbnRlZ2VyIG9yZGluYWwpIHsKKwkJdGhpcy5uYW1lID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChuYW1lLCAiTmFtZSBvZiBhbiBFbnVtZXJhdGlvblZhbHVlIGNhbiBuZXZlciBiZSBudWxsISIpOworCQl0aGlzLm9yZGluYWwgPSBvcmRpbmFsOworCQl0aGlzLm93bmVyID0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgZW51bWVyYXRpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbiBuYW1lCisJICovCisJcHVibGljIEVudW1lcmF0aW9uVmFsdWUgdmFsdWVPZihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gb3duZXIudmFsdWVPZihuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRoZSBvcmRpbmFsIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZW51bWVyYXRpb24gdmFsdWUKKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBvcmRpbmFsKCkgeworCQlyZXR1cm4gb3JkaW5hbDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBuYW1lKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW52aXJvbm1lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9FbnZpcm9ubWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTkwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRW52aXJvbm1lbnQuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGVudmlyb25tZW50IGVudGl0eSB0eXBlLiBUaGUge0BsaW5rIEVudmlyb25tZW50fSBpcyBhCisgKiBzaW5nbGV0b24gd2l0aGluIGEgY29ubmVjdGVkIGRhdGEgc291cmNlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgRW52aXJvbm1lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVzY3JpYmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnTWF4VGVzdExldmVsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01BWF9URVNUX0xFVkVMID0gIk1heF90ZXN0X2xldmVsIjsKKworCS8qKgorCSAqIFRoZSAnQmFzZU1vZGVsVmVyc2lvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9CQVNFX01PREVMX1ZFUlNJT04gPSAiQmFzZV9tb2RlbF92ZXJzaW9uIjsKKworCS8qKgorCSAqIFRoZSAnQXBwTW9kZWxWZXJzaW9uJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FQUF9NT0RFTF9WRVJTSU9OID0gIkFwcE1vZGVsVmVyc2lvbiI7CisKKwkvKioKKwkgKiBUaGUgJ0FwcE1vZGVsVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9BUFBfTU9ERUxfVFlQRSA9ICJBcHBNb2RlbFR5cGUiOworCisJLyoqCisJICogVGhlICdUaW1lem9uZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9USU1FWk9ORSA9ICJUaW1lem9uZSI7CisKKwkvKioKKwkgKiBUaGUgJ01lYW5pbmdPZkFsaWFzZXMnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVBTklOR19PRl9BTElBU0VTID0gIk1lYW5pbmdPZkFsaWFzZXMiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlFbnZpcm9ubWVudChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWF4IHRlc3QgbGV2ZWwgb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1heCB0ZXN0IGxldmVsIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldE1heFRlc3RMZXZlbCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUFYX1RFU1RfTEVWRUwpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBiYXNlIG1vZGVsIHZlcnNpb24gb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGJhc2UgbW9kZWwgdmVyc2lvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEJhc2VNb2RlbFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0JBU0VfTU9ERUxfVkVSU0lPTikuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIHZlcnNpb24gb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFwcGxpY2F0aW9uIG1vZGVsIHZlcnNpb24gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRBcHBNb2RlbFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FQUF9NT0RFTF9WRVJTSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gbW9kZWwgdHlwZSBvZiB0aGlzIGVudmlyb25tZW50LgorCSAqCisJICogQHJldHVybiBUaGUgYXBwbGljYXRpb24gbW9kZWwgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFwcE1vZGVsVHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQVBQX01PREVMX1RZUEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0aW1lIHpvbmUgb2YgdGhpcyBlbnZpcm9ubWVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHRpbWUgem9uZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFRpbWV6b25lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9USU1FWk9ORSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIE1lYW5pbmcgb2YgYWxpYXNlcyBvZiB0aGlzIGVudmlyb25tZW50LgorCSAqCisJICogQHJldHVybiBUaGUgbWVhbmluZyBvZiBhbGlhc2VzIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nW10gZ2V0TWVhbmluZ09mQWxpYXNlcygpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUVBTklOR19PRl9BTElBU0VTKS5leHRyYWN0KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmlsZUxpbmsuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GaWxlTGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NThiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmlsZUxpbmsuamF2YQpAQCAtMCwwICsxLDUwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIG1hbmFnZSBsaW5rcyB0byBleHRlcm5hbGx5IHN0b3JlZCBmaWxlcyAobG9jYWwvcmVtb3RlKS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbGVMaW5rIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFN0YXRlIHN0YXRlOworCisJcHJpdmF0ZSBTdHJpbmcgcmVtb3RlUGF0aDsKKwlwcml2YXRlIE1pbWVUeXBlIG1pbWVUeXBlOworCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisJcHJpdmF0ZSBJbnB1dFN0cmVhbSBsb2NhbFN0cmVhbTsKKwlwcml2YXRlIFN0cmluZyBsb2NhbEZpbGVOYW1lOworCisJcHJpdmF0ZSBsb25nIHNpemUgPSAtMTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGluayBXaWxsIGJlIGNvcGllZC4KKwkgKi8KKwlGaWxlTGluayhGaWxlTGluayBmaWxlTGluaykgeworCQlyZW1vdGVQYXRoID0gZmlsZUxpbmsucmVtb3RlUGF0aDsKKwkJbWltZVR5cGUgPSBmaWxlTGluay5taW1lVHlwZTsKKwkJZGVzY3JpcHRpb24gPSBmaWxlTGluay5kZXNjcmlwdGlvbjsKKwkJbG9jYWxTdHJlYW0gPSBmaWxlTGluay5sb2NhbFN0cmVhbTsKKwkJc2l6ZSA9IGZpbGVMaW5rLnNpemU7CisJCXN0YXRlID0gZmlsZUxpbmsuc3RhdGU7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcmVtb3RlUGF0aCBUaGUgcmVtb3RlIHBhdGguCisJICogQHBhcmFtIG1pbWVUeXBlICAgVGhlIE1JTUUgdHlwZSBvZiB0aGUgbGlua2VkIGZpbGUuCisJICovCisJcHJpdmF0ZSBGaWxlTGluayhTdHJpbmcgcmVtb3RlUGF0aCwgTWltZVR5cGUgbWltZVR5cGUpIHsKKwkJdGhpcy5yZW1vdGVQYXRoID0gcmVtb3RlUGF0aDsKKwkJdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlOworCisJCXN0YXRlID0gU3RhdGUuUkVNT1RFOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGxvY2FsUGF0aCBUaGUgbG9jYWwge0BsaW5rIFBhdGh9LgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXByaXZhdGUgRmlsZUxpbmsoSW5wdXRTdHJlYW0gbG9jYWxTdHJlYW0sIFN0cmluZyBuYW1lLCBsb25nIHNpemUsIE1pbWVUeXBlIG1pbWVUeXBlLCBTdHJpbmcgZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRoaXMubG9jYWxTdHJlYW0gPSBsb2NhbFN0cmVhbTsKKwkJdGhpcy5taW1lVHlwZSA9IG1pbWVUeXBlID09IG51bGwgPyBuZXcgTWltZVR5cGUoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpIDogbWltZVR5cGU7CisJCXRoaXMuc2l6ZSA9IHNpemU7CisJCXRoaXMubG9jYWxGaWxlTmFtZSA9IG5hbWU7CisJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKwkJc3RhdGUgPSBTdGF0ZS5MT0NBTDsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBGaWxlTGlua30gaW5zdGFuY2Ugd2hpY2ggcmVtb3RlbHkgYXZhaWxhYmxlLgorCSAqCisJICogQHBhcmFtIHJlbW90ZVBhdGggIFRoZSByZW1vdGUgcGF0aC4KKwkgKiBAcGFyYW0gbWltZVR5cGUgICAgVGhlIE1JTUUgdHlwZS4KKwkgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGZpbGUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgRmlsZUxpbmt9IGluc3RhbmNlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsZUxpbmsgbmV3UmVtb3RlKFN0cmluZyByZW1vdGVQYXRoLCBNaW1lVHlwZSBtaW1lVHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisJCUZpbGVMaW5rIGZpbGVMaW5rID0gbmV3IEZpbGVMaW5rKHJlbW90ZVBhdGgsIG1pbWVUeXBlKTsKKwkJZmlsZUxpbmsuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOworCQlyZXR1cm4gZmlsZUxpbms7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRmlsZUxpbmt9IGluc3RhbmNlIHdoaWNoIGxvY2FsbHkgYXZhaWxhYmxlLgorCSAqCisJICogQHBhcmFtIGxvY2FsUGF0aCBUaGUgbG9jYWwge0BsaW5rIFBhdGh9IHRvIHRoZSBmaWxlLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIEZpbGVMaW5rfSBpbnN0YW5jZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gYWNjZXNzIGZpbGUgd2l0aCBnaXZlbiB7QGNvZGUKKwkgKiAJCVBhdGh9ICAgICAgIC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIEZpbGVMaW5rIG5ld0xvY2FsKElucHV0U3RyZWFtIGxvY2FsU3RyZWFtLCBTdHJpbmcgbmFtZSwgbG9uZyBzaXplLCBNaW1lVHlwZSBtaW1lVHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gbmV3IEZpbGVMaW5rKGxvY2FsU3RyZWFtLCBuYW1lLCBzaXplLCBtaW1lVHlwZSwgZGVzY3JpcHRpb24pOworCX0KKwkKKwlwdWJsaWMgc3RhdGljIEZpbGVMaW5rIG5ld0xvY2FsKFBhdGggbG9jYWxQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoRmlsZXMuaXNEaXJlY3RvcnkobG9jYWxQYXRoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9jYWwgcGF0aCBpcyBhIGRpcmVjdG9yeS4iKTsKKwkJfSBlbHNlIGlmICghRmlsZXMuZXhpc3RzKGxvY2FsUGF0aCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxvY2FsIHBhdGggZG9lcyBub3QgZXhpc3QuIik7CisJCX0gZWxzZSBpZiAoIUZpbGVzLmlzUmVhZGFibGUobG9jYWxQYXRoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTG9jYWwgcGF0aCBpcyBub3QgcmVhZGFibGUuIik7CisJCX0KKwkJCisJCUlucHV0U3RyZWFtIGxvY2FsU3RyZWFtID0gRmlsZXMubmV3SW5wdXRTdHJlYW0obG9jYWxQYXRoKTsKKwkJbG9uZyBzaXplID0gRmlsZXMuc2l6ZShsb2NhbFBhdGgpOworCQlTdHJpbmcgbmFtZSA9IGxvY2FsUGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCk7CisJCVN0cmluZyBtaW1lVHlwZSA9IEZpbGVzLnByb2JlQ29udGVudFR5cGUobG9jYWxQYXRoKTsKKwkJTWltZVR5cGUgbWltZVQgPSBtaW1lVHlwZSA9PSBudWxsID8gbnVsbCA6IG5ldyBNaW1lVHlwZShtaW1lVHlwZSk7CisJCXJldHVybiBuZXcgRmlsZUxpbmsobG9jYWxTdHJlYW0sIG5hbWUsIHNpemUsIG1pbWVULCBuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gTmFtZSBvZiB0aGUgZmlsZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBmaWxlIG5hbWUuCisJICovCisJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKKwkJUGF0aCBmaWxlTmFtZVBhdGggPSBudWxsOworCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOworCQlpZiAoaXNMb2NhbCgpKSB7CisJCQlmaWxlTmFtZSA9IHRoaXMubG9jYWxGaWxlTmFtZTsKKwkJfSBlbHNlIGlmIChpc1JlbW90ZSgpKSB7CisJCQl0cnkgeworCQkJCS8vIG9uIFdpbmRvd3MsIFBhdGhzLmdldCgpIGNhbm5vdCBoYW5kbGUgZmlsZSB1cmxzIGluIHRoZSBmb3JtCisJCQkJLy8gZmlsZTovL1JFTU9URV9IT1NUL3BhdGgvZmlsZW5hbWUKKwkJCQlTdHJpbmcgZml4ZWRQYXRoID0gcmVtb3RlUGF0aC5yZXBsYWNlRmlyc3QoImZpbGU6IiwgIiIpOworCQkJCWZpbGVOYW1lUGF0aCA9IFBhdGhzLmdldChVUkxEZWNvZGVyLmRlY29kZShmaXhlZFBhdGgsIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgubmFtZSgpKSkuZ2V0RmlsZU5hbWUoKTsKKwkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBkZWNvZGUgcmVtb3RlIHBhdGggZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJfQorCQkJCisJCQlpZiAoZmlsZU5hbWVQYXRoID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJGaWxlIG5hbWUgaXMgdW5rbm93bi4iKTsKKwkJCX0KKwkJCWZpbGVOYW1lID0gZmlsZU5hbWVQYXRoLnRvU3RyaW5nKCk7CisJCX0KKworCQlyZXR1cm4gZmlsZU5hbWU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgTWltZVR5cGUgZ2V0TWltZVR5cGUoKSB7CisJCXJldHVybiBtaW1lVHlwZTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBhIGxvY2FsIHtAbGluayBQYXRofSBpcyBhdmFpbGFibGUgZm9yIHRoZSBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYSBsb2NhbCB7QGNvZGUgUGF0aH0gaXMgYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9jYWwoKSB7CisJCXJldHVybiBsb2NhbFN0cmVhbSAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxvY2FsIHtAbGluayBJbnB1dFN0cmVhbX0gdG8gdGhlIGxpbmtlZCBmaWxlLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzCisJICogb25seSBhbGxvd2VkIGlmIGNhbGxpbmcge0BsaW5rICNpc0xvY2FsKCl9IHJldHVybnMge0Bjb2RlCisJICogdHJ1ZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBsb2NhbCB7QGNvZGUgUGF0aH0gdG8gdGhlIGxpbmtlZCBmaWxlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRMb2NhbFN0cmVhbSgpIHsKKwkJaWYgKGlzTG9jYWwoKSkgeworCQkJcmV0dXJuIGxvY2FsU3RyZWFtOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTG9jYWwgcGF0aCBpcyBub3QgYXZhaWxhYmxlLiIpOworCX0KKworCS8qKgorCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBBUEkgcHJvdmlkZXJzIHRvIHNldCB0aGUgbG9jYWwge0BsaW5rIElucHV0U3RyZWFtfSBvbmNlIHRoZQorCSAqIHJlbW90ZSBmaWxlIHdhcyBkb3dubG9hZGVkLgorCSAqCisJICogQHBhcmFtIGxvY2FsUGF0aCBUaGUgbG9jYWwge0Bjb2RlIElucHV0U3RyZWFtfSBvZiB0aGUgZG93bmxvYWRlZCBmaWxlLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB0aGlzIGZpbGUgbGluayBpcyAnTE9DQUwnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2FsU3RyZWFtKElucHV0U3RyZWFtIGxvY2FsU3RyZWFtKSB7CisJCWlmIChTdGF0ZS5MT0NBTCA9PSBzdGF0ZSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXQgaXMgbm90IGFsbG93ZWQgdG8gcmVwbGFjZSBhbiBleGlzdGluZyBsb2NhbCBwYXRoLiIpOworCQl9CisKKwkJdGhpcy5sb2NhbFN0cmVhbSA9IGxvY2FsU3RyZWFtOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGEgcmVtb3RlIHBhdGggaXMgYXZhaWxhYmxlIGZvciBmb3IgbGlua2VkIGZpbGUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGEgcmVtb3RlIHBhdGggaXMgYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVtb3RlKCkgeworCQlyZXR1cm4gcmVtb3RlUGF0aCAhPSBudWxsICYmICFyZW1vdGVQYXRoLmlzRW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZW1vdGUgcGF0aCB0byB0aGUgbGlua2VkIGZpbGUuIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgb25seQorCSAqIGFsbG93ZWQgaWYgY2FsbGluZyB7QGxpbmsgI2lzUmVtb3RlKCl9IHJldHVybnMge0Bjb2RlIHRydWV9LgorCSAqCisJICogQHJldHVybiBUaGUgcmVtb3RlIHBhdGggdG8gdGhlIGxpbmtlZCBmaWxlIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3RlUGF0aCgpIHsKKwkJaWYgKGlzUmVtb3RlKCkpIHsKKwkJCXJldHVybiByZW1vdGVQYXRoOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVtb3RlIHBhdGggaXMgbm90IGF2YWlsYWJsZS4iKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQVBJIHByb3ZpZGVycyB0byBzZXQgdGhlIHJlbW90ZSBwYXRoIG9uY2UgdGhlIGxvY2FsCisJICogZmlsZSBoYXMgYmVlbiB1cGxvYWRlZC4KKwkgKgorCSAqIEBwYXJhbSByZW1vdGVQYXRoIFRoZSByZW1vdGUgcGF0aCBvZiB0aGUgdXBsb2FkZWQgZmlsZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdGhpcyBmaWxlIGxpbmsgaXMgJ1JFTU9URScuCisJICovCisJcHVibGljIHZvaWQgc2V0UmVtb3RlUGF0aChTdHJpbmcgcmVtb3RlUGF0aCkgeworCQlpZiAoU3RhdGUuUkVNT1RFID09IHN0YXRlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byByZXBsYWNlIGFuIGV4aXN0aW5nIHJlbW90ZSBwYXRoLiIpOworCQl9CisJCXRoaXMucmVtb3RlUGF0aCA9IHJlbW90ZVBhdGg7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmtlZCBmaWxlLgorCSAqCisJICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uID09IG51bGwgPyAiIiA6IGRlc2NyaXB0aW9uOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgZGVzY3JpcHRpb24gZm9yIHRoZSBsaW5rZWQgZmlsZS4KKwkgKgorCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgbmV3IGRlc2NyaXB0aW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgeworCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbGlua2VkIGZpbGUgb3Ige0Bjb2RlIC0xfSBpZiB1bmtub3duLgorCSAqCisJICogQHJldHVybiBUaGUgZmlsZSBzaXplIGluIGJ5dGVzIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBsb25nIGdldFNpemUoKSB7CisJCXJldHVybiBzaXplOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZvcm1hdHRlZCBmaWxlIHNpemUgb2YgdGhlIGxpbmtlZCBmaWxlLgorCSAqCisJICogQHBhcmFtIGZvcm1hdCBVc2VkIHRvIGZvcm1hdCB0aGUgc2l6ZS4KKwkgKiBAcmV0dXJuIFRoZSBmb3JtYXR0ZWQgZmlsZSBzaXplIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0U2l6ZShGb3JtYXQgZm9ybWF0KSB7CisJCXJldHVybiBmb3JtYXQuZ2V0U2l6ZShzaXplKTsKKwl9CisKKwkvKioKKwkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQVBJIHByb3ZpZGVycyB0byBzZXQgdGhlIGZpbGUgc2l6ZSBmb3IgdGhlIGxpbmtlZAorCSAqIGZpbGUuCisJICoKKwkgKiBAcGFyYW0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmlsZSBpbiBieXRlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRGaWxlU2l6ZShsb25nIHNpemUpIHsKKwkJdGhpcy5zaXplID0gc2l6ZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJaWYgKFN0YXRlLkxPQ0FMID09IHN0YXRlKSB7CisJCQlpZiAoIWlzTG9jYWwoKSkgeworCQkJCXJldHVybiAiIi5oYXNoQ29kZSgpOworCQkJfQorCQkJcmV0dXJuIGdldExvY2FsU3RyZWFtKCkuaGFzaENvZGUoKTsKKwkJfQorCQlpZiAoIWlzUmVtb3RlKCkpIHsKKwkJCXJldHVybiAiIi5oYXNoQ29kZSgpOworCQl9CisJCXJldHVybiBnZXRSZW1vdGVQYXRoKCkuaGFzaENvZGUoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIEZpbGVMaW5rKSB7CisJCQlGaWxlTGluayBvdGhlciA9IChGaWxlTGluaykgb2JqZWN0OworCQkJaWYgKHN0YXRlID09IG90aGVyLnN0YXRlKSB7CisJCQkJaWYgKFN0YXRlLkxPQ0FMID09IHN0YXRlKSB7CisJCQkJCWlmICghaXNMb2NhbCgpKSB7CisJCQkJCQlyZXR1cm4gIW90aGVyLmlzTG9jYWwoKTsKKwkJCQkJfQorCQkJCQlyZXR1cm4gZ2V0TG9jYWxTdHJlYW0oKS5lcXVhbHMob3RoZXIuZ2V0TG9jYWxTdHJlYW0oKSk7CisJCQkJfQorCQkJCWlmICghaXNSZW1vdGUoKSkgeworCQkJCQlyZXR1cm4gIW90aGVyLmlzUmVtb3RlKCk7CisJCQkJfQorCQkJCXJldHVybiBnZXRSZW1vdGVQYXRoKCkuZXF1YWxzKG90aGVyLmdldFJlbW90ZVBhdGgoKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiRmlsZUxpbmsoRGVzY3JpcHRpb24gPSAiKTsKKworCQlpZiAoIWdldERlc2NyaXB0aW9uKCkuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7CisJCX0KKworCQlpZiAoaXNMb2NhbCgpKSB7CisJCQlzYi5hcHBlbmQoIiwgTG9jYWxQYXRoID0gIikuYXBwZW5kKGdldExvY2FsU3RyZWFtKCkpOworCQl9CisKKwkJaWYgKGlzUmVtb3RlKCkpIHsKKwkJCXNiLmFwcGVuZCgiLCBSZW1vdGVQYXRoID0gIikuYXBwZW5kKGdldFJlbW90ZVBhdGgoKSk7CisJCX0KKworCQlzYi5hcHBlbmQoIiwgU2l6ZSA9ICIpOworCQlpZiAoZ2V0U2l6ZSgpID4gMCkgeworCQkJc2IuYXBwZW5kKGdldFNpemUoRm9ybWF0LkRFQ0lNQUwpKS5hcHBlbmQoIiAvICIpLmFwcGVuZChnZXRTaXplKEZvcm1hdC5CSU5BUlkpKTsKKwkJfSBlbHNlIHsKKwkJCXNiLmFwcGVuZCgiVU5LTk9XTiIpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHtAbGluayBGaWxlTGlua30gbWF5IGJlIHRyZWF0ZWQgYXMgZXF1YWwuIFRoaXMgaXMgdGhlCisJICogY2FzZSBpZiBlaXRoZXIgdGhlaXIgbG9jYWwge0BsaW5rIFBhdGh9cyBvciByZW1vdGUgcGF0aHMgYXJlIGVxdWFsLgorCSAqCisJICogQHBhcmFtIG8xIFRoZSBmaXJzdCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBvMiBUaGUgc2Vjb25kIHtAY29kZSBGaWxlTGlua30uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBlaXRoZXIgdGhlaXIgbG9jYWwge0Bjb2RlIFBhdGh9cyBvciByZW1vdGUKKwkgKiAgICAgICAgIHBhdGhzIGFyZSBlcXVhbC4KKwkgKi8KKwlzdGF0aWMgYm9vbGVhbiBhcmVFcXVhbChGaWxlTGluayBvMSwgRmlsZUxpbmsgbzIpIHsKKwkJcmV0dXJuIGlzTG9jYWxQYXRoRXF1YWwobzEsIG8yKSB8fCBpc1JlbW90ZVBhdGhFcXVhbChvMSwgbzIpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBib3RoIHtAbGluayBGaWxlTGlua31zIHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbgorCSAqIHtAbGluayAjaXNMb2NhbCgpfSBpcyBjYWxsZWQgYW5kIHRoZWlyIHtAbGluayBQYXRofXMgYXJlIGVxdWFsLgorCSAqCisJICogQHBhcmFtIG8xIFRoZSBmaXJzdCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBvMiBUaGUgc2Vjb25kIHtAY29kZSBGaWxlTGlua30uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBib3RoIHtAY29kZSBGaWxlTGlua31zIGhhdmUgYSBsb2NhbAorCSAqICAgICAgICAge0Bjb2RlIFBhdGh9IHdoaWNoIGFyZSBlcXVhbC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTG9jYWxQYXRoRXF1YWwoRmlsZUxpbmsgbzEsIEZpbGVMaW5rIG8yKSB7CisJCXJldHVybiBvMS5pc0xvY2FsKCkgJiYgbzIuaXNMb2NhbCgpICYmIG8xLmdldExvY2FsU3RyZWFtKCkuZXF1YWxzKG8yLmdldExvY2FsU3RyZWFtKCkpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGJvdGgge0BsaW5rIEZpbGVMaW5rfXMgcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuCisJICoge0BsaW5rICNpc1JlbW90ZSgpfSBpcyBjYWxsZWQgYW5kIHRoZWlyIHJlbW90ZSBwYXRocyBhcmUgZXF1YWwuCisJICoKKwkgKiBAcGFyYW0gbzEgVGhlIGZpcnN0IHtAY29kZSBGaWxlTGlua30uCisJICogQHBhcmFtIG8yIFRoZSBzZWNvbmQge0Bjb2RlIEZpbGVMaW5rfS4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGJvdGgge0Bjb2RlIEZpbGVMaW5rfXMgaGF2ZSBhIHJlbW90ZSBwYXRoCisJICogICAgICAgICB3aGljaCBhcmUgZXF1YWwuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1JlbW90ZVBhdGhFcXVhbChGaWxlTGluayBvMSwgRmlsZUxpbmsgbzIpIHsKKwkJcmV0dXJuIG8xLmlzUmVtb3RlKCkgJiYgbzIuaXNSZW1vdGUoKSAmJiBvMS5nZXRSZW1vdGVQYXRoKCkuZXF1YWxzKG8yLmdldFJlbW90ZVBhdGgoKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIElubmVyIGNsYXNzZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVc2VkIHRvIGZvcm1hdCBhIG51bWJlciBvZiBieXRlcyBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc2l6ZS4KKwkgKi8KKwlwdWJsaWMgZW51bSBGb3JtYXQgeworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gRW51bSBjb25zdGFudHMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCS8qKgorCQkgKiBDb3VudHMgMTAwMCBiaXRzIGFzIDEgYnl0ZSwgc28gZm9ybWF0cyAxMTA1OTIgdG8gJzExMC42IGtCJy4KKwkJICovCisJCURFQ0lNQUwoMTAwMCwgImtNR1RQRSIpLAorCisJCS8qKgorCQkgKiBDb3VudHMgMTAyNCBiaXRzIGFzIDEgYnl0ZSwgc28gZm9ybWF0cyAxMTA1OTIgdG8gJzEwOC4wIEtpQicuCisJCSAqLworCQlCSU5BUlkoMTAyNCwgIktNR1RQRSIpOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSW5uZXIgY2xhc3NlcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJlZml4Q2hhcnM7CisJCXByaXZhdGUgZmluYWwgaW50IHVuaXQ7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBDb25zdHJ1Y3RvcnMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCS8qKgorCQkgKiBDb25zdHJ1Y3Rvci4KKwkJICoKKwkJICogQHBhcmFtIHVuaXQgICAgICAgIFRoZSB1bml0LgorCQkgKiBAcGFyYW0gcHJlZml4Q2hhcnMgVGhlIHByZWZpeCBjaGFyYWN0ZXJzLgorCQkgKi8KKwkJcHJpdmF0ZSBGb3JtYXQoaW50IHVuaXQsIFN0cmluZyBwcmVmaXhDaGFycykgeworCQkJdGhpcy5wcmVmaXhDaGFycyA9IHByZWZpeENoYXJzOworCQkJdGhpcy51bml0ID0gdW5pdDsKKwkJfQorCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gUHJpdmF0ZSBtZXRob2RzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogRm9ybWF0cyBnaXZlbiBmaWxlIHNpemUgaW4gYnl0ZXMgaW50byBhIGh1bWFuIHJlYWRhYmxlIG9uZS4KKwkJICoKKwkJICogQHBhcmFtIHNpemUgVGhlIG51bWJlciBvZiBieXRlcy4KKwkJICogQHJldHVybiBGb3JtYXR0ZWQgZmlsZSBzaXplIGlzIHJldHVybmVkLgorCQkgKi8KKwkJcHJpdmF0ZSBTdHJpbmcgZ2V0U2l6ZShsb25nIHNpemUpIHsKKwkJCWlmIChzaXplIDwgMCkgeworCQkJCXJldHVybiAiVU5LTk9XTiI7CisJCQl9IGVsc2UgaWYgKHNpemUgPCB1bml0KSB7CisJCQkJcmV0dXJuIHNpemUgKyAiIEIiOworCQkJfQorCisJCQlpbnQgZXhwb25lbnQgPSAoaW50KSAoTWF0aC5sb2coc2l6ZSkgLyBNYXRoLmxvZyh1bml0KSk7CisJCQlTdHJpbmcgcHJlZml4Q2hhciA9IHByZWZpeENoYXJzLmNoYXJBdChleHBvbmVudCAtIDEpICsgKERFQ0lNQUwgPT0gdGhpcyA/ICIiIDogImkiKTsKKwkJCXJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjFmICVzQiIsIHNpemUgLyBNYXRoLnBvdyh1bml0LCBleHBvbmVudCksIHByZWZpeENoYXIpOworCQl9CisJfQorCisJLyoqCisJICogVXNlZCB0byBwcmVzZXJ2ZSB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhIHtAbGluayBGaWxlTGlua30uCisJICovCisJcHJpdmF0ZSBlbnVtIFN0YXRlIHsKKworCQkvKioKKwkJICoge0BsaW5rIEZpbGVMaW5rfSB3YXMgaW5pdGlhbGx5IG9ubHkgcmVtb3RlbHkgYXZhaWxhYmxlLgorCQkgKi8KKwkJUkVNT1RFLAorCisJCS8qKgorCQkgKiB7QGxpbmsgRmlsZUxpbmt9IHdhcyBpbml0aWFsbHkgb25seSBsb2NhbGx5IGF2YWlsYWJsZS4KKwkJICovCisJCUxPQ0FMCisKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GaWxlc0F0dGFjaGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9GaWxlc0F0dGFjaGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2NiMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0ZpbGVzQXR0YWNoYWJsZS5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUge0BsaW5rIEVudGl0eX0gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBnZXR0ZXIgYW5kCisgKiBzZXR0ZXIgbWV0aG9kcyBmb3IgdGhlICdGaWxlTGlua3MnIHNlcXVlbmNlIGZpZWxkIG9mIGFuIGVudGl0eS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRmlsZUxpbmsKKyAqLworcHVibGljIGludGVyZmFjZSBGaWxlc0F0dGFjaGFibGUgZXh0ZW5kcyBFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnRmlsZUxpbmtzJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9GSUxFX0xJTktTID0gIk1ETUxpbmtzIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudCBzZXQgb2YgbGlua2VkIGZpbGVzIG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBDdXJyZW50IHNldCBvZiBsaW5rZWQgZmlsZXMgYXJlIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgRmlsZUxpbmtbXSBnZXRGaWxlTGlua3MoKSB7CisJCXJldHVybiAoKEZpbGVMaW5rW10pIGdldFZhbHVlKEFUVFJfRklMRV9MSU5LUykuZXh0cmFjdCgpKS5jbG9uZSgpOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnQgc2V0IG9mIGxpbmtlZCBmaWxlcyB3aXRoIGdpdmVuIHtAbGluayBGaWxlTGlua31zLgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rcyBUaGUgbmV3IHtAY29kZSBGaWxlTGlua31zLgorCSAqLworCWRlZmF1bHQgdm9pZCBzZXRGaWxlTGlua3MoRmlsZUxpbmtbXSBmaWxlTGlua3MpIHsKKwkJZ2V0VmFsdWUoQVRUUl9GSUxFX0xJTktTKS5zZXQoZmlsZUxpbmtzKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIHtAbGluayBGaWxlTGlua30gdG8gdGhlIGN1cnJlbnQgc2V0IG9mIGxpbmtlZCBmaWxlcy4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGluayBUaGUgbmV3IHtAY29kZSBGaWxlTGlua30uCisJICovCisJZGVmYXVsdCB2b2lkIGFkZEZpbGVMaW5rKEZpbGVMaW5rIGZpbGVMaW5rKSB7CisJCUZpbGVMaW5rW10gZmlsZUxpbmtzID0gZ2V0RmlsZUxpbmtzKCk7CisKKwkJRmlsZUxpbmtbXSBuZXdGaWxlTGlua3MgPSBuZXcgRmlsZUxpbmtbZmlsZUxpbmtzLmxlbmd0aCArIDFdOworCQlTeXN0ZW0uYXJyYXljb3B5KGZpbGVMaW5rcywgMCwgbmV3RmlsZUxpbmtzLCAwLCBmaWxlTGlua3MubGVuZ3RoKTsKKwkJbmV3RmlsZUxpbmtzW2ZpbGVMaW5rcy5sZW5ndGhdID0gZmlsZUxpbms7CisJCXNldEZpbGVMaW5rcyhuZXdGaWxlTGlua3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSBmcm9tIGN1cnJlbnQgc2V0IG9mIGxpbmtlZCBmaWxlcy4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGluayBUaGUge0Bjb2RlIEZpbGVMaW5rfSB3aGljaCBzaGFsbCBiZSByZW1vdmVkLgorCSAqLworCWRlZmF1bHQgdm9pZCByZW1vdmVGaWxlTGluayhGaWxlTGluayBmaWxlTGluaykgeworCQlMaXN0PEZpbGVMaW5rPiBmaWxlTGlua3MgPSBuZXcgQXJyYXlMaXN0PD4oQXJyYXlzLmFzTGlzdChnZXRGaWxlTGlua3MoKSkpOworCQlmaWxlTGlua3MucmVtb3ZlKGZpbGVMaW5rKTsKKwkJc2V0RmlsZUxpbmtzKGZpbGVMaW5rcy50b0FycmF5KG5ldyBGaWxlTGlua1tmaWxlTGlua3Muc2l6ZSgpXSkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Zsb2F0Q29tcGxleC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0Zsb2F0Q29tcGxleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNmY0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvRmxvYXRDb21wbGV4LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29tcGxleCB2YWx1ZSB3aXRoIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiB0eXBlCisgKiB7QGNvZGUgZmxvYXR9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmxvYXRDb21wbGV4IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIGZsb2F0IHJlOworCXByaXZhdGUgZmluYWwgZmxvYXQgaW07CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcmVhbCAgICAgIFRoZSByZWFsIHBhcnQuCisJICogQHBhcmFtIGltYWdpbmFyeSBUaGUgaW1hZ2luYXJ5IHBhcnQuCisJICovCisJcHVibGljIEZsb2F0Q29tcGxleChmbG9hdCByZWFsLCBmbG9hdCBpbWFnaW5hcnkpIHsKKwkJcmUgPSByZWFsOworCQlpbSA9IGltYWdpbmFyeTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBQYXJzZXMgZ2l2ZW4ge0Bjb2RlIFN0cmluZ30gd2hlcmUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGFyZSBzZXBhcmF0ZWQgYnkKKwkgKiBvbmUgb3IgbW9yZSBibGFua3MuIEZ1cnRoZXJtb3JlIGJvdGggbXVzdCBiZSBmbG9hdGluZyBwb2ludCBudW1iZXJzIHRoYXQgY2FuCisJICogYmUgcGFyc2VkIGJ5IGNhbGxpbmcge0BsaW5rIEZsb2F0I3ZhbHVlT2YoU3RyaW5nKX0uCisJICoKKwkgKiBAcGFyYW0gcyBUaGUge0Bjb2RlIFN0cmluZ30gdG8gYmUgcGFyc2VkLgorCSAqIEByZXR1cm4gVGhlIHBhcnNlZCB7QGxpbmsgRmxvYXRDb21wbGV4fSB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHBhcnNlIHRoZSBjb21wbGV4IHZhbHVlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRmxvYXRDb21wbGV4IHZhbHVlT2YoU3RyaW5nIHMpIHsKKwkJU3RyaW5nW10gdmFsdWVzID0gcy5zcGxpdCgiICsiKTsKKwkJaWYgKHZhbHVlcy5sZW5ndGggIT0gMikgeworCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIGNvbXBsZXggdmFsdWUuIik7CisJCX0KKworCQlyZXR1cm4gbmV3IEZsb2F0Q29tcGxleChGbG9hdC5wYXJzZUZsb2F0KHZhbHVlc1swXSksIEZsb2F0LnBhcnNlRmxvYXQodmFsdWVzWzFdKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJlYWwgcGFydCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgZmxvYXQgcmVhbCgpIHsKKwkJcmV0dXJuIHJlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoaXMgY29tcGxleCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGltYWdpbmFyeSBwYXJ0IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBmbG9hdCBpbWFnaW5hcnkoKSB7CisJCXJldHVybiBpbTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb21wbGV4IHZhbHVlLgorCSAqIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgYXJlIHNlcGFyYXRlZCB3aXRoIGEgYmxhbmsuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBsZXggdmFsdWUuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKHJlYWwoKSkuYXBwZW5kKCcgJykuYXBwZW5kKGltYWdpbmFyeSgpKS50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0ludGVycG9sYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9JbnRlcnBvbGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyZDRlNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9JbnRlcnBvbGF0aW9uLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBpbnRlcnBvbGF0aW9uIGVudW1lcmF0aW9uLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgSW50ZXJwb2xhdGlvbiBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWUgeworCisJLyoqCisJICogTm8gaW50ZXJwb2xhdGlvbiBpcyB1c2VkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJwb2xhdGlvbiBOT05FID0gbmV3IEludGVycG9sYXRpb24oIk5PTkUiLCAwKTsKKworCS8qKgorCSAqIEludGVycG9sYXRpb24gaXMgbGluZWFyLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJwb2xhdGlvbiBMSU5FQVIgPSBuZXcgSW50ZXJwb2xhdGlvbigiTElORUFSIiwgMSk7CisKKwkvKioKKwkgKiBJbnRlcnBvbGF0aW9uIGlzIGFwcGxpY2F0aW9uIHNwZWNpZmljLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJwb2xhdGlvbiBTUEVDSUZJQyA9IG5ldyBJbnRlcnBvbGF0aW9uKCJTUEVDSUZJQyIsIDIpOworCisJcHJpdmF0ZSBJbnRlcnBvbGF0aW9uKFN0cmluZyBuYW1lLCBpbnQgb3JkaW5hbCkgeworCQlzdXBlcihuYW1lLCBvcmRpbmFsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnRlcnBvbGF0aW9uIGlzIHtAbGluayAjTk9ORX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNOb25lKCkgeworCQlyZXR1cm4gTk9ORSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGludGVycG9sYXRpb24gaXMge0BsaW5rICNMSU5FQVJ9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGluZWFyKCkgeworCQlyZXR1cm4gTElORUFSID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaW50ZXJwb2xhdGlvbiBpcyB7QGxpbmsgI1NQRUNJRklDfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmljKCkgeworCQlyZXR1cm4gU1BFQ0lGSUMgPT0gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NZWFzdXJlZFZhbHVlcy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL01lYXN1cmVkVmFsdWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkzNWVhMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NZWFzdXJlZFZhbHVlcy5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtLnJhbmdlOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWUucmVhZEF0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCisvKioKKyAqIENsYXNzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBtZWFzdXJlZCB2YWx1ZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWFzdXJlZFZhbHVlcyB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBTY2FsYXJUeXBlIHNjYWxhclR5cGU7CisJcHJpdmF0ZSBmaW5hbCBPYmplY3QgdmFsdWVzOworCXByaXZhdGUgZmluYWwgYm9vbGVhbltdIGZsYWdzOworCisJLyoKKwkgKiBUT0RPOiAtIHJlcGxhY2UgbmFtZSBhbmQgdW5pdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIENoYW5uZWwgJiBVbml0IGVudGl0aWVzCisJICogLSBwcm92aWRlIGZ1cnRoZXIgaW5mb3JtYXRpb24gaWYgcmVxdWlyZWQgLSBwcm92aWRlIGFuIG92ZXJhbGwgb2Zmc2V0IGZvcgorCSAqIHRoaXMgdmFsdWUgc2VxdWVuY2UKKwkgKi8KKworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdW5pdDsKKworCXByaXZhdGUgZmluYWwgaW50IGxlbmd0aDsKKworCXByaXZhdGUgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCXByaXZhdGUgZmluYWwgZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnM7CisJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGluZGVwZW5kZW50OworCXByaXZhdGUgZmluYWwgQXhpc1R5cGUgYXhpc1R5cGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyVHlwZSAgICAgICAgICAgICBUaGUge0BsaW5rIFNjYWxhclR5cGV9IG9mIHRoaXMgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgQ2hhbm5lbH0uCisJICogQHBhcmFtIHVuaXQgICAgICAgICAgICAgICAgICAgTmFtZSBvZiB0aGUgdW5pdCB0aGUgY29udGFpbmVkIHZhbHVlcyBhcmUgb2YuCisJICogQHBhcmFtIHNlcXVlbmNlUmVwcmVzZW50YXRpb24gVGhlIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBvZiB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHBhcmFtIGdlbmVyYXRpb25QYXJhbWV0ZXJzICAgVGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIG1lYXN1cmVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLgorCSAqIEBwYXJhbSBpbmRlcGVuZGVudCAgICAgICAgICAgIFRoZSBpbmRlcGVuZGVudCBmbGFnIG9mIHRoZSBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHBhcmFtIGF4aXNUeXBlICAgICAgICAgICAgICAgVGhlIHtAbGluayBBeGlzVHlwZX0gb2YgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcGFyYW0gdmFsdWVzICAgICAgICAgICAgICAgICBUaGUgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEBwYXJhbSBmbGFncyAgICAgICAgICAgICAgICAgIFRoZSB2YWxpZGl0eSBmbGFncyBvZiB0aGUgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB2YWx1ZXMgb3IgZmxhZ3MgaXMgbnVsbCBvciBsZW5ndGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB2YWx1ZXMgYW5kIGZsYWdzIGlzIG5vdCBlcXVhbC4KKwkgKi8KKwlNZWFzdXJlZFZhbHVlcyhTY2FsYXJUeXBlIHNjYWxhclR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdW5pdCwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uLAorCQkJZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnMsIGJvb2xlYW4gaW5kZXBlbmRlbnQsIEF4aXNUeXBlIGF4aXNUeXBlLCBPYmplY3QgdmFsdWVzLCBib29sZWFuW10gZmxhZ3MpIHsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy51bml0ID0gKHVuaXQgPT0gbnVsbCA/ICIiIDogdW5pdCk7CisJCXRoaXMuc2NhbGFyVHlwZSA9IHNjYWxhclR5cGU7CisJCXRoaXMuc2VxdWVuY2VSZXByZXNlbnRhdGlvbiA9IHNlcXVlbmNlUmVwcmVzZW50YXRpb247CisJCXRoaXMuZ2VuZXJhdGlvblBhcmFtZXRlcnMgPSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJdGhpcy5pbmRlcGVuZGVudCA9IGluZGVwZW5kZW50OworCQl0aGlzLmF4aXNUeXBlID0gYXhpc1R5cGU7CisJCXRoaXMudmFsdWVzID0gdmFsdWVzOworCisJCWlmICh2YWx1ZXMgPT0gbnVsbCB8fCBmbGFncyA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHZhbHVlcyBub3IgZmxhZ3MgaXMgYWxsb3dlZCB0byBiZSBudWxsLiIpOworCQl9IGVsc2UgaWYgKEFycmF5LmdldExlbmd0aCh2YWx1ZXMpICE9IGZsYWdzLmxlbmd0aCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGVuZ3RoIG9mIHZhbHVlcyBhbmQgZmxhZ3MgaXMgbm90IGVxdWFsLiIpOworCQl9CisKKwkJdGhpcy5mbGFncyA9IEFycmF5cy5jb3B5T2YoZmxhZ3MsIGZsYWdzLmxlbmd0aCk7CisJCWxlbmd0aCA9IGZsYWdzLmxlbmd0aDsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHVuaXQgbmFtZSBmb3IgdGhpcyBtZWFzdXJlZCB2YWx1ZXMgc2VxdWVuY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB1bml0IG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRVbml0KCkgeworCQlyZXR1cm4gdW5pdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgU2NhbGFyVHlwZX0gb2YgdGhpcyBtZWFzdXJlZCB2YWx1ZXMgc2VxdWVuY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU2NhbGFyVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFNjYWxhclR5cGUgZ2V0U2NhbGFyVHlwZSgpIHsKKwkJcmV0dXJuIHNjYWxhclR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBvZiB0aGlzIG1lYXN1cmVkIHZhbHVlcyBzZXF1ZW5jZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisJCXJldHVybiBsZW5ndGg7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IG9mIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSB7CisJCXJldHVybiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBmb3IgdGhpcyBtZWFzdXJlZCB2YWx1ZXMgc2VxdWVuY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBkb3VibGVbXSBnZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIGdlbmVyYXRpb25QYXJhbWV0ZXJzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGluZGVwZW5kZW50IGZsYWcgb2YgdGhpcyBtZWFzdXJlZCB2YWx1ZXMgc2VxdWVuY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBpbmRlcGVuZGVudCBmbGFnIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW5kZXBlbmRlbnQoKSB7CisJCXJldHVybiBpbmRlcGVuZGVudDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoaXMgbWVhc3VyZWQgdmFsdWVzIHNlcXVlbmNlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEF4aXNUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQXhpc1R5cGUgZ2V0QXhpc1R5cGUoKSB7CisJCXJldHVybiBheGlzVHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgdHlwZWQge0BsaW5rIFZhbHVlSXRlcmF0b3J9LiBJdHMgdXNhZ2UgaXMgZGVzY3JpYmVkIGJlbG93OgorCSAqCisJICogPHByZT4KKwkgKiAvLyBhc3N1bWUgdGhlIG1lYXN1cmVkVmFsdWVzKCkuZ2V0U2NhbGFyVHlwZSgpID09IFNjYWxhclR5cGUuQllURQorCSAqIFZhbHVlSXRlcmF0b3ImbHQ7Qnl0ZSZndDsgdmFsdWVJdGVyYXRvciA9IG1lYXN1cmVkVmFsdWVzKCkuaXRlcmF0b3IoKTsKKwkgKiB3aGlsZSAodmFsdWVJdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkgKiAJYm9vbGVhbiBpc0N1cnJlbnRWYWxpZCA9IHZhbHVlSXRlcmF0b3IuaXNWYWxpZCgpOworCSAqIAlCeXRlIGN1cnJlbnRWYWx1ZSA9IHZhbHVlSXRlcmF0b3IubmV4dCgpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8RT4gVGhpcyB0eXBlIGhhcyB0byBiZSBkZXJpdmVkIGZyb20gdGhlIHtAbGluayBTY2FsYXJUeXBlfSBvZiB0aGlzCisJICogICAgICAgICAgICBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHJldHVybiBBIHR5cGVkIHtAY29kZSBWYWx1ZUl0ZXJhdG9yfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgPEU+IFZhbHVlSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7CisJCS8vIFRPRE8gcHJvdmlkZSBjdXN0b20gaW1wbGVtZW50YXRpb25zIGZvciBlYWNoIHR5cGUgYW5kIHR5cGVkCisJCS8vIG5leHRUeXBlKCkgbWV0aG9kcworCQkvLyBpZGVhOiBnZXRTY2FsYXJUeXBlKCkuY3JlYXRlSXRlcmF0b3IodmFsdWVzLCBmbGFncyk7IC8vIDwtIHBhY2thZ2UKKwkJLy8gcHJpdmF0ZQorCQlyZXR1cm4gbmV3IFZhbHVlSXRlcmF0b3I8RT4oKSB7CisJCQlwcml2YXRlIGludCBpbmRleCA9IDA7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJCQlyZXR1cm4gaW5kZXggPCBsZW5ndGg7CisJCQl9CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKwkJCQlyZXR1cm4gZmxhZ3NbaW5kZXhdOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJcHVibGljIEUgbmV4dCgpIHsKKwkJCQlpZiAoaGFzTmV4dCgpKSB7CisJCQkJCXJldHVybiAoRSkgQXJyYXkuZ2V0KHZhbHVlcywgaW5kZXgrKyk7CisJCQkJfQorCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJTdWJzZXF1ZW50IHZhbHVlIGlzIG5vdCBhdmFpbGFibGUuIik7CisJCQl9CisJCX07CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWVhc3VyZWQKKwkgKiB2YWx1ZXMuIElmIHRoaXMgc2VxdWVuY2UgY29udGFpbnMgbW9yZSB0aGFuIDEwIHZhbHVlcywgb25seSB0aGUgZmlyc3QgYW5kCisJICogbGFzdCA1IHZhbHVlcyBhcmUgd3JpdHRlbi4gSWYgYSB2YWx1ZSBpcyBtYXJrZWQgYXMgbm90IHZhbGlkLCB0aGVuICdYWCcgaXMKKwkgKiB3cml0dGVuIGluc3RlYWQgb2YgaXRzIHZhbHVlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyBlbnRpdHkuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJNZWFzdXJlZFZhbHVlcyhDaGFubmVsTmFtZSA9ICIpLmFwcGVuZChnZXROYW1lKCkpOworCQlzYi5hcHBlbmQoIiwgU2NhbGFyVHlwZSA9ICIpLmFwcGVuZChnZXRTY2FsYXJUeXBlKCkpOworCisJCWlmICghZ2V0VW5pdCgpLmlzRW1wdHkoKSkgeworCQkJc2IuYXBwZW5kKCIsIFVuaXQgPSAiKS5hcHBlbmQoZ2V0VW5pdCgpKTsKKwkJfQorCisJCXNiLmFwcGVuZCgiLCBWYWx1ZXMgPSBbIik7CisJCVN0cmluZyBub3RWYWxpZE1hcmtlciA9ICJYWCI7CisJCWlmIChnZXRMZW5ndGgoKSA+IDEwKSB7CisJCQlzYi5hcHBlbmQocmFuZ2UoMCwgNSkubWFwVG9PYmooaSAtPiBmbGFnc1tpXSA/IHJlYWRBdCh2YWx1ZXMsIGkpIDogbm90VmFsaWRNYXJrZXIpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQkJc2IuYXBwZW5kKCIsIC4uLiwgIik7CisJCQlzYi5hcHBlbmQocmFuZ2UobGVuZ3RoIC0gNSwgbGVuZ3RoKS5tYXBUb09iaihpIC0+IGZsYWdzW2ldID8gcmVhZEF0KHZhbHVlcywgaSkgOiBub3RWYWxpZE1hcmtlcikKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisJCX0gZWxzZSBpZiAoZ2V0TGVuZ3RoKCkgPiAwKSB7CisJCQlzYi5hcHBlbmQocmFuZ2UoMCwgbGVuZ3RoKS5tYXBUb09iaihpIC0+IGZsYWdzW2ldID8gcmVhZEF0KHZhbHVlcywgaSkgOiBub3RWYWxpZE1hcmtlcikKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCJdKSIpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIElubmVyIFR5cGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIG1lYXN1cmVkIHZhbHVlcyBpdGVyYXRvci4KKwkgKgorCSAqIEBwYXJhbSA8RT4gVHlwZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWVzLgorCSAqIEBzaW5jZSAxLjAuMAorCSAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKwkgKi8KKwlwdWJsaWMgaW50ZXJmYWNlIFZhbHVlSXRlcmF0b3I8RT4gZXh0ZW5kcyBJdGVyYXRvcjxFPiB7CisKKwkJLyoqCisJCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBtYXJrZWQgYXMgdmFsaWQuCisJCSAqCisJCSAqIEByZXR1cm4gVHJ1ZSBpZiBjdXJyZW50IHZhbHVlIGlzIHZhbGlkLgorCQkgKi8KKwkJYm9vbGVhbiBpc1ZhbGlkKCk7CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NZWFzdXJlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL01lYXN1cmVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlZTc2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NZWFzdXJlbWVudC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5CYXNlRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBtZWFzdXJlbWVudCBlbnRpdHkgdHlwZS4gVGhlIG1lYXN1cmVtZW50IGVudGl0eSBob2xkcworICogZGF0YSBvZiBhIG1lYXN1cmVtZW50IG9yIGFuIGFuYWx5c2lzLiBJdCBpcyB0aGUgbGlua2luZyBwb2ludCB0byB0aGUKKyAqIGZvbGxvd2luZyByZWxhdGVkIGRhdGE6CisgKgorICogPHVsPgorICogPGxpPlRvIGVuc3VyZSBhbnkgcGVyc2lzdGVkIG1lYXN1cmVtZW50IGNhbiBhbHdheXMgYmUgcmVpbnRlcnByZXRlZCBpdCwKKyAqIGFsd2F5cyBzaG91bGQgaGF2ZSByZWxhdGlvbnMgdG8ge0BsaW5rIENvbnRleHRSb290fXMgdGhhdCBjb250YWluIHRoZQorICogZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QgcnVuLiBBbGwgbWVhc3VyZW1lbnQgZW50aXRpZXMgdW5kZXIgdGhlIHNhbWUgcGFyZW50CisgKiB7QGxpbmsgVGVzdFN0ZXB9IG11c3QgcmVmZXJlbmNlIHRoZSBzYW1lIHtAY29kZQorICogCQlDb250ZXh0Um9vdH0uPC9saT4KKyAqIDxsaT5UaGUgcmVzdWx0cyBvZiBhIHRlc3QgcnVuIGFyZSBhY2Nlc3NpYmxlIHZpYSB0aGUgY2hpbGRyZW4gb2YgdHlwZQorICoge0BsaW5rIENoYW5uZWxHcm91cH0gYW5kIHtAbGluayBDaGFubmVsfS48L2xpPgorICogPC91bD4KKyAqCisgKiBUaGUgbmFtZSBvZiBhIG1lYXN1cmVtZW50IHNob3VsZCBiZSBjaG9zZW4gaW4gYSBzcGVha2luZyB3YXkuIEl0IGhhcyB0byBiZQorICogdW5pcXVlIHVuZGVyIHRoZSBwYXJlbnQge0Bjb2RlIFRlc3RTdGVwfS4KKyAqIDxwPgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBQYXJhbWV0ZXJTZXQKKyAqLworcHVibGljIGNsYXNzIE1lYXN1cmVtZW50IGV4dGVuZHMgQmFzZUVudGl0eQorCQlpbXBsZW1lbnRzIENvbnRleHREZXNjcmliYWJsZSwgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgRmlsZXNBdHRhY2hhYmxlLCBUYWdhYmxlLCBTdGF0dXNBdHRhY2hhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFRlc3RTdGVwfSBwYXJlbnQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFRlc3RTdGVwPiBQQVJFTlRfVFlQRV9URVNUU1RFUCA9IFRlc3RTdGVwLmNsYXNzOworCisJLyoqCisJICogVGhlIHtAbGluayBDaGFubmVsR3JvdXB9IGNoaWxkIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxDaGFubmVsR3JvdXA+IENISUxEX1RZUEVfQ0hBTk5FTEdST1VQID0gQ2hhbm5lbEdyb3VwLmNsYXNzOworCisJLyoqCisJICogVGhlIHtAbGluayBQYXJhbWV0ZXJTZXR9IGNoaWxkIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxQYXJhbWV0ZXJTZXQ+IENISUxEX1RZUEVfUEFSQU1FVEVSU0VUID0gUGFyYW1ldGVyU2V0LmNsYXNzOworCisJLyoqCisJICogVGhlIHtAbGluayBDaGFubmVsfSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8Q2hhbm5lbD4gQ0hJTERfVFlQRV9DSEFOTkVMID0gQ2hhbm5lbC5jbGFzczsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZW1lbnRCZWdpbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTVVJFTUVOVF9CRUdJTiA9ICJNZWFzdXJlbWVudEJlZ2luIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZW1lbnRFbmQnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTUVBU1VSRU1FTlRfRU5EID0gIk1lYXN1cmVtZW50RW5kIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJTWVhc3VyZW1lbnQoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRpbWUgc3RhbXAgb2YgdGhlIGRhdGUgd2hlbiB0aGlzIG1lYXN1cmVtZW50IHdhcyBzdGFydGVkLgorCSAqCisJICogQHJldHVybiBNZWFzdXJlbWVudCBleGVjdXRpb24gc3RhcnQgdGltZSBzdGFtcCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgTG9jYWxEYXRlVGltZSBnZXRNZWFzdXJlbWVudEJlZ2luKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NRUFTVVJFTUVOVF9CRUdJTikuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHRpbWUgc3RhbXAgZm9yIHRoZSBkYXRlIHdoZW4gdGhpcyBtZWFzdXJlbWVudCB3YXMgc3RhcnRlZC4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudEJlZ2luIFRoZSBuZXcgbWVhc3VyZW1lbnQgc3RhcnQgdGltZSBzdGFtcC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZWFzdXJlbWVudEJlZ2luKExvY2FsRGF0ZVRpbWUgbWVhc3VyZW1lbnRCZWdpbikgeworCQlnZXRWYWx1ZShBVFRSX01FQVNVUkVNRU5UX0JFR0lOKS5zZXQobWVhc3VyZW1lbnRCZWdpbik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdGltZSBzdGFtcCBvZiB0aGUgZGF0ZSB3aGVuIHRoaXMgbWVhc3VyZW1lbnQgd2FzIGZpbmlzaGVkLgorCSAqCisJICogQHJldHVybiBNZWFzdXJlbWVudCBleGVjdXRpb24gZW5kIHRpbWUgc3RhbXAgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIExvY2FsRGF0ZVRpbWUgZ2V0TWVhc3VyZW1lbnRFbmQoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX01FQVNVUkVNRU5UX0VORCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHRpbWUgc3RhbXAgZm9yIHRoZSBkYXRlIHdoZW4gdGhpcyBtZWFzdXJlbWVudCB3YXMgZmluaXNoZWQuCisJICoKKwkgKiBAcGFyYW0gbWVhc3VyZW1lbnRFbmQgVGhlIG5ldyBtZWFzdXJlbWVudCBleGVjdXRpb24gZW5kIHRpbWUgc3RhbXAuCisJICovCisJcHVibGljIHZvaWQgc2V0TWVhc3VyZW1lbnRFbmQoTG9jYWxEYXRlVGltZSBtZWFzdXJlbWVudEVuZCkgeworCQlnZXRWYWx1ZShBVFRSX01FQVNVUkVNRU5UX0VORCkuc2V0KG1lYXN1cmVtZW50RW5kKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8Q29udGV4dFR5cGU+IGxvYWRDb250ZXh0VHlwZXMoQmFzZUVudGl0eU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbWFuYWdlci5sb2FkQ29udGV4dFR5cGVzKHRoaXMpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPENvbnRleHRUeXBlLCBDb250ZXh0Um9vdD4gbG9hZENvbnRleHRzKEJhc2VFbnRpdHlNYW5hZ2VyIG1hbmFnZXIsIENvbnRleHRUeXBlLi4uIGNvbnRleHRUeXBlcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlNYXA8Q29udGV4dFR5cGUsIENvbnRleHRSb290PiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA6IGNvbnRleHRUeXBlcykgeworCQkJQ29udGV4dFJvb3QgYyA9IGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKTsKKwkJCWlmIChjICE9IG51bGwpIHsKKwkJCQltYXAucHV0KGNvbnRleHRUeXBlLCBjKTsKKwkJCX0KKwkJfQorCQlpZiAobWFwLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIG1hbmFnZXIubG9hZENvbnRleHRzKHRoaXMsIGNvbnRleHRUeXBlcyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbWFwOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWltZVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9NaW1lVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmJjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTWltZVR5cGUuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogQ2xhc3MgcHJvdmlkZXMgZWFzeSB0byB1c2UgTUlNRSB0eXBlIGNvbXBhcmlzb24gbWV0aG9kcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRW50aXR5CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNaW1lVHlwZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW50ZXJuYWw7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbWltZVR5cGUgVGhlIE1JTUUgdHlwZSB3aWxsIGJlIGNoYW5nZWQgdG8gbG93ZXIgY2FzZS4KKwkgKi8KKwlwdWJsaWMgTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisJCWludGVybmFsID0gbWltZVR5cGUudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXB1YmxpYyBNaW1lVHlwZSBhZGRTdWJUeXBlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBuZXcgTWltZVR5cGUoaW50ZXJuYWwgKyAnLicgKyBuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiB7QGNvZGUgTWltZVR5cGV9IGlzIGVpdGhlciB0aGUgc2FtZSBhcyBvciBhIHN1YiB0eXBlIG9mCisJICogdGhpcyBNSU1FIHR5cGUuIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGVzOgorCSAqCisJICogPHByZT4KKwkgKiBNaW1lVHlwZSB0eXBlID0gbmV3IE1pbWVUeXBlKCJhcHBsaWNhdGlvbi94LWFzYW0uYW9tZWFzdXJlbWVudCIpOworCSAqIE1pbWVUeXBlIHN1YlR5cGUgPSBuZXcgTWltZVR5cGUoImFwcGxpY2F0aW9uL3gtYXNhbS5hb21lYXN1cmVtZW50LnN1YnR5cGUiKTsKKwkgKgorCSAqIHR5cGUuaXNQYXJlbnRPZihzdWJUeXBlKTsgLy8gdHJ1ZQorCSAqIHN1YlR5cGUuaXNQYXJlbnRPZih0eXBlKTsgLy8gZmFsc2UKKwkgKiB0eXBlLmlzUGFyZW50T2YodHlwZSk7IC8vIHRydWUKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgY2hlY2tlZCB0eXBlLgorCSAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIGVpdGhlciB0aGlzIE1JTUUgdHlwZSBhbmQgZ2l2ZW4gb25lIGFyZSB0aGUgc2FtZSBvcgorCSAqICAgICAgICAgdGhlIGdpdmVuIG9uZSBpcyBhIHN1YiB0eXBlIG9mIHRoaXMgTUlNRSB0eXBlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUGFyZW50T2YoTWltZVR5cGUgbWltZVR5cGUpIHsKKwkJcmV0dXJuIG1pbWVUeXBlICE9IG51bGwgJiYgbWltZVR5cGUuY29tcGFyZVN0cmluZygpLnN0YXJ0c1dpdGgoY29tcGFyZVN0cmluZygpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGludGVybmFsLmhhc2hDb2RlKCk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4ge0Bjb2RlIE9iamVjdH0gcmVwcmVzZW50cyB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgTUlNRQorCSAqIHR5cGUuCisJICoKKwkgKiA8cHJlPgorCSAqIE1pbWVUeXBlIHR5cGUgPSBuZXcgTWltZVR5cGUoImFwcGxpY2F0aW9uL3gtYXNhbS5hb21lYXN1cmVtZW50Iik7CisJICogTWltZVR5cGUgZXF1YWxUeXBlID0gbmV3IE1pbWVUeXBlKCJhcHBsaWNhdGlvbi94LWFzYW0uYW9tZWFzdXJlbWVudCIpOworCSAqIE1pbWVUeXBlIHN1YlR5cGUgPSBuZXcgTWltZVR5cGUoImFwcGxpY2F0aW9uL3gtYXNhbS5hb21lYXN1cmVtZW50LnN1YnR5cGUiKTsKKwkgKiBNaW1lVHlwZSBhbm90aGVyVHlwZSA9IG5ldyBNaW1lVHlwZSgiYXBwbGljYXRpb24veC1hc2FtLmFvdW5pdCIpOworCSAqCisJICogdHlwZS5lcXVhbHMoZXF1YWxUeXBlKTsgLy8gdHJ1ZQorCSAqIHN1YlR5cGUuZXF1YWxzKHR5cGUpOyAvLyBmYWxzZQorCSAqIHR5cGUuZXF1YWxzKGFub3RoZXJUeXBlKTsgLy8gZmFsc2UKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBvYmplY3QgVGhlIGNoZWNrZWQgb2JqZWN0LgorCSAqIEByZXR1cm4gVHJ1ZSBpZiBnaXZlbiBvYmplY3QgaXMgb2YgdHlwZSB7QGNvZGUgTWltZVR5cGV9IGFuZCByZXByZXNlbnRzCisJICogICAgICAgICBleGFjdGx5IHRoZSBzYW1lIHR5cGUgYXMgdGhpcyBNSU1FIHR5cGUuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1pbWVUeXBlKSB7CisJCQlyZXR1cm4gaW50ZXJuYWwuZXF1YWxzKCgoTWltZVR5cGUpIG9iamVjdCkuaW50ZXJuYWwpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIE1JTUUgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIE1JTUUgdHlwZSBpcyByZXR1cm5lZCBpbiBsb3dlciBjYXNlLgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBpbnRlcm5hbDsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBhIHRlcm1pbmF0aW9uIGNoYXJhY3RlciB0byB0aGUgaW50ZXJuYWxseSBzdG9yZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqCisJICogQHJldHVybiBBIGNsb3NlZCBjb21wYXJpc29uIHN0cmluZyBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBjb21wYXJlU3RyaW5nKCkgeworCQlyZXR1cm4gaW50ZXJuYWwgKyAnLic7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGFyYW1ldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQzOGQyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgZW50aXR5IHR5cGUuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGhvbGQgYQorICogdmFsdWUgaW4gaXRzIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uLCB3aGljaCBpcyBjb252ZXJ0ZWQgdXBvbiByZXF1ZXN0CisgKiBhbmQgcHJvdmlkZWQgYXMgYSB2aXJ0dWFsIHtAbGluayBWYWx1ZX0uIFRoZSByZXR1cm5lZCB7QGNvZGUgVmFsdWV9IGlzIGZvcgorICogZGlzcGxheWluZyBwdXJwb3NlcyBvbmx5LiBUbyBjaGFuZ2UgdGhlIHZhbHVlLCBoZWxkIGJ5IHRoaXMgcGFyYW1ldGVyLCBvbmUgb2YKKyAqIGl0cyB7QGNvZGUgc2V0WFlWYWx1ZShYWSl9IG1ldGhvZHMgaGFzIHRvIGJlIHVzZWQuIHtAbGluayBWYWx1ZVR5cGV9cworICogc3VwcG9ydGVkIGJ5IHRoaXMgcGFyYW1ldGVyIGFyZSBsaXN0ZWQgYmVsb3c6CisgKgorICogPHVsPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjU1RSSU5HfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNEQVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNCT09MRUFOfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNCWVRFfTwvbGk+CisgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNTSE9SVH08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjSU5URUdFUn08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjTE9OR308L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVR9PC9saT4KKyAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRX08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVRfQ09NUExFWH08L2xpPgorICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFX0NPTVBMRVh9PC9saT4KKyAqIDwvdWw+CisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFBhcmFtZXRlclNldAorICogQHNlZSAjZ2V0VmlydHVhbFZhbHVlKCkKKyAqIEBzZWUgI3NldE9iamVjdFZhbHVlKE9iamVjdCwgVW5pdCkKKyAqIEBzZWUgI3NldFN0cmluZ1ZhbHVlKFN0cmluZykKKyAqIEBzZWUgI3NldERhdGVWYWx1ZShMb2NhbERhdGVUaW1lKQorICogQHNlZSAjc2V0Qm9vbGVhblZhbHVlKEJvb2xlYW4pCisgKiBAc2VlICNzZXRCeXRlVmFsdWUoQnl0ZSwgVW5pdCkKKyAqIEBzZWUgI3NldFNob3J0VmFsdWUoU2hvcnQsIFVuaXQpCisgKiBAc2VlICNzZXRJbnRlZ2VyVmFsdWUoSW50ZWdlciwgVW5pdCkKKyAqIEBzZWUgI3NldExvbmdWYWx1ZShMb25nLCBVbml0KQorICogQHNlZSAjc2V0RmxvYXRWYWx1ZShGbG9hdCwgVW5pdCkKKyAqIEBzZWUgI3NldERvdWJsZVZhbHVlKERvdWJsZSwgVW5pdCkKKyAqIEBzZWUgI3NldEZsb2F0Q29tcGxleFZhbHVlKEZsb2F0Q29tcGxleCwgVW5pdCkKKyAqIEBzZWUgI3NldERvdWJsZUNvbXBsZXhWYWx1ZShEb3VibGVDb21wbGV4LCBVbml0KQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgQmFzZVBhcmFtZXRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlICdTY2FsYXJUeXBlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NDQUxBUl9UWVBFID0gIkRhdGFUeXBlIjsKKworCS8qKgorCSAqIFRoZSAnVmFsdWUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUUgPSAiVmFsdWUiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlQYXJhbWV0ZXIoQ29yZSBjb3JlKSB7CisJCXN1cGVyKEFUVFJfU0NBTEFSX1RZUEUsIEFUVFJfVkFMVUUsIGNvcmUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BhcmFtZXRlclNldC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1BhcmFtZXRlclNldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NzRjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGFyYW1ldGVyU2V0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyIHNldCBlbnRpdHkgdHlwZS4gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MKKyAqIGdyb3VwIGEgc2V0IG9mIGZ1cnRoZXIgZGVzY3JpYmluZyBkYXRhIHN0b3JlZCBpbiB7QGxpbmsgUGFyYW1ldGVyfXMuCisgKiBQYXJhbWV0ZXIgc2V0cyBhcmUgYXR0YWNoZWQgZWl0aGVyIHRvIGEge0BsaW5rIE1lYXN1cmVtZW50fSBvcgorICoge0BsaW5rIENoYW5uZWx9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyU2V0IGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIHtAbGluayBNZWFzdXJlbWVudH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxNZWFzdXJlbWVudD4gUEFSRU5UX1RZUEVfTUVBU1VSRU1FTlQgPSBNZWFzdXJlbWVudC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgQ2hhbm5lbEdyb3VwfSBwYXJlbnQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPENoYW5uZWw+IFBBUkVOVF9UWVBFX0NIQU5ORUwgPSBDaGFubmVsLmNsYXNzOworCisJLyoqCisJICogVGhlICdWZXJzaW9uJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZFUlNJT04gPSAiVmVyc2lvbiI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVBhcmFtZXRlclNldChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFBhcmFtZXRlcn0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBQYXJhbWV0ZXJ9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgUGFyYW1ldGVyfSB3aXRoIGdpdmVuIG5hbWUKKwkgKiAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0UGFyYW1ldGVycygpLnN0cmVhbSgpLmZpbHRlcihwIC0+IHAubmFtZUVxdWFscyhuYW1lKSkuZmluZEFueSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSB7QGxpbmsgUGFyYW1ldGVyfXMgcmVsYXRlZCB0byB0aGlzIHBhcmFtZXRlciBzZXQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFBhcmFtZXRlci5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIFBhcmFtZXRlcn0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFBhcmFtZXRlcn0gdGhhdCBoYXZlIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIFBhcmFtZXRlcn0gd2l0aCBnaXZlbiBuYW1lIGhhcworCSAqICAgICAgICAgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVBhcmFtZXRlcihTdHJpbmcgbmFtZSkgeworCQlPcHRpb25hbDxQYXJhbWV0ZXI+IHBhcmFtZXRlciA9IGdldFBhcmFtZXRlcihuYW1lKTsKKwkJaWYgKHBhcmFtZXRlci5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUocGFyYW1ldGVyLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhpcyBwYXJhbWV0ZXIgc2V0LgorCSAqCisJICogQHJldHVybiBUaGUgdmVyc2lvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1ZFUlNJT04pLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB2ZXJzaW9uIGZvciB0aGlzIHBhcmFtZXRlciBzZXQuCisJICoKKwkgKiBAcGFyYW0gdmVyc2lvbiBUaGUgbmV3IHZlcnNpb24uCisJICovCisJcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikgeworCQlnZXRWYWx1ZShBVFRSX1ZFUlNJT04pLnNldCh2ZXJzaW9uKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKS5hcHBlbmQoJygnKTsKKwkJc2IuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisJCXJldHVybiBzYi5hcHBlbmQoIiwgUGFyYW1ldGVycyA9ICIpLmFwcGVuZChnZXRQYXJhbWV0ZXJzKCkpLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGh5c2ljYWxEaW1lbnNpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9QaHlzaWNhbERpbWVuc2lvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjdiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUGh5c2ljYWxEaW1lbnNpb24uamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHBoeXNpY2FsIGRpbWVuc2lvbiBlbnRpdHkgdHlwZS4gRWFjaCB7QGxpbmsgVW5pdH0gbXVzdAorICogaGF2ZSBhIHJlbGF0aW9uIHRvIGFuIGluc3RhbmNlIG9mIHRoaXMgdHlwZS4gVGhlIGF0dHJpYnV0ZXMgcmVwcmVzZW50IHRoZQorICogZXhwb25lbnRzIG9mIHRoZSBzZXZlbiBTSSBiYXNlIHVuaXRzIGFuZCBhZGRpdGlvbmFsbHkgdGhlIGFuZ2xlIGV4cG9uZW50IGFzCisgKiBkZWZpbmVkIGluIHRoZSBBU0FNIE5WSCBtb2RlbC4gQSB7QGNvZGUgVW5pdH0gd2l0aCBhIGNlcnRhaW4gcGh5c2ljYWwKKyAqIGRpbWVuc2lvbiBjYW4gYmUgY29udmVydGVkIHRvIGFsbCB1bml0cyBoYXZpbmcgdGhlIHNhbWUgcmVsYXRpb24uIE5hbWVzIG9mCisgKiB0aGUgcGh5c2ljYWwgZGltZW5zaW9ucyBoYXZlIHRvIGJlIHVuaXF1ZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFBoeXNpY2FsRGltZW5zaW9uIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlc2NyaWJhYmxlLCBEZWxldGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnTGVuZ3RoJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xFTkdUSCA9ICJMZW5ndGgiOworCisJLyoqCisJICogVGhlICdNYXNzJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01BU1MgPSAiTWFzcyI7CisKKwkvKioKKwkgKiBUaGUgJ1RpbWUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVElNRSA9ICJUaW1lIjsKKworCS8qKgorCSAqIFRoZSAnQ3VycmVudCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DVVJSRU5UID0gIkN1cnJlbnQiOworCisJLyoqCisJICogVGhlICdUZW1wZXJhdHVyZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9URU1QRVJBVFVSRSA9ICJUZW1wZXJhdHVyZSI7CisKKwkvKioKKwkgKiBUaGUgJ01vbGFyQW1vdW50JyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01PTEFSX0FNT1VOVCA9ICJNb2xhckFtb3VudCI7CisKKwkvKioKKwkgKiBUaGUgJ0x1bWlub3VzSW50ZW5zaXR5JyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0xVTUlOT1VTX0lOVEVOU0lUWSA9ICJMdW1pbm91c0ludGVuc2l0eSI7CisKKwkvKioKKwkgKiBUaGUgJ0FuZ2xlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FOR0xFID0gImFuZ2xlIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJUGh5c2ljYWxEaW1lbnNpb24oQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxlbmd0aCBleHBvbmVudCBvZiB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGxlbmd0aCBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0xFTkdUSCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGxlbmd0aCBleHBvbmVudCBmb3IgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcGFyYW0gZXhwb25lbnQgVGhlIG5ldyBsZW5ndGggZXhwb25lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgZXhwb25lbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9MRU5HVEgpLnNldChleHBvbmVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWFzcyBleHBvbmVudCBvZiB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1hc3MgZXhwb25lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEludGVnZXIgZ2V0TWFzcygpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUFTUykuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IG1hc3MgZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgbWFzcyBleHBvbmVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXNzKEludGVnZXIgZXhwb25lbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NQVNTKS5zZXQoZXhwb25lbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHRpbWUgZXhwb25lbnQgb2YgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB0aW1lIGV4cG9uZW50IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldFRpbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1RJTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB0aW1lIGV4cG9uZW50IGZvciB0aGlzIHBoeXNpY2FsIGRpbWVuc2lvbi4KKwkgKgorCSAqIEBwYXJhbSBleHBvbmVudCBUaGUgbmV3IHRpbWUgZXhwb25lbnQuCisJICovCisJcHVibGljIHZvaWQgc2V0VGltZShJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfVElNRSkuc2V0KGV4cG9uZW50KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGV4cG9uZW50IG9mIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgY3VycmVudCBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRDdXJyZW50KCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9DVVJSRU5UKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgY3VycmVudCBleHBvbmVudCBmb3IgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcGFyYW0gZXhwb25lbnQgVGhlIG5ldyBjdXJyZW50IGV4cG9uZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHNldEN1cnJlbnQoSW50ZWdlciBleHBvbmVudCkgeworCQlnZXRWYWx1ZShBVFRSX0NVUlJFTlQpLnNldChleHBvbmVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdGVtcGVyYXR1cmUgZXhwb25lbnQgb2YgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB0ZW1wZXJhdHVyZSBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRUZW1wZXJhdHVyZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfVEVNUEVSQVRVUkUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB0ZW1wZXJhdHVyZSBleHBvbmVudCBmb3IgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcGFyYW0gZXhwb25lbnQgVGhlIG5ldyB0ZW1wZXJhdHVyZSBleHBvbmVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUZW1wZXJhdHVyZShJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfVEVNUEVSQVRVUkUpLnNldChleHBvbmVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbW9sYXIgYW1vdW50IGV4cG9uZW50IG9mIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgbW9sYXIgYW1vdW50IGV4cG9uZW50IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldE1vbGFyQW1vdW50KCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NT0xBUl9BTU9VTlQpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBtb2xhciBhbW91bnQgZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgbW9sYXIgYW1vdW50IGV4cG9uZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1vbGFyQW1vdW50KEludGVnZXIgZXhwb25lbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NT0xBUl9BTU9VTlQpLnNldChleHBvbmVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbHVtaW5vdXMgaW50ZW5zaXR5IGV4cG9uZW50IG9mIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHJldHVybiBUaGUgbHVtaW5vdXMgaW50ZW5zaXR5IGV4cG9uZW50IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldEx1bWlub3VzSW50ZW5zaXR5KCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9MVU1JTk9VU19JTlRFTlNJVFkpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBsdW1pbm91cyBpbnRlbnNpdHkgZXhwb25lbnQgZm9yIHRoaXMgcGh5c2ljYWwgZGltZW5zaW9uLgorCSAqCisJICogQHBhcmFtIGV4cG9uZW50IFRoZSBuZXcgbHVtaW5vdXMgaW50ZW5zaXR5IGV4cG9uZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHNldEx1bWlub3VzSW50ZW5zaXR5KEludGVnZXIgZXhwb25lbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9MVU1JTk9VU19JTlRFTlNJVFkpLnNldChleHBvbmVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYW5nbGUgZXhwb25lbnQgb2YgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhbmdsZSBleHBvbmVudCBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgSW50ZWdlciBnZXRBbmdsZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQU5HTEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBhbmdsZSBleHBvbmVudCBmb3IgdGhpcyBwaHlzaWNhbCBkaW1lbnNpb24uCisJICoKKwkgKiBAcGFyYW0gZXhwb25lbnQgVGhlIG5ldyBhbmdsZSBleHBvbmVudC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBbmdsZShJbnRlZ2VyIGV4cG9uZW50KSB7CisJCWdldFZhbHVlKEFUVFJfQU5HTEUpLnNldChleHBvbmVudCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUXVhbnRpdHkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9RdWFudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTljYjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvUXVhbnRpdHkuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHF1YW50aXR5IGVudGl0eSB0eXBlLiB7QGxpbmsgQ2hhbm5lbH1zIGFyZSBiYXNlZCBvbgorICogZW50aXRpZXMgb2YgdGhpcyB0eXBlLiBFYWNoIHF1YW50aXR5IGhhcyBhIHJlbGF0aW9uIHRvIGEgZGVmYXVsdAorICoge0BsaW5rIFVuaXR9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgUXVhbnRpdHkgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlICdEZWZhdWx0UmFuaycgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1JBTksgPSAiRGVmYXVsdFJhbmsiOworCisJLyoqCisJICogVGhlICdEZWZhdWx0RGltZW5zaW9uJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFRkFVTFRfRElNRU5TSU9OID0gIkRlZkRpbWVuc2lvbiI7CisKKwkvKioKKwkgKiBUaGUgJ0RlZmF1bHRUeXBlU2l6ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1RZUEVfU0laRSA9ICJEZWZUeXBlU2l6ZSI7CisKKwkvKioKKwkgKiBUaGUgJ0RlZmF1bHRDaGFubmVsTmFtZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0NIQU5ORUxfTkFNRSA9ICJEZWZNUU5hbWUiOworCisJLyoqCisJICogVGhlICdEZWZhdWx0U2NhbGFyVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1NDQUxBUl9UWVBFID0gIkRlZkRhdGFUeXBlIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJUXVhbnRpdHkoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgcmFuayBvZiB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCByYW5rIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRSYW5rKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1JBTkspLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBkZWZhdWx0IHJhbmsgZm9yIHRoaXMgcXVhbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdFJhbmsgVGhlIG5ldyBkZWZhdWx0IHJhbmsuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFJhbmsoSW50ZWdlciBkZWZhdWx0UmFuaykgeworCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfUkFOSykuc2V0KGRlZmF1bHRSYW5rKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGRpbWVuc2lvbiBvZiB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCBkaW1lbnNpb24gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIGludFtdIGdldERlZmF1bHREaW1lbnNpb24oKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFRkFVTFRfRElNRU5TSU9OKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVmYXVsdCBkaW1lbnNpb24gZm9yIHRoaXMgcXVhbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdERpbWVuc2lvbiBUaGUgbmV3IGRlZmF1bHQgZGltZW5zaW9uLgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlZmF1bHREaW1lbnNpb24oaW50W10gZGVmYXVsdERpbWVuc2lvbikgeworCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfRElNRU5TSU9OKS5zZXQoZGVmYXVsdERpbWVuc2lvbik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB0eXBlIHNpemUgb2YgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQgdHlwZSBzaXplIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRUeXBlU2l6ZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREVGQVVMVF9UWVBFX1NJWkUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBkZWZhdWx0IHR5cGUgc2l6ZSBmb3IgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0VHlwZVNpemUgVGhlIG5ldyBkZWZhdWx0IHR5cGUgc2l6ZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VHlwZVNpemUoSW50ZWdlciBkZWZhdWx0VHlwZVNpemUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1RZUEVfU0laRSkuc2V0KGRlZmF1bHRUeXBlU2l6ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB7QGxpbmsgQ2hhbm5lbH0gbmFtZSBvZiB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCB7QGNvZGUgQ2hhbm5lbH0gbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDaGFubmVsTmFtZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREVGQVVMVF9DSEFOTkVMX05BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBkZWZhdWx0IHtAbGluayBDaGFubmVsfSBuYW1lIGZvciB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlZmF1bHRDaGFubmVsTmFtZSBUaGUgbmV3IGRlZmF1bHQge0Bjb2RlIENoYW5uZWx9IG5hbWUuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdENoYW5uZWxOYW1lKFN0cmluZyBkZWZhdWx0Q2hhbm5lbE5hbWUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0NIQU5ORUxfTkFNRSkuc2V0KGRlZmF1bHRDaGFubmVsTmFtZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZGVmYXVsdCB7QGxpbmsgU2NhbGFyVHlwZX0gb2YgdGhpcyBxdWFudGl0eS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlZmF1bHQge0Bjb2RlIFNjYWxhclR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTY2FsYXJUeXBlIGdldERlZmF1bHRTY2FsYXJUeXBlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1NDQUxBUl9UWVBFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVmYXVsdCB7QGxpbmsgU2NhbGFyVHlwZX0gZm9yIHRoaXMgcXVhbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdFNjYWxhclR5cGUgVGhlIG5ldyBkZWZhdWx0IHtAY29kZSBTY2FsYXJUeXBlfS4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4ge0Bjb2RlIFNjYWxhclR5cGV9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFNjYWxhclR5cGUjVU5LTk9XTn0uCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFNjYWxhclR5cGUoU2NhbGFyVHlwZSBkZWZhdWx0U2NhbGFyVHlwZSkgeworCQlpZiAoZGVmYXVsdFNjYWxhclR5cGUuaXNVbmtub3duKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJEZWZhdWx0IHNjYWxhciB0eXBlIGNvbnN0YW50IGlzIG5vdCBhbGxvd2VkIHRvIGJlICciICsgZGVmYXVsdFNjYWxhclR5cGUgKyAiJy4iKTsKKwkJfQorCisJCWdldFZhbHVlKEFUVFJfREVGQVVMVF9TQ0FMQVJfVFlQRSkuc2V0KGRlZmF1bHRTY2FsYXJUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHtAbGluayBVbml0fSBvZiB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCB7QGNvZGUgVW5pdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFVuaXQgZ2V0RGVmYXVsdFVuaXQoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFVuaXQuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IGRlZmF1bHQge0BsaW5rIFVuaXR9IGZvciB0aGlzIHF1YW50aXR5LgorCSAqCisJICogQHBhcmFtIGRlZmF1bHRVbml0IFRoZSBuZXcgZGVmYXVsdCB7QGNvZGUgVW5pdH0uCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFVuaXQoVW5pdCBkZWZhdWx0VW5pdCkgeworCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGRlZmF1bHRVbml0KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9TY2FsYXJUeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU2NhbGFyVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOGVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU2NhbGFyVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDM0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CisKKy8qKgorICogU2NhbGFyIHR5cGUgZW51bWVyYXRpb24gaXMgYSB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IGZhY3RvcnkuIEFub3RoZXIgY29udGV4dAorICogd2hlcmUgdGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIGlzIHRoZSBzdG9yYWdlIG9mIHZhbHVlcywgcmVwcmVzZW50ZWQgYnkgdGhlCisgKiBjb25zdGFudHMgb2YgdGhpcyBlbnVtZXJhdGlvbiwgaW4gdGhlaXIge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gKHNlZToKKyAqIHtAbGluayBCYXNlUGFyYW1ldGVyfSkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KKworcHVibGljIGZpbmFsIGNsYXNzIFNjYWxhclR5cGUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCS8qKgorCSAqIEEge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhbiBhcnJheSBzZXF1ZW5jZSBvZgorCSAqIHtAY29kZSBTdHJpbmd9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgU1RSSU5HID0gbmV3IFNjYWxhclR5cGUoMCwgIlNUUklORyIsIFZhbHVlVHlwZS5TVFJJTkdfU0VRVUVOQ0UsIFN0cmluZy5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgTG9jYWxEYXRlVGltZX0gdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBEQVRFID0gbmV3IFNjYWxhclR5cGUoMSwgIkRBVEUiLCBWYWx1ZVR5cGUuREFURV9TRVFVRU5DRSwgTG9jYWxEYXRlVGltZS5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgYm9vbGVhbn0gdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBCT09MRUFOID0gbmV3IFNjYWxhclR5cGUoMiwgIkJPT0xFQU4iLCBWYWx1ZVR5cGUuQk9PTEVBTl9TRVFVRU5DRSwgYm9vbGVhbi5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgYnl0ZX0gdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBCWVRFID0gbmV3IFNjYWxhclR5cGUoMywgIkJZVEUiLCBWYWx1ZVR5cGUuQllURV9TRVFVRU5DRSwgYnl0ZS5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgc2hvcnR9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgU0hPUlQgPSBuZXcgU2NhbGFyVHlwZSg0LCAiU0hPUlQiLCBWYWx1ZVR5cGUuU0hPUlRfU0VRVUVOQ0UsIHNob3J0LmNsYXNzKTsKKworCS8qKgorCSAqIEEge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhbiBhcnJheSBzZXF1ZW5jZSBvZgorCSAqIHtAY29kZSBpbnR9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgSU5URUdFUiA9IG5ldyBTY2FsYXJUeXBlKDUsICJJTlRFR0VSIiwgVmFsdWVUeXBlLklOVEVHRVJfU0VRVUVOQ0UsIGludC5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgbG9uZ30gdmFsdWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2NhbGFyVHlwZSBMT05HID0gbmV3IFNjYWxhclR5cGUoNiwgIkxPTkciLCBWYWx1ZVR5cGUuTE9OR19TRVFVRU5DRSwgbG9uZy5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgZmxvYXR9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgRkxPQVQgPSBuZXcgU2NhbGFyVHlwZSg3LCAiRkxPQVQiLCBWYWx1ZVR5cGUuRkxPQVRfU0VRVUVOQ0UsIGZsb2F0LmNsYXNzKTsKKworCS8qKgorCSAqIEEge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhbiBhcnJheSBzZXF1ZW5jZSBvZgorCSAqIHtAY29kZSBkb3VibGV9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgRE9VQkxFID0gbmV3IFNjYWxhclR5cGUoOCwgIkRPVUJMRSIsIFZhbHVlVHlwZS5ET1VCTEVfU0VRVUVOQ0UsIGRvdWJsZS5jbGFzcyk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgYnl0ZVtdfSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIEJZVEVfU1RSRUFNID0gbmV3IFNjYWxhclR5cGUoOSwgIkJZVEVfU1RSRUFNIiwgVmFsdWVUeXBlLkJZVEVfU1RSRUFNX1NFUVVFTkNFLAorCQkJYnl0ZVtdLmNsYXNzKTsKKworCS8qKgorCSAqIEEge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhbiBhcnJheSBzZXF1ZW5jZSBvZgorCSAqIHtAY29kZSBGbG9hdENvbXBsZXh9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgRkxPQVRfQ09NUExFWCA9IG5ldyBTY2FsYXJUeXBlKDEwLCAiRkxPQVRfQ09NUExFWCIsIFZhbHVlVHlwZS5GTE9BVF9DT01QTEVYX1NFUVVFTkNFLAorCQkJRmxvYXRDb21wbGV4LmNsYXNzKTsKKworCS8qKgorCSAqIEEge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhbiBhcnJheSBzZXF1ZW5jZSBvZgorCSAqIHtAY29kZSBEb3VibGVDb21wbGV4fSB2YWx1ZXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIERPVUJMRV9DT01QTEVYID0gbmV3IFNjYWxhclR5cGUoMTEsICJET1VCTEVfQ09NUExFWCIsCisJCQlWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0UsIERvdWJsZUNvbXBsZXguY2xhc3MpOworCisJLyoqCisJICoge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSBhcmUgbm90IGFsbG93ZWQgdG8gYmUgb2YgdGhpcyB0eXBlLiBUaGlzIGNvbnN0YW50IG1heQorCSAqIGJlIHVzZWQgaW4gb3RoZXIgY29udGV4dHMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIEVOVU1FUkFUSU9OID0gbmV3IFNjYWxhclR5cGUoMTIsICJFTlVNRVJBVElPTiIsIFZhbHVlVHlwZS5FTlVNRVJBVElPTl9TRVFVRU5DRSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBNZWFzdXJlZFZhbHVlc30gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYW4gYXJyYXkgc2VxdWVuY2Ugb2YKKwkgKiB7QGNvZGUgRmlsZUxpbmt9IHZhbHVlcy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgRklMRV9MSU5LID0gbmV3IFNjYWxhclR5cGUoMTMsICJGSUxFX0xJTksiLCBWYWx1ZVR5cGUuRklMRV9MSU5LX1NFUVVFTkNFLAorCQkJRmlsZUxpbmsuY2xhc3MpOworCisJLyoqCisJICogVE9ETyAuLi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNjYWxhclR5cGUgQkxPQiA9IG5ldyBTY2FsYXJUeXBlKDE0LCAiQkxPQiIsIFZhbHVlVHlwZS5CTE9CLCBPYmplY3QuY2xhc3MpOworCisJLyoqCisJICoge0BsaW5rIE1lYXN1cmVkVmFsdWVzfSBhcmUgbm90IGFsbG93ZWQgdG8gYmUgb2YgdGhpcyB0eXBlLiBUaGlzIGNvbnN0YW50IG1heQorCSAqIGJlIHVzZWQgaW4gb3RoZXIgY29udGV4dHMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTY2FsYXJUeXBlIFVOS05PV04gPSBuZXcgU2NhbGFyVHlwZSgxNSwgIlVOS05PV04iLCBWYWx1ZVR5cGUuVU5LTk9XTik7CisKKwlwcml2YXRlIGZpbmFsIFZhbHVlVHlwZSB2YWx1ZVR5cGU7CisJcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBhcnJheVR5cGU7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gb3JkICAgICAgIG9yZGluYWwgbnVtYmVyIG9mIHRoZSBlbnVtIHZhbHVlCisJICogQHBhcmFtIG5hbWUgICAgICBuYW1lIG9mIHRoZSBlbnVtIHZhbHVlCisJICogQHBhcmFtIHZhbHVlVHlwZSBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgVmFsdWVUeXBlfS4KKwkgKi8KKwlwcml2YXRlIFNjYWxhclR5cGUoaW50IG9yZCwgU3RyaW5nIG5hbWUsIFZhbHVlVHlwZSB2YWx1ZVR5cGUpIHsKKwkJc3VwZXIobmFtZSwgb3JkKTsKKwkJdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisJCWFycmF5VHlwZSA9IG51bGw7CisJfQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gb3JkICAgICAgICAgICBvcmRpbmFsIG51bWJlciBvZiB0aGUgZW51bSB2YWx1ZQorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgIG5hbWUgb2YgdGhlIGVudW0gdmFsdWUKKwkgKiBAcGFyYW0gdmFsdWVUeXBlICAgICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgVmFsdWVUeXBlfS4KKwkgKiBAcGFyYW0gY29tcG9uZW50VHlwZSBUaGUgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFycmF5IGhlbGQgYnkgaW5zdGFuY2VzIG9mCisJICogICAgICAgICAgICAgICAgICAgICAge0BsaW5rIE1lYXN1cmVkVmFsdWVzfS4KKwkgKi8KKwlwcml2YXRlIFNjYWxhclR5cGUoaW50IG9yZCwgU3RyaW5nIG5hbWUsIFZhbHVlVHlwZSB2YWx1ZVR5cGUsIENsYXNzPD8+IGNvbXBvbmVudFR5cGUpIHsKKwkJc3VwZXIobmFtZSwgb3JkKTsKKwkJdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7CisJCWFycmF5VHlwZSA9IEFycmF5Lm5ld0luc3RhbmNlKGNvbXBvbmVudFR5cGUsIDApLmdldENsYXNzKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTWVhc3VyZWRWYWx1ZXN9IGluaXRpYWxpemVkIHdpdGggZ2l2ZW4gbmFtZSwgdW5pdCBhbmQKKwkgKiB2YWx1ZXMgaW5jbHVkaW5nIHRoZSByZWxhdGVkIHZhbGlkaXR5IGZsYWdzLgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBDaGFubmVsfS4KKwkgKiBAcGFyYW0gdW5pdCAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSB1bml0IHRoZSBjb250YWluZWQgdmFsdWVzIGFyZSBvZi4KKwkgKiBAcGFyYW0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbiBUaGUge0BsaW5rIFNlcXVlbmNlUmVwcmVzZW50YXRpb259IG9mIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcGFyYW0gaW5kZXBlbmRlbnQgICAgICAgICAgICBUaGUgaW5kZXBlbmRlbnQgZmxhZyBvZiB0aGUgbWVhc3VyZWQgdmFsdWVzLgorCSAqIEBwYXJhbSBheGlzVHlwZSAgICAgICAgICAgICAgIFRoZSB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoZSBtZWFzdXJlZCB2YWx1ZXMuCisJICogQHBhcmFtIGlucHV0ICAgICAgICAgICAgICAgICAgVGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcGFyYW0gZmxhZ3MgICAgICAgICAgICAgICAgICBUaGUgdmFsaWRpdHkgZmxhZ3Mgb2YgdGhlIG1lYXN1cmVkIHZhbHVlcy4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBNZWFzdXJlZFZhbHVlc30gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgVGhyb3duIGlmIHtAbGluayAjaXNFbnVtZXJhdGlvbigpfSBvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayAjaXNVbmtub3duKCl9IHJldHVybnMge0Bjb2RlIHRydWV9LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB2YWx1ZXMgYXJlIG5vdCBhc3NpZ25tZW50CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZS4KKwkgKi8KKwlwdWJsaWMgTWVhc3VyZWRWYWx1ZXMgY3JlYXRlTWVhc3VyZWRWYWx1ZXMoU3RyaW5nIG5hbWUsIFN0cmluZyB1bml0LCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24sCisJCQlkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVycywgYm9vbGVhbiBpbmRlcGVuZGVudCwgQXhpc1R5cGUgYXhpc1R5cGUsIE9iamVjdCBpbnB1dCwgYm9vbGVhbltdIGZsYWdzKSB7CisJCWlmIChpc0VudW1lcmF0aW9uKCkgfHwgaXNVbmtub3duKCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBtZWFzdXJlZCB2YWx1ZXMgb2YgdHlwZSAnIiArIHRoaXMgKyAiJy4iKTsKKwkJfSBlbHNlIGlmICghYXJyYXlUeXBlLmlzSW5zdGFuY2UoaW5wdXQpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiB2YWx1ZXMgb2YgdHlwZSAnIiArIGlucHV0LmdldENsYXNzKCkgKyAiJy4iKTsKKwkJfQorCisJCXJldHVybiBuZXcgTWVhc3VyZWRWYWx1ZXModGhpcywgbmFtZSwgdW5pdCwgc2VxdWVuY2VSZXByZXNlbnRhdGlvbiwgZ2VuZXJhdGlvblBhcmFtZXRlcnMsIGluZGVwZW5kZW50LCBheGlzVHlwZSwKKwkJCQlpbnB1dCwgZmxhZ3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjU1RSSU5HfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0cmluZygpIHsKKwkJcmV0dXJuIFNUUklORyA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjREFURX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEYXRlKCkgeworCQlyZXR1cm4gREFURSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjQk9PTEVBTn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb29sZWFuKCkgeworCQlyZXR1cm4gQk9PTEVBTiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIG9uIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjQllURX08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNOdW1lcmljYWxUeXBlKCkgeworCQlyZXR1cm4gaXNJbnRlZ2VyVHlwZSgpIHx8IGlzRmxvYXRUeXBlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgb24gb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayAjU0hPUlR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayAjTE9OR308L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlZ2VyVHlwZSgpIHsKKwkJcmV0dXJuIGlzQnl0ZSgpIHx8IGlzU2hvcnQoKSB8fCBpc0ludGVnZXIoKSB8fCBpc0xvbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0JZVEV9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnl0ZSgpIHsKKwkJcmV0dXJuIEJZVEUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI1NIT1JUfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Nob3J0KCkgeworCQlyZXR1cm4gU0hPUlQgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0lOVEVHRVJ9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZWdlcigpIHsKKwkJcmV0dXJuIElOVEVHRVIgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0xPTkd9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9uZygpIHsKKwkJcmV0dXJuIExPTkcgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBvbiBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0VHlwZSgpIHsKKwkJcmV0dXJuIGlzRmxvYXQoKSB8fCBpc0RvdWJsZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjRkxPQVR9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXQoKSB7CisJCXJldHVybiBGTE9BVCA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjRE9VQkxFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0RvdWJsZSgpIHsKKwkJcmV0dXJuIERPVUJMRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjQllURV9TVFJFQU19LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnl0ZVN0cmVhbSgpIHsKKwkJcmV0dXJuIEJZVEVfU1RSRUFNID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgb24gb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9DT01QTEVYfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFX0NPTVBMRVh9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29tcGxleFR5cGUoKSB7CisJCXJldHVybiBpc0Zsb2F0Q29tcGxleCgpIHx8IGlzRG91YmxlQ29tcGxleCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjRkxPQVRfQ09NUExFWH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGbG9hdENvbXBsZXgoKSB7CisJCXJldHVybiBGTE9BVF9DT01QTEVYID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2NhbGFyIHR5cGUgaXMge0BsaW5rICNET1VCTEVfQ09NUExFWH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEb3VibGVDb21wbGV4KCkgeworCQlyZXR1cm4gRE9VQkxFX0NPTVBMRVggPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0VOVU1FUkFUSU9OfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VudW1lcmF0aW9uKCkgeworCQlyZXR1cm4gRU5VTUVSQVRJT04gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzY2FsYXIgdHlwZSBpcyB7QGxpbmsgI0ZJTEVfTElOS30uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGaWxlTGluaygpIHsKKwkJcmV0dXJuIEZJTEVfTElOSyA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjQkxPQn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCbG9iKCkgeworCQlyZXR1cm4gQkxPQiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNjYWxhciB0eXBlIGlzIHtAbGluayAjVU5LTk9XTn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNVbmtub3duKCkgeworCQlyZXR1cm4gVU5LTk9XTiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFZhbHVlVHlwZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBWYWx1ZVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZVR5cGUgdG9WYWx1ZVR5cGUoKSB7CisJCXJldHVybiB2YWx1ZVR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbm9uIHNlcXVlbmNlIHtAbGluayBWYWx1ZVR5cGV9IG9mIHRoZSBhc3NvY2lhdGVkIHtAY29kZQorCSAqIFZhbHVlVHlwZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBub24gc2VxdWVuY2Uge0Bjb2RlIFZhbHVlVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlVHlwZSB0b1NpbmdsZVZhbHVlVHlwZSgpIHsKKwkJcmV0dXJuIHZhbHVlVHlwZS50b1NpbmdsZVR5cGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NlcXVlbmNlUmVwcmVzZW50YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWFiMGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1NlcXVlbmNlUmVwcmVzZW50YXRpb24uamF2YQpAQCAtMCwwICsxLDI2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gdG8gZGVzY3JpYmUgdGhlIHN0b3JhZ2UgdHlwZSBvZiBtZWFzdXJlZCB2YWx1ZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENoYW5uZWwKKyAqLworcHVibGljIGNsYXNzIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBNZWFzdXJlZCB2YWx1ZXMgYXJlIHN0b3JlZCBhcyBpcyBhbmQgdmFsdWVzIGFyZSB0aGVyZWZvcmUgaW1tZWRpYXRlbHkKKwkgKiBhdmFpbGFibGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIEVYUExJQ0lUID0gbmV3IFNlcXVlbmNlUmVwcmVzZW50YXRpb24oIkVYUExJQ0lUIiwgMCk7CisKKwkvKioKKwkgKiBFYWNoIHZhbHVlIHg8c3ViPmk8L3N1Yj4gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6IHg8c3ViPmk8L3N1Yj4gPSBwIGZvciBpCisJICogJmlzaW47IFsxLCBuXSwgbiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZ2VuZXJhdGlvbiBwYXJhbWV0ZXIgcAorCSAqIChvZmZzZXQpLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBJTVBMSUNJVF9DT05TVEFOVCA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJJTVBMSUNJVF9DT05TVEFOVCIsIDEpOworCisJLyoqCisJICogRWFjaCB2YWx1ZSB4PHN1Yj5pPC9zdWI+IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOiB4PHN1Yj5pPC9zdWI+ID0KKwkgKiBwPHN1Yj4xPC9zdWI+KyhpLTEpKnA8c3ViPjI8L3N1Yj4gZm9yIGkgJmlzaW47IFsxLCBuXSwgbiBpcyB0aGUgdG90YWwgbnVtYmVyCisJICogb2YgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgcDxzdWI+MTwvc3ViPiAoc3RhcnQgdmFsdWUpIGFuZAorCSAqIHA8c3ViPjI8L3N1Yj4gKGluY3JlbWVudCkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIElNUExJQ0lUX0xJTkVBUiA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJJTVBMSUNJVF9MSU5FQVIiLCAyKTsKKworCS8qKgorCSAqIEVhY2ggdmFsdWUgeDxzdWI+aTwvc3ViPiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czogeDxzdWI+aTwvc3ViPiA9CisJICogcDxzdWI+MTwvc3ViPisoKGktMSltb2QocDxzdWI+Mzwvc3ViPi1wPHN1Yj4xPC9zdWI+KS9wPHN1Yj4yPC9zdWI+KSoKKwkgKiBwPHN1Yj4yPC9zdWI+IGZvciBpICZpc2luOyBbMSwgbl0sIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgYW5kCisJICogZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIHA8c3ViPjE8L3N1Yj4gKHN0YXJ0IHZhbHVlKSwgcDxzdWI+Mjwvc3ViPiAoaW5jcmVtZW50KQorCSAqIGFuZCBwPHN1Yj4zPC9zdWI+IChudW1iZXIgb2YgdmFsdWVzIHBlciBzYXcpLiBUaGUgZXhwcmVzc2lvbgorCSAqIChwPHN1Yj4zPC9zdWI+LXA8c3ViPjE8L3N1Yj4pL3A8c3ViPjI8L3N1Yj4gbXVzdCBiZSB0cnVuY2F0ZWQgdG8gaW50ZWdlciB0bworCSAqIHN0YXJ0IGVhY2ggc2F3IGN1cnZlIGN5Y2xlIGF0IHA8c3ViPjE8L3N1Yj4uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIElNUExJQ0lUX1NBVyA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJJTVBMSUNJVF9TQVciLCAzKTsKKworCS8qKgorCSAqIEVhY2ggdmFsdWUgeDxzdWI+aTwvc3ViPiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czogeDxzdWI+aTwvc3ViPiA9CisJICogcDxzdWI+MTwvc3ViPitwPHN1Yj4yPC9zdWI+KnI8c3ViPmk8L3N1Yj4gZm9yIGkgJmlzaW47IFsxLCBuXSwgbiBpcyB0aGUgdG90YWwKKwkgKiBudW1iZXIgb2YgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgcDxzdWI+MTwvc3ViPiAob2Zmc2V0KSwKKwkgKiBwPHN1Yj4yPC9zdWI+IChmYWN0b3IpIGFuZCB0aGUgcmF3IHZhbHVlIHIgYXQgcG9zaXRpb24gaS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gUkFXX0xJTkVBUiA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJSQVdfTElORUFSIiwgNCk7CisKKwkvKioKKwkgKiBFYWNoIHZhbHVlIHg8c3ViPmk8L3N1Yj4gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6IHg8c3ViPmk8L3N1Yj4gPSAmc3VtOworCSAqIHA8c3ViPmo8L3N1Yj4qcjxzdWI+aTwvc3ViPjxzdXA+ai0xPC9zdXA+ID0gcDxzdWI+Mjwvc3ViPitwPHN1Yj4zCisJICogPC9zdWI+KnI8c3ViPmk8L3N1Yj4rcDxzdWI+NDwvc3ViPipyPHN1Yj5pPC9zdWI+PHN1cD4yPC9zdXA+Ky4uLiBmb3IgaSAmaXNpbjsKKwkgKiBbMSwgbl0sIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgYW5kIGdlbmVyYXRpb24gcGFyYW1ldGVycworCSAqIHA8c3ViPmo8L3N1Yj4gZm9yIGogJmlzaW47IFsxLCBwPHN1Yj4xPC9zdWI+XSBhbmQgdGhlIHJhdyB2YWx1ZSByIGF0IHBvc2l0aW9uCisJICogaS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gUkFXX1BPTFlOT01JQUwgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiUkFXX1BPTFlOT01JQUwiLCA1KTsKKworCS8qCisJICogTm90IHVzZWQuIEJ1dCBrZWVwIGhlcmUgdG8gc2hvdyBvcmRpbmFsIHNlcXVlbmNlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBGT1JNVUxBID0gbmV3IFNlcXVlbmNlUmVwcmVzZW50YXRpb24oIkZPUk1VTEEiLCA2KTsKKworCS8qKgorCSAqIE1lYXN1cmVkIHZhbHVlcyBhcmUgc3RvcmVkIGFzIGlzIGluIGFuIGV4dGVybmFsIGZpbGUgYW5kIHZhbHVlcyBhcmUgdGhlcmVmb3JlCisJICogaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBFWFBMSUNJVF9FWFRFUk5BTCA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCJFWFBMSUNJVF9FWFRFUk5BTCIsIDcpOworCisJLyoqCisJICogRWFjaCB2YWx1ZSB4PHN1Yj5pPC9zdWI+IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOiB4PHN1Yj5pPC9zdWI+ID0KKwkgKiBwPHN1Yj4xPC9zdWI+K3A8c3ViPjI8L3N1Yj4qcjxzdWI+aTwvc3ViPiBmb3IgaSAmaXNpbjsgWzEsIG5dLCBuIGlzIHRoZSB0b3RhbAorCSAqIG51bWJlciBvZiB2YWx1ZXMgYW5kIGdlbmVyYXRpb24gcGFyYW1ldGVycyBwPHN1Yj4xPC9zdWI+IChvZmZzZXQpLAorCSAqIHA8c3ViPjI8L3N1Yj4gKGZhY3RvcikgYW5kIHRoZSByYXcgdmFsdWUgciBhdCBwb3NpdGlvbiBpIHJlYWQgZnJvbSBhbgorCSAqIGV4dGVybmFsIGZpbGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFJBV19MSU5FQVJfRVhURVJOQUwgPSBuZXcgU2VxdWVuY2VSZXByZXNlbnRhdGlvbigiUkFXX0xJTkVBUl9FWFRFUk5BTCIsCisJCQk4KTsKKworCS8qKgorCSAqIEVhY2ggdmFsdWUgeDxzdWI+aTwvc3ViPiBpcyBnZW5lcmF0ZWQgYXMgZm9sbG93czogeDxzdWI+aTwvc3ViPiA9ICZzdW07CisJICogcDxzdWI+ajwvc3ViPipyPHN1Yj5pPC9zdWI+PHN1cD5qLTE8L3N1cD4gPSBwPHN1Yj4yPC9zdWI+K3A8c3ViPjMKKwkgKiA8L3N1Yj4qcjxzdWI+aTwvc3ViPitwPHN1Yj40PC9zdWI+KnI8c3ViPmk8L3N1Yj48c3VwPjI8L3N1cD4rLi4uIGZvciBpICZpc2luOworCSAqIFsxLCBuXSwgbiBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbHVlcyBhbmQgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzCisJICogcDxzdWI+ajwvc3ViPiBmb3IgaiAmaXNpbjsgWzEsIHA8c3ViPjE8L3N1Yj5dIGFuZCB0aGUgcmF3IHZhbHVlIHIgYXQgcG9zaXRpb24KKwkgKiBpIHJlYWQgZnJvbSBhbiBleHRlcm5hbCBmaWxlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBSQVdfUE9MWU5PTUlBTF9FWFRFUk5BTCA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKAorCQkJIlJBV19QT0xZTk9NSUFMX0VYVEVSTkFMIiwgOSk7CisKKwkvKioKKwkgKiBFYWNoIHZhbHVlIHg8c3ViPmk8L3N1Yj4gaXMgZ2VuZXJhdGVkIGFzIGZvbGxvd3M6IHg8c3ViPmk8L3N1Yj4gPQorCSAqIChwPHN1Yj4xPC9zdWI+K3A8c3ViPjI8L3N1Yj4qcjxzdWI+aTwvc3ViPikqcDxzdWI+Mzwvc3ViPiBmb3IgaSAmaXNpbjsgWzEsCisJICogbl0sIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgYW5kIGdlbmVyYXRpb24gcGFyYW1ldGVycyBwPHN1Yj4xPC9zdWI+CisJICogKG9mZnNldCksIHA8c3ViPjI8L3N1Yj4gKGZhY3RvciksIHA8c3ViPjI8L3N1Yj4gKGNhbGlicmF0aW9uKSBhbmQgdGhlIHJhdworCSAqIHZhbHVlIHIgYXQgcG9zaXRpb24gaS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gUkFXX0xJTkVBUl9DQUxJQlJBVEVEID0gbmV3IFNlcXVlbmNlUmVwcmVzZW50YXRpb24oCisJCQkiUkFXX0xJTkVBUl9DQUxJQlJBVEVEIiwgMTApOworCisJLyoqCisJICogRWFjaCB2YWx1ZSB4PHN1Yj5pPC9zdWI+IGlzIGdlbmVyYXRlZCBhcyBmb2xsb3dzOiB4PHN1Yj5pPC9zdWI+ID0KKwkgKiAocDxzdWI+MTwvc3ViPitwPHN1Yj4yPC9zdWI+KnI8c3ViPmk8L3N1Yj4pKnA8c3ViPjM8L3N1Yj4gZm9yIGkgJmlzaW47IFsxLAorCSAqIG5dLCBuIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsdWVzIGFuZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgcDxzdWI+MTwvc3ViPgorCSAqIChvZmZzZXQpLCBwPHN1Yj4yPC9zdWI+IChmYWN0b3IpLCBwPHN1Yj4yPC9zdWI+IChjYWxpYnJhdGlvbikgYW5kIHRoZSByYXcKKwkgKiB2YWx1ZSByIGF0IHBvc2l0aW9uIGkgcmVhZCBmcm9tIGFuIGV4dGVybmFsIGZpbGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFJBV19MSU5FQVJfQ0FMSUJSQVRFRF9FWFRFUk5BTCA9IG5ldyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKAorCQkJIlJBV19MSU5FQVJfQ0FMSUJSQVRFRF9FWFRFUk5BTCIsIDExKTsKKworCXByaXZhdGUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbihTdHJpbmcgbmFtZSwgaW50IG9yZGluYWwpIHsKKwkJc3VwZXIobmFtZSwgb3JkaW5hbCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRVhQTElDSVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNFWFBMSUNJVF9FWFRFUk5BTH08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFeHBsaWNpdCgpIHsKKwkJcmV0dXJuIG5hbWUoKS5zdGFydHNXaXRoKCJFWFBMSUNJVCIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0lNUExJQ0lUX0NPTlNUQU5UfTwvbGk+CisJICogPGxpPntAbGluayAjSU1QTElDSVRfTElORUFSfTwvbGk+CisJICogPGxpPntAbGluayAjSU1QTElDSVRfU0FXfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpY2l0KCkgeworCQlyZXR1cm4gbmFtZSgpLnN0YXJ0c1dpdGgoIklNUExJQ0lUIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjSU1QTElDSVRfQ09OU1RBTlR9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ29uc3RhbnQoKSB7CisJCXJldHVybiBuYW1lKCkuY29udGFpbnMoIkNPTlNUQU5UIik7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjSU1QTElDSVRfTElORUFSfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJfRVhURVJOQUx9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0NBTElCUkFURUR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUx9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGluZWFyKCkgeworCQlyZXR1cm4gbmFtZSgpLmNvbnRhaW5zKCJMSU5FQVIiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNSQVdfUE9MWU5PTUlBTH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19QT0xZTk9NSUFMX0VYVEVSTkFMfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1BvbHlub21pYWwoKSB7CisJCXJldHVybiBuYW1lKCkuY29udGFpbnMoIlBPTFlOT01JQUwiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0NBTElCUkFURUR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUx9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQ2FsaWJyYXRlZCgpIHsKKwkJcmV0dXJuIG5hbWUoKS5jb250YWlucygiQ0FMSUJSQVRFRCIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0VYUExJQ0lUX0VYVEVSTkFMfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUl9FWFRFUk5BTH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19QT0xZTk9NSUFMX0VYVEVSTkFMfTwvbGk+CisJICogPGxpPntAbGluayAjUkFXX0xJTkVBUl9DQUxJQlJBVEVEX0VYVEVSTkFMfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgeworCQlyZXR1cm4gbmFtZSgpLmVuZHNXaXRoKCJFWFRFUk5BTCIpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlcXVlbmNlIHJlcHJlc2VudGF0aW9uIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJ9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfUE9MWU5PTUlBTH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJfRVhURVJOQUx9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNSQVdfUE9MWU5PTUlBTF9FWFRFUk5BTH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJfQ0FMSUJSQVRFRH08L2xpPgorCSAqIDxsaT57QGxpbmsgI1JBV19MSU5FQVJfQ0FMSUJSQVRFRF9FWFRFUk5BTH08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNSYXcoKSB7CisJCXJldHVybiBuYW1lKCkuc3RhcnRzV2l0aCgiUkFXIik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU29ydGFibGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Tb3J0YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NDVhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU29ydGFibGUuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUge0BsaW5rIEVudGl0eX0gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBnZXR0ZXIgYW5kCisgKiBzZXR0ZXIgbWV0aG9kcyBmb3IgdGhlICdTb3J0SW5kZXgnIGZpZWxkIG9mIGFuIGVudGl0eS4gVGhlIHZhbHVlIGluIHRoaXMKKyAqIGZpZWxkIGlzIHRoZSBpbmRleCBvZiBhbiBlbnRpdHkgcmVsYXRpdmUgdG8gYWxsIG90aGVyIGVudGl0aWVzIG9mIHRoZSBzYW1lCisgKiB0eXBlIGJlbmVhdGggdGhlaXIgc2hhcmVkIHBhcmVudC4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBTb3J0YWJsZSBleHRlbmRzIEVudGl0eSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhpcyB7QGNvZGUgQ29tcGFyYXRvcn0gY29tcGFyZXMgZW50aXRpZXMgaW1wbGVtZW50aW5nIHRoZSB7QGxpbmsgU29ydGFibGV9CisJICogaW50ZXJmYWNlIGJ5IHRoZSBtYW5kYXRvcnkge0BsaW5rICNBVFRSX1NPUlRfSU5ERVh9IHByb3BlcnR5IGluIGFzY2VuZGluZworCSAqIG9yZGVyLgorCSAqLworCUNvbXBhcmF0b3I8U29ydGFibGU+IENPTVBBUkFUT1IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhTb3J0YWJsZTo6Z2V0U29ydEluZGV4KTsKKworCS8qKgorCSAqIFRoZSAnU29ydEluZGV4JyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9TT1JUX0lOREVYID0gIlNvcnRpbmRleCI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzb3J0IGluZGV4IG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgc29ydCBpbmRleCBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IEludGVnZXIgZ2V0U29ydEluZGV4KCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9TT1JUX0lOREVYKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgc29ydCBpbmRleCBmb3IgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gc29ydEluZGV4IFRoZSBuZXcgc29ydCBpbmRleC4KKwkgKi8KKwlkZWZhdWx0IHZvaWQgc2V0U29ydEluZGV4KEludGVnZXIgc29ydEluZGV4KSB7CisJCWdldFZhbHVlKEFUVFJfU09SVF9JTkRFWCkuc2V0KHNvcnRJbmRleCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvU3RhdHVzQXR0YWNoYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1N0YXR1c0F0dGFjaGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGE2MTJiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1N0YXR1c0F0dGFjaGFibGUuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCisvKioKKyAqIEVhY2ggbW9kZWxlZCB7QGxpbmsgRW50aXR5fSBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHRvIGluZGljYXRlIHRoYXQgaXQgaGFzCisgKiBhIHN0YXR1cy4KKyAqCisgKiA8cD4KKyAqIDxiPk5vdGU6PC9iPiBTdGF0ZSBtYW5hZ2VtZW50IGlzIG5vdCBwYXJ0IG9mIHRoZSBiYXNlIGFwcGxpY2F0aW9uIG1vZGVsLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIFN0YXR1c0F0dGFjaGFibGUgZXh0ZW5kcyBFbnRpdHkgeworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVGFnYWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1RhZ2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2NhYmUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1RhZ2FibGUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCisvKioKKyAqIEVhY2ggbW9kZWxlZCB7QGxpbmsgRW50aXR5fSBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHRvIGluZGljYXRlIHRoYXQgdGFncworICogY2FuIGJlIGF0dGFjaGVkIHRvIGl0LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhZ2FibGUgZXh0ZW5kcyBFbnRpdHkgeworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY0MWQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRlc3QgZW50aXR5IHR5cGUuIFRoZSB0ZXN0IGdyb3VwcyBhIG51bWJlciBvZiBzaW5nbGUKKyAqIHtAbGluayBUZXN0U3RlcH1zLiBBIG1lYXN1cmVtZW50IG9yZGVyIGFsd2F5cyBjb3JyZXNwb25kcyB3aXRoIGV4YWN0bHkgb25lCisgKiB0ZXN0IGVudGl0eS4gVGhlIG5hbWUgb2YgYSB0ZXN0IHNob3VsZCBiZSBjaG9zZW4gaW4gYSBzcGVha2luZyB3YXksIGJlY2F1c2UKKyAqIGl0IGlzIG9mdGVuIHVzZWQgaW4gZGlmZmVyZW50IGNvbnRleHRzLCBlLmcuIGFzIGEgbGluayBiZXR3ZWVuIHRoZQorICogbWVhc3VyZW1lbnQgZGF0YSBmcm9tIHRoZSBkZXZpY2UgYW5kIHRoZSBvcmRlciBpbiB0aGUgZGF0YWJhc2UuIFRoaXMgdHlwZSBpcworICogYSByb290IG5vZGUgZm9yIHBlcnNpc3RlZCB0ZXN0cyB3aXRoaW4gYSBiYXNlIGFwcGxpY2F0aW9uIG1vZGVsLiBFeHRlbnNpb25zCisgKiBhcmUgZnJlZSB0byBpbnRyb2R1Y2UgbmV3IGVudGl0eSB0eXBlcyB0aGF0IG1heSBhY3QgYXMgYW4gaW1tZWRpYXRlIHBhcmVudAorICogZm9yIGVudGl0aWVzIG9mIHRoaXMgdHlwZS4gSW4gc3VjaCBjYXNlcyB0ZXN0cyBoYXZlIHRvIGJlIHVuaXF1ZSB1bmRlciB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgcGFyZW50LiBDaGlsZHJlbiBvZiBhIHRlc3QgYXJlIHtAY29kZSBUZXN0U3RlcH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgVGVzdCBleHRlbmRzIEJhc2VFbnRpdHkKKwkJaW1wbGVtZW50cyBEYXRhYmxlLCBEZWxldGFibGUsIERlc2NyaWJhYmxlLCBGaWxlc0F0dGFjaGFibGUsIFRhZ2FibGUsIFN0YXR1c0F0dGFjaGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSB7QGxpbmsgVGVzdFN0ZXB9IGNoaWxkIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxUZXN0U3RlcD4gQ0hJTERfVFlQRV9URVNUU1RFUCA9IFRlc3RTdGVwLmNsYXNzOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlUZXN0KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVXNlcn0gd2hvIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRlc3QuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGRhdGEgc291cmNlIGRvZXMgbm90IHByb3ZpZGUgYW55CisJICogICAgICAgICB7QGNvZGUgVXNlcn0gZW50aXRpZXMgYXQgYWxsLCB3aGljaCBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyEKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VXNlcj4gZ2V0UmVzcG9uc2libGVQZXJzb24oKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVXNlci5jbGFzcykpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHtAbGluayBVc2VyfSBhcyB0aGUgcmVzcG9uc2libGUgcGVyc29uIGZvciB0aGlzIHRlc3QuCisJICoKKwkgKiBAcGFyYW0gcmVzcG9uc2libGVQZXJzb24gVGhlIG5ldyByZXNwb25zaWJsZSBwZXJzb24uCisJICovCisJcHVibGljIHZvaWQgc2V0UmVzcG9uc2libGVQZXJzb24oVXNlciByZXNwb25zaWJsZVBlcnNvbikgeworCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHJlc3BvbnNpYmxlUGVyc29uKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb21taXNzaW9uZWQge0BsaW5rIFRlc3RTdGVwfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlc3RTdGVwfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlc3RTdGVwfSB3aXRoIGdpdmVuIG5hbWUKKwkgKiAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZXN0U3RlcD4gZ2V0Q29tbWlzc2lvbmVkVGVzdFN0ZXAoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENvbW1pc3Npb25lZFRlc3RTdGVwcygpLnN0cmVhbSgpLmZpbHRlcih0cyAtPiB0cy5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgY29tbWlzc2lvbmVkIHtAbGluayBUZXN0U3RlcH1zIHJlbGF0ZWQgdG8gdGhpcyB0ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZXN0U3RlcD4gZ2V0Q29tbWlzc2lvbmVkVGVzdFN0ZXBzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVzdFN0ZXAuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIGNvbW1pc3Npb25lZCB7QGxpbmsgVGVzdFN0ZXB9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHtAY29kZSBUZXN0U3RlcH0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgVGVzdFN0ZXB9IHdpdGggZ2l2ZW4gbmFtZSBoYXMgYmVlbgorCSAqICAgICAgICAgcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb21taXNzaW9uZWRUZXN0U3RlcChTdHJpbmcgbmFtZSkgeworCQlPcHRpb25hbDxUZXN0U3RlcD4gdGVzdFN0ZXAgPSBnZXRDb21taXNzaW9uZWRUZXN0U3RlcChuYW1lKTsKKwkJaWYgKHRlc3RTdGVwLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZSh0ZXN0U3RlcC5nZXQoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UZXN0U3RlcC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1Rlc3RTdGVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNDZhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UZXN0U3RlcC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5CYXNlRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXN0IHN0ZXAgZW50aXR5IHR5cGUuIEEgdGVzdCBzdGVwIGlzIGFuIGF0b21pYworICogbWVhc3VyZW1lbnQgdGFzayBhcyBwYXJ0IG9mIGEge0BsaW5rIFRlc3R9LiBUaGUgYm91bmRhcnkgY29uZGl0aW9ucyBkbyBub3QKKyAqIGNoYW5nZSB3aXRoaW4gYSBzaW5nbGUgdGVzdCBzdGVwLCB0aGVyZWZvcmUgZXZlcnkgb3JkZXJlZCB0ZXN0IHN0ZXAgaGFzIHRvIGJlCisgKiBmdWxseSBkZXNjcmliZWQuIEl0IG1heSBoYXZlIHJlbGF0aW9ucyB0byB7QGxpbmsgQ29udGV4dFJvb3R9cywgd2hpY2ggY29udGFpbgorICogdGhlIGRlc2NyaWJpbmcgb3JkZXIgZGF0YS4gVGVzdCBzdGVwcyBtYXkgaGF2ZSBhIHNvcnQgb3JkZXIgaW4gdGhlIGNvbnRleHQgb2YKKyAqIHRoZWlyIHBhcmVudCB7QGNvZGUgVGVzdH0sIGluZGljYXRpbmcgdGhlIGRlc2lyZWQgZXhlY3V0aW9uIG9yZGVyLiBUaGUgbmFtZQorICogb2YgYSB0ZXN0IHN0ZXAgc2hvdWxkIGJlIGNob3NlbiBpbiBhIHNwZWFraW5nIHdheSwgYmVjYXVzZSBpdCBpcyBvZnRlbiB1c2VkCisgKiBpbiBkaWZmZXJlbnQgY29udGV4dHMsIGUuZy4gYXMgYSBsaW5rIGJldHdlZW4gdGhlIG1lYXN1cmVtZW50IGRhdGEgZnJvbSB0aGUKKyAqIGRldmljZSBhbmQgdGhlIG9yZGVyIGluIHRoZSBkYXRhYmFzZS4gRnVydGhlcm1vcmUgdGhlIG5hbWUgaGFzIHRvIGJlIHVuaXF1ZQorICogdW5kZXIgdGhlIHBhcmVudCB7QGNvZGUgVGVzdH0uIENoaWxkcmVuIG9mIGEgdGVzdCBzdGVwIGFyZQorICoge0BsaW5rIE1lYXN1cmVtZW50fXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U3RlcCBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBDb250ZXh0RGVzY3JpYmFibGUsIERhdGFibGUsIERlbGV0YWJsZSwgRGVzY3JpYmFibGUsCisJCUZpbGVzQXR0YWNoYWJsZSwgU29ydGFibGUsIFN0YXR1c0F0dGFjaGFibGUsIFRhZ2FibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSB7QGxpbmsgVGVzdH0gcGFyZW50IHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxUZXN0PiBQQVJFTlRfVFlQRV9URVNUID0gVGVzdC5jbGFzczsKKworCS8qKgorCSAqIFRoZSB7QGxpbmsgTWVhc3VyZW1lbnR9IGNoaWxkIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxNZWFzdXJlbWVudD4gQ0hJTERfVFlQRV9NRUFTVVJFTUVOVCA9IE1lYXN1cmVtZW50LmNsYXNzOworCisJLyoqCisJICogVGhlICdPcHRpb25hbCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PUFRJT05BTCA9ICJPcHRpb25hbCI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVRlc3RTdGVwKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBmbGFnIG9mIHRoaXMgdGVzdCBzdGVwLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgb3B0aW9uYWwgZmxhZyBmb3IgdGhpcyB0ZXN0IHN0ZXAuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uYWwgVGhlIG5ldyBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuc2V0KG9wdGlvbmFsKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8Q29udGV4dFR5cGU+IGxvYWRDb250ZXh0VHlwZXMoQmFzZUVudGl0eU1hbmFnZXIgbWFuYWdlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbWFuYWdlci5sb2FkQ29udGV4dFR5cGVzKHRoaXMpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPENvbnRleHRUeXBlLCBDb250ZXh0Um9vdD4gbG9hZENvbnRleHRzKEJhc2VFbnRpdHlNYW5hZ2VyIG1hbmFnZXIsIENvbnRleHRUeXBlLi4uIGNvbnRleHRUeXBlcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlNYXA8Q29udGV4dFR5cGUsIENvbnRleHRSb290PiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA6IGNvbnRleHRUeXBlcykgeworCQkJQ29udGV4dFJvb3QgYyA9IGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKTsKKwkJCWlmIChjICE9IG51bGwpIHsKKwkJCQltYXAucHV0KGNvbnRleHRUeXBlLCBjKTsKKwkJCX0KKwkJfQorCQlpZiAobWFwLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIG1hbmFnZXIubG9hZENvbnRleHRzKHRoaXMsIGNvbnRleHRUeXBlcyk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gbWFwOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVHlwZVNwZWNpZmljYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9UeXBlU3BlY2lmaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWM3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVHlwZVNwZWNpZmljYXRpb24uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworLyoqCisgKiBUaGUgdHlwZSBzcGVjaWZpY2F0aW9uIG9mIG1hc3MgZGF0YSBzdG9yZWQgaW4gZXh0ZXJuYWwgZmlsZXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENoYW5uZWwKKyAqLworcHVibGljIGNsYXNzIFR5cGVTcGVjaWZpY2F0aW9uIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJPT0xFQU4gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkJPT0xFQU4iLCAwKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQllURSA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQllURSIsIDEpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTSE9SVCA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiU0hPUlQiLCAyKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gSU5URUdFUiA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiSU5URUdFUiIsIDMpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBMT05HID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJMT05HIiwgNCk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEZMT0FUID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJGTE9BVCIsIDUpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBET1VCTEUgPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkRPVUJMRSIsIDYpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTSE9SVF9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNIT1JUX0JFTyIsIDcpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBJTlRFR0VSX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiSU5URUdFUl9CRU8iLCA4KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gTE9OR19CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkxPTkdfQkVPIiwgOSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEZMT0FUX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiRkxPQVRfQkVPIiwgMTApOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBET1VCTEVfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJET1VCTEVfQkVPIiwgMTEpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTVFJJTkcgPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlNUUklORyIsIDEyKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQllURV9TVFJFQU0gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkJZVEVfU1RSRUFNIiwgMTMpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCTE9CID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCTE9CIiwgMTQpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBCT09MRUFOX0ZMQUdTX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQk9PTEVBTl9GTEFHU19CRU8iLCAxNSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJZVEVfRkxBR1NfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCWVRFX0ZMQUdTX0JFTyIsIDE2KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gU1RSSU5HX0ZMQUdTX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiU1RSSU5HX0ZMQUdTX0JFTyIsIDE3KTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQllURV9TVFJFQU1fQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCWVRFX1NUUkVBTV9CRU8iLCAxOCk7CisKKwkvLyBTQllURSwKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFNJR05FRF9CWVRFID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJTSUdORURfQllURSIsIDE5KTsKKworCS8vIFNCWVRFX0ZMQUdTX0JFTywKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFNJR05FRF9CWVRFX0ZMQUdTX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiU0lHTkVEX0JZVEVfRkxBR1NfQkVPIiwgMjApOworCisJLy8gVVNIT1JULAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gVU5TSUdORURfU0hPUlQgPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlVOU0lHTkVEX1NIT1JUIiwgMjEpOworCisJLy8gVVNIT1JUX0JFTywKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFVOU0lHTkVEX1NIT1JUX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiVU5TSUdORURfU0hPUlRfQkVPIiwgMjIpOworCisJLy8gVUlOVEVHRVIsCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBVTlNJR05FRF9JTlRFR0VSID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJVTlNJR05FRF9JTlRFR0VSIiwgMjMpOworCisJLy8gVUlOVEVHRVJfQkVPLAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gVU5TSUdORURfSU5URUdFUl9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIlVOU0lHTkVEX0lOVEVHRVJfQkVPIiwgMjQpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlU3BlY2lmaWNhdGlvbiBTVFJJTkdfVVRGOCA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiU1RSSU5HX1VURjgiLCAyNSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIFNUUklOR19VVEY4X0ZMQUdTX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiU1RSSU5HX1VURjhfRkxBR1NfQkVPIiwgMjYpOworCisJLy8gQklUX0lOVCwKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJJVF9JTlRFR0VSID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCSVRfSU5URUdFUiIsIDI3KTsKKworCS8vIEJJVF9JTlRfQkVPLAorCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQklUX0lOVEVHRVJfQkVPID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCSVRfSU5URUdFUl9CRU8iLCAyOCk7CisKKwkvLyBCSVRfVUlOVCwKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJJVF9VTlNJR05FRF9JTlRFR0VSID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCSVRfVU5TSUdORURfSU5URUdFUiIsIDI5KTsKKworCS8vIEJJVF9VSU5UX0JFTywKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJJVF9VTlNJR05FRF9JTlRFR0VSX0JFTyA9IG5ldyBUeXBlU3BlY2lmaWNhdGlvbigiQklUX1VOU0lHTkVEX0lOVEVHRVJfQkVPIiwKKwkJCTMwKTsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZVNwZWNpZmljYXRpb24gQklUX0ZMT0FUID0gbmV3IFR5cGVTcGVjaWZpY2F0aW9uKCJCSVRfRkxPQVQiLCAzMSk7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVTcGVjaWZpY2F0aW9uIEJJVF9GTE9BVF9CRU8gPSBuZXcgVHlwZVNwZWNpZmljYXRpb24oIkJJVF9GTE9BVF9CRU8iLCAzMik7CisKKwlwcml2YXRlIFR5cGVTcGVjaWZpY2F0aW9uKFN0cmluZyBuYW1lLCBpbnQgb3JkaW5hbCkgeworCQlzdXBlcihuYW1lLCBvcmRpbmFsKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVW5pdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1VuaXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2YzYmYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1VuaXQuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHVuaXQgZW50aXR5IHR5cGUuIFVuaXRzIHJlZmVycmluZyB0byB0aGUgc2FtZQorICoge0BsaW5rIFBoeXNpY2FsRGltZW5zaW9ufSBjYW4gYmUgY29udmVydGVkIHRvIGVhY2ggb3RoZXIgYnkgbWVhbnMgb2YgdGhlaXIKKyAqIGF0dHJpYnV0ZSB2YWx1ZXMgIk9mZnNldCIgYW5kICJGYWN0b3IiLiBUaGUgbmFtZXMgb2YgdGhlIHVuaXRzIGhhdmUgdG8gYmUKKyAqIHVuaXF1ZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFVuaXQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlICdGYWN0b3InIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfRkFDVE9SID0gIkZhY3RvciI7CisKKwkvKioKKwkgKiBUaGUgJ09mZnNldCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9PRkZTRVQgPSAiT2Zmc2V0IjsKKworCS8qKgorCSAqIFRoZSAnREInIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREIgPSAiZEIiOworCisJLyoqCisJICogVGhlICdEQlJyZWZlcmVuY2VGYWN0b3InIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREJfUkVGRVJFTkNFX0ZBQ1RPUiA9ICJkQl9yZWZlcmVuY2VfZmFjdG9yIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVW5pdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZmFjdG9yIG9mIHRoaXMgdW5pdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGZhY3RvciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgRG91YmxlIGdldEZhY3RvcigpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfRkFDVE9SKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZmFjdG9yIGZvciB0aGlzIHVuaXQuCisJICoKKwkgKiBAcGFyYW0gZmFjdG9yIFRoZSBuZXcgZmFjdG9yLgorCSAqLworCXB1YmxpYyB2b2lkIHNldEZhY3RvcihEb3VibGUgZmFjdG9yKSB7CisJCWdldFZhbHVlKEFUVFJfRkFDVE9SKS5zZXQoZmFjdG9yKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhpcyB1bml0LgorCSAqCisJICogQHJldHVybiBUaGUgb2Zmc2V0IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBEb3VibGUgZ2V0T2Zmc2V0KCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9PRkZTRVQpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBvZmZzZXQgZm9yIHRoaXMgdW5pdC4KKwkgKgorCSAqIEBwYXJhbSBvZmZzZXQgVGhlIG5ldyBvZmZzZXQuCisJICovCisJcHVibGljIHZvaWQgc2V0T2Zmc2V0KERvdWJsZSBvZmZzZXQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PRkZTRVQpLnNldChvZmZzZXQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlY2liZWwgZmxhZyBvZiB0aGlzIHVuaXQuIElmIHRoZSBmbGFnIGlzIHRydWUsIHRoZW4KKwkgKiB7QGxpbmsgI2dldERCUmVmRmFjdG9yKCl9IHNob3VsZCByZXR1cm4gYSBmaW5pdGUgdmFsdWUgYXMgcmV0dXJuZWQgYnkKKwkgKiB7QGxpbmsgRmxvYXQjaXNGaW5pdGUoZmxvYXQpfSB0aGF0IGlzIG5vdCAwLgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIHRoaXMgdW5pdCBpcyBhIGRlY2liZWwgdW5pdC4KKwkgKiBAc2VlICNnZXREQlJlZkZhY3RvcigpCisJICovCisJcHVibGljIEJvb2xlYW4gaXNEQigpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfREIpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3IsIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IHRoZSBkZWNpYmVsIHZhbHVlcyBiYWNrIGludG8KKwkgKiBsaW5lYXIgdmFsdWVzLiBJZiB0aGUgZGVjaWJlbCBmbGFnIGlzIHNldCB0byBmYWxzZSwgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgorCSAqIDAsIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgQVNBTSBOVkggc3BlY2lmaWNhdGlvbiAoQ2hhcHRlciAxMSwgMTAuMykuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZWNpYmVsIHJlZmVyZW5jZSBmYWN0b3IgaXMgcmV0dXJuZWQuCisJICogQHNlZSAjaXNEQigpCisJICovCisJcHVibGljIEZsb2F0IGdldERCUmVmRmFjdG9yKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9EQl9SRUZFUkVOQ0VfRkFDVE9SKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogQ2hhbmdlcyB0aGUgZGVjaWJlbCBzdGF0dXMgb2YgdGhpcyB1bml0LiBUaGUgZGVjaWJlbCBmbGFnIGlzIGRlZHVjZWQgZnJvbQorCSAqIGdpdmVuIHJlZmVyZW5jZSBmYWN0b3IuIElmIHRoZSByZWZlcmVuY2UgZmFjdG9yIGlzIGZpbml0ZSwgYXMgcmV0dXJuZWQgYnkKKwkgKiB7QGxpbmsgRmxvYXQjaXNGaW5pdGUoZmxvYXQpfSwgYW5kIG5vdCAwLCB0aGVuIHRoZSBkZWNpYmVsIGZsYWcgaXMgc2V0IHRvCisJICogdHJ1ZSBhbmQgZ2l2ZW4gcmVmZXJlbmNlIGZhY3RvciBpcyB0YWtlbi4gSW4gYW55IG90aGVyIGNhc2UgYm90aCwgdGhlIGRlY2liZWwKKwkgKiBmbGFnIGFuZCB0aGUgcmVmZXJlbmNlIGZhY3Rvciwgd2lsbCBiZSByZXNldC4KKwkgKgorCSAqIEBwYXJhbSBkYlJlZmVyZW5jZUZhY3RvciBUaGUgbmV3IGRlY2liZWwgcmVmZXJlbmNlIGZhY3Rvci4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREQihGbG9hdCBkYlJlZmVyZW5jZUZhY3RvcikgeworCQlib29sZWFuIGlzVmFsaWQgPSBGbG9hdC5pc0Zpbml0ZShkYlJlZmVyZW5jZUZhY3RvcikgJiYgRmxvYXQuY29tcGFyZShNYXRoLmFicyhkYlJlZmVyZW5jZUZhY3RvciksIDBGKSAhPSAwOworCQlnZXRWYWx1ZShBVFRSX0RCKS5zZXQoaXNWYWxpZCk7CisKKwkJaWYgKGlzVmFsaWQpIHsKKwkJCWdldFZhbHVlKEFUVFJfREJfUkVGRVJFTkNFX0ZBQ1RPUikuc2V0KGRiUmVmZXJlbmNlRmFjdG9yKTsKKwkJfSBlbHNlIHsKKwkJCWdldFZhbHVlKEFUVFJfREJfUkVGRVJFTkNFX0ZBQ1RPUikuc2V0VmFsaWQoZmFsc2UpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFBoeXNpY2FsRGltZW5zaW9ufSBvZiB0aGlzIHVuaXQuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgUGh5c2ljYWxEaW1lbnNpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBQaHlzaWNhbERpbWVuc2lvbiBnZXRQaHlzaWNhbERpbWVuc2lvbigpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoUGh5c2ljYWxEaW1lbnNpb24uY2xhc3MpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHtAbGluayBQaHlzaWNhbERpbWVuc2lvbn0gZm9yIHRoaXMgdW5pdC4KKwkgKgorCSAqIEBwYXJhbSBwaHlzaWNhbERpbWVuc2lvbiBUaGUgbmV3IHtAY29kZSBQaHlzaWNhbERpbWVuc2lvbn0uCisJICovCisJcHVibGljIHZvaWQgc2V0UGh5c2ljYWxEaW1lbnNpb24oUGh5c2ljYWxEaW1lbnNpb24gcGh5c2ljYWxEaW1lbnNpb24pIHsKKwkJZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLnNldChwaHlzaWNhbERpbWVuc2lvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVXNlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFhOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1VzZXIuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHVzZXIgZW50aXR5IHR5cGUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSwgRGVzY3JpYmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnU3VybmFtZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVVJOQU1FID0gIlN1cm5hbWUiOworCisJLyoqCisJICogVGhlICdHaXZlbk5hbWUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfR0lWRU5fTkFNRSA9ICJHaXZlbk5hbWUiOworCisJLyoqCisJICogVGhlICdEZXBhcnRtZW50JyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0RFUEFSVE1FTlQgPSAiRGVwYXJ0bWVudCI7CisKKwkvKioKKwkgKiBUaGUgJ1RlbGVwaG9uZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9QSE9ORSA9ICJUZWxlcGhvbmUiOworCisJLyoqCisJICogVGhlICdFTWFpbCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9FTUFJTCA9ICJFLU1haWwiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlVc2VyKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBnaXZlbiBuYW1lIG9mIHRoaXMgdXNlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGdpdmVuIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRHaXZlbk5hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0dJVkVOX05BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBnaXZlbiBuYW1lIGZvciB0aGlzIHVzZXIuCisJICoKKwkgKiBAcGFyYW0gZ2l2ZW5OYW1lIFRoZSBuZXcgZ2l2ZW4gbmFtZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHaXZlbk5hbWUoU3RyaW5nIGdpdmVuTmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX0dJVkVOX05BTUUpLnNldChnaXZlbk5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHN1cm5hbWUgb2YgdGhpcyB1c2VyLgorCSAqCisJICogQHJldHVybiBUaGUgc3VybmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFN1cm5hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1NVUk5BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBzdXJuYW1lIGZvciB0aGlzIHVzZXIuCisJICoKKwkgKiBAcGFyYW0gc3VybmFtZSBUaGUgbmV3IHN1cm5hbWUuCisJICovCisJcHVibGljIHZvaWQgc2V0U3VybmFtZShTdHJpbmcgc3VybmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX1NVUk5BTUUpLnNldChzdXJuYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZXBhcnRtZW50IG9mIHRoaXMgdXNlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGRlcGFydG1lbnQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXREZXBhcnRtZW50KCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERVBBUlRNRU5UKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGVwYXJ0bWVudCBmb3IgdGhpcyB1c2VyLgorCSAqCisJICogQHBhcmFtIGRlcGFydG1lbnQgVGhlIG5ldyBkZXBhcnRtZW50LgorCSAqLworCXB1YmxpYyB2b2lkIHNldERlcGFydG1lbnQoU3RyaW5nIGRlcGFydG1lbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERVBBUlRNRU5UKS5zZXQoZGVwYXJ0bWVudCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGhvbmUgbnVtYmVyIG9mIHRoaXMgdXNlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHBob25lIG51bWJlciBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFBob25lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9QSE9ORSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgbmV3IHBob25lIG51bWJlciBmb3IgdGhpcyB1c2VyLgorCSAqCisJICogQHBhcmFtIHBob25lIFRoZSBuZXcgcGhvbmUgbnVtYmVyLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFBob25lKFN0cmluZyBwaG9uZSkgeworCQlnZXRWYWx1ZShBVFRSX1BIT05FKS5zZXQocGhvbmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGUtbWFpbCBhZGRyZXNzIG9mIHRoaXMgdXNlci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGUtbWFpbCBhZGRyZXNzIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWFpbCgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfRU1BSUwpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyBlLW1haWwgYWRkcmVzcyBmb3IgdGhpcyB1c2VyLgorCSAqCisJICogQHBhcmFtIGVNYWlsIFRoZSBuZXcgZS1tYWlsIGFkZHJlc3MuCisJICovCisJcHVibGljIHZvaWQgc2V0TWFpbChTdHJpbmcgZU1haWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9FTUFJTCkuc2V0KGVNYWlsKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjMDJlNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsNDQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtLnJhbmdlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS50aW1lLmZvcm1hdC5EYXRlVGltZUZvcm1hdHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBHZW5lcmljIHZhbHVlIGNvbnRhaW5lci4gVGhpcyB2YWx1ZSBjb250YWluZXIgaXMgdGlnaHRseSBjb3VwbGVkIHdpdGggaXRzCisgKiB7QGxpbmsgVmFsdWVUeXBlfS4gSXQgYWxsb3dzIG9ubHkgdG8gc3RvcmUgYXNzaWdubWVudCBjb21wYXRpYmxlIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhbHVlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGVUaW1lRm9ybWF0dGVyIExPQ0FMX0RBVEVfVElNRV9GT1JNQVRURVIgPSBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oInl5eXlNTWRkSEhtbXNzIik7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2VzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgVmFsdWVUeXBlPD8+IHZhbHVlVHlwZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHVuaXQ7CisKKwlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbFZhbGlkOworCXByaXZhdGUgT2JqZWN0IGluaXRpYWxWYWx1ZTsKKworCXByaXZhdGUgYm9vbGVhbiB2YWxpZDsKKwlwcml2YXRlIE9iamVjdCB2YWx1ZTsKKworCXByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gdmFsdWVDbGFzczsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZVR5cGVEZXNjcjsKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0VmFsdWU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVUeXBlICAgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBWYWx1ZVR5cGV9LgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgVGhlIG5hbWUgb2YgdGhpcyBjb250YWluZXIuCisJICogQHBhcmFtIHVuaXQgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgdW5pdC4KKwkgKiBAcGFyYW0gdmFsaWQgICAgICAgIFRoZSBpbml0aWFsIHZhbGlkaXR5IGZsYWcuCisJICogQHBhcmFtIHZhbHVlICAgICAgICBUaGUgaW5pdGlhbCB2YWx1ZS4KKwkgKiBAcGFyYW0gdmFsdWVDbGFzcyAgIFVzZWQgZm9yIHR5cGUgY2hlY2tpbmcgdXBvbiBhc3NpZ25tZW50LgorCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVXNlZCBhcyBudWxsIHJlcGxhY2VtZW50LgorCSAqLworCVZhbHVlKFZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgdW5pdCwgYm9vbGVhbiB2YWxpZCwgT2JqZWN0IHZhbHVlLCBDbGFzczw/PiB2YWx1ZUNsYXNzLAorCQkJT2JqZWN0IGRlZmF1bHRWYWx1ZSwgU3RyaW5nIHZhbHVlVHlwZURlc2NyKSB7CisJCXRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOworCQl0aGlzLnZhbHVlVHlwZURlc2NyID0gdmFsdWVUeXBlRGVzY3I7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMudW5pdCA9IHVuaXQgPT0gbnVsbCA/ICIiIDogdW5pdDsKKworCQl0aGlzLnZhbHVlQ2xhc3MgPSB2YWx1ZUNsYXNzOworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKworCQkvLyBzZXQgaW5pdGlhbCB2YWx1ZQorCQlzZXQodmFsdWUpOworCQkvLyBvdmVyd3JpdGUgaW5pdGlhbCB2YWxpZGl0eSBmbGFnCisJCXNldFZhbGlkKHZhbGlkKTsKKworCQkvLyBwcmVzZXJ2ZSBpbml0aWFsIHZhbHVlcworCQlpbml0aWFsVmFsaWQgPSBpc1ZhbGlkKCk7CisJCWluaXRpYWxWYWx1ZSA9IGNvcHkoZXh0cmFjdCgpKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBvcmlnaW4gVGhlIG9yaWdpbiB7QGxpbmsgVmFsdWV9LgorCSAqIEBwYXJhbSBpbnB1dCAgVGhlIG5ldyB2YWx1ZS4KKwkgKi8KKwlwcml2YXRlIFZhbHVlKFZhbHVlIG9yaWdpbiwgT2JqZWN0IGlucHV0KSB7CisJCXRoaXMob3JpZ2luLnZhbHVlVHlwZSwgb3JpZ2luLm5hbWUsIG9yaWdpbi51bml0LCBvcmlnaW4udmFsaWQsIGlucHV0LCBvcmlnaW4udmFsdWVDbGFzcywgb3JpZ2luLmRlZmF1bHRWYWx1ZSwKKwkJCQlvcmlnaW4udmFsdWVUeXBlRGVzY3IpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyB2YWx1ZSBjb250YWluZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoaXMgdmFsdWUgY29udGFpbmVyJ3MgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBWYWx1ZVR5cGV9IHRoaXMgdmFsdWUgY29udGFpbmVyIGlzIGFzc29jaWF0ZWQgd2l0aC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIFZhbHVlVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlVHlwZTw/PiBnZXRWYWx1ZVR5cGUoKSB7CisJCXJldHVybiB2YWx1ZVR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdW5pdCBuYW1lIG9mIHRoaXMgdmFsdWUgY29udGFpbmVyLgorCSAqCisJICogQHJldHVybiBUaGUgdW5pdCBuYW1lIG9mIHRoaXMgdmFsdWUgY29udGFpbmVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIHVuaXQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsaWRpdHkgZmxhZyBvZiB0aGlzIHZhbHVlIGNvbnRhaW5lci4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSwgaWYgdGhlIHN0b3JlZCB2YWx1ZSBpcyBtYXJrZWQgdG8gYmUgdmFsaWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKKwkJT2JqZWN0IHYgPSBleHRyYWN0KCk7CisKKwkJaWYgKHYgIT0gbnVsbCkgeworCQkJaWYgKHYuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpIHsKKwkJCQlyZXR1cm4gdmFsaWQgJiYgQXJyYXkuZ2V0TGVuZ3RoKHYpID4gMDsKKwkJCX0gZWxzZSBpZiAodiBpbnN0YW5jZW9mIFN0cmluZykgeworCQkJCXJldHVybiB2YWxpZCAmJiAhKChTdHJpbmcpIHYpLmlzRW1wdHkoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiB2YWxpZCAmJiB2ICE9IG51bGw7CisJfQorCisJLyoqCisJICogT3ZlcndyaXRlcyB2YWxpZGl0eSBmbGFnIHdpdGggZ2l2ZW4gZmxhZy4KKwkgKgorCSAqIEBwYXJhbSB2YWxpZCBUaGUgbmV3IHZhbGlkaXR5IGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsaWQoYm9vbGVhbiB2YWxpZCkgeworCQl0aGlzLnZhbGlkID0gdmFsaWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyBjdXJyZW50bHkgc3RvcmVkIHZhbHVlIG9mIHRoaXMgdmFsdWUgY29udGFpbmVyLgorCSAqCisJICogQHBhcmFtIDxUPiAgVGhlIGV4cGVjdGVkIHZhbHVlIHR5cGUuCisJICogQHBhcmFtIHR5cGUgVGhlIHtAbGluayBWYWx1ZVR5cGV9LgorCSAqIEByZXR1cm4gQ3VycmVudGx5IHN0b3JlZCB2YWx1ZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQ+IFQgZXh0cmFjdChWYWx1ZVR5cGU8VD4gdHlwZSkgeworCQlyZXR1cm4gKFQpIHZhbHVlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgY3VycmVudGx5IHN0b3JlZCB2YWx1ZSBvZiB0aGlzIHZhbHVlIGNvbnRhaW5lci4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGV4cGVjdGVkIHZhbHVlIHR5cGUuCisJICogQHJldHVybiBDdXJyZW50bHkgc3RvcmVkIHZhbHVlIGlzIHJldHVybmVkLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VD4gVCBleHRyYWN0KCkgeworCQlyZXR1cm4gKFQpIHZhbHVlOworCX0KKworCS8qKgorCSAqIFJlcGxhY2VzIGN1cnJlbnRseSBzdG9yZWQgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gb25lLiBJZiB7QGNvZGUgbnVsbH0gaXMgZ2l2ZW4sCisJICogdGhlbiBhIHdlbGwgZGVmaW5lZCBkZWZhdWx0IHZhbHVlIGlzIHVzZWQgaW5zdGVhZCBhbmQgdGhlIHZhbGlkaXR5IGZsYWcgaXMKKwkgKiBhdXRvbWF0aWNhbGx5IHNldCB0byB7QGNvZGUgZmFsc2V9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSBuZXcgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSBkZWZpbmVkIGluCisJICogICAgICAgICAgICAgIHtAbGluayBWYWx1ZVR5cGUjdHlwZX0gb3IgaW4gY2FzZSBvZiBhbiBlbnVtZXJhdGlvbiB0eXBlIGFuCisJICogICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGVudW1lcmF0aW9uIGNvbnN0YW50IG9yIGFycmF5IHRoZXJlb2YuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGluY29tcGF0aWJsZSB2YWx1ZSBpcyBnaXZlbi4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXQoT2JqZWN0IGlucHV0KSB7CisJCWlmIChpbnB1dCA9PSBudWxsKSB7CisJCQl2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKwkJCXNldFZhbGlkKGZhbHNlKTsKKwkJfSBlbHNlIGlmICh2YWx1ZUNsYXNzLmlzSW5zdGFuY2UoaW5wdXQpKSB7CisJCQl2YWx1ZSA9IGlucHV0OworCQkJc2V0VmFsaWQodHJ1ZSk7CisJCX0gZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnVtZXJhdGlvblZhbHVlKSB7CisJCQlzZXRGb3JFbnVtZXJhdGlvblZhbHVlKGlucHV0KTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29tcGF0aWJsZSB2YWx1ZSB0eXBlICciICsgaW5wdXQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkKKwkJCQkJKyAiJyBwYXNzZWQsIGV4cGVjdGVkICciICsgdmFsdWVDbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiJy4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIE1lcmdlcyBnaXZlbiB2YWx1ZSBjb250YWluZXIgd2l0aCB0aGlzIGluc3RhbmNlLiBUbyBiZSBhYmxlIHRvIGRvIHNvLCB0aGUKKwkgKiBnaXZlbiB2YWx1ZSBjb250YWluZXIgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhpcyBvbmUuIFZhbHVlIGNvbnRhaW5lcnMgYXJlCisJICogY29tcGF0aWJsZSBpZiB0aGUgdGhlaXIgbmFtZSwgdW5pdCBhbmQge0BsaW5rIFZhbHVlVHlwZX0gaXMgZXF1YWwuIElmIHRoZQorCSAqIHN0b3JlZCB2YWx1ZXMgb3IgdGhlIHZhbGlkaXR5IGZsYWdzIGRvIG5vdCBtYXRjaCwgdGhlbiBib3RoIHZhbHVlcyBhcmUKKwkgKiBkaXNjYXJkZWQgYW5kIHtAY29kZSBudWxsfSBpcyB0YWtlbiBhcyB0aGUgaW5pdGlhbCB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgY29udGFpbmVyIHRoYXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGlzIGluc3RhbmNlLgorCSAqIEByZXR1cm4gQSBuZXcgdmFsdWUgY29udGFpbmVyIHdpdGggbWVyZ2VkIHZhbHVlIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB2YWx1ZSBjb250YWluZXIgaXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZS4KKwkgKi8KKwlwdWJsaWMgVmFsdWUgbWVyZ2UoVmFsdWUgdmFsdWUpIHsKKwkJYm9vbGVhbiBuYW1lTWlzc21hdGNoID0gIWdldE5hbWUoKS5lcXVhbHModmFsdWUuZ2V0TmFtZSgpKTsKKwkJYm9vbGVhbiB1bml0TWlzc21hdGNoID0gIWdldFVuaXQoKS5lcXVhbHModmFsdWUuZ2V0VW5pdCgpKTsKKwkJYm9vbGVhbiB0eXBlTWlzc21hdGNoID0gIWdldFZhbHVlVHlwZSgpLmVxdWFscyh2YWx1ZS5nZXRWYWx1ZVR5cGUoKSk7CisJCWlmIChuYW1lTWlzc21hdGNoIHx8IHVuaXRNaXNzbWF0Y2ggfHwgdHlwZU1pc3NtYXRjaCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIG1lcmdlLCBpbmNvbXBhdGlibGUgdmFsdWUgcGFzc2VkLiIpOworCQl9CisKKwkJYm9vbGVhbiBlcXVhbFZhbHVlID0gT2JqZWN0cy5kZWVwRXF1YWxzKGV4dHJhY3QoKSwgdmFsdWUuZXh0cmFjdCgpKTsKKwkJYm9vbGVhbiBib3RoVmFsaWQgPSBpc1ZhbGlkKCkgJiYgdmFsdWUuaXNWYWxpZCgpOworCQlyZXR1cm4gbmV3IFZhbHVlKHRoaXMsIGVxdWFsVmFsdWUgJiYgYm90aFZhbGlkID8gZXh0cmFjdCgpIDogbnVsbCk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKG90aGVyID09IHRoaXMpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgVmFsdWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlWYWx1ZSB2YWwgPSAoVmFsdWUpIG90aGVyOworCisJCXJldHVybiBPYmplY3RzLmVxdWFscyh0aGlzLnZhbHVlVHlwZSwgdmFsLnZhbHVlVHlwZSkgJiYgT2JqZWN0cy5lcXVhbHModGhpcy5uYW1lLCB2YWwubmFtZSkKKwkJCQkmJiBPYmplY3RzLmVxdWFscyh0aGlzLnVuaXQsIHZhbC51bml0KSAmJiBPYmplY3RzLmVxdWFscyh0aGlzLmluaXRpYWxWYWxpZCwgdmFsLmluaXRpYWxWYWxpZCkKKwkJCQkmJiBPYmplY3RzLmRlZXBFcXVhbHModGhpcy5pbml0aWFsVmFsdWUsIHZhbC5pbml0aWFsVmFsdWUpICYmIE9iamVjdHMuZXF1YWxzKHRoaXMudmFsaWQsIHZhbC52YWxpZCkKKwkJCQkmJiBPYmplY3RzLmRlZXBFcXVhbHModGhpcy52YWx1ZSwgdmFsLnZhbHVlKSAmJiBPYmplY3RzLmVxdWFscyh0aGlzLnZhbHVlQ2xhc3MsIHZhbC52YWx1ZUNsYXNzKQorCQkJCSYmIE9iamVjdHMuZXF1YWxzKHRoaXMudmFsdWVUeXBlRGVzY3IsIHZhbC52YWx1ZVR5cGVEZXNjcikKKwkJCQkmJiBPYmplY3RzLmVxdWFscyh0aGlzLmRlZmF1bHRWYWx1ZSwgdmFsLmRlZmF1bHRWYWx1ZSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQlyZXR1cm4gT2JqZWN0cy5oYXNoKHZhbHVlVHlwZSwgbmFtZSwgdW5pdCwgaW5pdGlhbFZhbGlkLCBpbml0aWFsVmFsdWUsIHZhbGlkLCB2YWx1ZSwgdmFsdWVDbGFzcywgdmFsdWVUeXBlRGVzY3IsCisJCQkJZGVmYXVsdFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZS4gSW4gY2FzZQorCSAqIG9mIGEgc2VxdWVuY2UgdmFsdWUgY29udGFpbmVyIHdpdGggdXAgdG8gMTAgdmFsdWVzIHRoZSBjb21wbGV0ZSBzZXF1ZW5jZSB3aWxsCisJICogYmUgcHJpbnRlZC4gT3RoZXJ3aXNlIG9ubHkgdGhlIDUgZmlyc3QgYW5kIGxhc3QgdmFsdWVzIHdpbGwgYmUgcHJpbnRlZC4gSWYKKwkgKiB0aGUgY29udGFpbmVkIHZhbHVlIGlzIG1hcmtlZCBhcyBub3QgdmFsaWQsIHRoZW4gdGhlIGNvbnRhaW5lZCB2YWx1ZSBpcworCSAqIG9taXR0ZWQgaW4gdGhlIHJlcHJlc2VudGF0aW9uLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZS4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobmFtZSkuYXBwZW5kKCIgPSAiKTsKKworCQlpZiAoaXNWYWxpZCgpKSB7CisJCQlPYmplY3QgdiA9IGV4dHJhY3QoKTsKKwkJCWlmICh2ICE9IG51bGwgJiYgdi5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworCQkJCWludCBsZW5ndGggPSBBcnJheS5nZXRMZW5ndGgodik7CisJCQkJc2IuYXBwZW5kKCdbJyk7CisKKwkJCQlpZiAobGVuZ3RoID4gMTApIHsKKwkJCQkJc2IuYXBwZW5kKHJhbmdlKDAsIDUpLm1hcFRvT2JqKGkgLT4gcmVhZEF0KHYsIGkpKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCQkJCQlzYi5hcHBlbmQoIiwgLi4uLCAiKTsKKwkJCQkJc2IuYXBwZW5kKHJhbmdlKGxlbmd0aCAtIDUsIGxlbmd0aCkubWFwVG9PYmooaSAtPiByZWFkQXQodiwgaSkpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2IuYXBwZW5kKHJhbmdlKDAsIGxlbmd0aCkubWFwVG9PYmooaSAtPiByZWFkQXQodiwgaSkpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisJCQkJfQorCQkJCXNiLmFwcGVuZCgnXScpOworCQkJfSBlbHNlIHsKKwkJCQlzYi5hcHBlbmQodik7CisJCQl9CisJCX0KKworCQlpZiAoIWdldFVuaXQoKS5pc0VtcHR5KCkpIHsKKwkJCXNiLmFwcGVuZCgiIFsiKS5hcHBlbmQoZ2V0VW5pdCgpKS5hcHBlbmQoJ10nKTsKKwkJfQorCisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGVpdGhlciB0aGUgdmFsaWRpdHkgZmxhZyBvciB0aGUgdmFsdWUgaGF2ZSBiZWVuIG1vZGlmaWVkIHNpbmNlCisJICogaW5pdGlhbGl6YXRpb24uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGVpdGhlciBpZiB0aGUgZmxhZyBvciB0aGUgdmFsdWUgaGFzIGJlZW4KKwkgKiAgICAgICAgIG1vZGlmaWVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7CisJCXJldHVybiB3YXNWYWxpZCgpICE9IGlzVmFsaWQoKSB8fCAhT2JqZWN0cy5kZWVwRXF1YWxzKGV4dHJhY3RJbml0aWFsKCksIGV4dHJhY3QoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5pdGlhbCB2YWxpZGl0eSBmbGFnLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgdmFsdWUgd2FzIGluaXRpYWxseSBtYXJrZWQgYXMgdmFsaWQuCisJICovCisJcHVibGljIGJvb2xlYW4gd2FzVmFsaWQoKSB7CisJCXJldHVybiBpbml0aWFsVmFsaWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgaW5pdGlhbCB2YWx1ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGluaXRpYWwgdmFsdWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIE9iamVjdCBleHRyYWN0SW5pdGlhbCgpIHsKKwkJcmV0dXJuIGluaXRpYWxWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBPdmVyd3JpdGVzIHRoZSBpbml0aWFsIHZhbGlkaXR5IGZsYWcgYW5kIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgb25lcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhcHBseSgpIHsKKwkJaW5pdGlhbFZhbGlkID0gaXNWYWxpZCgpOworCQlpbml0aWFsVmFsdWUgPSBjb3B5KGV4dHJhY3QoKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAY29kZSBTdHJpbmd9IHZhbHVlIGZyb20gZ2l2ZW4gYXJyYXkgYXQgZ2l2ZW4gcG9zaXRpb24uCisJICoKKwkgKiBAcGFyYW0gYXJyYXkgVGhlIGFycmF5IHtAY29kZSBPYmplY3R9LgorCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVpcmVkIHZhbHVlLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTdHJpbmd9IHZhbHVlIG9mIHRoZSByZXF1ZXN0ZWQgdmFsdWUgaXMgcmV0dXJuZWQuCisJICovCisJc3RhdGljIFN0cmluZyByZWFkQXQoT2JqZWN0IGFycmF5LCBpbnQgaW5kZXgpIHsKKwkJT2JqZWN0IHZhbHVlID0gQXJyYXkuZ2V0KGFycmF5LCBpbmRleCk7CisJCWlmICh2YWx1ZSAhPSBudWxsICYmIGJ5dGVbXS5jbGFzcy5pc0luc3RhbmNlKHZhbHVlKSkgeworCQkJcmV0dXJuIEFycmF5cy50b1N0cmluZygoYnl0ZVtdKSB2YWx1ZSk7CisJCX0KKworCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiIDogU3RyaW5nLnZhbHVlT2YodmFsdWUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgY29weSBvZiBnaXZlbiB7QGNvZGUgT2JqZWN0fSwgc28gbW9kaWZpY2F0aW9ucyBpbiBvbmUgZG8gbm90IGFmZmVjdAorCSAqIHRvIG90aGVyLgorCSAqCisJICogQHBhcmFtIHZhbHVlIFRoZSBvYmplY3Qgd2hpY2ggd2lsbCBiZSBjb3BpZWQuCisJICogQHJldHVybiBUaGUgY29weSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBPYmplY3QgY29weShPYmplY3QgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IG51bGwpIHsKKwkJCXJldHVybiBudWxsOworCQl9CisKKwkJQ2xhc3M8Pz4gdmFsdWVDbGFzcyA9IHZhbHVlLmdldENsYXNzKCk7CisJCWlmICh2YWx1ZUNsYXNzLmlzQXJyYXkoKSAmJiBBcnJheS5nZXRMZW5ndGgodmFsdWUpID4gMCkgeworCQkJcmV0dXJuIGNyZWF0ZURlZXBDb3B5KHZhbHVlLCB2YWx1ZUNsYXNzKTsKKwkJfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMaW5rKSB7CisJCQlyZXR1cm4gbmV3IEZpbGVMaW5rKChGaWxlTGluaykgdmFsdWUpOworCQl9CisKKwkJLy8gc2ltcGxlIGltbXV0YWJsZSB2YWx1ZQorCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudGx5IHN0b3JlZCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIG5ldyB2YWx1ZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIHRoZSBlbnVtZXJhdGlvbiB0eXBlIGFuCisJICogICAgICAgICAgICAgIGFwcHJvcHJpYXRlIGVudW1lcmF0aW9uIGNvbnN0YW50LgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBhbiBpbmNvbXBhdGlibGUgdmFsdWUgaXMgZ2l2ZW4uCisJICovCisJcHJpdmF0ZSB2b2lkIHNldEZvckVudW1lcmF0aW9uVmFsdWUoT2JqZWN0IGlucHV0KSB7CisJCVN0cmluZyBpbnB2YWx1ZVR5cGVEZXNjciA9ICgoRW51bWVyYXRpb25WYWx1ZSkgaW5wdXQpLmdldE93bmVyKCkuZ2V0TmFtZSgpOworCQlpZiAoaW5wdmFsdWVUeXBlRGVzY3IgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIkVudW1lcmF0aW9uVmFsdWUgdmFsdWUgZGVzY3JpcHRpb24gb2YgaW5wdXQgdmFsdWUgbm90IGNvcnJlY3RseSBpbml0aWFsaXplZCIpOworCQl9CisJCWlmICh2YWx1ZVR5cGVEZXNjciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiRW51bWVyYXRpb25WYWx1ZSB2YWx1ZSBkZXNjcmlwdGlvbiBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIGdvdCBudWxsLCAnIiArICInIGV4cGVjdGVkICciCisJCQkJCQkJKyB2YWx1ZUNsYXNzLmdldFNpbXBsZU5hbWUoKSArICInLiIpOworCQl9CisKKwkJaWYgKHZhbHVlVHlwZURlc2NyLmVxdWFscyhpbnB2YWx1ZVR5cGVEZXNjcikpIHsKKwkJCXZhbHVlID0gaW5wdXQ7CisJCQlzZXRWYWxpZCh0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29tcGF0aWJsZSB2YWx1ZSB0eXBlIGRlc2NyaXB0aW9uJyIgKyBpbnB2YWx1ZVR5cGVEZXNjcgorCQkJCQkrICInIHBhc3NlZCwgZXhwZWN0ZWQgJyIgKyB2YWx1ZVR5cGVEZXNjciArICInLiIpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGRlZXAgY29weSBvZiBnaXZlbiB7QGNvZGUgT2JqZWN0fSwgc28gbW9kaWZpY2F0aW9ucyBpbiBvbmUgZG8gbm90CisJICogYWZmZWN0IHRvIG90aGVyLgorCSAqCisJICogQHBhcmFtIHZhbHVlICAgICAgVGhlIG9iamVjdCB3aGljaCB3aWxsIGJlIGNvcGllZC4KKwkgKiBAcGFyYW0gdmFsdWVDbGFzcyBUaGUgY2xhc3Mgb2YgdGhlIHZhbHVlIG9iamVjdC4KKwkgKiBAcmV0dXJuIFRoZSBjb3B5IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIE9iamVjdCBjcmVhdGVEZWVwQ29weShPYmplY3QgdmFsdWUsIENsYXNzPD8+IHZhbHVlQ2xhc3MpIHsKKwkJaW50IGxlbmd0aCA9IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7CisKKwkJaWYgKHZhbHVlQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKKwkJCU9iamVjdCBjb3B5ID0gQXJyYXkubmV3SW5zdGFuY2UodmFsdWVDbGFzcy5nZXRDb21wb25lbnRUeXBlKCksIGxlbmd0aCk7CisJCQlTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCAwLCBjb3B5LCAwLCBsZW5ndGgpOworCQkJcmV0dXJuIGNvcHk7CisJCX0gZWxzZSB7CisJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW11bXSkgeworCQkJCXJldHVybiBBcnJheXMuc3RyZWFtKChieXRlW11bXSkgdmFsdWUpLm1hcCh2IC0+IHYuY2xvbmUoKSkudG9BcnJheShieXRlW11bXTo6bmV3KTsKKwkJCX0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlTGlua1tdKSB7CisJCQkJcmV0dXJuIEFycmF5cy5zdHJlYW0oKEZpbGVMaW5rW10pIHZhbHVlKS5tYXAoRmlsZUxpbms6Om5ldykudG9BcnJheShGaWxlTGlua1tdOjpuZXcpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gQXJyYXlzLmNvcHlPZigoT2JqZWN0W10pIHZhbHVlLCBsZW5ndGgpOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlVHlwZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTdiN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVmFsdWVUeXBlLmphdmEKQEAgLTAsMCArMSwxMDM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZVRpbWU7CisKKy8qKgorICogVmFsdWUgdHlwZSBlbnVtZXJhdGlvbiBpcyBhIHtAbGluayBWYWx1ZX0gZmFjdG9yeS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIFZhbHVlVHlwZTxUPiBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWUgeworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIFN0cmluZ30gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIFN0cmluZ30uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8U3RyaW5nPiBTVFJJTkcgPSBuZXcgVmFsdWVUeXBlPD4oU3RyaW5nLmNsYXNzLCAiU1RSSU5HIiwgIiIpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIFN0cmluZ1tdfSB2YWx1ZSByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBTdHJpbmd9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPFN0cmluZ1tdPiBTVFJJTkdfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oU3RyaW5nW10uY2xhc3MsICJTVFJJTkdfU0VRVUVOQ0UiLAorCQkJbmV3IFN0cmluZ1swXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgTG9jYWxEYXRlVGltZX0gdmFsdWUgYW5kCisJICogZG9lcyBub3QgcmVwbGFjZSB7QGNvZGUgbnVsbH0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8TG9jYWxEYXRlVGltZT4gREFURSA9IG5ldyBWYWx1ZVR5cGU8PihMb2NhbERhdGVUaW1lLmNsYXNzLCAiREFURSIsIG51bGwpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIExvY2FsRGF0ZVRpbWVbXX0gdmFsdWUgYW5kCisJICogcmVwbGFjZXMge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIExvY2FsRGF0ZVRpbWV9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPExvY2FsRGF0ZVRpbWVbXT4gREFURV9TRVFVRU5DRSA9IG5ldyBWYWx1ZVR5cGU8PihMb2NhbERhdGVUaW1lW10uY2xhc3MsCisJCQkiREFURV9TRVFVRU5DRSIsIG5ldyBMb2NhbERhdGVUaW1lWzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBCb29sZWFufSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCB7QGxpbmsgQm9vbGVhbiNGQUxTRX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8Qm9vbGVhbj4gQk9PTEVBTiA9IG5ldyBWYWx1ZVR5cGU8PihCb29sZWFuLmNsYXNzLCAiQk9PTEVBTiIsIEJvb2xlYW4uRkFMU0UpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIGJvb2xlYW5bXX0gdmFsdWUgYW5kCisJICogcmVwbGFjZXMge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIGJvb2xlYW59IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPGJvb2xlYW5bXT4gQk9PTEVBTl9TRVFVRU5DRSA9IG5ldyBWYWx1ZVR5cGU8Pihib29sZWFuW10uY2xhc3MsICJCT09MRUFOX1NFUVVFTkNFIiwKKwkJCW5ldyBib29sZWFuWzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBCeXRlfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhIHtAY29kZSBCeXRlfSBjb250YWluaW5nIHplcm8uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8Qnl0ZT4gQllURSA9IG5ldyBWYWx1ZVR5cGU8PihCeXRlLmNsYXNzLCAiQllURSIsIEJ5dGUudmFsdWVPZigoYnl0ZSkgMCkpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIGJ5dGVbXX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIGJ5dGV9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPGJ5dGVbXT4gQllURV9TRVFVRU5DRSA9IG5ldyBWYWx1ZVR5cGU8PihieXRlW10uY2xhc3MsICJCWVRFX1NFUVVFTkNFIiwgbmV3IGJ5dGVbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIFNob3J0fSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhIHtAY29kZSBTaG9ydH0gY29udGFpbmluZyB6ZXJvLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPFNob3J0PiBTSE9SVCA9IG5ldyBWYWx1ZVR5cGU8PihTaG9ydC5jbGFzcywgIlNIT1JUIiwgU2hvcnQudmFsdWVPZigoc2hvcnQpIDApKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBzaG9ydFtdfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgc2hvcnR9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPHNob3J0W10+IFNIT1JUX1NFUVVFTkNFID0gbmV3IFZhbHVlVHlwZTw+KHNob3J0W10uY2xhc3MsICJTSE9SVF9TRVFVRU5DRSIsCisJCQluZXcgc2hvcnRbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIEludGVnZXJ9IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGEge0Bjb2RlIEludGVnZXJ9IGNvbnRhaW5pbmcgemVyby4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxJbnRlZ2VyPiBJTlRFR0VSID0gbmV3IFZhbHVlVHlwZTw+KEludGVnZXIuY2xhc3MsICJJTlRFR0VSIiwgSW50ZWdlci52YWx1ZU9mKDApKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBpbnRbXX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIGludH0gYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8aW50W10+IElOVEVHRVJfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oaW50W10uY2xhc3MsICJJTlRFR0VSX1NFUVVFTkNFIiwKKwkJCW5ldyBpbnRbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0BsaW5rIExvbmd9IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGEge0Bjb2RlIExvbmd9IGNvbnRhaW5pbmcgemVyby4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxMb25nPiBMT05HID0gbmV3IFZhbHVlVHlwZTw+KExvbmcuY2xhc3MsICJMT05HIiwgTG9uZy52YWx1ZU9mKDApKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBsb25nW119IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBsb25nfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxsb25nW10+IExPTkdfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4obG9uZ1tdLmNsYXNzLCAiTE9OR19TRVFVRU5DRSIsIG5ldyBsb25nWzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBGbG9hdH0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYSB7QGNvZGUgRmxvYXR9IGNvbnRhaW5pbmcgemVyby4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxGbG9hdD4gRkxPQVQgPSBuZXcgVmFsdWVUeXBlPD4oRmxvYXQuY2xhc3MsICJGTE9BVCIsIEZsb2F0LnZhbHVlT2YoMCkpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEge0Bjb2RlIGZsb2F0W119IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBmbG9hdH0gYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8ZmxvYXRbXT4gRkxPQVRfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oZmxvYXRbXS5jbGFzcywgIkZMT0FUX1NFUVVFTkNFIiwKKwkJCW5ldyBmbG9hdFswXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgRG91YmxlfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhIHtAY29kZSBEb3VibGV9IGNvbnRhaW5pbmcgemVyby4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxEb3VibGU+IERPVUJMRSA9IG5ldyBWYWx1ZVR5cGU8PihEb3VibGUuY2xhc3MsICJET1VCTEUiLCBEb3VibGUudmFsdWVPZigwKSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgZG91YmxlW119IHZhbHVlIGFuZCByZXBsYWNlcworCSAqIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBkb3VibGV9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPGRvdWJsZVtdPiBET1VCTEVfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oZG91YmxlW10uY2xhc3MsICJET1VCTEVfU0VRVUVOQ0UiLAorCQkJbmV3IGRvdWJsZVswXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGNvZGUgYnl0ZVtdfSB2YWx1ZSBhbmQgcmVwbGFjZXMKKwkgKiB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgYnl0ZX0gYXJyYXkuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZVR5cGU8Ynl0ZVtdPiBCWVRFX1NUUkVBTSA9IG5ldyBWYWx1ZVR5cGU8PihieXRlW10uY2xhc3MsICJCWVRFX1NUUkVBTSIsIG5ldyBieXRlWzBdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBieXRlW11bXX0gdmFsdWUgYW5kIHJlcGxhY2VzCisJICoge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIGJ5dGVbXVtdfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxieXRlW11bXT4gQllURV9TVFJFQU1fU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oYnl0ZVtdW10uY2xhc3MsCisJCQkiQllURV9TVFJFQU1fU0VRVUVOQ0UiLCBuZXcgYnl0ZVswXVtdKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBGbG9hdENvbXBsZXh9IHZhbHVlIGFuZCBkb2VzCisJICogbm90IHJlcGxhY2VzIHtAY29kZSBudWxsfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxGbG9hdENvbXBsZXg+IEZMT0FUX0NPTVBMRVggPSBuZXcgVmFsdWVUeXBlPD4oRmxvYXRDb21wbGV4LmNsYXNzLCAiRkxPQVRfQ09NUExFWCIsCisJCQludWxsKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBGbG9hdENvbXBsZXhbXX0gdmFsdWUgYW5kCisJICogcmVwbGFjZXMge0Bjb2RlIG51bGx9IHdpdGggYW4gZW1wdHkge0Bjb2RlIEZsb2F0Q29tcGxleFtdfSBhcnJheS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbHVlVHlwZTxGbG9hdENvbXBsZXhbXT4gRkxPQVRfQ09NUExFWF9TRVFVRU5DRSA9IG5ldyBWYWx1ZVR5cGU8PihGbG9hdENvbXBsZXhbXS5jbGFzcywKKwkJCSJGTE9BVF9DT01QTEVYX1NFUVVFTkNFIiwgbmV3IEZsb2F0Q29tcGxleFswXSk7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgRG91YmxlQ29tcGxleH0gdmFsdWUgYW5kCisJICogZG9lcyBub3QgcmVwbGFjZXMge0Bjb2RlIG51bGx9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPERvdWJsZUNvbXBsZXg+IERPVUJMRV9DT01QTEVYID0gbmV3IFZhbHVlVHlwZTw+KERvdWJsZUNvbXBsZXguY2xhc3MsICJET1VCTEVfQ09NUExFWCIsCisJCQludWxsKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBEb3VibGVDb21wbGV4W119IHZhbHVlIGFuZAorCSAqIHJlcGxhY2VzIHtAY29kZSBudWxsfSB3aXRoIGFuIGVtcHR5IHtAY29kZSBEb3VibGVDb21wbGV4W119IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPERvdWJsZUNvbXBsZXhbXT4gRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oRG91YmxlQ29tcGxleFtdLmNsYXNzLAorCQkJIkRPVUJMRV9DT01QTEVYX1NFUVVFTkNFIiwgbmV3IERvdWJsZUNvbXBsZXhbMF0pOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEgbW9kZWxlZCBlbnVtZXJhdGlvbiBjb25zdGFudCB2YWx1ZQorCSAqIGFuZCBkb2VzIG5vdCByZXBsYWNlIHtAY29kZSBudWxsfS4KKwkgKgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPEVudW1lcmF0aW9uVmFsdWU+IEVOVU1FUkFUSU9OID0gbmV3IFZhbHVlVHlwZTw+KCJFTlVNRVJBVElPTiIpOworCisJLyoqCisJICogQSB7QGxpbmsgVmFsdWV9IHdpdGggdGhpcyB0eXBlIGNvbnRhaW5zIGEgbW9kZWxlZCBlbnVtZXJhdGlvbiBjb25zdGFudCBhcnJheQorCSAqIHZhbHVlIGFuZCByZXBsYWNlcyB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSBhcnJheSB3aXRoIGRlZmluZWQgY29tcG9uZW50CisJICogdHlwZS4KKwkgKgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPEVudW1lcmF0aW9uVmFsdWVbXT4gRU5VTUVSQVRJT05fU0VRVUVOQ0UgPSBuZXcgVmFsdWVUeXBlPD4oIkVOVU1FUkFUSU9OX1NFUVVFTkNFIik7CisKKwkvKioKKwkgKiBBIHtAbGluayBWYWx1ZX0gd2l0aCB0aGlzIHR5cGUgY29udGFpbnMgYSB7QGxpbmsgRmlsZUxpbmt9IHZhbHVlIGFuZCBkb2VzIG5vdAorCSAqIHJlcGxhY2Uge0Bjb2RlIG51bGx9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPEZpbGVMaW5rPiBGSUxFX0xJTksgPSBuZXcgVmFsdWVUeXBlPD4oRmlsZUxpbmsuY2xhc3MsICJGSUxFX0xJTksiLCBudWxsKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAY29kZSBGaWxlTGlua1tdfSB2YWx1ZSBhbmQKKwkgKiByZXBsYWNlcyB7QGNvZGUgbnVsbH0gd2l0aCBhbiBlbXB0eSB7QGNvZGUgRmlsZUxpbmt9IGFycmF5LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPEZpbGVMaW5rW10+IEZJTEVfTElOS19TRVFVRU5DRSA9IG5ldyBWYWx1ZVR5cGU8PihGaWxlTGlua1tdLmNsYXNzLAorCQkJIkZJTEVfTElOS19TRVFVRU5DRSIsIG5ldyBGaWxlTGlua1swXSk7CisKKwkvKioKKwkgKiBUT0RPIC4uLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPE9iamVjdD4gQkxPQiA9IG5ldyBWYWx1ZVR5cGU8PihPYmplY3QuY2xhc3MsICIiLCBudWxsKTsKKworCS8qKgorCSAqIEEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdHlwZSBjb250YWlucyBhIHtAbGluayBPYmplY3R9IHZhbHVlIGFuZCBkb2VzIG5vdAorCSAqIHJlcGxhY2Uge0Bjb2RlIG51bGx9LiBUaGlzIHZhbHVlIHR5cGUgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc2VxdWVuY2UKKwkgKiB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVUeXBlPE9iamVjdD4gVU5LTk9XTiA9IG5ldyBWYWx1ZVR5cGU8PihPYmplY3QuY2xhc3MsICJVTktOT1dOIiwgbnVsbCk7CisKKwkvKioKKwkgKiBUaGUgdHlwZSBpcyB1c2VkIHRvIGNoZWNrIGFzc2lnbm1lbnQgY29tcGF0aWJpbGl0eSBvZiBub24ge0Bjb2RlIG51bGx9IHZhbHVlcworCSAqIHBhc3NlZCB0byB7QGxpbmsgVmFsdWUjc2V0KE9iamVjdCl9LgorCSAqLworCXByaXZhdGUgZmluYWwgQ2xhc3M8VD4gdHlwZTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgdXNlZCBpbiB7QGxpbmsgVmFsdWUjc2V0KE9iamVjdCl9IHRvIHJlcGxhY2UgYQorCSAqIHtAY29kZSBudWxsfSBpbnB1dCBhcmd1bWVudC4KKwkgKi8KKwlwcml2YXRlIGZpbmFsIFQgZGVmYXVsdFZhbHVlOworCisJLyoqCisJICogQ29uc3RydWN0b3IgLSBNYXkgb25seSBiZSB1c2VkIHRvIGNyZWF0ZSB7QGxpbmsgI0VOVU1FUkFUSU9OfSwKKwkgKiB7QGxpbmsgI0VOVU1FUkFUSU9OX1NFUVVFTkNFfSBvciB7QGxpbmsgI1VOS05PV059IHR5cGVzLgorCSAqIAorCSAqIEBwYXJhbSBuYW1lCisJICovCisJcHJpdmF0ZSBWYWx1ZVR5cGUoU3RyaW5nIG5hbWUpIHsKKwkJdGhpcyhudWxsLCBuYW1lLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSAgICAgICAgIFRoZSB0eXBlIG9mIHZhbHVlIGEge0BsaW5rIFZhbHVlfSB3aXRoIHRoaXMgdmFsdWUgdHlwZQorCSAqICAgICAgICAgICAgICAgICAgICAgd2lsbCBhY2NlcHQuCisJICogQHBhcmFtIG5hbWUKKwkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFdpbGwgYmUgdXNlZCBhcyB7QGNvZGUgbnVsbH0gcmVwbGFjZW1lbnQgaW4KKwkgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBWYWx1ZSNzZXQoT2JqZWN0KX0uCisJICovCisJcHJpdmF0ZSBWYWx1ZVR5cGUoQ2xhc3M8VD4gdHlwZSwgU3RyaW5nIG5hbWUsIFQgZGVmYXVsdFZhbHVlKSB7CisJCXN1cGVyKG5hbWUpOworCQl0aGlzLnR5cGUgPSB0eXBlOworCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZX0gaW5pdGlhbGl6ZWQgd2l0aCBnaXZlbiBuYW1lLiBUaGUge0Bjb2RlCisJICogVmFsdWV9J3MgaW5pdGlhbCB2YWxpZGl0eSBmbGFnIHdpbGwgYmUgc2V0IHRvIHtAY29kZSB0cnVlfSwgdGhlIHVuaXQgbmFtZQorCSAqIHdpbGwgYmUgb21pdHRlZC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIHdoZXJlCisJICoge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zIHtAY29kZSBmYWxzZX0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0uCisJICovCisJcHVibGljIFZhbHVlIGNyZWF0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IGlucHV0KSB7CisJCXJldHVybiBjcmVhdGUobmFtZSwgIiIsIHRydWUsIGlucHV0KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZX0gaW5pdGlhbGl6ZWQgd2l0aCBnaXZlbiBuYW1lLiBUaGUge0Bjb2RlCisJICogVmFsdWV9J3MgaW5pdGlhbCB2YWxpZGl0eSBmbGFnIHdpbGwgYmUgc2V0IHRvIHtAY29kZSBmYWxzZX0sIHRoZSB1bml0IG5hbWUKKwkgKiB3aWxsIGJlIG9taXR0ZWQuIFRoZSBpbml0aWFsIHZhbHVlIHdpbGwgYmUgdGhlIG9uZSBkZWZpbmVkIGluCisJICoge0BsaW5rICNkZWZhdWx0VmFsdWV9LgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBjYWxsZWQgd2hlcmUKKwkgKiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMge0Bjb2RlIGZhbHNlfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0uCisJICovCisJcHVibGljIFZhbHVlIGNyZWF0ZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY3JlYXRlKG5hbWUsICIiLCBmYWxzZSwgZGVmYXVsdFZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZX0gaW5pdGlhbGl6ZWQgd2l0aCBnaXZlbiBhcmd1bWVudHMuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgb25seSBhbGxvd2VkIHRvIGJlIGNhbGxlZCB3aGVyZQorCSAqIHtAbGluayAjaXNFbnVtZXJhdGlvblR5cGUoKX0gcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorCSAqCisJICogQHBhcmFtIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIHVuaXQgIFRoZSB1bml0IG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKwkgKiBAcGFyYW0gdmFsaWQgVGhlIGluaXRpYWwgdmFsaWRpdHkgZmxhZy4KKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0uCisJICovCisJcHVibGljIFZhbHVlIGNyZWF0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHVuaXQsIGJvb2xlYW4gdmFsaWQsIE9iamVjdCBpbnB1dCkgeworCQlpZiAoaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyB2YWx1ZSB0eXBlIGlzIGFuIGVudW1lcmF0aW9uIHR5cGUuIik7CisJCX0KKworCQlyZXR1cm4gbmV3IFZhbHVlKHRoaXMsIG5hbWUsIHVuaXQsIHZhbGlkLCBpbnB1dCwgdHlwZSwgZGVmYXVsdFZhbHVlLCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZX0gaW5pdGlhbGl6ZWQgd2l0aCBnaXZlbiBuYW1lLiBUaGUge0Bjb2RlCisJICogVmFsdWV9J3MgaW5pdGlhbCB2YWxpZGl0eSBmbGFnIHdpbGwgYmUgc2V0IHRvIHtAY29kZSBmYWxzZX0sIHRoZSB1bml0IG5hbWUKKwkgKiB3aWxsIGJlIG9taXR0ZWQuIFRoZSBpbml0aWFsIHZhbHVlIHdpbGwgYmUge0Bjb2RlIG51bGx9IGlmCisJICoge0BsaW5rICNpc1NlcXVlbmNlKCl9IHJldHVybnMge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UgYW4gZW1wdHkgYXJyYXkgd2l0aAorCSAqIGdpdmVuIGNvbXBvbmVudCB0eXBlIGluIGVudW1DbGFzcyBpcyB1c2VkLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBjYWxsZWQgd2hlcmUKKwkgKiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMge0Bjb2RlIHRydWV9LgorCSAqCisJICogQHBhcmFtIDxFPiAgTW9kZWxlZCBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgZmFsc2V9LgorCSAqLworCXB1YmxpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IFZhbHVlIGNyZWF0ZShFbnVtZXJhdGlvbjxFPiBlbnVtT2JqLCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gY3JlYXRlKG5hbWUsICIiLCBmYWxzZSwgbnVsbCwgZW51bU9iai5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFZhbHVlfSBpbml0aWFsaXplZCB3aXRoIGdpdmVuIGFyZ3VtZW50cy4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgY2FsbGVkIHdoZXJlCisJICoge0BsaW5rICNpc0VudW1lcmF0aW9uVHlwZSgpfSByZXR1cm5zIHtAY29kZSB0cnVlfS4KKwkgKgorCSAqIEBwYXJhbSA8RT4gICBNb2RlbGVkIGVudW1lcmF0aW9uIHR5cGUuCisJICogQHBhcmFtIG5hbWUgIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCisJICogQHBhcmFtIHVuaXQgIFRoZSB1bml0IG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKwkgKiBAcGFyYW0gdmFsaWQgVGhlIGluaXRpYWwgdmFsaWRpdHkgZmxhZy4KKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGluaXRpYWwgdmFsdWUuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgZmFsc2V9LgorCSAqLworCXB1YmxpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IFZhbHVlIGNyZWF0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHVuaXQsIGJvb2xlYW4gdmFsaWQsIE9iamVjdCBpbnB1dCwKKwkJCVN0cmluZyB2YWx1ZVR5cGVEZXNjcikgeworCQlpZiAoaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJT2JqZWN0IG51bGxSZXBsYWNlbWVudCA9IG51bGw7CisJCQlDbGFzczw/PiB2YWx1ZUNsYXNzID0gRW51bWVyYXRpb25WYWx1ZS5jbGFzczsKKwkJCWlmIChpc1NlcXVlbmNlKCkpIHsKKwkJCQludWxsUmVwbGFjZW1lbnQgPSBBcnJheS5uZXdJbnN0YW5jZSh2YWx1ZUNsYXNzLCAwKTsKKwkJCQl2YWx1ZUNsYXNzID0gbnVsbFJlcGxhY2VtZW50LmdldENsYXNzKCk7CisJCQl9CisKKwkJCXJldHVybiBuZXcgVmFsdWUodGhpcywgbmFtZSwgdW5pdCwgdmFsaWQsIGlucHV0LCB2YWx1ZUNsYXNzLCBudWxsUmVwbGFjZW1lbnQsIHZhbHVlVHlwZURlc2NyKTsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgdmFsdWUgdHlwZSBpcyBub3QgYW4gZW51bWVyYXRpb24gdHlwZS4iKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1NUUklOR308L2xpPgorCSAqIDxsaT57QGxpbmsgI1NUUklOR19TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdHJpbmdUeXBlKCkgeworCQlyZXR1cm4gaXNTdHJpbmcoKSB8fCBpc1N0cmluZ1NlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI1NUUklOR30uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTdHJpbmcoKSB7CisJCXJldHVybiBTVFJJTkcgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjU1RSSU5HX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0cmluZ1NlcXVlbmNlKCkgeworCQlyZXR1cm4gU1RSSU5HX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNEQVRFfTwvbGk+CisJICogPGxpPntAbGluayAjREFURV9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEYXRlVHlwZSgpIHsKKwkJcmV0dXJuIGlzRGF0ZSgpIHx8IGlzRGF0ZVNlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0RBVEV9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRGF0ZSgpIHsKKwkJcmV0dXJuIERBVEUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjREFURV9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEYXRlU2VxdWVuY2UoKSB7CisJCXJldHVybiBEQVRFX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNCT09MRUFOfTwvbGk+CisJICogPGxpPntAbGluayAjQk9PTEVBTl9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb29sZWFuVHlwZSgpIHsKKwkJcmV0dXJuIGlzQm9vbGVhbigpIHx8IGlzQm9vbGVhblNlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0JPT0xFQU59LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQm9vbGVhbigpIHsKKwkJcmV0dXJuIEJPT0xFQU4gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjQk9PTEVBTl9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb29sZWFuU2VxdWVuY2UoKSB7CisJCXJldHVybiBCT09MRUFOX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayAjQllURV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayAjU0hPUlRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUl9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNMT05HX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNOdW1lcmljYWxUeXBlKCkgeworCQlyZXR1cm4gaXNBbnlJbnRlZ2VyVHlwZSgpIHx8IGlzQW55RmxvYXRUeXBlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayAjQllURV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayAjU0hPUlRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayAjSU5URUdFUl9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNMT05HX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FueUludGVnZXJUeXBlKCkgeworCQlyZXR1cm4gaXNCeXRlVHlwZSgpIHx8IGlzU2hvcnRUeXBlKCkgfHwgaXNJbnRlZ2VyVHlwZSgpIHx8IGlzTG9uZ1R5cGUoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0JZVEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNCWVRFX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J5dGVUeXBlKCkgeworCQlyZXR1cm4gaXNCeXRlKCkgfHwgaXNCeXRlU2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjQllURX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCeXRlKCkgeworCQlyZXR1cm4gQllURSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNCWVRFX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J5dGVTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIEJZVEVfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayAjU0hPUlRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU2hvcnRUeXBlKCkgeworCQlyZXR1cm4gaXNTaG9ydCgpIHx8IGlzU2hvcnRTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNTSE9SVH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaG9ydCgpIHsKKwkJcmV0dXJuIFNIT1JUID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI1NIT1JUX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Nob3J0U2VxdWVuY2UoKSB7CisJCXJldHVybiBTSE9SVF9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjSU5URUdFUn08L2xpPgorCSAqIDxsaT57QGxpbmsgI0lOVEVHRVJfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZWdlclR5cGUoKSB7CisJCXJldHVybiBpc0ludGVnZXIoKSB8fCBpc0ludGVnZXJTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNJTlRFR0VSfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ludGVnZXIoKSB7CisJCXJldHVybiBJTlRFR0VSID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0lOVEVHRVJfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzSW50ZWdlclNlcXVlbmNlKCkgeworCQlyZXR1cm4gSU5URUdFUl9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjTE9OR308L2xpPgorCSAqIDxsaT57QGxpbmsgI0xPTkdfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9uZ1R5cGUoKSB7CisJCXJldHVybiBpc0xvbmcoKSB8fCBpc0xvbmdTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNMT05HfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0xvbmcoKSB7CisJCXJldHVybiBMT05HID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0xPTkdfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTG9uZ1NlcXVlbmNlKCkgeworCQlyZXR1cm4gTE9OR19TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbnlGbG9hdFR5cGUoKSB7CisJCXJldHVybiBpc0Zsb2F0VHlwZSgpIHx8IGlzRG91YmxlVHlwZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGbG9hdFR5cGUoKSB7CisJCXJldHVybiBpc0Zsb2F0KCkgfHwgaXNGbG9hdFNlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0ZMT0FUfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0KCkgeworCQlyZXR1cm4gRkxPQVQgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRkxPQVRfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXRTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIEZMT0FUX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEVfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlVHlwZSgpIHsKKwkJcmV0dXJuIGlzRG91YmxlKCkgfHwgaXNEb3VibGVTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNET1VCTEV9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlKCkgeworCQlyZXR1cm4gRE9VQkxFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0RPVUJMRV9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEb3VibGVTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIERPVUJMRV9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjQllURV9TVFJFQU19PC9saT4KKwkgKiA8bGk+e0BsaW5rICNCWVRFX1NUUkVBTV9TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCeXRlU3RyZWFtVHlwZSgpIHsKKwkJcmV0dXJuIGlzQnl0ZVN0cmVhbSgpIHx8IGlzQnl0ZVN0cmVhbVNlcXVlbmNlKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0JZVEVfU1RSRUFNfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0J5dGVTdHJlYW0oKSB7CisJCXJldHVybiBCWVRFX1NUUkVBTSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNCWVRFX1NUUkVBTV9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCeXRlU3RyZWFtU2VxdWVuY2UoKSB7CisJCXJldHVybiBCWVRFX1NUUkVBTV9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRkxPQVRfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUX0NPTVBMRVhfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNET1VCTEVfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9DT01QTEVYX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXhUeXBlKCkgeworCQlyZXR1cm4gaXNGbG9hdENvbXBsZXhUeXBlKCkgfHwgaXNEb3VibGVDb21wbGV4VHlwZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRkxPQVRfQ09NUExFWH08L2xpPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUX0NPTVBMRVhfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRmxvYXRDb21wbGV4VHlwZSgpIHsKKwkJcmV0dXJuIGlzRmxvYXRDb21wbGV4KCkgfHwgaXNGbG9hdENvbXBsZXhTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNGTE9BVF9DT01QTEVYfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Zsb2F0Q29tcGxleCgpIHsKKwkJcmV0dXJuIEZMT0FUX0NPTVBMRVggPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRkxPQVRfQ09NUExFWF9TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGbG9hdENvbXBsZXhTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIEZMT0FUX0NPTVBMRVhfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0RPVUJMRV9DT01QTEVYfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlQ29tcGxleFR5cGUoKSB7CisJCXJldHVybiBpc0RvdWJsZUNvbXBsZXgoKSB8fCBpc0RvdWJsZUNvbXBsZXhTZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNET1VCTEVfQ09NUExFWH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNEb3VibGVDb21wbGV4KCkgeworCQlyZXR1cm4gRE9VQkxFX0NPTVBMRVggPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0V9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRG91YmxlQ29tcGxleFNlcXVlbmNlKCkgeworCQlyZXR1cm4gRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0UgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgI0VOVU1FUkFUSU9OfTwvbGk+CisJICogPGxpPntAbGluayAjRU5VTUVSQVRJT05fU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpbiB0aGUgY2FzZXMgbGlzdGVkIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzRW51bWVyYXRpb25UeXBlKCkgeworCQlyZXR1cm4gaXNFbnVtZXJhdGlvbigpIHx8IGlzRW51bWVyYXRpb25TZXF1ZW5jZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMge0BsaW5rICNFTlVNRVJBVElPTn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbnVtZXJhdGlvbigpIHsKKwkJcmV0dXJuIEVOVU1FUkFUSU9OID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0VOVU1FUkFUSU9OX1NFUVVFTkNFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VudW1lcmF0aW9uU2VxdWVuY2UoKSB7CisJCXJldHVybiBFTlVNRVJBVElPTl9TRVFVRU5DRSA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjRklMRV9MSU5LfTwvbGk+CisJICogPGxpPntAbGluayAjRklMRV9MSU5LX1NFUVVFTkNFfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaW4gdGhlIGNhc2VzIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVMaW5rVHlwZSgpIHsKKwkJcmV0dXJuIGlzRmlsZUxpbmsoKSB8fCBpc0ZpbGVMaW5rU2VxdWVuY2UoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjRklMRV9MSU5LfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZpbGVMaW5rKCkgeworCQlyZXR1cm4gRklMRV9MSU5LID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0ZJTEVfTElOS19TRVFVRU5DRX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGaWxlTGlua1NlcXVlbmNlKCkgeworCQlyZXR1cm4gRklMRV9MSU5LX1NFUVVFTkNFID09IHRoaXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgdHlwZSBpcyB7QGxpbmsgI0JMT0J9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQmxvYigpIHsKKwkJcmV0dXJuIEJMT0IgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIHtAbGluayAjVU5LTk9XTn0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNVbmtub3duKCkgeworCQlyZXR1cm4gVU5LTk9XTiA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIHR5cGUgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayAjU1RSSU5HX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjREFURV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0JPT0xFQU5fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNCWVRFX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjU0hPUlRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNJTlRFR0VSX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjTE9OR19TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0ZMT0FUX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjQllURV9TVFJFQU1fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNGTE9BVF9DT01QTEVYX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayAjRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rICNFTlVNRVJBVElPTl9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgI0ZJTEVfTElOS19TRVFVRU5DRX08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGluIHRoZSBjYXNlcyBsaXN0ZWQgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTZXF1ZW5jZSgpIHsKKwkJcmV0dXJuIG5hbWUoKSAhPSBudWxsICYmIG5hbWUoKS5lbmRzV2l0aCgiU0VRVUVOQ0UiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzZXF1ZW5jZSB2ZXJzaW9uIG9mIHRoaXMgdmFsdWUgdHlwZS4gVGhpcyBtZXRob2QgcmV0dXJucyBpdHNlbGYsCisJICogaWYgdGhpcyB2YWx1ZSB0eXBlIGlzIGEgc2VxdWVuY2UgdHlwZS4KKwkgKiAKKwkgKiBJZiB5b3UgZXh0ZW5kIHRoZSBjbGFzcyBWYWx1ZVR5cGUsIHlvdSBoYXZlIHRvIGVuc3VyZSB0aGF0IFQgY29udGFpbnMgYSBmaWVsZAorCSAqIG9mIHRoZSBjb3JyZWN0IG5hbWUgYW5kIHR5cGUsIG90aGVyd2lzZSBhIHJ1bnRpbWUgZXJyb3Igd2lsbCBvY2N1ci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHNlcXVlbmNlIHZlcnNpb24gb2YgdGhpcyB2YWx1ZSB0eXBlIGlzIHJldHVybmVkLgorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8UyBleHRlbmRzIFZhbHVlVHlwZTw/Pj4gUyB0b1NlcXVlbmNlVHlwZSgpIHsKKwkJaWYgKGlzU2VxdWVuY2UoKSkgeworCQkJcmV0dXJuIChTKSB0aGlzOworCQl9CisKKwkJcmV0dXJuIChTKSB2YWx1ZU9mKG5hbWUoKSArICJfU0VRVUVOQ0UiKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBzY2FsYXIgdmVyc2lvbiBvZiB0aGlzIHZhbHVlIHR5cGUuIFRoaXMgbWV0aG9kIHJldHVybnMgaXRzZWxmLCBpZgorCSAqIHRoaXMgdmFsdWUgdHlwZSBpcyBhIHNjYWxhciB0eXBlLgorCSAqIAorCSAqIElmIHlvdSBleHRlbmQgdGhlIGNsYXNzIFZhbHVlVHlwZSwgeW91IGhhdmUgdG8gZW5zdXJlIHRoYXQgVCBjb250YWlucyBhIGZpZWxkCisJICogb2YgdGhlIGNvcnJlY3QgbmFtZSBhbmQgdHlwZSwgb3RoZXJ3aXNlIGEgcnVudGltZSBlcnJvciB3aWxsIG9jY3VyLgorCSAqCisJICogQHJldHVybiBUaGUgc2VxdWVuY2UgdmVyc2lvbiBvZiB0aGlzIHZhbHVlIHR5cGUgaXMgcmV0dXJuZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIDxTIGV4dGVuZHMgVmFsdWVUeXBlPD8+PiBTIHRvU2luZ2xlVHlwZSgpIHsKKworCQlpZiAoaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJaWYgKGlzU2VxdWVuY2UoKSkgeworCQkJCXJldHVybiAoUykgdmFsdWVPZihuYW1lKCkucmVwbGFjZSgiX1NFUVVFTkNFIiwgIiIpKTsKKwkJCX0KKworCQkJcmV0dXJuIChTKSB0aGlzOworCQl9IGVsc2UgeworCQkJdHJ5IHsKKwkJCQlpZiAoaXNTZXF1ZW5jZSgpKSB7CisJCQkJCUZpZWxkIGZpZWxkID0gZ2V0Q2xhc3MoKS5nZXRGaWVsZChuYW1lKCkucmVwbGFjZSgiX1NFUVVFTkNFIiwgIiIpKTsKKwkJCQkJcmV0dXJuIChTKSBmaWVsZC5nZXQodGhpcyk7CisJCQkJfQorCQkJCXJldHVybiAoUykgdGhpczsKKwkJCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIHwgQ2xhc3NDYXN0RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbid0IGZpZ3VyZSBvdXQgc2luZ2xlIHR5cGUgZm9yICIgKyBuYW1lKCkpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgY2xhc3MgZm9yIHRoaXMgdmFsdWUgdHlwZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHZhbHVlIGNsYXNzIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgI2lzRW51bWVyYXRpb25UeXBlKCl9IHJldHVybnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0uCisJICovCisJcHVibGljIENsYXNzPD8+IGdldFZhbHVlQ2xhc3MoKSB7CisJCWlmIChpc0VudW1lcmF0aW9uVHlwZSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKKwkJfQorCQlyZXR1cm4gdHlwZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WZXJzaW9uU3RhdGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9WZXJzaW9uU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjJiZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZlcnNpb25TdGF0ZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKKy8qKgorICogVmVyc2lvbiBzdGF0ZSBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRmlsZUxpbmsKKyAqLworcHVibGljIGNsYXNzIFZlcnNpb25TdGF0ZSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW1lcmF0aW9ucworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFuIGVudGl0eSB3aXRoIHRoaXMgdmVyc2lvbiBzdGF0ZSBpcyBzdGlsbCBlZGl0YWJsZSBhbmQgaGVuY2Ugbm90IGFsbG93ZWQgYmUKKwkgKiB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IGVudGl0aWVzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvblN0YXRlIEVESVRBQkxFID0gbmV3IFZlcnNpb25TdGF0ZSgiRURJVEFCTEUiLCAwKTsKKworCS8qKgorCSAqIEFuIGVudGl0eSB3aXRoIHRoaXMgdmVyc2lvbiBzdGF0ZSBpcyBubyBsb25nZXIgZWRpdGFibGUgYW5kIGlzIGFsbG93ZWQgdG8gYmUKKwkgKiB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IGVudGl0aWVzLgorCSAqCisJICogPHA+CisJICogPGI+Tm90ZTo8L2I+IElmIGFuIGVudGl0eSdzIHZlcnNpb24gc3RhdGUgaXMgdGhpcyBzdGF0ZSwgdGhlbiBpdHMgdmVyc2lvbgorCSAqIHN0YXRlIGlzIG9ubHkgYWxsb3dlZCB0byBiZSBjaGFuZ2VkIHRvIHtAbGluayAjQVJDSElWRUR9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvblN0YXRlIFZBTElEID0gbmV3IFZlcnNpb25TdGF0ZSgiVkFMSUQiLCAxKTsKKworCS8qKgorCSAqIEFuIGVudGl0eSB3aXRoIHRoaXMgdmVyc2lvbiBzdGF0ZSBpcyBuZWl0aGVyIGVkaXRhYmxlIG5vciBpcyBpdCBhbGxvd2VkIHRvCisJICogdXNlIGl0IHdoZW4gY3JlYXRpbmcgbmV3IGVudGl0aWVzCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gSWYgYW4gZW50aXR5J3MgdmVyc2lvbiBzdGF0ZSBpcyB0aGlzIHN0YXRlLCB0aGVuIGl0cyB2ZXJzaW9uCisJICogc3RhdGUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gYmUgY2hhbmdlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb25TdGF0ZSBBUkNISVZFRCA9IG5ldyBWZXJzaW9uU3RhdGUoIkFSQ0hJVkVEIiwgMik7CisKKwlwcml2YXRlIFZlcnNpb25TdGF0ZShTdHJpbmcgbmFtZSwgaW50IG9yZGluYWwpIHsKKwkJc3VwZXIobmFtZSwgb3JkaW5hbCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdmVyc2lvbiBzdGF0ZSBpcyB7QGxpbmsgI0VESVRBQkxFfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBjb25zdGFudCBpcyB0aGUgY29uc3RhbnQgZGVzY3JpYmVkCisJICogICAgICAgICBhYm92ZS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0VkaXRhYmxlKCkgeworCQlyZXR1cm4gRURJVEFCTEUgPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB2ZXJzaW9uIHN0YXRlIGlzIHtAbGluayAjVkFMSUR9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNvbnN0YW50IGlzIHRoZSBjb25zdGFudCBkZXNjcmliZWQKKwkgKiAgICAgICAgIGFib3ZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7CisJCXJldHVybiBWQUxJRCA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZlcnNpb24gc3RhdGUgaXMge0BsaW5rICNBUkNISVZFRH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgY29uc3RhbnQgaXMgdGhlIGNvbnN0YW50IGRlc2NyaWJlZAorCSAqICAgICAgICAgYWJvdmUuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBcmNoaXZlZCgpIHsKKwkJcmV0dXJuIEFSQ0hJVkVEID09IHRoaXM7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTk3MTAyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbjsKKworLyoqCisgKiBUaHJvd24gdG8gaW5kaWNhdGUgYSBlcnJvcnMgY29uY2VybmluZyBub3RpZmljYXRpb25zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICovCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQwMTE4Nzc2MzE1NTkyNjE3MTZMOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgZXJyb3IgbWVzc2FnZS4KKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UgICBUaGUgZXJyb3IgbWVzc2FnZS4KKwkgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBvcmlnaW4gY2F1c2UuCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNmViOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkZpbHRlci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworCisvKioKKyAqIENsYXNzIHJlcHJlc2VudHMgYSBmaWx0ZXIgZm9yIG5vdGlmaWNhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICovCitwdWJsaWMgY2xhc3MgTm90aWZpY2F0aW9uRmlsdGVyIHsKKworCS8qKgorCSAqIE1vZGlmaWNhdGlvbiB0eXBlIGVudW1lcmF0aW9uCisJICogCisJICogQHNpbmNlIDEuMC4wCisJICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorCSAqLworCXB1YmxpYyBzdGF0aWMgZW51bSBNb2RpZmljYXRpb25UeXBlIHsKKwkJSU5TVEFOQ0VfQ1JFQVRFRCwgSU5TVEFOQ0VfTU9ESUZJRUQsIElOU1RBTkNFX0RFTEVURUQsIE1PREVMX01PRElGSUVELCBTRUNVUklUWV9NT0RJRklFRDsKKwl9CisKKwlwcml2YXRlIEVudW1TZXQ8TW9kaWZpY2F0aW9uVHlwZT4gdHlwZXMgPSBFbnVtU2V0LmFsbE9mKE1vZGlmaWNhdGlvblR5cGUuY2xhc3MpOworCisJcHJpdmF0ZSBTZXQ8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIE1vZGlmaWNhdGlvblR5cGV9cyBvZiB0aGlzIGZpbHRlci4KKwkgKiAKKwkgKiBAcmV0dXJuIFNldCB3aXRoIHtAbGluayBNb2RpZmljYXRpb25UeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU2V0PE1vZGlmaWNhdGlvblR5cGU+IGdldFR5cGVzKCkgeworCQlyZXR1cm4gdHlwZXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIE1vZGlmaWNhdGlvblR5cGV9cyB1c2VkIHRvIGZpbHRlciB0aGUgbm90aWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcGFyYW0gdHlwZXMgU2V0IHdpdGgge0BsaW5rIE1vZGlmaWNhdGlvblR5cGV9CisJICovCisJcHVibGljIHZvaWQgc2V0VHlwZXMoU2V0PE1vZGlmaWNhdGlvblR5cGU+IHR5cGVzKSB7CisJCXRoaXMudHlwZXMgPSBFbnVtU2V0LmNvcHlPZih0eXBlcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVR5cGV9cyBvZiB0aGlzIGZpbHRlci4KKwkgKiAKKwkgKiBAcmV0dXJuIFNldCB3aXRoIHtAbGluayBFbnRpdHlUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU2V0PEVudGl0eVR5cGU+IGdldEVudGl0eVR5cGVzKCkgeworCQlyZXR1cm4gZW50aXR5VHlwZXM7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIEVudGl0eVR5cGV9cyB1c2VkIHRvIGZpbHRlciB0aGUgbm90aWZpY2F0aW9ucy4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgU2V0IHdpdGgge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqLworCXB1YmxpYyB2b2lkIHNldEVudGl0eVR5cGVzKFNldDxFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcykgeworCQl0aGlzLmVudGl0eVR5cGVzID0gbmV3IEhhc2hTZXQ8PihlbnRpdHlUeXBlcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25MaXN0ZW5lci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25MaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwM2EzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKKworLyoqCisgKiBMaXN0ZW5lciBpbnRlcmZhY2UgZm9yIG5vdGlmaWNhdGlvbnMuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICovCitwdWJsaWMgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbkxpc3RlbmVyIHsKKwkvKioKKwkgKiBDYWxsZWQgd2hlbiBhIG5ldyBpbnN0YW5jZSBlbGVtZW50IHdhcyBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGVudGl0aWVzIEEgbGlzdCBvZiBuZXdseSBjcmVhdGVkIGVudGl0aWVzLgorCSAqIEBwYXJhbSB1c2VyICAgICBUaGUgdXNlciB3aG8gY3JlYXRlZCB0aGUgZW50aXRpZXMuCisJICovCisJdm9pZCBpbnN0YW5jZUNyZWF0ZWQoTGlzdDw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdGllcywgVXNlciB1c2VyKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIGEgZXhpc3RpbmcgaW5zdGFuY2UgZWxlbWVudCB3YXMgbW9kaWZpZWQgYnkgdGhlIHNlcnZlci4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXRpZXMgQSBsaXN0IG9mIG1vZGlmaWVkIGVudGl0aWVzLgorCSAqIEBwYXJhbSB1c2VyICAgICBUaGUgdXNlciB3aG8gbW9kaWZpZWQgdGhlIGVudGl0aWVzLgorCSAqLworCXZvaWQgaW5zdGFuY2VNb2RpZmllZChMaXN0PD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0aWVzLCBVc2VyIHVzZXIpOworCisJLyoqCisJICogQ2FsbGVkIHdoZW4gYSBleGlzdGluZyBpbnN0YW5jZSBlbGVtZW50IHdhcyBkZWxldGVkIGJ5IHRoZSBzZXJ2ZXIuCisJICogCisJICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZSBvZiB0aGUgZGVsZXRlZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gZW50aXRpZXMgICBBIGxpc3Qgd2l0aCB0aGUgSURzIG9mIGRlbGV0ZWQgZW50aXRpZXMuCisJICogQHBhcmFtIHVzZXIgICAgICAgVGhlIHVzZXIgd2hvIGRlbGV0ZWQgdGhlIGVudGl0aWVzLgorCSAqLworCXZvaWQgaW5zdGFuY2VEZWxldGVkKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgTGlzdDxTdHJpbmc+IGlkcywgVXNlciB1c2VyKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBpcyBjaGFuZ2VkIGJ5IHRoZSBzZXJ2ZXIKKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBNb2RpZmllZCBlbnRpdHlUeXBlLgorCSAqIEBwYXJhbSB1c2VyICAgICAgIFRoZSB1c2VyIHdobyBtb2RpZmllZCB0aGUgYXBwbGljYXRpb24gbW9kZWwuCisJICovCisJdm9pZCBtb2RlbE1vZGlmaWVkKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgVXNlciB1c2VyKTsKKworCS8qKgorCSAqIENhbGxlZCB3aGVuIHNlY3VyaXR5IHJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgY2hhbmdlZCBieSB0aGUgc2VydmVyCisJICogCisJICogQHBhcmFtIGVudGl0eVR5cGUgRW50aXR5VHlwZSB3aXRoIGNoYW5nZWQgc2VjdXJpdHkKKwkgKiBAcGFyYW0gZW50aXRpZXMgICBBIGxpc3Qgd2l0aCB0aGUgSURzIG9mIGVudGl0aWVzIHJlbGF0ZWQgdG8gdGhlIGNoYW5nZS4KKwkgKiAgICAgICAgICAgICAgICAgICBFbXB0eSBpZiBjaGFuZ2Ugd2FzIG9ubHkgcmVsZXZhbnQgZm9yIGVudGl0eVR5cGUuCisJICogQHBhcmFtIHVzZXIgICAgICAgVGhlIHVzZXIgd2hvIG1vZGlmaWVkIHNlY3VyaXR5IGluZm9ybWF0aW9uLgorCSAqLworCXZvaWQgc2VjdXJpdHlNb2RpZmllZChFbnRpdHlUeXBlIGVudGl0eVR5cGUsIExpc3Q8U3RyaW5nPiBpZHMsIFVzZXIgdXNlcik7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvblNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9ub3RpZmljYXRpb24vTm90aWZpY2F0aW9uU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMTc0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvblNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbjsKKworLyoqCisgKiBNYW5hZ2VzIHJlZ2lzdHJhdGlvbnMgdG8gYSBub3RpZmljYXRpb24gc2VydmljZS4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTm90aWZpY2F0aW9uU2VydmljZSB7CisKKwkvKioKKwkgKiBSZWdpc3RlcnMgYSBOb3RpZmljYXRpb25MaXN0ZW5lciBhdCB0aGUgdW5kZXJseWluZyBub3RpZmljYXRpb24gc2VydmljZS4KKwkgKiAKKwkgKiBAcGFyYW0gcmVnaXN0cmF0aW9uTmFtZSBBbiB1bmlxdWUgbmFtZSB1c2VkIGZvciB0aGUgcmVnaXN0cmF0aW9uLgorCSAqIEBwYXJhbSBmaWx0ZXIgICAgICAgICAgIEEgbm90aWZpY2F0aW9uIGZpbHRlciwgc3BlY2lmeWluZyB3aGljaCBldmVudHMgc2hvdWxkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgcmVjZWl2ZWQgYnkgdGhlIGxpc3RlbmVyLgorCSAqIEBwYXJhbSBsaXN0ZW5lciAgICAgICAgIEEgbm90aWZpY2F0aW9uIGxpc3RlbmVyIHdoaWNoIGlzIGluZm9ybWVkIGlmIG5ldworCSAqICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCisJICogQHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gSW4gY2FzZSB0aGUgbGlzdGVuZXIgY2Fubm90IGJlIHJlZ2lzdGVyZWQgYXQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisJICovCisJdm9pZCByZWdpc3RlcihTdHJpbmcgcmVnaXN0cmF0aW9uTmFtZSwgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCisJCQl0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uOworCisJLyoqCisJICogVW5yZWdpc3RlcnMgYSBOb3RpZmljYXRpb25MaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLgorCSAqIAorCSAqIEBwYXJhbSByZWdpc3RyYXRpb25OYW1lIFRoZSB1bmlxdWUgbmFtZSBwcmV2aW91c2x5IHVzZWQgZm9yIHRoZSByZWdpc3RyYXRpb24uCisJICogQHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gSW4gY2FzZSB0aGUgbGlzdGVuZXIgY2Fubm90IGJlIGRlcmVnaXN0ZXJlZC4KKwkgKi8KKwl2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbk5hbWUpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb247CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIE5vdGlmaWNhdGlvbk1hbmFnZXIgYW5kIGFsbCByZWdpc3RlcmVkIE5vdGlmaWNhdGlvbkxpc3RlbmVycworCSAqIAorCSAqIEBwYXJhbSBkZXJlZ2lzdGVyQWxsIGlmIHRydWUsIGFsbCBOb3RpZmljYXRpb25MaXN0ZW5lcnMgYXJlIGFsc28gZGVyZWdpc3RlcmVkCisJICogICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGNsb3NpbmcuCisJICogQHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gSW4gY2FzZSB0aGUgbGlzdGVuZXJzIGNhbm5vdCBiZSBkZXJlZ2lzdGVyZWQgb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFuYWdlciBjYW5ub3QgYmUgY2xvc2VkLgorCSAqLworCXZvaWQgY2xvc2UoYm9vbGVhbiBkZXJlZ2lzdGVyQWxsKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0FnZ3JlZ2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQWdncmVnYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRkNzMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0FnZ3JlZ2F0aW9uLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworLyoqCisgKiBBZ2dyZWdhdGlvbiBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgUXVlcnkKKyAqLworcHVibGljIGVudW0gQWdncmVnYXRpb24geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW1lcmF0aW9ucworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIE5vIGFnZ3JlZ2F0ZSBmdW5jdGlvbiBpcyB1c2VkIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlLgorCSAqLworCU5PTkUsCisKKwkvKioKKwkgKiBVc2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVzdWx0IHJvd3MuCisJICovCisJQ09VTlQsCisKKwkvKioKKwkgKiBXaXRoaW4gdGhlIHJlc3VsdCByb3dzIGZvciB0aGUgc2VsZWN0ZWQgYXR0cmlidXRlIGFsbCBkaXN0aW5jdCB2YWx1ZXMgYXJlCisJICogY291bnRlZC4KKwkgKi8KKwlESVNUSU5DVF9DT1VOVCwKKworCS8qKgorCSAqIFdpdGhpbiB0aGUgcmVzdWx0IHJvd3MgZm9yIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgdGhlIHNtYWxsZXN0IHZhbHVlIGlzCisJICogc2VsZWN0ZWQuIE9ubHkgZm9yIG51bWVyaWNhbCB2YWx1ZXMuCisJICovCisJTUlOSU1VTSwKKworCS8qKgorCSAqIFdpdGhpbiB0aGUgcmVzdWx0IHJvd3MgZm9yIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgdGhlIGhpZ2hlc3QgdmFsdWUgaXMKKwkgKiBzZWxlY3RlZC4gT25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcy4KKwkgKi8KKwlNQVhJTVVNLAorCisJLyoqCisJICogT3ZlciBhbGwgcmVzdWx0IHJvd3MgZm9yIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgdGhlIGF2ZXJhZ2UgdmFsdWUgaXMKKwkgKiBjYWxjdWxhdGVkLiBPbmx5IGZvciBudW1lcmljYWwgdmFsdWVzLgorCSAqLworCUFWRVJBR0UsCisKKwkvKioKKwkgKiBPdmVyIGFsbCByZXN1bHQgcm93cyBmb3IgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIHZhbHVlCisJICogaXMgY2FsY3VsYXRlZC4gT25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcy4KKwkgKi8KKwlERVZJQVRJT04sCisKKwkvKioKKwkgKiBBbGwgcmVzdWx0IHJvd3MgZm9yIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgYXJlIHN1bW1lZC4gT25seSBmb3IgbnVtZXJpY2FsCisJICogdmFsdWVzLgorCSAqLworCVNVTSwKKworCS8qKgorCSAqIFdpdGhpbiB0aGUgcmVzdWx0IHJvd3MgZm9yIHRoZSBzZWxlY3RlZCBhdHRyaWJ1dGUgYWxsIGRpc3RpbmN0IHZhbHVlcyBhcmUKKwkgKiBjb2xsZWN0ZWQuCisJICovCisJRElTVElOQ1QKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0Jvb2xlYW5PcGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0Jvb2xlYW5PcGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmI5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQm9vbGVhbk9wZXJhdG9yLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworLyoqCisgKiBUaGUgb3BlcmF0b3IgZW51bWVyYXRpb24uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENvbmRpdGlvbgorICogQHNlZSBGaWx0ZXIKKyAqLworcHVibGljIGVudW0gQm9vbGVhbk9wZXJhdG9yIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBMb2dpY2FsIGNvbmp1bmN0aW9uLgorCSAqLworCUFORCwKKworCS8qKgorCSAqIExvZ2ljYWwgZGlzanVuY3Rpb24uCisJICovCisJT1IsCisKKwkvKioKKwkgKiBMb2dpY2FsIE5lZ2F0aW9uLgorCSAqLworCU5PVAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQnJhY2tldE9wZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQnJhY2tldE9wZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwNzBjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9CcmFja2V0T3BlcmF0b3IuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCisvKioKKyAqIFRoZSBicmFja2V0IG9wZXJhdG9yIGVudW1lcmF0aW9uLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQHNlZSBDb25kaXRpb24KKyAqIEBzZWUgRmlsdGVyCisgKi8KKworcHVibGljIGVudW0gQnJhY2tldE9wZXJhdG9yIHsKKwkvKioKKwkgKiBMZWZ0IHBhcmVudGhlc2lzLgorCSAqLworCU9QRU4sCisKKwkvKioKKwkgKiBSaWdodCBwYXJlbnRoZXNpcy4KKwkgKi8KKwlDTE9TRTsKKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLkVudW0jdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXN3aXRjaCAodGhpcykgeworCQljYXNlIE9QRU46CisJCQlyZXR1cm4gIigiOworCQljYXNlIENMT1NFOgorCQkJcmV0dXJuICIpIjsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiB0aGlzLnRvU3RyaW5nKCk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQ29tcGFyaXNvbk9wZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQ29tcGFyaXNvbk9wZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxNzEwYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9Db21wYXJpc29uT3BlcmF0b3IuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKKworLyoqCisgKiBUaGUgc2VsZWN0aW9uIG9wZXJhdGlvbnMgZGVmaW5lIHF1ZXJ5IGluc3RydWN0aW9ucyBsaWtlICJlcXVhbCIsICJncmVhdGVyIiwKKyAqIGV0Yy4gU3VjaCBvcGVyYXRpb25zIGFyZSBjYXNlIHNlbnNpdGl2ZS4gSWYgYW4gaW5zZW5zaXRpdmUgaW5zdHJ1Y3Rpb24gaXMKKyAqIHJlcXVpcmVkLCB0aGVuIGl0cyBjb3VudGVycGFydCBzdGFydGluZyB3aXRoIHRoZSAiQ0lfIiBwcmVmaXggaGFzIHRvIGJlIHVzZWQuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIENvbmRpdGlvbgorICogQHNlZSBGaWx0ZXIKKyAqLworcHVibGljIGVudW0gQ29tcGFyaXNvbk9wZXJhdG9yIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBFbnVtZXJhdGlvbnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBFeGFjdCBtYXRjaAorCSAqLworCUVRVUFMLAorCisJLyoqCisJICogTm90IGVxdWFsICghPSkKKwkgKi8KKwlOT1RfRVFVQUwsCisKKwkvKioKKwkgKiBMZXNzIHRoYW4gKCZsdDspCisJICovCisJTEVTU19USEFOLAorCisJLyoqCisJICogTGVzcyB0aGFuIGVxdWFsICgmbHQ7PSkKKwkgKi8KKwlMRVNTX1RIQU5fT1JfRVFVQUwsCisKKwkvKioKKwkgKiBHcmVhdGVyIHRoYW4gKCZndDspCisJICovCisJR1JFQVRFUl9USEFOLAorCisJLyoqCisJICogR3JlYXRlciB0aGFuIGVxdWFsICgmZ3Q7PSkKKwkgKi8KKwlHUkVBVEVSX1RIQU5fT1JfRVFVQUwsCisKKwkvKioKKwkgKiBJbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLgorCSAqLworCUlOX1NFVCwKKworCS8qKgorCSAqIE5vdCBpbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLgorCSAqLworCU5PVF9JTl9TRVQsCisKKwkvKioKKwkgKiBsaWtlLCB1c2UgcGF0dGVybiBtYXRjaGluZywgc2VlIFBhdHRlcm4gZm9yIHRoZSB3aWxkY2FyZCBkZWZpbml0aW9ucy4KKwkgKi8KKwlMSUtFLAorCisJLyoqCisJICogTm90IExJS0UKKwkgKi8KKwlOT1RfTElLRSwKKworCS8qKgorCSAqIEVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciB7QGxpbmsgVmFsdWVUeXBlI1NUUklOR30KKwkgKi8KKwlDQVNFX0lOU0VOU0lUSVZFX0VRVUFMLAorCisJLyoqCisJICogTm90IGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciB7QGxpbmsgVmFsdWVUeXBlI1NUUklOR30KKwkgKi8KKwlDQVNFX0lOU0VOU0lUSVZFX05PVF9FUVVBTCwKKworCS8qKgorCSAqIExlc3MgdGhhbi4gY2FzZSBpbnNlbnNpdGl2ZSBmb3Ige0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9CisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9MRVNTX1RIQU4sCisKKwkvKioKKwkgKiBMZXNzIHRoYW4gZXF1YWwuIGNhc2UgaW5zZW5zaXRpdmUgZm9yIHtAbGluayBWYWx1ZVR5cGUjU1RSSU5HfQorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfTEVTU19USEFOX09SX0VRVUFMLAorCisJLyoqCisJICogR3JlYXRlciB0aGFuLiBjYXNlIGluc2Vuc2l0aXZlIGZvciB7QGxpbmsgVmFsdWVUeXBlI1NUUklOR30KKwkgKi8KKwlDQVNFX0lOU0VOU0lUSVZFX0dSRUFURVJfVEhBTiwKKworCS8qKgorCSAqIEdyZWF0ZXIgdGhhbiBlcXVhbC4gY2FzZSBpbnNlbnNpdGl2ZSBmb3Ige0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9CisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9HUkVBVEVSX1RIQU5fT1JfRVFVQUwsCisKKwkvKioKKwkgKiBJbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLiBjYXNlIGluc2Vuc2l0aXZlIGZvcgorCSAqIHtAbGluayBWYWx1ZVR5cGUjU1RSSU5HfQorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfSU5fU0VULAorCisJLyoqCisJICogTm90IGluIHNldCwgdmFsdWUgY2FuIGJlIGEgc2VxdWVuY2UuIGNhc2UgaW5zZW5zaXRpdmUgZm9yCisJICoge0BsaW5rIFZhbHVlVHlwZSNTVFJJTkd9CisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9OT1RfSU5fU0VULAorCisJLyoqCisJICogbGlrZSwgdXNlIHBhdHRlcm4gbWF0Y2hpbmcsIHNlZSBQYXR0ZXJuIGZvciB0aGUgd2lsZGNhcmQgZGVmaW5pdGlvbnMuIGNhc2UKKwkgKiBpbnNlbnNpdGl2ZSBmb3IgRFRfU1RSSU5HLgorCSAqLworCUNBU0VfSU5TRU5TSVRJVkVfTElLRSwKKworCS8qKgorCSAqIE5vdCBMSUtFLCBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisJICovCisJQ0FTRV9JTlNFTlNJVElWRV9OT1RfTElLRSwKKworCS8qKgorCSAqIFZhbHVlIGlzIE5VTEwKKwkgKi8KKwlJU19OVUxMLAorCisJLyoqCisJICogVmFsdWUgaXMgbm90IE5VTEwKKwkgKi8KKwlJU19OT1RfTlVMTCwKKworCS8qKgorCSAqIEJldHdlZW47IHNlbGVjdHMgYWxsIGluc3RhbmNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgJ2F0dHInIGxpZXMgYmV0d2VlbiB0aGUKKwkgKiBmaXJzdCB0d28gdmFsdWVzIGdpdmVuIGluICd2YWx1ZScgKHdpdGggJ2F0dHInLCAndmFsdWUnIGJlaW5nIGVsZW1lbnRzIG9mIHRoZQorCSAqIFNlbFZhbHVlIHN0cnVjdHVyZTsgJ3ZhbHVlJyBtdXN0IGJlIG9mIGRhdGEgdHlwZSBTXyopLgorCSAqLworCUJFVFdFRU47CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb25kaXRpb259IGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfSBhbmQgdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfSB0aGUgY29uZGl0aW9uIHdpbGwgYmUgYXBwbGllZCB0by4KKwkgKiBAcGFyYW0gdmFsdWUgICAgIFRoZSB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb25kaXRpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb25kaXRpb24gY3JlYXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIE9iamVjdCB2YWx1ZSkgeworCQlyZXR1cm4gbmV3IENvbmRpdGlvbihhdHRyaWJ1dGUsIHRoaXMsICIiLCB2YWx1ZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIHJlcXVpcmVzIGEgc2VxdWVuY2UgdmFsdWUgY29udGFpbmVyLiBUaGlzIGlzCisJICogdGhlIGNhc2UgZm9yIHRoZSBmb2xsb3dpbmcgdHlwZXM6CisJICoKKwkgKiA8dWw+CisJICogPGxpPntAbGluayBDb21wYXJpc29uT3BlcmF0b3IjSU5fU0VUfTwvbGk+CisJICogPGxpPntAbGluayBDb21wYXJpc29uT3BlcmF0b3IjTk9UX0lOX1NFVH08L2xpPgorCSAqIDxsaT57QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0NBU0VfSU5TRU5TSVRJVkVfSU5fU0VUfTwvbGk+CisJICogPGxpPntAbGluayBDb21wYXJpc29uT3BlcmF0b3IjQ0FTRV9JTlNFTlNJVElWRV9OT1RfSU5fU0VUfTwvbGk+CisJICogPGxpPntAbGluayBDb21wYXJpc29uT3BlcmF0b3IjQkVUV0VFTn08L2xpPgorCSAqIDwvdWw+CisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBvcGVyYXRpb24gaXMgb25lIG9mIHRob3NlIGxpc3RlZCBhYm92ZS4KKwkgKi8KKwlib29sZWFuIHJlcXVpcmVzU2VxdWVuY2UoKSB7CisJCXJldHVybiBBcnJheXMuYXNMaXN0KElOX1NFVCwgTk9UX0lOX1NFVCwgQ0FTRV9JTlNFTlNJVElWRV9JTl9TRVQsIENBU0VfSU5TRU5TSVRJVkVfTk9UX0lOX1NFVCwgQkVUV0VFTikKKwkJCQkuY29udGFpbnModGhpcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQ29uZGl0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvQ29uZGl0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2YzRmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9Db25kaXRpb24uamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiBEZXNjcmliZXMgYSBmaWx0ZXIgY29uZGl0aW9uLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBBdHRyaWJ1dGUKKyAqIEBzZWUgQ29tcGFyaXNvbk9wZXJhdG9yCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb25kaXRpb24geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgQXR0cmlidXRlIGF0dHJpYnV0ZTsKKwlwcml2YXRlIGZpbmFsIFZhbHVlIHZhbHVlOworCXByaXZhdGUgZmluYWwgQ29tcGFyaXNvbk9wZXJhdG9yIGNvbXBhcmlzb25PcGVyYXRvcjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICAgICAgICAgVGhlIHtAbGluayBBdHRyaWJ1dGV9IHRoaXMgY29uZGl0aW9uIHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgdG8uCisJICogQHBhcmFtIGNvbXBhcmlzb25PcGVyYXRvciBUaGUgY29uZGl0aW9uIHtAbGluayBDb21wYXJpc29uT3BlcmF0b3J9LgorCSAqIEBwYXJhbSB1bml0ICAgICAgICAgICAgICAgVGhlIHVuaXQgb2YgdGhlIGNyZWF0ZWQgdmFsdWUuCisJICogQHBhcmFtIGlucHV0ICAgICAgICAgICAgICBUaGUgY29uZGl0aW9uIHZhbHVlLgorCSAqLworCUNvbmRpdGlvbihBdHRyaWJ1dGUgYXR0cmlidXRlLCBDb21wYXJpc29uT3BlcmF0b3IgY29tcGFyaXNvbk9wZXJhdG9yLCBTdHJpbmcgdW5pdCwgT2JqZWN0IGlucHV0KSB7CisJCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOworCQl0aGlzLmNvbXBhcmlzb25PcGVyYXRvciA9IGNvbXBhcmlzb25PcGVyYXRvcjsKKwkJdmFsdWUgPSBjb21wYXJpc29uT3BlcmF0b3IucmVxdWlyZXNTZXF1ZW5jZSgpID8gYXR0cmlidXRlLmNyZWF0ZVZhbHVlU2VxKHVuaXQsIGlucHV0KQorCQkJCTogYXR0cmlidXRlLmNyZWF0ZVZhbHVlKHVuaXQsIGlucHV0KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0YXJnZXQge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB0YXJnZXQge0Bjb2RlIEF0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKSB7CisJCXJldHVybiBhdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29uZGl0aW9uIHtAbGluayBWYWx1ZX0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjb25kaXRpb24ge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWUgZ2V0VmFsdWUoKSB7CisJCXJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb25kaXRpb24ge0BsaW5rIENvbXBhcmlzb25PcGVyYXRvcn0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjb25kaXRpb24ge0Bjb2RlIENvbXBhcmlzb25PcGVyYXRvcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbXBhcmlzb25PcGVyYXRvciBnZXRDb21wYXJpc29uT3BlcmF0b3IoKSB7CisJCXJldHVybiBjb21wYXJpc29uT3BlcmF0b3I7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKG90aGVyID09IHRoaXMpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgQ29uZGl0aW9uKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJQ29uZGl0aW9uIGNvbmRpdGlvbiA9IChDb25kaXRpb24pIG90aGVyOworCisJCXJldHVybiBPYmplY3RzLmVxdWFscyh0aGlzLmF0dHJpYnV0ZSwgY29uZGl0aW9uLmF0dHJpYnV0ZSkgJiYgT2JqZWN0cy5lcXVhbHModGhpcy52YWx1ZSwgY29uZGl0aW9uLnZhbHVlKQorCQkJCSYmIE9iamVjdHMuZXF1YWxzKHRoaXMuY29tcGFyaXNvbk9wZXJhdG9yLCBjb25kaXRpb24uY29tcGFyaXNvbk9wZXJhdG9yKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBPYmplY3RzLmhhc2goYXR0cmlidXRlLCB2YWx1ZSwgY29tcGFyaXNvbk9wZXJhdG9yKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpLmdldE5hbWUoKSArICIuIiArIGF0dHJpYnV0ZS5nZXROYW1lKCkgKyAiICIgKyBjb21wYXJpc29uT3BlcmF0b3IgKyAiICIgKyB2YWx1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRGF0YUFjY2Vzc0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0RhdGFBY2Nlc3NFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ4MjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0RhdGFBY2Nlc3NFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCisvKioKKyAqIFRocm93biB0byBpbmRpY2F0ZSBlcnJvcnMgd2hpbGUgcXVlcnlpbmcgZGF0YS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIERhdGFBY2Nlc3NFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1MDI0MTg0NTU1Mjc0NTE4NDUxTDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlLgorCSAqLworCXB1YmxpYyBEYXRhQWNjZXNzRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJCXN1cGVyKG1lc3NhZ2UpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1lc3NhZ2UgICBUaGUgZXJyb3IgbWVzc2FnZS4KKwkgKiBAcGFyYW0gdGhyb3dhYmxlIFRoZSBvcmlnaW4gY2F1c2UuCisJICovCisJcHVibGljIERhdGFBY2Nlc3NFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKwkJc3VwZXIobWVzc2FnZSwgdGhyb3dhYmxlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9GaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9GaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBiYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5RGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFNlcnZpY2U7CisKKy8qKgorICogQSBmaWx0ZXIgaXMgYSBzZXF1ZW5jZSBvZiB7QGxpbmsgRmlsdGVySXRlbX1zIGNvbnRhaW5pbmcKKyAqIHtAbGluayBCb29sZWFuT3BlcmF0b3J9cyBvciB7QGxpbmsgQ29uZGl0aW9ufXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFF1ZXJ5CisgKiBAc2VlIFNlYXJjaFF1ZXJ5CisgKiBAc2VlIFNlYXJjaFNlcnZpY2UKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIEl0ZXJhYmxlPEZpbHRlckl0ZW0+IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIERlcXVlPEZpbHRlckl0ZW0+IGZpbHRlckl0ZW1zID0gbmV3IEFycmF5RGVxdWU8PigpOworCXByaXZhdGUgZmluYWwgRmlsdGVySXRlbSBvcGVyYXRvckl0ZW07CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gb3BlcmF0b3JJdGVtIFdpbGwgYmUgYWRkZWQgYmV0d2VlbiB7QGxpbmsgQ29uZGl0aW9ufXMgb3IgbWVyZ2VkCisJICogICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzLgorCSAqLworCXByaXZhdGUgRmlsdGVyKEZpbHRlckl0ZW0gb3BlcmF0b3JJdGVtKSB7CisJCXRoaXMub3BlcmF0b3JJdGVtID0gb3BlcmF0b3JJdGVtOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgZmlsdGVyIHdpdGggYW4gaW5zdGFuY2UgSUQgY29uZGl0aW9uIGZvciBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfSBhbmQgaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBpZCAgICAgICAgIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGZpbHRlciBpcyByZXR1cm5lZC4KKwkgKiBAc2VlICNpZChFbnRpdHlUeXBlLCBTdHJpbmcpCisJICovCisJcHVibGljIHN0YXRpYyBGaWx0ZXIgaWRPbmx5KEVudGl0eVR5cGUgZW50aXR5VHlwZSwgU3RyaW5nIGlkKSB7CisJCXJldHVybiBhbmQoKS5pZChlbnRpdHlUeXBlLCBpZCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXIgd2l0aCBhbiBmb3JlaWduIElEIGNvbmRpdGlvbiBmb3IgZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufQorCSAqIGFuZCBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvbiBUaGUge0Bjb2RlIFJlbGF0aW9ufS4KKwkgKiBAcGFyYW0gaWQgICAgICAgVGhlIGluc3RhbmNlIElELgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgZmlsdGVyIGlzIHJldHVybmVkLgorCSAqIEBzZWUgI2lkKFJlbGF0aW9uLCBTdHJpbmcpCisJICovCisJcHVibGljIHN0YXRpYyBGaWx0ZXIgaWRPbmx5KFJlbGF0aW9uIHJlbGF0aW9uLCBTdHJpbmcgaWQpIHsKKwkJcmV0dXJuIGFuZCgpLmlkKHJlbGF0aW9uLCBpZCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBmaWx0ZXIgd2l0aCBhbiBpbnN0YW5jZSBJRHMgY29uZGl0aW9uIGZvciBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfSBhbmQgaW5zdGFuY2UgSURzLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gaWRzICAgICAgICBUaGUgaW5zdGFuY2UgSURzLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgZmlsdGVyIGlzIHJldHVybmVkLgorCSAqIEBzZWUgI2lkcyhFbnRpdHlUeXBlLCBDb2xsZWN0aW9uKQorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIGlkc09ubHkoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBDb2xsZWN0aW9uPFN0cmluZz4gaWRzKSB7CisJCXJldHVybiBhbmQoKS5pZHMoZW50aXR5VHlwZSwgaWRzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGZpbHRlciB3aXRoIGFuIGZvcmVpZ24gSURzIGNvbmRpdGlvbiBmb3IgZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufQorCSAqIGFuZCBpbnN0YW5jZSBJRHMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIHtAY29kZSBSZWxhdGlvbn0uCisJICogQHBhcmFtIGlkcyAgICAgIFRoZSBpbnN0YW5jZSBJRHMuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCBmaWx0ZXIgaXMgcmV0dXJuZWQuCisJICogQHNlZSAjaWRzKFJlbGF0aW9uLCBDb2xsZWN0aW9uKQorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIGlkc09ubHkoUmVsYXRpb24gcmVsYXRpb24sIENvbGxlY3Rpb248U3RyaW5nPiBpZHMpIHsKKwkJcmV0dXJuIGFuZCgpLmlkcyhyZWxhdGlvbiwgaWRzKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGZpbHRlciB3aXRoIGFuIGluc3RhbmNlIG5hbWUgY29uZGl0aW9uIGZvciBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfSBhbmQgaW5zdGFuY2UgbmFtZSBwYXR0ZXJuLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gcGF0dGVybiAgICBJcyBhbHdheXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkCisJICogICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcyBmb2xsb3dzOiAiPyIgZm9yIG9uZSBtYXRjaGluZyBjaGFyYWN0ZXIgYW5kCisJICogICAgICAgICAgICAgICAgICAgIioiIGZvciBhIHNlcXVlbmNlIG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMuCisJICogQHJldHVybiBUaGUgY3JlYXRlZCBmaWx0ZXIgaXMgcmV0dXJuZWQuCisJICogQHNlZSAjbmFtZShFbnRpdHlUeXBlLCBTdHJpbmcpCisJICovCisJcHVibGljIHN0YXRpYyBGaWx0ZXIgbmFtZU9ubHkoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBTdHJpbmcgcGF0dGVybikgeworCQlyZXR1cm4gYW5kKCkubmFtZShlbnRpdHlUeXBlLCBwYXR0ZXJuKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdGhhdCBpbXBsaWNpdGx5IGFkZHMKKwkgKiB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI0FORH0ge0Bjb2RlIEZpbHRlckl0ZW19cyBiZXR3ZWVuIHtAbGluayBDb25kaXRpb259cyBvcgorCSAqIG1lcmdlZCBmaWx0ZXJzLgorCSAqCisJICogPHByZT4KKwkgKiBGaWx0ZXIgZmlsdGVyID0gRmlsdGVyLmFuZCgpOworCSAqIGZpbHRlci5hZGQoY29uZGl0aW9uQSk7IC8vIGNvbmRpdGlvbkEKKwkgKiBmaWx0ZXIuYWRkKGNvbmRpdGlvbkIpOyAvLyBjb25kaXRpb25BIEFORCBjb25kaXRpb25CCisJICogZmlsdGVyLmludmVydCgpOyAvLyAhKGNvbmRpdGlvbkEgQU5EIGNvbmRpdGlvbkIpCisJICogZmlsdGVyLm1lcmdlKG90aGVyRmlsdGVyKTsgLy8gIShjb25kaXRpb25BIEFORCBjb25kaXRpb25CKSBBTkQKKwkgKiAJCQkJCQkJLy8gKG90aGVyRmlsdGVyKQorCSAqIDwvcHJlPgorCSAqCisJICogQHJldHVybiBBIG5ld2x5IGNyZWF0ZWQgZmlsdGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIGFuZCgpIHsKKwkJcmV0dXJuIG5ldyBGaWx0ZXIoRmlsdGVySXRlbS5BTkQpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyB0aGF0IGltcGxpY2l0bHkgYWRkcworCSAqIHtAbGluayBCb29sZWFuT3BlcmF0b3IjT1J9IHtAY29kZSBGaWx0ZXJJdGVtfXMgYmV0d2VlbiB7QGxpbmsgQ29uZGl0aW9ufXMgb3IKKwkgKiBtZXJnZWQgZmlsdGVycy4KKwkgKgorCSAqIDxwcmU+CisJICogRmlsdGVyIGZpbHRlciA9IEZpbHRlci5vcigpOworCSAqIGZpbHRlci5hZGQoY29uZGl0aW9uQSk7IC8vIGNvbmRpdGlvbkEKKwkgKiBmaWx0ZXIuYWRkKGNvbmRpdGlvbkIpOyAvLyBjb25kaXRpb25BIE9SIGNvbmRpdGlvbkIKKwkgKiBmaWx0ZXIuaW52ZXJ0KCk7IC8vICEoY29uZGl0aW9uQSBPUiBjb25kaXRpb25CKQorCSAqIGZpbHRlci5tZXJnZShvdGhlckZpbHRlcik7IC8vICEoY29uZGl0aW9uQSBPUiBjb25kaXRpb25CKSBPUiBvdGhlckZpbHRlcgorCSAqIDwvcHJlPgorCSAqCisJICogQHJldHVybiBBIG5ld2x5IGNyZWF0ZWQgZmlsdGVyIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgRmlsdGVyIG9yKCkgeworCQlyZXR1cm4gbmV3IEZpbHRlcihGaWx0ZXJJdGVtLk9SKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFsbCB7QGxpbmsgQ29uZGl0aW9ufXMgdG8gdGhpcyBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gY29uZGl0aW9ucyBUaGUge0BsaW5rIENvbmRpdGlvbn1zIHRoYXQgd2lsbCBiZSBhZGRlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHNlZSBGaWx0ZXIjYWRkKENvbmRpdGlvbikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIGFkZEFsbChMaXN0PENvbmRpdGlvbj4gY29uZGl0aW9ucykgeworCQljb25kaXRpb25zLmZvckVhY2godGhpczo6YWRkKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhbGwge0BsaW5rIENvbmRpdGlvbn1zIHRvIHRoaXMgZmlsdGVyLgorCSAqCisJICogQHBhcmFtIGNvbmRpdGlvbnMgVGhlIHtAbGluayBDb25kaXRpb259cyB0aGF0IHdpbGwgYmUgYWRkZWQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqIEBzZWUgRmlsdGVyI2FkZChDb25kaXRpb24pCisJICovCisJcHVibGljIEZpbHRlciBhZGRBbGwoQ29uZGl0aW9uLi4uIGNvbmRpdGlvbnMpIHsKKwkJQXJyYXlzLnN0cmVhbShjb25kaXRpb25zKS5mb3JFYWNoKHRoaXM6OmFkZCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBuZXcgaW5zdGFuY2UgSUQgY29uZGl0aW9uICh7QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0VRVUFMfSkgZm9yIGdpdmVuCisJICoge0BsaW5rIEVudGl0eVR5cGV9IGFuZCBpbnN0YW5jZSBJRCB0byB0aGlzIGZpbHRlci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGlkICAgICAgICAgVGhlIGluc3RhbmNlIElELgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGlzIGZpbHRlci4KKwkgKiBAc2VlICNhZGQoQ29uZGl0aW9uKQorCSAqLworCXB1YmxpYyBGaWx0ZXIgaWQoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBTdHJpbmcgaWQpIHsKKwkJYWRkKENvbXBhcmlzb25PcGVyYXRvci5FUVVBTC5jcmVhdGUoZW50aXR5VHlwZS5nZXRJREF0dHJpYnV0ZSgpLCBpZCkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgbmV3IGZvcmVpZ24gSUQgY29uZGl0aW9uICh7QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yI0VRVUFMfSkgZm9yIGdpdmVuCisJICoge0BsaW5rIFJlbGF0aW9ufSBhbmQgaW5zdGFuY2UgSUQgdG8gdGhpcyBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIHtAY29kZSBSZWxhdGlvbn0uCisJICogQHBhcmFtIGlkICAgICAgIFRoZSBpbnN0YW5jZSBJRC4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHNlZSAjYWRkKENvbmRpdGlvbikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIGlkKFJlbGF0aW9uIHJlbGF0aW9uLCBTdHJpbmcgaWQpIHsKKwkJYWRkKENvbXBhcmlzb25PcGVyYXRvci5FUVVBTC5jcmVhdGUocmVsYXRpb24uZ2V0QXR0cmlidXRlKCksIGlkKSk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBuZXcgaW5zdGFuY2UgSURzIGNvbmRpdGlvbiAoe0BsaW5rIENvbXBhcmlzb25PcGVyYXRvciNJTl9TRVR9KSBmb3IKKwkgKiBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0gYW5kIGluc3RhbmNlIElEcyB0byB0aGlzIGZpbHRlci4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGlkcyAgICAgICAgVGhlIGluc3RhbmNlIElEcy4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIKKwkgKiBAc2VlICNhZGQoQ29uZGl0aW9uKQorCSAqLworCXB1YmxpYyBGaWx0ZXIgaWRzKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkcykgeworCQlhZGQoQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUoZW50aXR5VHlwZS5nZXRJREF0dHJpYnV0ZSgpLAorCQkJCWlkcy5zdHJlYW0oKS5kaXN0aW5jdCgpLnRvQXJyYXkoU3RyaW5nW106Om5ldykpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIG5ldyBmb3JlaWduIElEcyBjb25kaXRpb24gKHtAbGluayBDb21wYXJpc29uT3BlcmF0b3IjSU5fU0VUfSkgZm9yCisJICogZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufSBhbmQgaW5zdGFuY2UgSURzIHRvIHRoaXMgZmlsdGVyLgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIFRoZSB7QGNvZGUgUmVsYXRpb259LgorCSAqIEBwYXJhbSBpZHMgICAgICBUaGUgaW5zdGFuY2UgSURzLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGlzIGZpbHRlci4KKwkgKiBAc2VlICNhZGQoQ29uZGl0aW9uKQorCSAqLworCXB1YmxpYyBGaWx0ZXIgaWRzKFJlbGF0aW9uIHJlbGF0aW9uLCBDb2xsZWN0aW9uPFN0cmluZz4gaWRzKSB7CisJCWFkZChDb21wYXJpc29uT3BlcmF0b3IuSU5fU0VULmNyZWF0ZShyZWxhdGlvbi5nZXRBdHRyaWJ1dGUoKSwgaWRzLnN0cmVhbSgpLmRpc3RpbmN0KCkudG9BcnJheShTdHJpbmdbXTo6bmV3KSkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgaW5zdGFuY2UgbmFtZSBjb25kaXRpb24gKHtAbGluayBDb21wYXJpc29uT3BlcmF0b3IjTElLRX0pIGZvciBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfSBhbmQgaW5zdGFuY2UgbmFtZSBwYXR0ZXJuLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IElmIHRoZSBnaXZlbiBwYXR0ZXJuIGVxdWFscyAiKiIsIHRoZW4gbm8ge0BsaW5rIENvbmRpdGlvbn0gd2lsbAorCSAqIGJlIGFkZGVkIHNpbmNlICIqIiBtZWFucyB0YWtlIGFsbC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIHBhdHRlcm4gICAgSXMgYWx3YXlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZAorCSAqICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgYXMgZm9sbG93czogIj8iIGZvciBvbmUgbWF0Y2hpbmcgY2hhcmFjdGVyIGFuZAorCSAqICAgICAgICAgICAgICAgICAgICIqIiBmb3IgYSBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gUmV0dXJucyB0aGlzIGZpbHRlci4KKwkgKiBAc2VlICNhZGQoQ29uZGl0aW9uKQorCSAqLworCXB1YmxpYyBGaWx0ZXIgbmFtZShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIFN0cmluZyBwYXR0ZXJuKSB7CisJCWlmICghIioiLmVxdWFscyhwYXR0ZXJuKSkgeworCQkJYWRkKENvbXBhcmlzb25PcGVyYXRvci5MSUtFLmNyZWF0ZShlbnRpdHlUeXBlLmdldE5hbWVBdHRyaWJ1dGUoKSwgcGF0dGVybikpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIENvbmRpdGlvbn0gdG8gdGhpcyBmaWx0ZXIncyB7QGxpbmsgRmlsdGVySXRlbX0gc2VxdWVuY2UuCisJICoKKwkgKiBAcGFyYW0gY29uZGl0aW9uIHtAY29kZSBDb25kaXRpb259IHRoYXQgd2lsbCBiZSBhZGRlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICovCisJcHVibGljIEZpbHRlciBhZGQoQ29uZGl0aW9uIGNvbmRpdGlvbikgeworCQlpbnNlcnRPcGVyYXRvcigpOworCQlmaWx0ZXJJdGVtcy5hZGRMYXN0KG5ldyBGaWx0ZXJJdGVtKGNvbmRpdGlvbikpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBNZXJnZXMgYWxsIGdpdmVuIGZpbHRlcnMgd2l0aCB0aGlzIGZpbHRlci4KKwkgKgorCSAqIEBwYXJhbSBmaWx0ZXJzIEZpbHRlcnMgdGhhdCB3aWxsIGJlIG1lcmdlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHNlZSAjbWVyZ2UoRmlsdGVyKQorCSAqLworCXB1YmxpYyBGaWx0ZXIgbWVyZ2UoTGlzdDxGaWx0ZXI+IGZpbHRlcnMpIHsKKwkJZmlsdGVycy5zdHJlYW0oKS5mb3JFYWNoKHRoaXM6Om1lcmdlKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogTWVyZ2VzIGFsbCBnaXZlbiBmaWx0ZXJzIHdpdGggdGhpcyBmaWx0ZXIuCisJICoKKwkgKiBAcGFyYW0gZmlsdGVycyBGaWx0ZXJzIHRoYXQgd2lsbCBiZSBtZXJnZWQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqIEBzZWUgI21lcmdlKEZpbHRlcikKKwkgKi8KKwlwdWJsaWMgRmlsdGVyIG1lcmdlKEZpbHRlci4uLiBmaWx0ZXJzKSB7CisJCUFycmF5cy5zdHJlYW0oZmlsdGVycykuZm9yRWFjaCh0aGlzOjptZXJnZSk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIFRoZSB7QGxpbmsgRmlsdGVySXRlbX1zIG9mIHRoZSBnaXZlbiBmaWx0ZXIgYXJlIGFkZGVkIHRvIHRoaXMgZmlsdGVyLiBJZgorCSAqIHJlcXVpcmVkLCB0aGVuIHBhcmVudGhlc2lzIGFyZSBpbXBsaWNpdGx5IGFkZGVkIGFzIHNob3duIGluIHRoZSBleGFtcGxlCisJICogYmVsb3c6CisJICoKKwkgKiA8cHJlPgorCSAqIEZpbHRlciBmaWx0ZXIxID0gRmlsdGVyLmFuZCgpOworCSAqIENvbmRpdGlvbiBhID0gLi4uOworCSAqIENvbmRpdGlvbiBiID0gLi4uOworCSAqIGZpbHRlcjEuYWRkQWxsKGEsIGIpOyAvLyBhIEFORCBiCisJICoKKwkgKiBGaWx0ZXIgZmlsdGVyMiA9IEZpbHRlci5vcigpOworCSAqIENvbmRpdGlvbiBjID0gLi4uOworCSAqIENvbmRpdGlvbiBkID0gLi4uOworCSAqIENvbmRpdGlvbiBlID0gLi4uOworCSAqIGZpbHRlcjIuYWRkQWxsKGMsIGQsIGUpOyAvLyBjIE9SIGQgT1IgZQorCSAqCisJICogRmlsdGVyIGZpbHRlciA9IEZpbHRlci5vcigpOworCSAqIGZpbHRlci5tZXJnZShmaWx0ZXIxLCBmaWx0ZXIyKTsgLy8gKGZpbHRlcjEpIE9SIGZpbHRlcjIKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSBmaWx0ZXIgRmlsdGVyIHRoYXQgd2lsbCBiZSBtZXJnZWQuCisJICogQHJldHVybiBSZXR1cm5zIHRoaXMgZmlsdGVyLgorCSAqLworCXB1YmxpYyBGaWx0ZXIgbWVyZ2UoRmlsdGVyIGZpbHRlcikgeworCQlib29sZWFuIGFkZEJyYWNrZXRzID0gZmlsdGVyLmhhc011bHRpcGxlKCkgJiYgb3BlcmF0b3JJdGVtICE9IGZpbHRlci5vcGVyYXRvckl0ZW0gJiYgIWZpbHRlci5pc0ludmVydGVkKCk7CisJCWluc2VydE9wZXJhdG9yKCk7CisKKwkJaWYgKGFkZEJyYWNrZXRzKSB7CisJCQlmaWx0ZXJJdGVtcy5hZGRMYXN0KEZpbHRlckl0ZW0uT1BFTik7CisJCX0KKworCQlmaWx0ZXIuZmlsdGVySXRlbXMuc3RyZWFtKCkuZm9yRWFjaChmaWx0ZXJJdGVtczo6YWRkTGFzdCk7CisKKwkJaWYgKGFkZEJyYWNrZXRzKSB7CisJCQlmaWx0ZXJJdGVtcy5hZGRMYXN0KEZpbHRlckl0ZW0uQ0xPU0UpOworCQl9CisKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogSW52ZXJ0cyB0aGlzIGZpbHRlciBieSBwcmVwZW5kaW5nIHRoZSB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI05PVH0gdG8gdGhlCisJICoge0BsaW5rIEZpbHRlckl0ZW19IHNlcXVlbmNlIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXM6CisJICoKKwkgKiA8cHJlPgorCSAqIC8vIGludmVydGluZyBhbiBBTkQgZmlsdGVyCisJICogRmlsdGVyIGFuZEZpbHRlciA9IEZpbHRlci5hbmQoKTsKKwkgKiBDb25kaXRpb24gYSA9IC4uLjsgICAgICAvLyBhbnkgY29uZGl0aW9uCisJICogQ29uZGl0aW9uIGIgPSAuLi47ICAgICAgLy8gYW5vdGhlciBjb25kaXRpb24KKwkgKiBhbmRGaWx0ZXIuYWRkQWxsKGEsIGIpOyAvLyBhIEFORCBiCisJICogYW5kRmlsdGVyLmludmVydCgpOyAgICAgLy8gIShhIEFORCBiKQorCSAqCisJICogLy8gaW52ZXJ0aW5nIGFuIE9SIGZpbHRlcgorCSAqIEZpbHRlciBvckZpbHRlciA9IEZpbHRlci5vcigpOworCSAqIENvbmRpdGlvbiBhID0gLi4uOyAgICAgLy8gYW55IGNvbmRpdGlvbgorCSAqIENvbmRpdGlvbiBiID0gLi4uOyAgICAgLy8gYW5vdGhlciBjb25kaXRpb24KKwkgKiBvckZpbHRlci5hZGRBbGwoYSwgYik7IC8vIGEgT1IgYgorCSAqIG9yRmlsdGVyLmludmVydCgpOyAgICAgLy8gIShhIE9SIGIpCisJICogb3JGaWx0ZXIuaW52ZXJ0KCk7ICAgICAvLyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSZndDsgZmlsdGVyIGlzIGFscmVhZHkgaW52ZXJ0ZWQhCisJICogPC9wcmU+CisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhpcyBmaWx0ZXIuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGVpdGhlciBpZiB0aGUgY3VycmVudCBzZXQgb2YgY29uZGl0aW9ucworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGVtcHR5IG9yIHRoaXMgZmlsdGVyIGlzIGFscmVhZHkgaW52ZXJ0ZWQuCisJICovCisJcHVibGljIEZpbHRlciBpbnZlcnQoKSB7CisJCWlmIChmaWx0ZXJJdGVtcy5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1cnJlbnQgc2V0IG9mIGNvbmRpdGlvbnMgaXMgZW1wdHkuIik7CisJCX0KKworCQlpZiAoaXNJbnZlcnRlZCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXJyZW50IHNldCBvZiBjb25kaXRpb25zIGlzIGFscmVhZHkgaW52ZXJ0ZWQuIik7CisJCX0gZWxzZSBpZiAoaGFzTXVsdGlwbGUoKSkgeworCQkJZmlsdGVySXRlbXMuYWRkRmlyc3QoRmlsdGVySXRlbS5PUEVOKTsKKwkJCWZpbHRlckl0ZW1zLmFkZExhc3QoRmlsdGVySXRlbS5DTE9TRSk7CisJCX0KKworCQlmaWx0ZXJJdGVtcy5hZGRGaXJzdChGaWx0ZXJJdGVtLk5PVCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgZmlsdGVyIGhhcyBubyBjb25kaXRpb25zIGF0IGFsbC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgZmFsc2V9IGlmIGF0IGxlYXN0IG9uZSB7QGxpbmsgQ29uZGl0aW9ufSBpcyBjb250YWluZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXRwdHkoKSB7CisJCXJldHVybiBmaWx0ZXJJdGVtcy5pc0VtcHR5KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIHNlcXVlbnRpYWwgc3RyZWFtIHdpdGggdGhlIGludGVybmFsbHkgc3RvcmVkIHtAbGluayBGaWx0ZXJJdGVtfXMgYXMKKwkgKiBpdHMgc291cmNlLgorCSAqCisJICogQHJldHVybiBBIHN0cmVhbSBvdmVyIHRoZSBjb250YWluZWQge0Bjb2RlIEZpbHRlckl0ZW19cyBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyZWFtPEZpbHRlckl0ZW0+IHN0cmVhbSgpIHsKKwkJcmV0dXJuIGZpbHRlckl0ZW1zLnN0cmVhbSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUge0BsaW5rIEZpbHRlckl0ZW19cyBjb250YWluZWQgaW4gdGhpcyBmaWx0ZXIgaW4KKwkgKiBwcm9wZXIgc2VxdWVuY2UuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9CisJICogICAgICAgICBvcGVyYXRpb24uCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPEZpbHRlckl0ZW0+IGl0ZXJhdG9yKCkgeworCQlJdGVyYXRvcjxGaWx0ZXJJdGVtPiBpbnRlcm5hbCA9IGZpbHRlckl0ZW1zLml0ZXJhdG9yKCk7CisJCXJldHVybiBuZXcgSXRlcmF0b3I8RmlsdGVySXRlbT4oKSB7CisKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKwkJCQlyZXR1cm4gaW50ZXJuYWwuaGFzTmV4dCgpOworCQkJfQorCisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBGaWx0ZXJJdGVtIG5leHQoKSB7CisJCQkJcmV0dXJuIGludGVybmFsLm5leHQoKTsKKwkJCX0KKwkJfTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogSWYgcmVxdWlyZWQgdGhlIHtAbGluayAjb3BlcmF0b3JJdGVtfSBpcyBhZGRlZCB0byB0aGUgZW5kICh0YWlsKSBvZiB0aGUKKwkgKiB7QGxpbmsgRmlsdGVySXRlbX0gc2VxdWVuY2UuCisJICovCisJcHJpdmF0ZSB2b2lkIGluc2VydE9wZXJhdG9yKCkgeworCQlpZiAoIWZpbHRlckl0ZW1zLmlzRW1wdHkoKSkgeworCQkJZmlsdGVySXRlbXMuYWRkTGFzdChvcGVyYXRvckl0ZW0pOworCQl9CisJfQorCisJLyoqCisJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB7QGxpbmsgRmlsdGVySXRlbX0gc2VxdWVuY2Ugc3RhcnRzIHdpdGggdGhlCisJICoge0BsaW5rIEJvb2xlYW5PcGVyYXRvciNOT1R9LgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIHRoaXMgZmlsdGVyIGlzIGludmVydGVkLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0ludmVydGVkKCkgeworCQlyZXR1cm4gIWZpbHRlckl0ZW1zLmlzRW1wdHkoKSAmJiBGaWx0ZXJJdGVtLk5PVCA9PSBmaWx0ZXJJdGVtcy5nZXRGaXJzdCgpOworCX0KKworCS8qKgorCSAqIERldGVybWluZXMgd2hldGhlciBtdWx0aXBsZSB7QGxpbmsgRmlsdGVySXRlbX1zIGFyZSBjb250YWluZWQuCisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgbXVsdGlwbGUge0Bjb2RlIEZpbHRlckl0ZW19cyBhcmUgY29udGFpbmVkLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBoYXNNdWx0aXBsZSgpIHsKKwkJcmV0dXJuIGZpbHRlckl0ZW1zLnNpemUoKSA+IDE7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKwkJaWYgKG90aGVyID09IHRoaXMpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmICghKG90aGVyIGluc3RhbmNlb2YgRmlsdGVyKSkgeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJRmlsdGVyIGZpbHRlciA9IChGaWx0ZXIpIG90aGVyOworCisJCS8vIERlcXVlIGRvZXMgbm90IGltcGxlbWVudCBlcXVhbHMKKwkJcmV0dXJuIEFycmF5cy5lcXVhbHModGhpcy5maWx0ZXJJdGVtcy50b0FycmF5KG5ldyBGaWx0ZXJJdGVtWzBdKSwgZmlsdGVyLmZpbHRlckl0ZW1zLnRvQXJyYXkobmV3IEZpbHRlckl0ZW1bMF0pKQorCQkJCSYmIE9iamVjdHMuZXF1YWxzKHRoaXMub3BlcmF0b3JJdGVtLCBmaWx0ZXIub3BlcmF0b3JJdGVtKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBPYmplY3RzLmhhc2goZmlsdGVySXRlbXMsIG9wZXJhdG9ySXRlbSk7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gdGhpcy5zdHJlYW0oKS5tYXAoaSAtPiBPYmplY3RzLnRvU3RyaW5nKGkpKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiIikpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9GaWx0ZXJJdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVySXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTU2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVySXRlbS5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogRmlsdGVyIGl0ZW0gY29udGFpbnMgZWl0aGVyIGEge0BsaW5rIENvbmRpdGlvbn0gb3IgYW4KKyAqIHtAbGluayBCb29sZWFuT3BlcmF0b3J9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRmlsdGVySXRlbSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29udGFpbnMgdGhlIHtAbGluayBCb29sZWFuT3BlcmF0b3IjQU5EfS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgRmlsdGVySXRlbSBBTkQgPSBuZXcgRmlsdGVySXRlbShCb29sZWFuT3BlcmF0b3IuQU5EKTsKKworCS8qKgorCSAqIENvbnRhaW5zIHRoZSB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI09SfS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgRmlsdGVySXRlbSBPUiA9IG5ldyBGaWx0ZXJJdGVtKEJvb2xlYW5PcGVyYXRvci5PUik7CisKKwkvKioKKwkgKiBDb250YWlucyB0aGUge0BsaW5rIEJvb2xlYW5PcGVyYXRvciNOT1R9LgorCSAqLworCXN0YXRpYyBmaW5hbCBGaWx0ZXJJdGVtIE5PVCA9IG5ldyBGaWx0ZXJJdGVtKEJvb2xlYW5PcGVyYXRvci5OT1QpOworCisJLyoqCisJICogQ29udGFpbnMgdGhlIHtAbGluayBCb29sZWFuT3BlcmF0b3IjT1BFTn0uCisJICovCisJc3RhdGljIGZpbmFsIEZpbHRlckl0ZW0gT1BFTiA9IG5ldyBGaWx0ZXJJdGVtKEJyYWNrZXRPcGVyYXRvci5PUEVOKTsKKworCS8qKgorCSAqIENvbnRhaW5zIHRoZSB7QGxpbmsgQm9vbGVhbk9wZXJhdG9yI0NMT1NFfS4KKwkgKi8KKwlzdGF0aWMgZmluYWwgRmlsdGVySXRlbSBDTE9TRSA9IG5ldyBGaWx0ZXJJdGVtKEJyYWNrZXRPcGVyYXRvci5DTE9TRSk7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gY29uZGl0aW9uOworCXByaXZhdGUgZmluYWwgQm9vbGVhbk9wZXJhdG9yIGJvb2xlYW5PcGVyYXRvcjsKKwlwcml2YXRlIGZpbmFsIEJyYWNrZXRPcGVyYXRvciBicmFja2V0T3BlcmF0b3I7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29uZGl0aW9uIFRoZSB7QGxpbmsgQ29uZGl0aW9ufS4KKwkgKi8KKwlGaWx0ZXJJdGVtKENvbmRpdGlvbiBjb25kaXRpb24pIHsKKwkJdGhpcy5jb25kaXRpb24gPSBjb25kaXRpb247CisJCXRoaXMuYnJhY2tldE9wZXJhdG9yID0gbnVsbDsKKwkJdGhpcy5ib29sZWFuT3BlcmF0b3IgPSBudWxsOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGJvb2xlYW5PcGVyYXRvciBUaGUge0BsaW5rIEJvb2xlYW5PcGVyYXRvcn0uCisJICovCisJcHJpdmF0ZSBGaWx0ZXJJdGVtKEJvb2xlYW5PcGVyYXRvciBib29sZWFuT3BlcmF0b3IpIHsKKwkJdGhpcy5jb25kaXRpb24gPSBudWxsOworCQl0aGlzLmJyYWNrZXRPcGVyYXRvciA9IG51bGw7CisJCXRoaXMuYm9vbGVhbk9wZXJhdG9yID0gYm9vbGVhbk9wZXJhdG9yOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGJyYWNrZXRvcGVyYXRvciBUaGUge0BsaW5rIEJyYWNrZXRPcGVyYXRvcn0uCisJICovCisJcHJpdmF0ZSBGaWx0ZXJJdGVtKEJyYWNrZXRPcGVyYXRvciBicmFja2V0b3BlcmF0b3IpIHsKKwkJdGhpcy5jb25kaXRpb24gPSBudWxsOworCQl0aGlzLmJvb2xlYW5PcGVyYXRvciA9IG51bGw7CisJCXRoaXMuYnJhY2tldE9wZXJhdG9yID0gYnJhY2tldG9wZXJhdG9yOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGFuIHtAbGluayBCb29sZWFuT3BlcmF0b3J9IGlzIGNvbnRhaW5lZC4KKwkgKgorCSAqIEByZXR1cm4gVHJ1ZSBpZiBhbiB7QGNvZGUgQm9vbGVhbk9wZXJhdG9yfSBpcyBjb250YWluZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNCb29sZWFuT3BlcmF0b3IoKSB7CisJCXJldHVybiBib29sZWFuT3BlcmF0b3IgIT0gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjb250YWluZWQge0BsaW5rIEJvb2xlYW5PcGVyYXRvcn0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQm9vbGVhbk9wZXJhdG9yfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIEJvb2xlYW5PcGVyYXRvcn0gaXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkLgorCSAqLworCXB1YmxpYyBCb29sZWFuT3BlcmF0b3IgZ2V0Qm9vbGVhbk9wZXJhdG9yKCkgeworCQlpZiAoaXNCb29sZWFuT3BlcmF0b3IoKSkgeworCQkJcmV0dXJuIGJvb2xlYW5PcGVyYXRvcjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZW0gZG9lcyBub3QgY29udGFpbiBhbiBib29sZWFuT3BlcmF0b3IuIik7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgYW4ge0BsaW5rIENvbmRpdGlvbn0gaXMgY29udGFpbmVkLgorCSAqCisJICogQHJldHVybiBUcnVlIGlmIGFuIHtAY29kZSBDb25kaXRpb259IGlzIGNvbnRhaW5lZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0NvbmRpdGlvbigpIHsKKwkJcmV0dXJuIGNvbmRpdGlvbiAhPSBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbnRhaW5lZCB7QGxpbmsgQ29uZGl0aW9ufS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBDb25kaXRpb259IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGNvZGUgQ29uZGl0aW9ufSBpcyBub3QgY29udGFpbmVkLgorCSAqLworCXB1YmxpYyBDb25kaXRpb24gZ2V0Q29uZGl0aW9uKCkgeworCQlpZiAoaXNDb25kaXRpb24oKSkgeworCQkJcmV0dXJuIGNvbmRpdGlvbjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZW0gZG9lcyBub3QgY29udGFpbiBhIGNvbmRpdGlvbi4iKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBhbiB7QGxpbmsgQnJhY2tlck9wZXJhdG9yfSBpcyBjb250YWluZWQuCisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgYW4ge0Bjb2RlIEJyYWNrZXRPcGVyYXRvcn0gaXMgY29udGFpbmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQnJhY2tldE9wZXJhdG9yKCkgeworCQlyZXR1cm4gYnJhY2tldE9wZXJhdG9yICE9IG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgY29udGFpbmVkIHtAbGluayBDb25kaXRpb259LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvbmRpdGlvbn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBDb25kaXRpb259IGlzIG5vdCBjb250YWluZWQuCisJICovCisJcHVibGljIEJyYWNrZXRPcGVyYXRvciBnZXRCcmFja2V0T3BlcmF0b3IoKSB7CisJCWlmIChpc0JyYWNrZXRPcGVyYXRvcigpKSB7CisJCQlyZXR1cm4gYnJhY2tldE9wZXJhdG9yOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSXRlbSBkb2VzIG5vdCBjb250YWluIGEgY29uZGl0aW9uLiIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisJCWlmIChvdGhlciA9PSB0aGlzKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIEZpbHRlckl0ZW0pKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlGaWx0ZXJJdGVtIGZpbHRlckl0ZW0gPSAoRmlsdGVySXRlbSkgb3RoZXI7CisKKwkJcmV0dXJuIE9iamVjdHMuZXF1YWxzKHRoaXMuY29uZGl0aW9uLCBmaWx0ZXJJdGVtLmNvbmRpdGlvbikKKwkJCQkmJiBPYmplY3RzLmVxdWFscyh0aGlzLmJvb2xlYW5PcGVyYXRvciwgZmlsdGVySXRlbS5ib29sZWFuT3BlcmF0b3IpCisJCQkJJiYgT2JqZWN0cy5lcXVhbHModGhpcy5icmFja2V0T3BlcmF0b3IsIGZpbHRlckl0ZW0uYnJhY2tldE9wZXJhdG9yKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBPYmplY3RzLmhhc2goY29uZGl0aW9uLCBib29sZWFuT3BlcmF0b3IsIGJyYWNrZXRPcGVyYXRvcik7CisJfQorCisJLyoKKwkgKiAobm9uLUphdmFkb2MpCisJICogCisJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoaXNCb29sZWFuT3BlcmF0b3IoKSkgeworCQkJcmV0dXJuICIgIiArIGJvb2xlYW5PcGVyYXRvci50b1N0cmluZygpICsgIiAiOworCQl9IGVsc2UgaWYgKGlzQnJhY2tldE9wZXJhdG9yKCkpIHsKKwkJCXJldHVybiBicmFja2V0T3BlcmF0b3IudG9TdHJpbmcoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBjb25kaXRpb24udG9TdHJpbmcoKTsKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0pvaW5UeXBlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvSm9pblR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTkyY2RkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L0pvaW5UeXBlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeTsKKworLyoqCisgKiBKb2luVHlwZSBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgUXVlcnkKKyAqLworcHVibGljIGVudW0gSm9pblR5cGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW1lcmF0aW9ucworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEVuZm9yY2VzIGFuIGlubmVyIGpvaW4uCisJICovCisJSU5ORVIsCisKKwkvKioKKwkgKiBFbmZvcmNlcyBhbiBvdXRlciBqb2luLgorCSAqLworCU9VVEVSCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9RdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1F1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4YTM2MwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9RdWVyeS5qYXZhCkBAIC0wLDAgKzEsMzUxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKKworLyoqCisgKiBQcm92aWRlcyBtZXRob2RzIHRvIGVhc2lseSBidWlsZCBxdWVyaWVzIGJ5IGFkZGluZyBzZWxlY3QsIGpvaW4sIGdyb3VwIGJ5IGFuZAorICogb3JkZXIgYnkgc3RhdGVtZW50cy4gRmluYWxseSBhbiBvcHRpb25hbCB7QGxpbmsgRmlsdGVyfSBtYXkgYmUgZ2l2ZW4gdG8KKyAqIHNlbGVjdCBkYXRhIHRoYXQgbWF0Y2ggc3BlY2lmaWVkIGNyaXRlcmlhLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQGF1dGhvciBTZWJhc3RpYW4gRGlyc2NoLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBFbnRpdHlUeXBlCisgKiBAc2VlIEF0dHJpYnV0ZQorICogQHNlZSBBZ2dyZWdhdGlvbgorICogQHNlZSBSZWxhdGlvbgorICogQHNlZSBKb2luVHlwZQorICogQHNlZSBSZXN1bHQKKyAqLworcHVibGljIGludGVyZmFjZSBRdWVyeSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0gd2lsbCBiZSBxdWVyaWVkIGluIGFueSB3YXkgKHNlbGVjdCBvcgorCSAqIGpvaW4pLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGNoZWNrZWQge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEByZXR1cm4gVHJ1ZSBpZiBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0gd2lsbCBiZSBxdWVyaWVkLgorCSAqLworCWJvb2xlYW4gaXNRdWVyaWVkKEVudGl0eVR5cGUgZW50aXR5VHlwZSk7CisKKwkvKioKKwkgKiBBZGRzIHNlbGVjdCBzdGF0ZW1lbnRzIGZvciBhbGwge0BsaW5rIEF0dHJpYnV0ZX1zIG9mIGVhY2ggZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgVGhlIHtAY29kZSBBdHRyaWJ1dGV9cyBvZiBlYWNoIHtAY29kZSBFbnRpdHlUeXBlfSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byB7QGxpbmsgI3NlbGVjdChMaXN0KX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgc2VsZWN0QWxsKExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMpIHsKKwkJZW50aXR5VHlwZXMuc3RyZWFtKCkubWFwKEVudGl0eVR5cGU6OmdldEF0dHJpYnV0ZXMpLmZvckVhY2godGhpczo6c2VsZWN0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBzZWxlY3Qgc3RhdGVtZW50cyBmb3IgYWxsIHtAbGluayBBdHRyaWJ1dGV9cyBvZiBlYWNoIGdpdmVuCisJICoge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGVzIFRoZSB7QGNvZGUgQXR0cmlidXRlfXMgb2YgZWFjaCB7QGNvZGUgRW50aXR5VHlwZX0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8ge0BsaW5rICNzZWxlY3QoTGlzdCl9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IHNlbGVjdEFsbChFbnRpdHlUeXBlLi4uIGVudGl0eVR5cGVzKSB7CisJCUFycmF5cy5zdHJlYW0oZW50aXR5VHlwZXMpLm1hcChFbnRpdHlUeXBlOjpnZXRBdHRyaWJ1dGVzKS5mb3JFYWNoKHRoaXM6OnNlbGVjdCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgc2VsZWN0IHN0YXRlbWVudHMgZm9yIGFsbCB7QGxpbmsgQXR0cmlidXRlfXMgaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lcworCSAqIGF0IGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSB7QGNvZGUgRW50aXR5VHlwZX0gd2hvc2Uge0Bjb2RlIEF0dHJpYnV0ZX1zIHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8ge0BsaW5rICNzZWxlY3QoQXR0cmlidXRlKX0uCisJICogQHBhcmFtIG5hbWVzICAgICAgVGhlIG5hbWVzIG9mIHRoZSB7QGNvZGUgQXR0cmlidXRlfXMgdGhhdCBoYXZlIHRvIGJlIGFkZGVkLgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKiBAc2VlIEVudGl0eVR5cGUjZ2V0QXR0cmlidXRlKFN0cmluZykKKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IHNlbGVjdChFbnRpdHlUeXBlIGVudGl0eVR5cGUsIFN0cmluZy4uLiBuYW1lcykgeworCQlBcnJheXMuc3RyZWFtKG5hbWVzKS5tYXAoZW50aXR5VHlwZTo6Z2V0QXR0cmlidXRlKS5mb3JFYWNoKHRoaXM6OnNlbGVjdCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBzZWxlY3Qgc3RhdGVtZW50IGZvciB0aGUgSUQge0BsaW5rIEF0dHJpYnV0ZX0gb2YgZWFjaCBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlcyBUaGUge0Bjb2RlIEVudGl0eVR5cGV9cyB3aG9zZSBJRCB7QGNvZGUgQXR0cmlidXRlfXMgd2lsbAorCSAqICAgICAgICAgICAgICAgICAgICBiZSBwYXNzZWQgdG8ge0BsaW5rICNzZWxlY3QoQXR0cmlidXRlKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgc2VsZWN0SUQoRW50aXR5VHlwZS4uLiBlbnRpdHlUeXBlcykgeworCQlBcnJheXMuc3RyZWFtKGVudGl0eVR5cGVzKS5tYXAoRW50aXR5VHlwZTo6Z2V0SURBdHRyaWJ1dGUpLmZvckVhY2godGhpczo6c2VsZWN0KTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIHNlbGVjdCBzdGF0ZW1lbnQgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBFYWNoIHtAY29kZSBBdHRyaWJ1dGV9IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICAge0BsaW5rICNzZWxlY3QoQXR0cmlidXRlKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgc2VsZWN0KExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB7CisJCWF0dHJpYnV0ZXMuZm9yRWFjaCh0aGlzOjpzZWxlY3QpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgc2VsZWN0IHN0YXRlbWVudCBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIEVhY2gge0Bjb2RlIEF0dHJpYnV0ZX0gd2lsbCBiZSBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgI3NlbGVjdChBdHRyaWJ1dGUpfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBzZWxlY3QoQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKwkJQXJyYXlzLnN0cmVhbShhdHRyaWJ1dGVzKS5mb3JFYWNoKHRoaXM6OnNlbGVjdCk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBzZWxlY3Qgc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUge0Bjb2RlIEF0dHJpYnV0ZX0gd2lsbCBiZSBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAgIHtAbGluayAjc2VsZWN0KEF0dHJpYnV0ZSwgQWdncmVnYXRpb24pfSB3aXRoCisJICogICAgICAgICAgICAgICAgICB7QGxpbmsgQWdncmVnYXRpb24jTk9ORX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgc2VsZWN0KEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKwkJcmV0dXJuIHNlbGVjdChhdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uLk5PTkUpOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBzZWxlY3Qgc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfSB3aXRoIGdpdmVuCisJICoge0BsaW5rIEFnZ3JlZ2F0aW9ufSBmdW5jdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gYSBzZWxlY3Qgc3RhdGVtZW50IHdpbGwgYmUgYWRkZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgZm9yLgorCSAqIEBwYXJhbSBhZ2dyZWdhdGlvbiBUaGUge0Bjb2RlIEFnZ3JlZ2F0aW9ufSB0aGF0IHdpbGwgYmUgYXBwbGllZC4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJUXVlcnkgc2VsZWN0KEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uIGFnZ3JlZ2F0aW9uKTsKKworCS8qKgorCSAqIEZvciBhbGwgdW5hbWJpZ3VvdXMge0BsaW5rIFJlbGF0aW9ufXMgZnJvbSB0aGUgc291cmNlIHtAbGluayBFbnRpdHlUeXBlfSB0bworCSAqIGVhY2ggZ2l2ZW4gdGFyZ2V0IHtAY29kZSBFbnRpdHlUeXBlfSBhIGpvaW4gc3RhdGVtZW50IHdpbGwgYmUgYWRkZWQuCisJICoKKwkgKiBAcGFyYW0gc291cmNlICBUaGUgc291cmNlIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gdGFyZ2V0cyBUaGUgdW5hbWJpZ3VvdXMge0Bjb2RlIFJlbGF0aW9ufSBmb3IgZWFjaCB0YXJnZXQge0Bjb2RlCisJICogCQlFbnRpdHlUeXBlfSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgc291cmNlIHtAY29kZSBFbnRpdHlUeXBlfSB1c2luZworCSAqICAgICAgICAgICAgICAgIHtAbGluayBFbnRpdHlUeXBlI2dldFJlbGF0aW9uKEVudGl0eVR5cGUpfSBhbmQgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAge0BsaW5rICNqb2luKFJlbGF0aW9uKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgam9pbihFbnRpdHlUeXBlIHNvdXJjZSwgRW50aXR5VHlwZS4uLiB0YXJnZXRzKSB7CisJCUFycmF5cy5zdHJlYW0odGFyZ2V0cykubWFwKHNvdXJjZTo6Z2V0UmVsYXRpb24pLmZvckVhY2godGhpczo6am9pbik7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYSBqb2luIHN0YXRlbWVudCBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgUmVsYXRpb259cy4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvbnMgRWFjaCB7QGNvZGUgUmVsYXRpb259IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICB7QGxpbmsgI2pvaW4oUmVsYXRpb24pfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBqb2luKExpc3Q8UmVsYXRpb24+IHJlbGF0aW9ucykgeworCQlyZWxhdGlvbnMuZm9yRWFjaCh0aGlzOjpqb2luKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIGpvaW4gc3RhdGVtZW50IGZvciBlYWNoIGdpdmVuIHtAbGluayBSZWxhdGlvbn1zLgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9ucyBFYWNoIHtAY29kZSBSZWxhdGlvbn0gd2lsbCBiZSBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAgIHtAbGluayAjam9pbihSZWxhdGlvbil9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IGpvaW4oUmVsYXRpb24uLi4gcmVsYXRpb25zKSB7CisJCUFycmF5cy5zdHJlYW0ocmVsYXRpb25zKS5mb3JFYWNoKHRoaXM6OmpvaW4pOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgam9pbiBzdGF0ZW1lbnQgZm9yIGdpdmVuIHtAbGluayBSZWxhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24ge0Bjb2RlIFJlbGF0aW9ufSB3aWxsIGJlIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICB7QGxpbmsgI2pvaW4oUmVsYXRpb24sIEpvaW5UeXBlKX0gd2l0aAorCSAqICAgICAgICAgICAgICAgICB7QGxpbmsgSm9pblR5cGUjSU5ORVJ9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IGpvaW4oUmVsYXRpb24gcmVsYXRpb24pIHsKKwkJcmV0dXJuIGpvaW4ocmVsYXRpb24sIEpvaW5UeXBlLklOTkVSKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgam9pbiBzdGF0ZW1lbnQgZm9yIGdpdmVuIHtAbGluayBSZWxhdGlvbn0gd2l0aCBnaXZlbiB7QGxpbmsgSm9pblR5cGV9CisJICogdHlwZS4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvbiBUaGUge0Bjb2RlIFJlbGF0aW9ufSBhIGpvaW4gc3RhdGVtZW50IHdpbGwgYmUgYWRkZWQgZm9yLgorCSAqIEBwYXJhbSBqb2luICAgICBUaGUge0Bjb2RlIEpvaW5UeXBlfSB0eXBlIHRoYXQgd2lsbCBiZSBhcHBsaWVkLgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlRdWVyeSBqb2luKFJlbGF0aW9uIHJlbGF0aW9uLCBKb2luVHlwZSBqb2luKTsKKworCS8qKgorCSAqIEFkZHMgYSBncm91cCBieSBzdGF0ZW1lbnQgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBFYWNoIHtAY29kZSBBdHRyaWJ1dGV9IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICAge0BsaW5rICNncm91cChBdHRyaWJ1dGUpfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBncm91cChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgeworCQlhdHRyaWJ1dGVzLmZvckVhY2godGhpczo6Z3JvdXApOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgZ3JvdXAgYnkgc3RhdGVtZW50IGZvciBlYWNoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgRWFjaCB7QGNvZGUgQXR0cmlidXRlfSB3aWxsIGJlIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICAgIHtAbGluayAjZ3JvdXAoQXR0cmlidXRlKX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgZ3JvdXAoQXR0cmlidXRlLi4uIGF0dHJpYnV0ZXMpIHsKKwkJQXJyYXlzLnN0cmVhbShhdHRyaWJ1dGVzKS5mb3JFYWNoKHRoaXM6Omdyb3VwKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICogQWRkcyBhIGdyb3VwIGJ5IHN0YXRlbWVudCBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfSBhIGdyb3VwIGJ5IHN0YXRlbWVudCB3aWxsIGJlIGFkZGVkCisJICogICAgICAgICAgICAgICAgICBmb3IuCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCVF1ZXJ5IGdyb3VwKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOworCisJLyoqCisJICogQWRkcyBhbiBvcmRlciBieSBzdGF0ZW1lbnQgZm9yIGVhY2ggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlcyBFYWNoIHtAY29kZSBBdHRyaWJ1dGV9IHdpbGwgYmUgcGFzc2VkIHRvCisJICogICAgICAgICAgICAgICAgICAge0BsaW5rICNvcmRlcihBdHRyaWJ1dGUpfS4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJZGVmYXVsdCBRdWVyeSBvcmRlcihMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgeworCQlhdHRyaWJ1dGVzLmZvckVhY2godGhpczo6b3JkZXIpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFuIG9yZGVyIGJ5IHN0YXRlbWVudCBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIEVhY2gge0Bjb2RlIEF0dHJpYnV0ZX0gd2lsbCBiZSBwYXNzZWQgdG8KKwkgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgI29yZGVyKEF0dHJpYnV0ZSl9LgorCSAqIEByZXR1cm4gVGhpcyBxdWVyeSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFF1ZXJ5IG9yZGVyKEF0dHJpYnV0ZS4uLiBhdHRyaWJ1dGVzKSB7CisJCUFycmF5cy5zdHJlYW0oYXR0cmlidXRlcykuZm9yRWFjaCh0aGlzOjpvcmRlcik7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIEFkZHMgYW4gb3JkZXIgYnkgc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIHtAY29kZSBBdHRyaWJ1dGV9IGlzIHBhc3NlZCB0bworCSAqICAgICAgICAgICAgICAgICAge0BsaW5rICNvcmRlcihBdHRyaWJ1dGUsIGJvb2xlYW4pfSB3aXRoCisJICogICAgICAgICAgICAgICAgICB7QGNvZGUgYXNjZW5kaW5nID0gdHJ1ZX0uCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCWRlZmF1bHQgUXVlcnkgb3JkZXIoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlyZXR1cm4gb3JkZXIoYXR0cmlidXRlLCB0cnVlKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGFuIG9yZGVyIGJ5IHN0YXRlbWVudCBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0gd2l0aCBnaXZlbiBhc2NlbmRpbmcKKwkgKiBmbGFnLgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZSBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0gYW4gb3JkZXIgYnkgc3RhdGVtZW50IHdpbGwgYmUgYWRkZWQKKwkgKiAgICAgICAgICAgICAgICAgIGZvci4KKwkgKiBAcGFyYW0gYXNjZW5kaW5nIFRoZSBhc2NlbmRpbmcgZmxhZyB0aGF0IHdpbGwgYmUgYXBwbGllZC4KKwkgKiBAcmV0dXJuIFRoaXMgcXVlcnkgaXMgcmV0dXJuZWQuCisJICovCisJUXVlcnkgb3JkZXIoQXR0cmlidXRlIGF0dHJpYnV0ZSwgYm9vbGVhbiBhc2NlbmRpbmcpOworCisJLyoqCisJICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyBmZXRjaGVkIGJ5IHRoZSBxdWVyeS4gMCBkZW5vdGVzIG5vIGxpbWl0LgorCSAqCisJICogQHBhcmFtIGxpbWl0IG51bWJlciBvZiBtYXhpbXVtIHJvd3MuCisJICogQHJldHVybiBUaGlzIHF1ZXJ5IGlzIHJldHVybmVkLgorCSAqLworCVF1ZXJ5IGxpbWl0KGludCBsaW1pdCk7CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGlzIHF1ZXJ5IHdpdGggYW4gZW1wdHkge0BsaW5rIEZpbHRlcn0gYW5kIHJldHVybnMgdGhlCisJICoge0BsaW5rIFJlc3VsdH0uCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYge0Bjb2RlIFJlc3VsdH0gY291bGQgbm90IGJlIGZvdW5kLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fS4KKwkgKi8KKwlkZWZhdWx0IE9wdGlvbmFsPFJlc3VsdD4gZmV0Y2hTaW5nbGV0b24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaFNpbmdsZXRvbihGaWx0ZXIuYW5kKCkpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgcXVlcnkgd2l0aCBnaXZlbiB7QGxpbmsgRmlsdGVyfSBhbmQgcmV0dXJucyB0aGUge0BsaW5rIFJlc3VsdH0uCisJICoKKwkgKiBAcGFyYW0gZmlsdGVyIFRoZSBjcml0ZXJpYSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYge0Bjb2RlIFJlc3VsdH0gY291bGQgbm90IGJlIGZvdW5kLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fS4KKwkgKi8KKwlPcHRpb25hbDxSZXN1bHQ+IGZldGNoU2luZ2xldG9uKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogRXhlY3V0ZXMgdGhpcyBxdWVyeSB3aXRoIGFuIGVtcHR5IHtAbGluayBGaWx0ZXJ9IGFuZCByZXR1cm5zIHRoZQorCSAqIHtAbGluayBSZXN1bHR9cy4KKwkgKgorCSAqIEByZXR1cm4gQWxsIHtAY29kZSBSZXN1bHR9cyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIHtAY29kZSBSZXN1bHR9cy4KKwkgKi8KKwlkZWZhdWx0IExpc3Q8UmVzdWx0PiBmZXRjaCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZldGNoKEZpbHRlci5hbmQoKSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhpcyBxdWVyeSB3aXRoIGdpdmVuIHtAbGluayBGaWx0ZXJ9IGFuZCByZXR1cm5zIHRoZQorCSAqIHtAbGluayBSZXN1bHR9cy4KKwkgKgorCSAqIEBwYXJhbSBmaWx0ZXIgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQWxsIHtAY29kZSBSZXN1bHR9cyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIHtAY29kZSBSZXN1bHR9cy4KKwkgKi8KKwlMaXN0PFJlc3VsdD4gZmV0Y2goRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9RdWVyeVNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9RdWVyeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDJlZTVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1F1ZXJ5U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKKy8qKgorICogVGhlIHtAbGluayBRdWVyeVNlcnZpY2V9IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbG93IGxldmVsIHF1ZXJ5IEFQSS4KKyAqIAorICogQSB7QGxpbmsgUXVlcnl9LCBjcmVhdGVkIGJ5IHRoaXMgc2VydmljZSwgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYW5kIGV4ZWN1dGUKKyAqIHF1ZXJpZXMgb24gdGhlIHVuZGVybHlpbmcgZGF0YXN0b3JlLiBUaGUgcmVzdWx0cyBhcmUgcmV0dXJuZWQgYXMgYSBsaXN0IG9mCisgKiB7QGxpbmsgUmVzdWx0fXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVlcnlTZXJ2aWNlIHsKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYW5kIGVtcHR5IHtAbGluayBRdWVyeX0uCisJICoKKwkgKiBAcmV0dXJuIENyZWF0ZWQge0Bjb2RlIFF1ZXJ5fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlRdWVyeSBjcmVhdGVRdWVyeSgpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1JlY29yZC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1JlY29yZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzdkYzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvUmVjb3JkLmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiBBIHJlY29yZCBjb3JyZXNwb25kcyB0byBhbiBpbnN0YW5jZSBvZiB0aGUgdW5kZXJseWluZyB7QGxpbmsgRW50aXR5VHlwZX0uIEl0CisgKiBjb250YWlucyBhIHN1YnNldCBvZiBpdHMge0BsaW5rIFZhbHVlfXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEF0dHJpYnV0ZQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVjb3JkIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlUeXBlIGVudGl0eVR5cGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0BsaW5rIEVudGl0eVR5cGV9IHRoaXMgcmVjb3JkIGlzIGFzc29jaWF0ZWQgd2l0aC4KKwkgKi8KKwlwdWJsaWMgUmVjb3JkKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQl0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgRW50aXR5VHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZSgpIHsKKwkJcmV0dXJuIGVudGl0eVR5cGU7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgY29udGFpbmVkIHtAbGluayBWYWx1ZX1zIG1hcHBlZCBieSB0aGVpciBuYW1lcy4KKwkgKgorCSAqIEByZXR1cm4gQXZhaWxhYmxlIHtAY29kZSBWYWx1ZX1zIGluIGEgbXV0YWJsZSB7QGNvZGUgTWFwfSBhcmUgcmV0dXJuZWQuCisJICovCisJcHVibGljIE1hcDxTdHJpbmcsIFZhbHVlPiBnZXRWYWx1ZXMoKSB7CisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVjb3JkIElELCB3aGljaCBpcyB0aGUgSUQgb2YgdGhlIGluc3RhbmNlLCByZXByZXNlbnRlZCBieSB0aGlzCisJICogcmVjb3JkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBJRCBvZiB0aGlzIHJlY29yZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdGhlIElEIHtAY29kZSBWYWx1ZX0gY29udGFpbmVyIGlzIG5vdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldElEKCkgeworCQlWYWx1ZSBpZFZhbHVlID0gZ2V0VmFsdWVzKCkuZ2V0KGdldEVudGl0eVR5cGUoKS5nZXRJREF0dHJpYnV0ZSgpLmdldE5hbWUoKSk7CisJCWlmIChpZFZhbHVlID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklEIGF0dHJpYnV0ZSB3YXMgbm90IHNlbGVjdGVkLiIpOworCQl9CisKKwkJcmV0dXJuIGlkVmFsdWUuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGluc3RhbmNlIElEIG9mIHRoZSByZWxhdGVkIGVudGl0eSByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbgorCSAqIHtAbGluayBSZWxhdGlvbn0uCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIGZvcmVpZ24ga2V5IHtAY29kZSBSZWxhdGlvbn0uCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZXJlIGlzIG5vIHJlbGF0ZWQgZW50aXR5LgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB0aGUgcmVxdWVzdGVkIGZvcmVpZ24ga2V5IHdhcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBwcmlvciBleGVjdXRpbmcgdGhlIHF1ZXJ5LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxTdHJpbmc+IGdldElEKFJlbGF0aW9uIHJlbGF0aW9uKSB7CisJCVZhbHVlIGlkVmFsdWUgPSBnZXRWYWx1ZXMoKS5nZXQocmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJaWYgKGlkVmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsYXRpb24gYXR0cmlidXRlICciICsgcmVsYXRpb24gKyAiJyB3YXMgbm90IHNlbGVjdGVkLiIpOworCQl9CisKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoaWRWYWx1ZS5pc1ZhbGlkKCkgPyBpZFZhbHVlLmV4dHJhY3QoKSA6IG51bGwpOworCX0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIFZhbHVlfSB0byB0aGlzIHJlY29yZC4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSB7QGxpbmsgVmFsdWV9IHRoYXQgd2lsbCBiZSBhZGRlZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4ge0Bjb2RlIFZhbHVlfSBvdmVyd3JpdGVzIGFuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcgb25lLgorCSAqLworCXB1YmxpYyB2b2lkIGFkZFZhbHVlKFZhbHVlIHZhbHVlKSB7CisJCWlmICh2YWx1ZXMucHV0KHZhbHVlLmdldE5hbWUoKSwgdmFsdWUpICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIHdpdGggbmFtZSAnIiArIHZhbHVlLmdldE5hbWUoKSArICInIGZvciBlbnRpdHkgdHlwZSAnIgorCQkJCQkrIGVudGl0eVR5cGUgKyAiJyByZWNvcmQgaXMgYWxyZWFkeSBkZWZpbmVkLiIpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVjb3JkLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZWNvcmQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJSZWNvcmQoRW50aXR5VHlwZSA9ICIpLmFwcGVuZChnZXRFbnRpdHlUeXBlKCkpOworCQlyZXR1cm4gc2IuYXBwZW5kKCIsIFZhbHVlcyA9ICIpLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKSkuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTWVyZ2VzIGdpdmVuIHJlY29yZCB3aXRoIHRoaXMgaW5zdGFuY2UuIFRvIGJlIGFibGUgdG8gZG8gc28sIHRoZSBnaXZlbiByZWNvcmQKKwkgKiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlY29yZC4gUmVjb3JkcyBhcmUgY29tcGF0aWJsZSBpZiB0aGUgdW5kZXJseWluZworCSAqIHtAbGluayBFbnRpdHlUeXBlfSBhbmQgdGhlIHN1YnNldCBvZiB7QGxpbmsgVmFsdWV9cyBpcyB0aGUgc2FtZS4KKwkgKgorCSAqIEBwYXJhbSByZWNvcmQgVGhlIHJlY29yZCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhpcyBpbnN0YW5jZS4KKwkgKiBAcmV0dXJuIEEgbmV3IHJlY29yZCB3aXRoIG1lcmdlZCB7QGNvZGUgVmFsdWV9cyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gcmVjb3JkIGlzIG5vdCBjb21wYXRpYmxlLgorCSAqLworCVJlY29yZCBtZXJnZShSZWNvcmQgcmVjb3JkKSB7CisJCWJvb2xlYW4gZW50aXR5VHlwZU1pc3NtYXRjaCA9ICFnZXRFbnRpdHlUeXBlKCkuZXF1YWxzKHJlY29yZC5nZXRFbnRpdHlUeXBlKCkpOworCQlib29sZWFuIHZhbHVlc01pc3NtYXRjaCA9IGdldFZhbHVlcygpLnNpemUoKSAhPSByZWNvcmQuZ2V0VmFsdWVzKCkuc2l6ZSgpOworCQlpZiAoZW50aXR5VHlwZU1pc3NtYXRjaCB8fCB2YWx1ZXNNaXNzbWF0Y2gpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBtZXJnZSwgaW5jb21wYXRpYmxlIHJlY29yZCBwYXNzZWQuIik7CisJCX0KKworCQlSZWNvcmQgbWVyZ2VkUmVjb3JkID0gbmV3IFJlY29yZChnZXRFbnRpdHlUeXBlKCkpOworCQlnZXRWYWx1ZXMoKS5rZXlTZXQoKS5zdHJlYW0oKS5mb3JFYWNoKG4gLT4gbWVyZ2VkUmVjb3JkLmFkZFZhbHVlKGdldFZhbHVlKG4pLm1lcmdlKHJlY29yZC5nZXRWYWx1ZShuKSkpKTsKKwkJcmV0dXJuIG1lcmdlZFJlY29yZDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHtAbGluayBWYWx1ZX0gd2l0aCBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4ge0Bjb2RlIFZhbHVlfSB3aXRoIGdpdmVuIG5hbWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHZhbHVlIHdpdGggZ2l2ZW4gbmFtZSBpcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZWQuCisJICovCisJVmFsdWUgZ2V0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKwkJVmFsdWUgdmFsdWUgPSBnZXRWYWx1ZXMoKS5nZXQobmFtZSk7CisJCWlmICh2YWx1ZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgbm90IGZvdW5kLiIpOworCQl9CisKKwkJcmV0dXJuIHZhbHVlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1Jlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3F1ZXJ5L1Jlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYjNlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogQSByZXN1bHQgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUge0BsaW5rIFJlY29yZH1zLCB3aGljaCBpcyBtYXBwZWQgZnJvbSBhbgorICoge0BsaW5rIEVudGl0eVR5cGV9CisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXN1bHQgaW1wbGVtZW50cyBJdGVyYWJsZTxSZWNvcmQ+IHsKKworCXByaXZhdGUgZmluYWwgTWFwPEVudGl0eVR5cGUsIFJlY29yZD4gcmVjb3JkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIFJlY29yZH0gdG8gdGhpcyByZXN1bHQuCisJICoKKwkgKiBAcGFyYW0gcmVjb3JkIHtAY29kZSBSZWNvcmR9IHRoYXQgd2lsbCBiZSBhZGRlZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4ge0Bjb2RlIFJlY29yZH0gb3ZlcndyaXRlcyBhbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nIG9uZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSZWNvcmQoUmVjb3JkIHJlY29yZCkgeworCQlpZiAocmVjb3Jkcy5wdXQocmVjb3JkLmdldEVudGl0eVR5cGUoKSwgcmVjb3JkKSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiUmVjb3JkIGZvciBlbnRpdHkgdHlwZSAnIiArIHJlY29yZC5nZXRFbnRpdHlUeXBlKCkgKyAiJyBpcyBhbHJlYWR5IGRlZmluZWQuIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUmVjb3JkfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBSZWNvcmR9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0gaXMKKwkgKiAgICAgICAgIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBhc3NvY2lhdGVkIHtAY29kZSBSZWNvcmR9IGRvZXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QuCisJICovCisJcHVibGljIFJlY29yZCBnZXRSZWNvcmQoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCVJlY29yZCByZWNvcmQgPSByZWNvcmRzLmdldChlbnRpdHlUeXBlKTsKKwkJaWYgKHJlY29yZCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWNvcmQgZm9yIGVudGl0eSB0eXBlICciICsgZW50aXR5VHlwZSArICInIGlzIG5vdCBhdmFpbGFibGUuIik7CisJCX0KKworCQlyZXR1cm4gcmVjb3JkOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBSZWNvcmR9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0gZnJvbSB0aGlzCisJICogcmVzdWx0IGFuZCByZXR1cm5zIGl0LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHJlbW92ZWQge0Bjb2RlIFJlY29yZH0gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfQorCSAqICAgICAgICAgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGFzc29jaWF0ZWQge0Bjb2RlIFJlY29yZH0gZG9lcyBub3QKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMuCisJICovCisJcHVibGljIFJlY29yZCByZW1vdmVSZWNvcmQoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCVJlY29yZCByZWNvcmQgPSByZWNvcmRzLnJlbW92ZShlbnRpdHlUeXBlKTsKKwkJaWYgKHJlY29yZCA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWNvcmQgZm9yIGVudGl0eSB0eXBlICciICsgZW50aXR5VHlwZSArICInIGlzIG5vdCBhdmFpbGFibGUuIik7CisJCX0KKworCQlyZXR1cm4gcmVjb3JkOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBWYWx1ZX0gY29udGFpbmVyIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfQorCSAqIGFuZCBubyBhZ2dyZWdhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVXNlZCBhcyBpZGVudGlmaWVyIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIFZhbHVlfS4KKwkgKiBAcmV0dXJuIEFzc29jaWF0ZWQge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWUgZ2V0VmFsdWUoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlyZXR1cm4gZ2V0VmFsdWUoYXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5OT05FKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lciBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0KKwkgKiBhbmQge0BsaW5rIEFnZ3JlZ2F0aW9ufS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICBVc2VkIGFzIGlkZW50aWZpZXIgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB7QGNvZGUgVmFsdWV9LgorCSAqIEBwYXJhbSBhZ2dyZWdhdGlvbiB7QGxpbmsgQWdncmVnYXRpb259IHVzZWQgd2l0aCB0aGUgYXR0cmlidXRlLgorCSAqIEByZXR1cm4gQXNzb2NpYXRlZCB7QGNvZGUgVmFsdWV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZSBnZXRWYWx1ZShBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbikgeworCQlTdHJpbmcga2V5OworCQlpZiAoQWdncmVnYXRpb24uTk9ORSA9PSBhZ2dyZWdhdGlvbikgeworCQkJa2V5ID0gYXR0cmlidXRlLmdldE5hbWUoKTsKKwkJfSBlbHNlIHsKKwkJCWtleSA9IFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIGFnZ3JlZ2F0aW9uLm5hbWUoKSwgYXR0cmlidXRlLmdldE5hbWUoKSk7CisJCX0KKworCQlyZXR1cm4gZ2V0UmVjb3JkKGF0dHJpYnV0ZS5nZXRFbnRpdHlUeXBlKCkpLmdldFZhbHVlKGtleSk7CisJfQorCisJLyoqCisJICogTWVyZ2VzIGdpdmVuIHJlc3VsdCB3aXRoIHRoaXMgaW5zdGFuY2UuIFRvIGJlIGFibGUgdG8gZG8gc28sIHRoZSBnaXZlbiByZXN1bHQKKwkgKiBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlc3VsdC4gUmVzdWx0cyBhcmUgY29tcGF0aWJsZSBpZiB0aGUgc3Vic2V0IG9mCisJICoge0BsaW5rIFJlY29yZH1zIGlzIHRoZSBzYW1lLgorCSAqCisJICogQHBhcmFtIHJlc3VsdCBUaGUgcmVzdWx0IHRoYXQgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGlzIGluc3RhbmNlLgorCSAqIEByZXR1cm4gQSBuZXcgcmVzdWx0IHdpdGggbWVyZ2VkIHtAY29kZSBSZWNvcmR9cyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gcmVzdWx0IGlzIG5vdCBjb21wYXRpYmxlLgorCSAqLworCXB1YmxpYyBSZXN1bHQgbWVyZ2UoUmVzdWx0IHJlc3VsdCkgeworCQlpZiAocmVjb3Jkcy5zaXplKCkgIT0gcmVzdWx0LnJlY29yZHMuc2l6ZSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbWVyZ2UsIGluY29tcGF0aWJsZSByZXN1bHQgcGFzc2VkLiIpOworCQl9CisKKwkJUmVzdWx0IG1lcmdlZFJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKKwkJcmVjb3Jkcy5rZXlTZXQoKS5zdHJlYW0oKS5mb3JFYWNoKGUgLT4gbWVyZ2VkUmVzdWx0LmFkZFJlY29yZChnZXRSZWNvcmQoZSkubWVyZ2UocmVzdWx0LmdldFJlY29yZChlKSkpKTsKKwkJcmV0dXJuIG1lcmdlZFJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgc2VxdWVudGlhbCBzdHJlYW0gd2l0aCB0aGlzIHJlc3VsdCBhcyBpdHMgc291cmNlLgorCSAqCisJICogQHJldHVybiBBIHNlcXVlbnRpYWwgc3RyZWFtIHdpdGggcmVjb3JkcyBvZiB0aGlzIHJlc3VsdC4KKwkgKi8KKwlwdWJsaWMgU3RyZWFtPFJlY29yZD4gc3RyZWFtKCkgeworCQlyZXR1cm4gU3RyZWFtU3VwcG9ydC5zdHJlYW0oc3BsaXRlcmF0b3IoKSwgZmFsc2UpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUge0BsaW5rIFJlY29yZH1zIGNvbnRhaW5lZCBpbiB0aGlzIHJlc3VsdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbnRhaW5lZCB7QGNvZGUgUmVjb3JkfXMgaXMgcmV0dXJuZWQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEl0ZXJhdG9yPFJlY29yZD4gaXRlcmF0b3IoKSB7CisJCXJldHVybiByZWNvcmRzLnZhbHVlcygpLml0ZXJhdG9yKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhIGh1bWFuIHJlYWRhYmxlIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVzdWx0LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZXN1bHQuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKCJSZXN1bHQoUmVjb3JkcyA9ICIpLmFwcGVuZChyZWNvcmRzLnZhbHVlcygpKS5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOGIwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvc2VhcmNoL1NlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSwxNzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworCisvKioKKyAqIFRoaXMgaXMgYW4gaW50ZXJmYWNlIGZvciBwcmVkZWZpbmVkIHNlYXJjaCBxdWVyeSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIEVudGl0eVR5cGUKKyAqIEBzZWUgU2VhcmNoYWJsZQorICogQHNlZSBBdHRyaWJ1dGUKKyAqIEBzZWUgVmFsdWUKKyAqIEBzZWUgRmlsdGVyCisgKiBAc2VlIFJlc3VsdAorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlYXJjaFF1ZXJ5IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHtAbGluayBFbnRpdHlUeXBlfXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IG1heSBiZSBpbW11dGFibGUuCisJICovCisJTGlzdDxFbnRpdHlUeXBlPiBsaXN0RW50aXR5VHlwZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTZWFyY2hhYmxlfSwgd2hpY2ggZGVzY3JpYmVzIGEgaGllcmFyY2hpY2FsIG9yZGVyIG9mIHRoZQorCSAqIHtAbGluayBFbnRpdHlUeXBlfXMgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFNlYXJjaGFibGV9IHJvb3QgaXMgcmV0dXJuZWQuCisJICovCisJU2VhcmNoYWJsZSBnZXRTZWFyY2hhYmxlUm9vdCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgZGlzdGluY3Qge0BsaW5rIFZhbHVlfSBzZXF1ZW5jZSBmb3IgZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX0uIFRoZQorCSAqIHtAY29kZSBBdHRyaWJ1dGV9IG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LiBUaGUgcmV0dXJuZWQKKwkgKiB7QGNvZGUgVmFsdWV9IHNlcXVlbmNlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIGZpbHRlciBjcml0ZXJpYQorCSAqIGZvciB0aGlzIHNlYXJjaCBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIHtAY29kZSBBdHRyaWJ1dGV9IHdob3NlIGRpc3RpbmN0IHZhbHVlcyB3aWxsIGJlIHF1ZXJpZWQuCisJICogQHJldHVybiBBIGRpc3RpbmN0IHtAY29kZSBMaXN0fSBvZiBhbGwgYXZhaWxhYmxlIHtAY29kZSBWYWx1ZX1zIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSBkaXN0aW5jdCB7QGNvZGUgVmFsdWV9CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLgorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KCkKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoKQorCSAqIEBzZWUgI2dldEZpbHRlclZhbHVlcyhBdHRyaWJ1dGUsIEZpbHRlcikKKwkgKi8KKwlkZWZhdWx0IExpc3Q8VmFsdWU+IGdldEZpbHRlclZhbHVlcyhBdHRyaWJ1dGUgYXR0cmlidXRlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRGaWx0ZXJWYWx1ZXMoYXR0cmlidXRlLCBGaWx0ZXIuYW5kKCkpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRpc3RpbmN0IHtAbGluayBWYWx1ZX0gc2VxdWVuY2UgZm9yIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9IGFuZAorCSAqIHtAbGluayBGaWx0ZXJ9LiBCb3RoIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LiBUaGUKKwkgKiByZXR1cm5lZCB7QGNvZGUgVmFsdWV9IHNlcXVlbmNlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIGZpbHRlcgorCSAqIGNyaXRlcmlhIGZvciB0aGlzIHNlYXJjaCBxdWVyeS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIHtAY29kZSBBdHRyaWJ1dGV9IHdob3NlIGRpc3RpbmN0IHZhbHVlcyB3aWxsIGJlIHF1ZXJpZWQuCisJICogQHBhcmFtIGZpbHRlciAgICBUaGUgY3JpdGVyaWEgc2VxdWVuY2UuCisJICogQHJldHVybiBBIGRpc3RpbmN0IHtAY29kZSBMaXN0fSBvZiB7QGNvZGUgVmFsdWV9cyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUgZGlzdGluY3Qge0Bjb2RlIFZhbHVlfQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZS4KKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdCgpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKCkKKwkgKiBAc2VlICNnZXRGaWx0ZXJWYWx1ZXMoQXR0cmlidXRlKQorCSAqLworCUxpc3Q8VmFsdWU+IGdldEZpbHRlclZhbHVlcyhBdHRyaWJ1dGUgYXR0cmlidXRlLCBGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgc2VhcmNoIHF1ZXJ5IHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9cy4gVGhlIHtAY29kZQorCSAqIEVudGl0eVR5cGV9cyBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGlzIHNlYXJjaCBxdWVyeS4gVGhpcyBtZXRob2QKKwkgKiBzZWxlY3RzIGFsbCB7QGxpbmsgQXR0cmlidXRlfXMgb2YgZWFjaCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgU2VsZWN0IHN0YXRlbWVudHMgd2lsbCBiZSBhZGRlZCBmb3IgYWxsIHtAY29kZSBBdHRyaWJ1dGV9cworCSAqICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcmV0dXJuIEFsbCB7QGNvZGUgUmVzdWx0fXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fXMuCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcygpCisJICogQHNlZSAjZmV0Y2hDb21wbGV0ZShMaXN0LCBGaWx0ZXIpCisJICogQHNlZSAjZmV0Y2goTGlzdCkKKwkgKi8KKwlkZWZhdWx0IExpc3Q8UmVzdWx0PiBmZXRjaENvbXBsZXRlKExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZldGNoQ29tcGxldGUoZW50aXR5VHlwZXMsIEZpbHRlci5hbmQoKSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhpcyBzZWFyY2ggcXVlcnkgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX1zIGFuZCB7QGxpbmsgRmlsdGVyfS4KKwkgKiBCb3RoIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LiBUaGlzIG1ldGhvZCBzZWxlY3RzIGFsbAorCSAqIHtAbGluayBBdHRyaWJ1dGV9cyBvZiBlYWNoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlcyBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBhbGwge0Bjb2RlIEF0dHJpYnV0ZX1zCisJICogICAgICAgICAgICAgICAgICAgIG9mIGVhY2ggZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBmaWx0ZXIgICAgICBUaGUgY3JpdGVyaWEgc2VxdWVuY2UuCisJICogQHJldHVybiBBbGwge0Bjb2RlIFJlc3VsdH1zIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnkgb3IgZ2VuZXJhdGluZyB0aGUge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KCkKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoKQorCSAqIEBzZWUgI2ZldGNoQ29tcGxldGUoTGlzdCkKKwkgKiBAc2VlICNmZXRjaChMaXN0LCBGaWx0ZXIpCisJICovCisJTGlzdDxSZXN1bHQ+IGZldGNoQ29tcGxldGUoTGlzdDxFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcywgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGlzIHNlYXJjaCBxdWVyeSB3aXRoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9cy4gVGhlIHtAY29kZQorCSAqIEF0dHJpYnV0ZX1zIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LiBUaGlzIG1ldGhvZCBhbGxvd3MKKwkgKiBmaW5lIGdyYWluZWQge0BsaW5rIFJlc3VsdH0gY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIFNlbGVjdCBzdGF0ZW1lbnRzIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2gge0Bjb2RlCisJICogCQlBdHRyaWJ1dGV9LgorCSAqIEByZXR1cm4gQWxsIHtAY29kZSBSZXN1bHR9cyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdCgpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKCkKKwkgKiBAc2VlICNmZXRjaChMaXN0LCBGaWx0ZXIpCisJICogQHNlZSAjZmV0Y2hDb21wbGV0ZShMaXN0KQorCSAqLworCWRlZmF1bHQgTGlzdDxSZXN1bHQ+IGZldGNoKExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaChhdHRyaWJ1dGVzLCBGaWx0ZXIuYW5kKCkpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgc2VhcmNoIHF1ZXJ5IHdpdGggZ2l2ZW4ge0BsaW5rIEF0dHJpYnV0ZX1zIGFuZCB7QGxpbmsgRmlsdGVyfS4KKwkgKiBCb3RoIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoaXMgc2VhcmNoIHF1ZXJ5LiBUaGlzIG1ldGhvZCBhbGxvd3MgZmluZQorCSAqIGdyYWluZWQge0BsaW5rIFJlc3VsdH0gY29uZmlndXJhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzIFNlbGVjdCBzdGF0ZW1lbnRzIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2gge0Bjb2RlCisJICogCQlBdHRyaWJ1dGV9LgorCSAqIEBwYXJhbSBmaWx0ZXIgICAgIFRoZSBjcml0ZXJpYSBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIEFsbCB7QGNvZGUgUmVzdWx0fXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBvciBnZW5lcmF0aW5nIHRoZSB7QGNvZGUgUmVzdWx0fXMuCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcygpCisJICogQHNlZSAjZmV0Y2goTGlzdCkKKwkgKiBAc2VlICNmZXRjaENvbXBsZXRlKExpc3QsIEZpbHRlcikKKwkgKi8KKwlMaXN0PFJlc3VsdD4gZmV0Y2goTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9zZWFyY2gvU2VhcmNoU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YzY0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvc2VhcmNoL1NlYXJjaFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM3MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworCisvKioKKyAqIFRoaXMgc2VhcmNoIHNlcnZpY2UgdXNlcyBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlIHRvIGV4ZWN1dGUgdGhlIGFzc29jaWF0ZWQKKyAqIHByZWRlZmluZWQge0BsaW5rIFNlYXJjaFF1ZXJ5fSBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBhdXRob3IgU2ViYXN0aWFuIERpcnNjaCwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgRW50aXR5VHlwZQorICogQHNlZSBTZWFyY2hhYmxlCisgKiBAc2VlIEF0dHJpYnV0ZQorICogQHNlZSBWYWx1ZQorICogQHNlZSBGaWx0ZXIKKyAqIEBzZWUgUmVzdWx0CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2VhcmNoU2VydmljZSB7CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCB7QGxpbmsgRW50aXR5fSB0eXBlcyB0aGlzIHNlYXJjaCBzZXJ2aWNlIHByb3ZpZGVzIGEgcHJlZGVmaW5lZAorCSAqIHtAbGluayBTZWFyY2hRdWVyeX0gZm9yLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IHdpdGggc3VwcG9ydGVkIHR5cGVzIG1heSBiZSBpbW11dGFibGUuCisJICovCisJTGlzdDxDbGFzczw/IGV4dGVuZHMgRW50aXR5Pj4gbGlzdFNlYXJjaGFibGVUeXBlcygpOworCisJLyoqCisJICogUmV0dXJucyBhbGwge0BsaW5rIEVudGl0eVR5cGV9cyBzdXBwb3J0ZWQgYnkgdGhlIHtAbGluayBTZWFyY2hRdWVyeX0KKwkgKiBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IG1heSBiZSBpbW11dGFibGUuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqLworCUxpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBTZWFyY2hhYmxlfSwgd2hpY2ggZGVzY3JpYmVzIGEgaGllcmFyY2hpY2FsIG9yZGVyIG9mIHRoZQorCSAqIHtAbGluayBFbnRpdHlUeXBlfXMgc3VwcG9ydGVkIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUXVlcnl9IGFzc29jaWF0ZWQgd2l0aAorCSAqIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBTZWFyY2hhYmxlfSByb290IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKi8KKwlTZWFyY2hhYmxlIGdldFNlYXJjaGFibGVSb290KENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRpc3RpbmN0IHtAbGluayBWYWx1ZX0gc2VxdWVuY2UgZm9yIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9LiBUaGUKKwkgKiB7QGNvZGUgQXR0cmlidXRlfSBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUge0BsaW5rIFNlYXJjaFF1ZXJ5fSBhc3NvY2lhdGVkCisJICogd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlLiBUaGUgcmV0dXJuZWQge0Bjb2RlIFZhbHVlfSBzZXF1ZW5jZSBpcworCSAqIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIGZpbHRlciBjcml0ZXJpYS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHBhcmFtIGF0dHJpYnV0ZSAgIFRoZSB7QGNvZGUgQXR0cmlidXRlfSB3aG9zZSBkaXN0aW5jdCB2YWx1ZXMgd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICBxdWVyaWVkLgorCSAqIEByZXR1cm4gQSBkaXN0aW5jdCB7QGNvZGUgTGlzdH0gb2YgYWxsIGF2YWlsYWJsZSB7QGNvZGUgVmFsdWV9cyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIGRpc3RpbmN0CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFZhbHVlfSBzZXF1ZW5jZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3MpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKENsYXNzKQorCSAqIEBzZWUgI2dldEZpbHRlclZhbHVlcyhDbGFzcywgQXR0cmlidXRlLCBGaWx0ZXIpCisJICovCisJZGVmYXVsdCBMaXN0PFZhbHVlPiBnZXRGaWx0ZXJWYWx1ZXMoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBnZXRGaWx0ZXJWYWx1ZXMoZW50aXR5Q2xhc3MsIGF0dHJpYnV0ZSwgRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkaXN0aW5jdCB7QGxpbmsgVmFsdWV9IHNlcXVlbmNlIGZvciBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfSBhbmQKKwkgKiB7QGxpbmsgRmlsdGVyfS4gQm90aCBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGUge0BsaW5rIFNlYXJjaFF1ZXJ5fQorCSAqIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlLiBUaGUgcmV0dXJuZWQge0Bjb2RlIFZhbHVlfQorCSAqIHNlcXVlbmNlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIGZpbHRlciBjcml0ZXJpYS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHBhcmFtIGF0dHJpYnV0ZSAgIFRoZSB7QGNvZGUgQXR0cmlidXRlfSB3aG9zZSBkaXN0aW5jdCB2YWx1ZXMgd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICBxdWVyaWVkLgorCSAqIEBwYXJhbSBmaWx0ZXIgICAgICBUaGUgY3JpdGVyaWEgc2VxdWVuY2UuCisJICogQHJldHVybiBBIGRpc3RpbmN0IHtAY29kZSBMaXN0fSBvZiB7QGNvZGUgVmFsdWV9cyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5IG9yIGdlbmVyYXRpbmcgdGhlIGRpc3RpbmN0CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFZhbHVlfSBzZXF1ZW5jZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3MpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKENsYXNzKQorCSAqIEBzZWUgI2dldEZpbHRlclZhbHVlcyhDbGFzcywgQXR0cmlidXRlKQorCSAqLworCUxpc3Q8VmFsdWU+IGdldEZpbHRlclZhbHVlcyhDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcywgQXR0cmlidXRlIGF0dHJpYnV0ZSwgRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFNlYXJjaFF1ZXJ5fSB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICogVGhlIHtAY29kZSBFbnRpdHlUeXBlfXMgbXVzdCBiZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0KKwkgKiBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4gVGhpcyBtZXRob2Qgc2VsZWN0cyBhbGwKKwkgKiB7QGxpbmsgQXR0cmlidXRlfXMgb2YgZWFjaCBnaXZlbiB7QGNvZGUgRW50aXR5VHlwZX0uCisJICoKKwkgKiBJdCBpcyBvbmx5IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBsb2FkcyB0aGUgc2VsZWN0ZWQgZW50aXRpZXMsIGFuZCB0aGVpcgorCSAqIHJlbGF0aW9ucyBhbW9uZyB0aGVtc2VsdmVzLiBObyBpbmZvcm1hdGlvbiBhYm91dCBhZGRpdGlvbmFsIHJlbGF0ZWQgZW50aXRpZXMKKwkgKiBpcyBuZWNlc3NhcmlseSBsb2FkZWQuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gUmVsYXRlZCB7QGNvZGUgUmVjb3JkfXMgbWF5IGJlIG1lcmdlZCBhY2NvcmRpbmcgdG8gdGhlCisJICogY2FyZGluYWxpdHkgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbGF0aW9ufS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoCisJICogICAgICAgICAgICAgICAgICAgIHJlc3VsdC4KKwkgKiBAcGFyYW0gZW50aXR5Q2FzcyAgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlcyBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBhbGwge0Bjb2RlIEF0dHJpYnV0ZX1zCisJICogICAgICAgICAgICAgICAgICAgIG9mIGVhY2ggZ2l2ZW4ge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEByZXR1cm4gQWxsIG1hdGNoZWQgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiAgICAgIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBvciBhbmFseXppbmcgaXRzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdChDbGFzcykKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoQ2xhc3MpCisJICogQHNlZSAjZmV0Y2goQ2xhc3MsIExpc3QpCisJICogQHNlZSBSZWNvcmQjbWVyZ2UoUmVjb3JkKQorCSAqLworCWRlZmF1bHQgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gZmV0Y2hDb21wbGV0ZShDbGFzczxUPiBlbnRpdHlDYXNzLCBMaXN0PEVudGl0eVR5cGU+IGVudGl0eVR5cGVzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZmV0Y2hDb21wbGV0ZShlbnRpdHlDYXNzLCBlbnRpdHlUeXBlcywgRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgU2VhcmNoUXVlcnl9IHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9cworCSAqIGFuZCB7QGxpbmsgRmlsdGVyfS4gQm90aCBtdXN0IGJlIGZ1bGx5IHN1cHBvcnRlZCBieSB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fQorCSAqIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5fSB0eXBlLiBUaGlzIG1ldGhvZCBzZWxlY3RzIGFsbAorCSAqIHtAbGluayBBdHRyaWJ1dGV9cyBvZiBlYWNoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiAKKwkgKiBJdCBpcyBvbmx5IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBsb2FkcyB0aGUgc2VsZWN0ZWQgZW50aXRpZXMsIGFuZCB0aGVpcgorCSAqIHJlbGF0aW9ucyBhbW9uZyB0aGVtc2VsdmVzLiBObyBpbmZvcm1hdGlvbiBhYm91dCBhZGRpdGlvbmFsIHJlbGF0ZWQgZW50aXRpZXMKKwkgKiBpcyBuZWNlc3NhcmlseSBsb2FkZWQuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gUmVsYXRlZCB7QGNvZGUgUmVjb3JkfXMgbWF5IGJlIG1lcmdlZCBhY2NvcmRpbmcgdG8gdGhlCisJICogY2FyZGluYWxpdHkgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbGF0aW9ufS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoLgorCSAqICAgICAgICAgICAgICAgICAgICByZXN1bHQuCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0gaWRlbnRpZmllci4KKwkgKiBAcGFyYW0gZW50aXR5VHlwZXMgU2VsZWN0IHN0YXRlbWVudHMgd2lsbCBiZSBhZGRlZCBmb3IgYWxsIHtAY29kZSBBdHRyaWJ1dGV9cworCSAqICAgICAgICAgICAgICAgICAgICBvZiBlYWNoIGdpdmVuIHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQWxsIG1hdGNoZWQgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiAgICAgIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBvciBhbmFseXppbmcgaXRzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdChDbGFzcykKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoQ2xhc3MpCisJICogQHNlZSAjZmV0Y2goQ2xhc3MsIExpc3QsIEZpbHRlcikKKwkgKiBAc2VlIFJlY29yZCNtZXJnZShSZWNvcmQpCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gZmV0Y2hDb21wbGV0ZShDbGFzczxUPiBlbnRpdHlDbGFzcywgTGlzdDxFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcywgRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFNlYXJjaFF1ZXJ5fSBhbmQgcmV0dXJucyBhbGwgYXZhaWxhYmxlCisJICogaW5zdGFuY2VzIG9mIHRoZSBzcGVjaWZpZWQge0BsaW5rIEVudGl0eX0gdHlwZS4KKwkgKiAKKwkgKiBJdCBpcyBvbmx5IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG1ldGhvZCBsb2FkcyB0aGUgc2VsZWN0ZWQgZW50aXR5LCBubworCSAqIGluZm9ybWF0aW9uIGFib3V0IHJlbGF0ZWQgZW50aXRpZXMgaXMgbmVjZXNzYXJpbHkgbG9hZGVkLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFR5cGUgb2YgdGhlIGVudGl0aWVzIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGVhY2gKKwkgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHJldHVybiBBbGwgYXZhaWxhYmxlIGVudGl0aWVzIGFyZSByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBTZWFyY2hRdWVyeX0gb3IgYW5hbHl6aW5nIGl0cworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZmV0Y2goQ2xhc3MsIEZpbHRlcikKKwkgKi8KKwlkZWZhdWx0IDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoKENsYXNzPFQ+IGVudGl0eUNsYXNzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaChlbnRpdHlDbGFzcywgRmlsdGVyLmFuZCgpKTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgU2VhcmNoUXVlcnl9IHdpdGggZ2l2ZW4ge0BsaW5rIEZpbHRlcn0uIFRoZQorCSAqIHtAY29kZSBGaWx0ZXJ9IG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGFzc29jaWF0ZWQKKwkgKiB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuIEl0IGlzIG9ubHkgZ3VhcmFudGVlZCB0aGF0IHRoaXMgbWV0aG9kIGxvYWRzCisJICogdGhlIHNlbGVjdGVkIGVudGl0eSwgbm8gaW5mb3JtYXRpb24gYWJvdXQgcmVsYXRlZCBlbnRpdGllcyBpcyBuZWNlc3NhcmlseQorCSAqIGxvYWRlZC4KKwkgKiAKKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoCisJICogICAgICAgICAgICAgICAgICAgIHJlc3VsdC4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBmaWx0ZXIgICAgICBUaGUgY3JpdGVyaWEgc2VxdWVuY2UuCisJICogQHJldHVybiBBbGwgbWF0Y2hlZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgU2VhcmNoUXVlcnl9IG9yIGFuYWx5emluZyBpdHMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgUmVzdWx0fXMuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KENsYXNzKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcyhDbGFzcykKKwkgKiBAc2VlICNmZXRjaChDbGFzcykKKwkgKi8KKwlkZWZhdWx0IDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBmZXRjaChlbnRpdHlDbGFzcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIGZpbHRlcik7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFNlYXJjaFF1ZXJ5fSB3aXRoIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9cy4KKwkgKiBUaGUge0Bjb2RlIEF0dHJpYnV0ZX1zIG11c3QgYmUgZnVsbHkgc3VwcG9ydGVkIGJ5IHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9CisJICogYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBFbnRpdHl9IHR5cGUuIFRoaXMgbWV0aG9kIGFsbG93cyBmaW5lIGdyYWluZWQKKwkgKiB7QGxpbmsgUmVjb3JkfSBjb25maWd1cmF0aW9uLgorCSAqIAorCSAqIEl0IGlzIG9ubHkgZ3VhcmFudGVlZCB0aGF0IHRoaXMgbWV0aG9kIGxvYWRzIHRoZSBzZWxlY3RlZCBlbnRpdHkgb3IKKwkgKiBhdHRyaWJ1dGVzLCBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHJlbGF0ZWQgZW50aXRpZXMgaXMgbmVjZXNzYXJpbHkKKwkgKiBsb2FkZWQuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gUmVsYXRlZCB7QGNvZGUgUmVjb3JkfXMgbWF5IGJlIG1lcmdlZCBhY2NvcmRpbmcgdG8gdGhlCisJICogY2FyZGluYWxpdHkgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbGF0aW9ufS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBlbnRpdGllcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBlYWNoCisJICogICAgICAgICAgICAgICAgICAgIHJlc3VsdC4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVXNlZCBhcyB0aGUge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSBhdHRyaWJ1dGVzICBTZWxlY3Qgc3RhdGVtZW50cyB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIHtAY29kZQorCSAqIAkJQXR0cmlidXRlfSAuCisJICogQHJldHVybiBBbGwgbWF0Y2hlZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzIHdoaWxlIGV4ZWN1dGluZyB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgU2VhcmNoUXVlcnl9IG9yIGFuYWx5emluZyBpdHMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgUmVzdWx0fXMuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIHR5cGUgaXMgbm90IGFzc29jaWF0ZWQgd2l0aAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcHJlZGVmaW5lZCB7QGNvZGUgU2VhcmNoUXVlcnl9LgorCSAqIEBzZWUgI2xpc3RTZWFyY2hhYmxlVHlwZXMoKQorCSAqIEBzZWUgI2dldFNlYXJjaGFibGVSb290KENsYXNzKQorCSAqIEBzZWUgI2xpc3RFbnRpdHlUeXBlcyhDbGFzcykKKwkgKiBAc2VlICNmZXRjaENvbXBsZXRlKENsYXNzLCBMaXN0KQorCSAqIEBzZWUgUmVjb3JkI21lcmdlKFJlY29yZCkKKwkgKi8KKwlkZWZhdWx0IDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGZldGNoKGVudGl0eUNsYXNzLCBhdHRyaWJ1dGVzLCBGaWx0ZXIuYW5kKCkpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBhc3NvY2lhdGVkIHtAbGluayBTZWFyY2hRdWVyeX0gd2l0aCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfXMgYW5kCisJICoge0BsaW5rIEZpbHRlcn0uIEJvdGggbXVzdCBiZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0KKwkgKiBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4gVGhpcyBtZXRob2QgYWxsb3dzIGZpbmUgZ3JhaW5lZAorCSAqIHtAbGluayBSZWNvcmR9IGNvbmZpZ3VyYXRpb24uCisJICogCisJICogSXQgaXMgb25seSBndWFyYW50ZWVkIHRoYXQgdGhpcyBtZXRob2QgbG9hZHMgdGhlIHNlbGVjdGVkIGVudGl0eSBvcgorCSAqIGF0dHJpYnV0ZXMsIG5vIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgcmVsYXRlZCBlbnRpdGllcyBpcyBuZWNlc3NhcmlseQorCSAqIGxvYWRlZC4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5vdGU6PC9iPiBSZWxhdGVkIHtAY29kZSBSZWNvcmR9cyBtYXkgYmUgbWVyZ2VkIGFjY29yZGluZyB0byB0aGUKKwkgKiBjYXJkaW5hbGl0eSBvZiB0aGUgYXNzb2NpYXRlZCB7QGxpbmsgUmVsYXRpb259LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFR5cGUgb2YgdGhlIGVudGl0aWVzIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIGVhY2gKKwkgKiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgIFNlbGVjdCBzdGF0ZW1lbnRzIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2gge0Bjb2RlCisJICogCQlBdHRyaWJ1dGV9IC4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEByZXR1cm4gQWxsIG1hdGNoZWQgZW50aXRpZXMgYXJlIHJldHVybmVkIGluIGEge0Bjb2RlIExpc3R9LgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiAgICAgIFRocm93biBpbiBjYXNlIG9mIGVycm9ycyB3aGlsZSBleGVjdXRpbmcgdGhlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFNlYXJjaFF1ZXJ5fSBvciBhbmFseXppbmcgaXRzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiB0eXBlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGgKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHByZWRlZmluZWQge0Bjb2RlIFNlYXJjaFF1ZXJ5fS4KKwkgKiBAc2VlICNsaXN0U2VhcmNoYWJsZVR5cGVzKCkKKwkgKiBAc2VlICNnZXRTZWFyY2hhYmxlUm9vdChDbGFzcykKKwkgKiBAc2VlICNsaXN0RW50aXR5VHlwZXMoQ2xhc3MpCisJICogQHNlZSAjZmV0Y2hDb21wbGV0ZShDbGFzcywgTGlzdCwgRmlsdGVyKQorCSAqIEBzZWUgUmVjb3JkI21lcmdlKFJlY29yZCkKKwkgKi8KKwk8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBmZXRjaChDbGFzczxUPiBlbnRpdHlDbGFzcywgTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMsIEZpbHRlciBmaWx0ZXIpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoZSBhc3NvY2lhdGVkIHtAbGluayBTZWFyY2hRdWVyeX0gd2l0aCBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfXMgYW5kCisJICoge0BsaW5rIEZpbHRlcn0uIEJvdGggbXVzdCBiZSBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHtAY29kZSBTZWFyY2hRdWVyeX0KKwkgKiBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eX0gdHlwZS4gVGhpcyBtZXRob2QgYWxsb3dzIGZpbmUgZ3JhaW5lZAorCSAqIHtAbGluayBSZWNvcmR9IGNvbmZpZ3VyYXRpb24uIFRoaXMgbWV0aG9kIGFsbG93cyB0byBzcGVjaWZ5IGEgZnVsbHRleHQgc2VhcmNoCisJICogcXVlcnkgc3RyaW5nLgorCSAqIAorCSAqIEl0IGlzIG9ubHkgZ3VhcmFudGVlZCB0aGF0IHRoaXMgbWV0aG9kIGxvYWRzIHRoZSBzZWxlY3RlZCBlbnRpdHkgb3IKKwkgKiBhdHRyaWJ1dGVzLCBubyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHJlbGF0ZWQgZW50aXRpZXMgaXMgbmVjZXNzYXJpbHkKKwkgKiBsb2FkZWQuCisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gUmVsYXRlZCB7QGNvZGUgUmVjb3JkfXMgbWF5IGJlIG1lcmdlZCBhY2NvcmRpbmcgdG8gdGhlCisJICogY2FyZGluYWxpdHkgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIFJlbGF0aW9ufS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBVc2VkIGFzIHRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGlkZW50aWZpZXIuCisJICogQHBhcmFtIGF0dHJpYnV0ZXMgIFNlbGVjdCBzdGF0ZW1lbnRzIHdpbGwgYmUgYWRkZWQgZm9yIGVhY2gge0Bjb2RlCisJICogCQlBdHRyaWJ1dGV9IC4KKwkgKiBAcGFyYW0gZmlsdGVyICAgICAgVGhlIGNyaXRlcmlhIHNlcXVlbmNlLgorCSAqIEBwYXJhbSBxdWVyeSAgICAgICBUaGUgZnVsbHRleHQgc2VhcmNoIHF1ZXJ5CisJICogQHJldHVybiBBbGwge0BsaW5rIFJlc3VsdH1zIGZvdW5kIGJ5IHRoZSB7QGxpbmsgU2VhcmNoUXVlcnl9IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIHtAbGluayBBdHRyaWJ1dGV9cy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMgd2hpbGUgZXhlY3V0aW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBTZWFyY2hRdWVyeX0gb3IgYW5hbHl6aW5nIGl0cworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBSZXN1bHR9cy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gdHlwZSBpcyBub3QgYXNzb2NpYXRlZCB3aXRoCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVkZWZpbmVkIHtAY29kZSBTZWFyY2hRdWVyeX0uCisJICogQHNlZSAjbGlzdFNlYXJjaGFibGVUeXBlcygpCisJICogQHNlZSAjZ2V0U2VhcmNoYWJsZVJvb3QoQ2xhc3MpCisJICogQHNlZSAjbGlzdEVudGl0eVR5cGVzKENsYXNzKQorCSAqIEBzZWUgUmVjb3JkI21lcmdlKFJlY29yZCkKKwkgKi8KKwlkZWZhdWx0IExpc3Q8UmVzdWx0PiBmZXRjaFJlc3VsdHMoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzLCBGaWx0ZXIgZmlsdGVyLAorCQkJU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworCWRlZmF1bHQgYm9vbGVhbiBpc1RleHRTZWFyY2hBdmFpbGFibGUoKSB7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlkZWZhdWx0IDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdHJpbmcgcXVlcnkpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIChMaXN0PFQ+KSBmZXRjaChxdWVyeSkuZ2V0T3JEZWZhdWx0KGVudGl0eUNsYXNzLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisJfQorCisJZGVmYXVsdCBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gZmV0Y2goU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2Uvc2VhcmNoL1NlYXJjaGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODdjMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL3NlYXJjaC9TZWFyY2hhYmxlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CisKKy8qKgorICogQSBzZWFyY2hhYmxlIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGhpZXJhcmNoaWNhbCBvcmRlciBvZgorICoge0BsaW5rIEVudGl0eVR5cGV9cyBiZWluZyB1c2VkIGZvciBzZWFyY2hpbmcuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAYXV0aG9yIFNlYmFzdGlhbiBEaXJzY2gsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFNlYXJjaFNlcnZpY2UKKyAqIEBzZWUgU2VhcmNoUXVlcnkKKyAqLworcHVibGljIGludGVyZmFjZSBTZWFyY2hhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlbGF0ZWQgc2VhcmNoYWJsZXMuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBMaXN0fSBtYXkgYmUgaW1tdXRhYmxlLgorCSAqLworCUxpc3Q8U2VhcmNoYWJsZT4gZ2V0UmVsYXRlZFNlYXJjaGFibGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5VHlwZX0gcmVwcmVzZW50ZWQgYnkgdGhpcyBzZWFyY2hhYmxlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eVR5cGV9IHJlcHJlc2VudGVkIGJ5IHRoaXMgc2VhcmNoYWJsZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKTsKKworCS8qKgorCSAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgc2VhcmNoYWJsZSBkb2Vzbid0IGhhdmUgZnVydGhlciByZWxhdGVkCisJICogc2VhcmNoYWJsZXMuCisJICoKKwkgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBpbnN0YW5jZSBkb2VzIG5vdCByZWxhdGUgZnVydGhlciBzZWFyY2hhYmxlcy4KKwkgKi8KKwlkZWZhdWx0IGJvb2xlYW4gaXNMZWFmKCkgeworCQlyZXR1cm4gZ2V0UmVsYXRlZFNlYXJjaGFibGVzKCkuaXNFbXB0eSgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0F0dHJpYnV0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9BdHRyaWJ1dGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2I4NmM2ZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9BdHRyaWJ1dGVJbXBsLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworCitwdWJsaWMgY2xhc3MgQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIEF0dHJpYnV0ZSB7CisKKwlwdWJsaWMgZW51bSBUeXBlIHsKKwkJSUQsIFVOS05PV047CisJfQorCisJVHlwZSB0eXBlOworCisJcHVibGljIEF0dHJpYnV0ZUltcGwoVHlwZSB0eXBlKSB7CisJCXRoaXMudHlwZSA9IHR5cGU7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZSgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gdHlwZS5uYW1lKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRVbml0KCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVmFsdWVUeXBlIGdldFZhbHVlVHlwZSgpIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgSUQ6CisJCQlyZXR1cm4gVmFsdWVUeXBlLlNUUklORzsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudW1lcmF0aW9uPD8+IGdldEVudW1PYmooKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlRW50aXR5TWFuYWdlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9CYXNlRW50aXR5TWFuYWdlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWEyMjViCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0Jhc2VFbnRpdHlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55Q29sbGVjdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuZXE7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBCYXNlRW50aXR5TWFuYWdlclRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsb2FkU2hvdWxkUmV0dXJuRW50aXR5KCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlCYXNlRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyID0gbW9jayhCYXNlRW50aXR5TWFuYWdlci5jbGFzcyk7CisJCVRlc3RTdGVwIG1vY2tlZFRlc3RTdGVwID0gbW9jayhUZXN0U3RlcC5jbGFzcyk7CisKKwkJd2hlbihlbnRpdHlNYW5hZ2VyLmxvYWQoYW55KCksIGFueVN0cmluZygpKSkudGhlbkNhbGxSZWFsTWV0aG9kKCk7CisJCXdoZW4oZW50aXR5TWFuYWdlci5sb2FkKFRlc3RTdGVwLmNsYXNzLCBBcnJheXMuYXNMaXN0KCJpZDEiKSkpLnRoZW5SZXR1cm4oQXJyYXlzLmFzTGlzdChtb2NrZWRUZXN0U3RlcCkpOworCisJCWFzc2VydFRoYXQoZW50aXR5TWFuYWdlci5sb2FkKFRlc3RTdGVwLmNsYXNzLCAiaWQxIikpLmlzRXF1YWxUbyhtb2NrZWRUZXN0U3RlcCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBsb2FkTm90RXhpc3RpbmdJZFNob3VsZFRocm93RGF0YUFjY2Vzc0V4Y2VwdGlvbigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkJQmFzZUVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlciA9IG1vY2soQmFzZUVudGl0eU1hbmFnZXIuY2xhc3MpOworCisJCXdoZW4oZW50aXR5TWFuYWdlci5sb2FkKGFueSgpLCBhbnlTdHJpbmcoKSkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCQl3aGVuKGVudGl0eU1hbmFnZXIubG9hZChlcShUZXN0U3RlcC5jbGFzcyksIGFueUNvbGxlY3Rpb24oKSkpLnRoZW5SZXR1cm4oQ29sbGVjdGlvbnMuPFRlc3RTdGVwPmVtcHR5TGlzdCgpKTsKKworCQlhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gZW50aXR5TWFuYWdlci5sb2FkKFRlc3RTdGVwLmNsYXNzLCAieHl6IikpLmlzSW5zdGFuY2VPZihEYXRhQWNjZXNzRXhjZXB0aW9uLmNsYXNzKQorCQkJCS5oYXNNZXNzYWdlQ29udGFpbmluZygiRmFpbGVkIHRvIGxvYWQgZW50aXR5IGJ5IGluc3RhbmNlIElELiIpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbG9hZE5vdFVuaXF1ZUlkU2hvdWxkVGhyb3dEYXRhQWNjZXNzRXhjZXB0aW9uKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQlCYXNlRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyID0gbW9jayhCYXNlRW50aXR5TWFuYWdlci5jbGFzcyk7CisJCVRlc3RTdGVwIG1vY2tlZFRlc3RTdGVwMSA9IG1vY2soVGVzdFN0ZXAuY2xhc3MpOworCQlUZXN0U3RlcCBtb2NrZWRUZXN0U3RlcDIgPSBtb2NrKFRlc3RTdGVwLmNsYXNzKTsKKworCQl3aGVuKGVudGl0eU1hbmFnZXIubG9hZChhbnkoKSwgYW55U3RyaW5nKCkpKS50aGVuQ2FsbFJlYWxNZXRob2QoKTsKKwkJd2hlbihlbnRpdHlNYW5hZ2VyLmxvYWQoVGVzdFN0ZXAuY2xhc3MsIEFycmF5cy5hc0xpc3QoImlkMSIpKSkKKwkJCQkudGhlblJldHVybihBcnJheXMuYXNMaXN0KG1vY2tlZFRlc3RTdGVwMSwgbW9ja2VkVGVzdFN0ZXAyKSk7CisKKwkJYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGVudGl0eU1hbmFnZXIubG9hZChUZXN0U3RlcC5jbGFzcywgImlkMSIpKS5pc0luc3RhbmNlT2YoRGF0YUFjY2Vzc0V4Y2VwdGlvbi5jbGFzcykKKwkJCQkuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkZhaWxlZCB0byBsb2FkIGVudGl0eSBieSBpbnN0YW5jZSBJRC4iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQ29yZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9Db3JlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyYmQxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvQ29yZUltcGwuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNoaWxkcmVuU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiAKKyAqIFZlcnkgYmFzaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIENvcmUgY2xhc3MuIFRoZSBjb250ZW50cyBpcyBpbml0aWFsaXplZCB2aWEKKyAqIGEgZ2l2ZW4gbWFwIChpbnN0ZWFkIG9mIHVzaW5nIGEgZGF0YWJhc2Ugb3Igc29tZSBvdGhlciBtZXRob2QpCisgKiAKKyAqIEBhdXRob3IgRmxvcmlhbiBTY2htaXR0CisgKi8KK3B1YmxpYyBjbGFzcyBDb3JlSW1wbCBpbXBsZW1lbnRzIENvcmUgeworCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzOworCXByaXZhdGUgRW50aXR5U3RvcmUgbXV0YWJsZVN0b3JlOworCisJcHVibGljIENvcmVJbXBsKE1hcDxTdHJpbmcsIFZhbHVlPiB2YWx1ZXMpIHsKKwkJc3VwZXIoKTsKKwkJdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CisJCXRoaXMubXV0YWJsZVN0b3JlID0gbmV3IEVudGl0eVN0b3JlKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gIlVuaXRUZXN0U291cmNlIjsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgeworCQlyZXR1cm4gIlVuaXRUZXN0VHlwZSI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRJRCgpIHsKKwkJcmV0dXJuICI0NzExbCI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgc2V0SUQoU3RyaW5nIGluc3RhbmNlSUQpIHsKKworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBNYXA8U3RyaW5nLCBWYWx1ZT4gZ2V0VmFsdWVzKCkgeworCQlyZXR1cm4gdmFsdWVzOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGhpZGVWYWx1ZXMoQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzKSB7CisKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWFwPFN0cmluZywgVmFsdWU+IGdldEFsbFZhbHVlcygpIHsKKwkJcmV0dXJuIHZhbHVlczsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5U3RvcmUgZ2V0TXV0YWJsZVN0b3JlKCkgeworCQlyZXR1cm4gbXV0YWJsZVN0b3JlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlTdG9yZSBnZXRQZXJtYW5lbnRTdG9yZSgpIHsKKwkJcmV0dXJuIG5ldyBFbnRpdHlTdG9yZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBDaGlsZHJlblN0b3JlIGdldENoaWxkcmVuU3RvcmUoKSB7CisJCXJldHVybiBuZXcgQ2hpbGRyZW5TdG9yZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSZWxhdGlvblN0b3JlIGdldE50b01TdG9yZSgpIHsKKwkJcmV0dXJuIG5ldyBSZWxhdGlvblN0b3JlKCk7CisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0VudGl0eUZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvRW50aXR5RmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjZlYjA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0VudGl0eUZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vc2VyOworCisvKioKKyAqIAorICogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRW50aXR5RmFjdG9yeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gV2UKKyAqIGRlbGl2ZXIgYSBjb3JlIGNvbnRhaW5pbmcgZGF0YSBvbiBpbml0aWFsaXphdGlvbiB0byBzaW11bGF0ZSBvdGhlciBkYXRhCisgKiBzb3VyY2VzLgorICogCisgKiBAYXV0aG9yIEZsb3JpYW4gU2NobWl0dAorICoKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUZhY3RvcnlJbXBsIGV4dGVuZHMgQmFzZUVudGl0eUZhY3RvcnkgeworCisJcHJpdmF0ZSBDb3JlIGNvcmU7CisKKwlwdWJsaWMgRW50aXR5RmFjdG9yeUltcGwoQ29yZSBjb3JlKSB7CisJCXRoaXMuY29yZSA9IGNvcmU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIE9wdGlvbmFsPFVzZXI+IGdldExvZ2dlZEluVXNlcigpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUobnVsbCk7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW50aXR5PiBDb3JlIGNyZWF0ZUNvcmUoQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHsKKwkJcmV0dXJuIGNvcmU7CisJfQorCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIDxUIGV4dGVuZHMgRW50aXR5PiBDb3JlIGNyZWF0ZUNvcmUoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCXJldHVybiBjb3JlOworCX0KKworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKFN0cmluZyBuYW1lLCBDbGFzczxUPiBlbnRpdHlDbGFzcykgeworCQlyZXR1cm4gY29yZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0VudGl0eVR5cGVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvRW50aXR5VHlwZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTBlOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL0VudGl0eVR5cGVJbXBsLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkF0dHJpYnV0ZUltcGwuVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvblR5cGU7CisKK3B1YmxpYyBjbGFzcyBFbnRpdHlUeXBlSW1wbCBpbXBsZW1lbnRzIEVudGl0eVR5cGUgeworCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisJCXJldHVybiAiMCI7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQXR0cmlidXRlIGdldElEQXR0cmlidXRlKCkgeworCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZUltcGwoVHlwZS5JRCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFBhcmVudFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldENoaWxkUmVsYXRpb25zKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZWxhdGlvbj4gZ2V0SW5mb1JlbGF0aW9ucygpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFJlbGF0aW9ucyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKSB7CisJCXJldHVybiBudWxsOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBSZWxhdGlvbiBnZXRSZWxhdGlvbihFbnRpdHlUeXBlIHRhcmdldCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb24gZ2V0UmVsYXRpb24oRW50aXR5VHlwZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1JlbGF0aW9uSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL1JlbGF0aW9uSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFiNGE2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvUmVsYXRpb25JbXBsLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uVHlwZTsKKworcHVibGljIGNsYXNzIFJlbGF0aW9uSW1wbCBpbXBsZW1lbnRzIFJlbGF0aW9uIHsKKworCXB1YmxpYyBlbnVtIEF0dHJpYnV0ZVR5cGUgeworCQlJRCwgVU5LTk9XTjsKKwl9CisKKwlBdHRyaWJ1dGVUeXBlIHR5cGU7CisKKwlwdWJsaWMgUmVsYXRpb25JbXBsKEF0dHJpYnV0ZVR5cGUgdHlwZSkgeworCQl0aGlzLnR5cGUgPSB0eXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIHR5cGUubmFtZSgpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldFNvdXJjZSgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVR5cGUgZ2V0VGFyZ2V0KCkgeworCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb25UeXBlIGdldFJlbGF0aW9uVHlwZSgpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoKSB7CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIElEOgorCQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVJbXBsKEF0dHJpYnV0ZUltcGwuVHlwZS5JRCk7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzT3V0Z29pbmcoUmVsYXRpb25UeXBlIHJlbGF0aW9uVHlwZSkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0luY29taW5nKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTnRvTSgpIHsKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRDb21wb25lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlZTE0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0Q29tcG9uZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ2hpbGRyZW5TdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVN0b3JlOworCitwdWJsaWMgY2xhc3MgQ29udGV4dENvbXBvbmVudFRlc3QgeworCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldENvbnRleHRSb290KCkgeworCQlCYXNlRW50aXR5RmFjdG9yeSBmYWN0b3J5ID0gc3B5KEJhc2VFbnRpdHlGYWN0b3J5LmNsYXNzKTsKKwkJQ29yZSByb290Q29yZSA9IGNyZWF0ZUNvcmUoIlVOSVRVTkRFUlRFU1QiKTsKKwkJd2hlbihmYWN0b3J5LmNyZWF0ZUNvcmUoQ29udGV4dFJvb3QuY2xhc3MsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpKS50aGVuUmV0dXJuKHJvb3RDb3JlKTsKKwkJQ29yZSBjb21wb25lbnRDb3JlID0gY3JlYXRlQ29yZSgiIik7CisJCXdoZW4oZmFjdG9yeS5jcmVhdGVDb3JlKCJFbmdpbmUiLCBDb250ZXh0Q29tcG9uZW50LmNsYXNzKSkudGhlblJldHVybihjb21wb25lbnRDb3JlKTsKKworCQlDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA9IGZhY3RvcnkuY3JlYXRlQ29udGV4dFJvb3QoIkNhciIsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpOworCQlDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQgPSBmYWN0b3J5LmNyZWF0ZUNvbnRleHRDb21wb25lbnQoIkVuZ2luZSIsIGNvbnRleHRSb290KTsKKworCQlhc3NlcnRUaGF0KGNvbnRleHRDb21wb25lbnQuZ2V0Q29udGV4dFJvb3QoKSkuaXNFcXVhbFRvKGNvbnRleHRSb290KTsKKwl9CisKKwlwcml2YXRlIENvcmUgY3JlYXRlQ29yZShTdHJpbmcgdHlwZSkgeworCQlDb3JlIGNvcmUgPSBtb2NrKENvcmUuY2xhc3MpOworCisJCU1hcDxTdHJpbmcsIFZhbHVlPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCXZhbHVlcy5wdXQoIk5hbWUiLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiTmFtZSIpKTsKKwkJdmFsdWVzLnB1dCgiVmVyc2lvbiIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJWZXJzaW9uIikpOworCisJCXdoZW4oY29yZS5nZXRWYWx1ZXMoKSkudGhlblJldHVybih2YWx1ZXMpOworCQl3aGVuKGNvcmUuZ2V0VHlwZU5hbWUoKSkudGhlblJldHVybih0eXBlKTsKKwkJd2hlbihjb3JlLmdldFBlcm1hbmVudFN0b3JlKCkpLnRoZW5SZXR1cm4obmV3IEVudGl0eVN0b3JlKCkpOworCQl3aGVuKGNvcmUuZ2V0Q2hpbGRyZW5TdG9yZSgpKS50aGVuUmV0dXJuKG5ldyBDaGlsZHJlblN0b3JlKCkpOworCisJCXJldHVybiBjb3JlOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL0NvbnRleHRTZW5zb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljZTVmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Db250ZXh0U2Vuc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uc3B5OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ2hpbGRyZW5TdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVN0b3JlOworCitwdWJsaWMgY2xhc3MgQ29udGV4dFNlbnNvclRlc3QgeworCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldENvbnRleHRDb21wb25lbnQoKSB7CisJCUJhc2VFbnRpdHlGYWN0b3J5IGZhY3RvcnkgPSBzcHkoQmFzZUVudGl0eUZhY3RvcnkuY2xhc3MpOworCQlDb3JlIHJvb3RDb3JlID0gY3JlYXRlQ29yZSgiVEVTVEVRVUlQTUVOVCIpOworCQl3aGVuKGZhY3RvcnkuY3JlYXRlQ29yZShDb250ZXh0Um9vdC5jbGFzcywgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCkpLnRoZW5SZXR1cm4ocm9vdENvcmUpOworCQlDb3JlIGNvbXBvbmVudENvcmUgPSBjcmVhdGVDb3JlKCIiKTsKKwkJd2hlbihmYWN0b3J5LmNyZWF0ZUNvcmUoIlNlbnNvckRldmljZSIsIENvbnRleHRDb21wb25lbnQuY2xhc3MpKS50aGVuUmV0dXJuKGNvbXBvbmVudENvcmUpOworCQlDb3JlIHNlbnNvckNvcmUgPSBjcmVhdGVDb3JlKCIiKTsKKwkJd2hlbihmYWN0b3J5LmNyZWF0ZUNvcmUoIlNlbnNvciIsIENvbnRleHRTZW5zb3IuY2xhc3MpKS50aGVuUmV0dXJuKHNlbnNvckNvcmUpOworCisJCUNvbnRleHRSb290IGNvbnRleHRSb290ID0gZmFjdG9yeS5jcmVhdGVDb250ZXh0Um9vdCgiU2Vuc29yRGV2aWNlcyIsIENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpOworCQlDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQgPSBmYWN0b3J5LmNyZWF0ZUNvbnRleHRDb21wb25lbnQoIlNlbnNvckRldmljZSIsIGNvbnRleHRSb290KTsKKwkJQ29udGV4dFNlbnNvciBjb250ZXh0U2Vuc29yID0gZmFjdG9yeS5jcmVhdGVDb250ZXh0U2Vuc29yKCJTZW5zb3IiLCBjb250ZXh0Q29tcG9uZW50KTsKKworCQlhc3NlcnRUaGF0KGNvbnRleHRTZW5zb3IuZ2V0Q29udGV4dENvbXBvbmVudCgpKS5pc0VxdWFsVG8oY29udGV4dENvbXBvbmVudCk7CisJfQorCisJcHJpdmF0ZSBDb3JlIGNyZWF0ZUNvcmUoU3RyaW5nIHR5cGUpIHsKKwkJQ29yZSBjb3JlID0gbW9jayhDb3JlLmNsYXNzKTsKKworCQlNYXA8U3RyaW5nLCBWYWx1ZT4gdmFsdWVzID0gbmV3IEhhc2hNYXA8PigpOworCQl2YWx1ZXMucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiKSk7CisJCXZhbHVlcy5wdXQoIlZlcnNpb24iLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiVmVyc2lvbiIpKTsKKworCQl3aGVuKGNvcmUuZ2V0VmFsdWVzKCkpLnRoZW5SZXR1cm4odmFsdWVzKTsKKwkJd2hlbihjb3JlLmdldFR5cGVOYW1lKCkpLnRoZW5SZXR1cm4odHlwZSk7CisJCXdoZW4oY29yZS5nZXRQZXJtYW5lbnRTdG9yZSgpKS50aGVuUmV0dXJuKG5ldyBFbnRpdHlTdG9yZSgpKTsKKwkJd2hlbihjb3JlLmdldENoaWxkcmVuU3RvcmUoKSkudGhlblJldHVybihuZXcgQ2hpbGRyZW5TdG9yZSgpKTsKKworCQlyZXR1cm4gY29yZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTW9kZWxUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGIzM2JlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9tb2RlbC9Nb2RlbFRlc3QuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29yZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkVudGl0eUZhY3RvcnlJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLlVuaXRCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Xcml0ZVJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLldyaXRlUmVxdWVzdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVkVmFsdWVzLlZhbHVlSXRlcmF0b3I7CisKKy8qKgorICogCisgKiBzb21lIHVuaXQgdGVzdCB0byB0ZXN0IGZ1bmN0aW9uYWxpdHkgb2Ygb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLiBBdAorICogdGhpcyBwb2ludCwgcGxlYXNlIGRvbid0IGV4cGVjdCBhbnl0aGluZyBuZWFyIGNvbXBsZXRlIHRlc3QgY292ZXJhZ2UuCisgKiAKKyAqIEBhdXRob3IgRmxvcmlhbiBTY2htaXR0CisgKgorICovCitwdWJsaWMgY2xhc3MgTW9kZWxUZXN0IHsKKworCS8vIGNvbXBhcmUgZG91YmxlcyB1cCB0byB0aGlzIGFjY3VyYWN5CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVQU0lMT04gPSAwLjAwMDA1ZDsKKworCS8qKgorCSAqIGJhc2ljIHRlc3QgZm9yIHJlYWRpbmcgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLlRoZSBpbnRpYWxpemF0aW9uIHZpYSBtYXBzIGlzCisJICogbmVlZGVkIHRvIHNpbXVsYXRlIHRoZSBkYXRhIHN0b3JlLgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHBhcmFtZXRlclZhbHVlKCkgeworCQlNYXA8U3RyaW5nLCBWYWx1ZT4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCQltYXAucHV0KCJEYXRhVHlwZSIsIG5ldyBWYWx1ZShWYWx1ZVR5cGUuU1RSSU5HLCAiRGF0YVR5cGUiLCBudWxsLCB0cnVlLCBTY2FsYXJUeXBlLkZMT0FULCBTY2FsYXJUeXBlLmNsYXNzLAorCQkJCVNjYWxhclR5cGUuRkxPQVQsIEVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRSkpOworCQltYXAucHV0KCJWYWx1ZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJWYWx1ZSIsIG51bGwsIHRydWUsICI1LjciKSk7CisJCW1hcC5wdXQoIk5hbWUiLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiTmFtZSIsIG51bGwsIHRydWUsICJwYXJhbW5hbWUiKSk7CisJCUNvcmUgY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQlQYXJhbWV0ZXIgdHAgPSBuZXcgUGFyYW1ldGVyKGNvcmUpOworCQlWYWx1ZSB2diA9IHRwLmdldFZpcnR1YWxWYWx1ZSgpOworCQlGbG9hdCBleHRyYWN0ZWQgPSB2di5leHRyYWN0KCk7CisJCWFzc2VydEVxdWFscyg1LjdmLCBleHRyYWN0ZWQsIEVQU0lMT04pOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3QgZm9yIHJlYWRpbmcgbWVhc3VyZWQgZmxvYXQgdmFsdWVzCisJICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWVhc3VyZWRWYWx1ZUZsb2F0KCkgeworCQlGbG9hdFtdIHZhbHMgPSB7IDEuMGYsIDIuMGYsIDMuN2YsIDIuMWYgfTsKKwkJYm9vbGVhbltdIGZsYWdzID0geyB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSB9OworCQlNZWFzdXJlZFZhbHVlcyBtdiA9IG5ldyBNZWFzdXJlZFZhbHVlcyhTY2FsYXJUeXBlLkZMT0FULCAiVmFsdWUxIiwgImxpZ2h0eWVhcnMiLAorCQkJCVNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVQsIG5ldyBkb3VibGVbMF0sIGZhbHNlLCBBeGlzVHlwZS5ZX0FYSVMsIHZhbHMsIGZsYWdzKTsKKwkJVmFsdWVJdGVyYXRvcjxGbG9hdD4gdmFsdWVJdGVyYXRvciA9IG12Lml0ZXJhdG9yKCk7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKHZhbHVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlib29sZWFuIGlzQ3VycmVudFZhbGlkID0gdmFsdWVJdGVyYXRvci5pc1ZhbGlkKCk7CisJCQlGbG9hdCBjdXJyZW50VmFsdWUgPSB2YWx1ZUl0ZXJhdG9yLm5leHQoKTsKKwkJCWFzc2VydEVxdWFscyh2YWxzW2ldLCBjdXJyZW50VmFsdWUsIEVQU0lMT04pOworCQkJYXNzZXJ0RXF1YWxzKGZsYWdzW2ldLCBpc0N1cnJlbnRWYWxpZCk7CisJCQlpKys7CisJCX0KKwkJYXNzZXJ0RXF1YWxzKGksIHZhbHMubGVuZ3RoKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0IGZvciByZWFkaW5nIG1lYXN1cmVkIGRvdWJsZSB2YWx1ZXMKKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBtZWFzdXJlZFZhbHVlRG91YmxlKCkgeworCQlEb3VibGVbXSB2YWxzID0geyAxLjBkLCAyLjBkLCAzLjdkLCAyLjFkIH07CisJCWJvb2xlYW5bXSBmbGFncyA9IHsgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUgfTsKKwkJTWVhc3VyZWRWYWx1ZXMgbXYgPSBuZXcgTWVhc3VyZWRWYWx1ZXMoU2NhbGFyVHlwZS5ET1VCTEUsICJWYWx1ZTEiLCAibGlnaHR5ZWFycyIsCisJCQkJU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVCwgbmV3IGRvdWJsZVswXSwgZmFsc2UsIEF4aXNUeXBlLllfQVhJUywgdmFscywgZmxhZ3MpOworCQlWYWx1ZUl0ZXJhdG9yPERvdWJsZT4gdmFsdWVJdGVyYXRvciA9IG12Lml0ZXJhdG9yKCk7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKHZhbHVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlib29sZWFuIGlzQ3VycmVudFZhbGlkID0gdmFsdWVJdGVyYXRvci5pc1ZhbGlkKCk7CisJCQlEb3VibGUgY3VycmVudFZhbHVlID0gdmFsdWVJdGVyYXRvci5uZXh0KCk7CisJCQlhc3NlcnRFcXVhbHModmFsc1tpXSwgY3VycmVudFZhbHVlLCBFUFNJTE9OKTsKKwkJCWFzc2VydEVxdWFscyhmbGFnc1tpXSwgaXNDdXJyZW50VmFsaWQpOworCQkJaSsrOworCQl9CisJCWFzc2VydEVxdWFscyhpLCB2YWxzLmxlbmd0aCk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdCBmb3IgcmVhZGluZyBtZWFzdXJlZCBzdHJpbmcgdmFsdWVzCisJICovCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgbWVhc3VyZWRWYWx1ZVN0cmluZygpIHsKKwkJU3RyaW5nW10gdmFscyA9IHsgInN0cjEiLCAic3RyMiIsICJzdHIzIiwgInN0cjQiIH07CisJCWJvb2xlYW5bXSBmbGFncyA9IHsgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUgfTsKKwkJTWVhc3VyZWRWYWx1ZXMgbXYgPSBuZXcgTWVhc3VyZWRWYWx1ZXMoU2NhbGFyVHlwZS5TVFJJTkcsICJWYWx1ZTEiLCAibGlnaHR5ZWFycyIsCisJCQkJU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVCwgbmV3IGRvdWJsZVswXSwgZmFsc2UsIEF4aXNUeXBlLllfQVhJUywgdmFscywgZmxhZ3MpOworCQlWYWx1ZUl0ZXJhdG9yPFN0cmluZz4gdmFsdWVJdGVyYXRvciA9IG12Lml0ZXJhdG9yKCk7CisJCWludCBpID0gMDsKKwkJd2hpbGUgKHZhbHVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlib29sZWFuIGlzQ3VycmVudFZhbGlkID0gdmFsdWVJdGVyYXRvci5pc1ZhbGlkKCk7CisJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gdmFsdWVJdGVyYXRvci5uZXh0KCk7CisJCQlhc3NlcnRFcXVhbHModmFsc1tpXSwgY3VycmVudFZhbHVlKTsKKwkJCWFzc2VydEVxdWFscyhmbGFnc1tpXSwgaXNDdXJyZW50VmFsaWQpOworCQkJaSsrOworCQl9CisJCWFzc2VydEVxdWFscyhpLCB2YWxzLmxlbmd0aCk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdCBmb3IgcmVhZGluZyBhdHRyaWJ1dGVzIG9mIHRoZSBjaGFubmVsLlRoZSBpbnRpYWxpemF0aW9uIHZpYSBtYXBzCisJICogaXMgbmVlZGVkIHRvIHNpbXVsYXRlIHRoZSBkYXRhIHN0b3JlLgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGdldENoYW5uZWxBdHRycygpIHsKKwkJTWFwPFN0cmluZywgVmFsdWU+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsdWU+KCk7CisJCWZsb2F0IG1pbl9zcmMgPSA1LjdmOworCQlmbG9hdCBtYXhfc3JjID0gMTAuMjNmOworCQltYXAucHV0KCJNaW5pbXVtIiwgVmFsdWVUeXBlLkRPVUJMRS5jcmVhdGUoIk1pbmltdW0iLCAibS9zIiwgdHJ1ZSwgbmV3IERvdWJsZShtaW5fc3JjKSkpOworCQltYXAucHV0KCJNYXhpbXVtIiwgVmFsdWVUeXBlLkRPVUJMRS5jcmVhdGUoIk1heGltdW0iLCAibS9zIiwgdHJ1ZSwgbmV3IERvdWJsZShtYXhfc3JjKSkpOworCQlDb3JlIGNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJQ2hhbm5lbCBjaCA9IG5ldyBDaGFubmVsKGNvcmUpOworCQlEb3VibGUgbWluID0gY2guZ2V0TWluaW11bSgpOworCQlEb3VibGUgbWF4ID0gY2guZ2V0TWF4aW11bSgpOworCQlhc3NlcnRFcXVhbHMobWluLCBtaW5fc3JjLCBFUFNJTE9OKTsKKwkJYXNzZXJ0RXF1YWxzKG1heCwgbWF4X3NyYywgRVBTSUxPTik7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdCB0byByZWFkIHRoZSBkZWZhdWx0IHNjYWxhciB0eXBlIG9mIGEgcXVhbnRpdHkuIFRoZSBpbnRpYWxpemF0aW9uCisJICogdmlhIG1hcHMgaXMgbmVlZGVkIHRvIHNpbXVsYXRlIHRoZSBkYXRhIHN0b3JlLgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGdldFF1YW50aXR5KCkgeworCQlNYXA8U3RyaW5nLCBWYWx1ZT4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiRGVmRGF0YVR5cGUiLCBuZXcgVmFsdWUoVmFsdWVUeXBlLkVOVU1FUkFUSU9OLCAibmFtZSIsICJ1bml0IiwgdHJ1ZSwgU2NhbGFyVHlwZS5GTE9BVCwKKwkJCQlTY2FsYXJUeXBlLmNsYXNzLCBTY2FsYXJUeXBlLkZMT0FULCBFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUpKTsKKwkJQ29yZSBjb3JlID0gbmV3IENvcmVJbXBsKG1hcCk7CisJCVF1YW50aXR5IHF1YW50aXR5ID0gbmV3IFF1YW50aXR5KGNvcmUpOworCQlTY2FsYXJUeXBlIGRlZmF1bHRTY2FsYXJUeXBlID0gcXVhbnRpdHkuZ2V0RGVmYXVsdFNjYWxhclR5cGUoKTsKKwkJYXNzZXJ0VHJ1ZShkZWZhdWx0U2NhbGFyVHlwZS5pc0Zsb2F0KCkpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3QgZm9yIGJ1aWxkaW5nIGEgd3JpdGUgcmVxdWVzdAorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHdyaXRlUmVxdWVzdCgpIHsKKwkJQXhpc1R5cGUgYXhpc1R5cGUgPSBBeGlzVHlwZS5YX0FYSVM7CisJCUNvcmUgY29yZSA9IG5ldyBDb3JlSW1wbChuZXcgSGFzaE1hcDw+KCkpOworCQlDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwID0gbmV3IENoYW5uZWxHcm91cChjb3JlKTsKKwkJQ2hhbm5lbCBjaGFubmVsID0gbmV3IENoYW5uZWwoY29yZSk7CisJCVdyaXRlUmVxdWVzdEJ1aWxkZXIgd3JiID0gV3JpdGVSZXF1ZXN0LmNyZWF0ZShjaGFubmVsR3JvdXAsIGNoYW5uZWwsIGF4aXNUeXBlKTsKKwkJVW5pdEJ1aWxkZXIgdWIgPSB3cmIuaW1wbGljaXRDb25zdGFudChTY2FsYXJUeXBlLkRPVUJMRSwgMC43ZCk7CisJCVdyaXRlUmVxdWVzdCB3ciA9IHViLmJ1aWxkKCk7CisJCVNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbiA9IHdyLmdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKTsKKwkJYXNzZXJ0VHJ1ZShzZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmlzQ29uc3RhbnQoKSk7CisJCWFzc2VydEVxdWFscyhBeGlzVHlwZS5YX0FYSVMsIHdyLmdldEF4aXNUeXBlKCkpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3QgZm9yIGdldHRpbmcgYSBtZWFzdXJlbWVudCBjaGFubmVsIGFuZCBhbGwgbmVjZXNzYXJ5IHJlbGF0ZWQKKwkgKiBvYmplY3RzIChtZWFzdXJtZW50LCBhbmQgc28gb24pIHZpYSBmYWN0b3J5IG1ldGhvZHMuIFRoZSBpbnRpYWxpemF0aW9uIHZpYQorCSAqIG1hcHMgaXMgbmVlZGVkIHRvIHNpbXVsYXRlIHRoZSBkYXRhIHN0b3JlLgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGVudGl0eUZhY3RvcnkoKSB7CisJCU1hcDxTdHJpbmcsIFZhbHVlPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCAicGRuYW1lYWJjIikpOworCQltYXAucHV0KCJMZW5ndGgiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDEzKSk7CisJCW1hcC5wdXQoIk1hc3MiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDApKTsKKwkJbWFwLnB1dCgiVGltZSIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMCkpOworCQltYXAucHV0KCJUZW1wZXJhdHVyZSIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMCkpOworCQltYXAucHV0KCJDdXJyZW50IiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJMZW5ndGgiLCBudWxsLCB0cnVlLCAwKSk7CisJCW1hcC5wdXQoIk1vbGFyQW1vdW50IiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJMZW5ndGgiLCBudWxsLCB0cnVlLCAwKSk7CisJCW1hcC5wdXQoIkx1bWlub3VzSW50ZW5zaXR5IiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJMZW5ndGgiLCBudWxsLCB0cnVlLCAwKSk7CisJCS8vIFRPRE8gKEZsb3JpYW4gU2NobWl0dCk6IGNoZWNrIGlmIGFuZ2xlIGluIGxvd2VyIGNhc2UgaXMgY29ycmVjdAorCQltYXAucHV0KCJhbmdsZSIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMCkpOworCQlDb3JlIGNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJRW50aXR5RmFjdG9yeUltcGwgZWYgPSBuZXcgRW50aXR5RmFjdG9yeUltcGwoY29yZSk7CisJCVBoeXNpY2FsRGltZW5zaW9uIHBoeXNpY2FsRGltZW5zaW9uID0gZWYuY3JlYXRlUGh5c2ljYWxEaW1lbnNpb24oInBoeXNkaW0iKTsKKworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQltYXAucHV0KCJPZmZzZXQiLCBWYWx1ZVR5cGUuRE9VQkxFLmNyZWF0ZSgiTGVuZ3RoIiwgbnVsbCwgdHJ1ZSwgMGQpKTsKKwkJbWFwLnB1dCgiRmFjdG9yIiwgVmFsdWVUeXBlLkRPVUJMRS5jcmVhdGUoIkxlbmd0aCIsIG51bGwsIHRydWUsIDBkKSk7CisJCW1hcC5wdXQoIk5hbWUiLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiTmFtZSIsIG51bGwsIHRydWUsICJ1bml0bmFtZSIpKTsKKwkJY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQllZiA9IG5ldyBFbnRpdHlGYWN0b3J5SW1wbChjb3JlKTsKKwkJVW5pdCB1bml0ID0gZWYuY3JlYXRlVW5pdCgidW5pdCIsIHBoeXNpY2FsRGltZW5zaW9uKTsKKworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCAicXVhbnRuYW1lIikpOworCQltYXAucHV0KCJWZXJzaW9uIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIlZlcnNpb24iLCBudWxsLCB0cnVlLCAiNDcxMSIpKTsKKwkJbWFwLnB1dCgiRGF0ZUNyZWF0ZWQiLCBWYWx1ZVR5cGUuREFURS5jcmVhdGUoIkRhdGVDcmVhdGVkIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQltYXAucHV0KCJEZWZhdWx0UmFuayIsIFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiRGVmYXVsdFJhbmsiLCBudWxsLCB0cnVlLCA1KSk7CisJCW1hcC5wdXQoIkRlZkRpbWVuc2lvbiIsIFZhbHVlVHlwZS5JTlRFR0VSX1NFUVVFTkNFLmNyZWF0ZSgiRGVmRGltZW5zaW9uIiwgbnVsbCwgdHJ1ZSwgbmV3IGludFtdIHsgNSB9KSk7CisJCW1hcC5wdXQoIkRlZlR5cGVTaXplIiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJEZWZUeXBlU2l6ZSIsIG51bGwsIHRydWUsIDgpKTsKKwkJbWFwLnB1dCgiRGVmTVFOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIkRlZk1RTmFtZSIsIG51bGwsIHRydWUsICJtcW5hbWUiKSk7CisJCW1hcC5wdXQoIkRlZkRhdGFUeXBlIiwgbmV3IFZhbHVlKFZhbHVlVHlwZS5FTlVNRVJBVElPTiwgIkRlZkRhdGFUeXBlIiwgIiIsIHRydWUsIFNjYWxhclR5cGUuRE9VQkxFLAorCQkJCVNjYWxhclR5cGUuY2xhc3MsIFNjYWxhclR5cGUuRE9VQkxFLCBFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUpKTsKKwkJbWFwLnB1dCgiVmFsaWRGbGFnIiwgbmV3IFZhbHVlKFZhbHVlVHlwZS5FTlVNRVJBVElPTiwgIlZhbGlkRmxhZyIsICIiLCBmYWxzZSwgVmVyc2lvblN0YXRlLkFSQ0hJVkVELAorCQkJCVZlcnNpb25TdGF0ZS5jbGFzcywgbnVsbCwgRW51bVJlZ2lzdHJ5LlZFUlNJT05fU1RBVEUpKTsKKwkJbWFwLnB1dCgiRGVzY3JpcHRpb24iLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiRGVzY3JpcHRpb24iLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCWNvcmUgPSBuZXcgQ29yZUltcGwobWFwKTsKKwkJZWYgPSBuZXcgRW50aXR5RmFjdG9yeUltcGwoY29yZSk7CisJCVF1YW50aXR5IHF1YW50aXR5ID0gZWYuY3JlYXRlUXVhbnRpdHkoInF1YW50aXR5IiwgdW5pdCk7CisJCS8vIE5vdGUgdGhhdCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGluIGNyZWF0ZVF1YW50aXR5IGFuZCB0aHVzIHNob3VsZAorCQkvLyBkaWZmZXIgZnJvbSBhYm92ZS4KKwkJYXNzZXJ0RXF1YWxzKFNjYWxhclR5cGUuRkxPQVQsIHF1YW50aXR5LmdldERlZmF1bHRTY2FsYXJUeXBlKCkpOworCQlhc3NlcnRFcXVhbHMoKEludGVnZXIpIDEsIHF1YW50aXR5LmdldERlZmF1bHRSYW5rKCkpOworCQlhc3NlcnRFcXVhbHMoInF1YW50aXR5IiwgcXVhbnRpdHkuZ2V0TmFtZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHVuaXQsIHF1YW50aXR5LmdldERlZmF1bHRVbml0KCkpOworCisJCW1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsdWU+KCk7CisJCW1hcC5wdXQoIk5hbWUiLCBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZSgiTmFtZSIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiRGF0ZUNyZWF0ZWQiLCBWYWx1ZVR5cGUuREFURS5jcmVhdGUoIkRhdGVDcmVhdGVkIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQljb3JlID0gbmV3IENvcmVJbXBsKG1hcCk7CisJCWVmID0gbmV3IEVudGl0eUZhY3RvcnlJbXBsKGNvcmUpOworCQlUZXN0IHRlc3QgPSBlZi5jcmVhdGVUZXN0KCJteXRlc3QiKTsKKworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCW1hcC5wdXQoIkRhdGVDcmVhdGVkIiwgVmFsdWVUeXBlLkRBVEUuY3JlYXRlKCJEYXRlQ3JlYXRlZCIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiT3B0aW9uYWwiLCBWYWx1ZVR5cGUuQk9PTEVBTi5jcmVhdGUoIk9wdGlvbmFsIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQltYXAucHV0KCJTb3J0aW5kZXgiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIlNvcnRpbmRleCIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQllZiA9IG5ldyBFbnRpdHlGYWN0b3J5SW1wbChjb3JlKTsKKwkJVGVzdFN0ZXAgdGVzdFN0ZXAgPSBlZi5jcmVhdGVUZXN0U3RlcCgidGVzdHN0ZXAiLCB0ZXN0KTsKKworCQltYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZhbHVlPigpOworCQltYXAucHV0KCJOYW1lIiwgVmFsdWVUeXBlLlNUUklORy5jcmVhdGUoIk5hbWUiLCBudWxsLCB0cnVlLCBudWxsKSk7CisJCW1hcC5wdXQoIkRhdGVDcmVhdGVkIiwgVmFsdWVUeXBlLkRBVEUuY3JlYXRlKCJEYXRlQ3JlYXRlZCIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJY29yZSA9IG5ldyBDb3JlSW1wbChtYXApOworCQllZiA9IG5ldyBFbnRpdHlGYWN0b3J5SW1wbChjb3JlKTsKKwkJTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQgPSBlZi5jcmVhdGVNZWFzdXJlbWVudCgibWVhc3VyZW1lbnQiLCB0ZXN0U3RlcCk7CisKKwkJbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZT4oKTsKKwkJbWFwLnB1dCgiTmFtZSIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQltYXAucHV0KCJEZXNjcmlwdGlvbiIsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJEZXNjcmlwdGlvbiIsIG51bGwsIHRydWUsIG51bGwpKTsKKwkJbWFwLnB1dCgiSW50ZXJwb2xhdGlvbiIsIG5ldyBWYWx1ZShWYWx1ZVR5cGUuRU5VTUVSQVRJT04sICJJbnRlcnBvbGF0aW9uIiwgIiIsIHRydWUsIG51bGwsIEludGVycG9sYXRpb24uY2xhc3MsCisJCQkJbnVsbCwgRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKSk7CisJCW1hcC5wdXQoIkRhdGFUeXBlIiwgbmV3IFZhbHVlKFZhbHVlVHlwZS5FTlVNRVJBVElPTiwgIkRhdGFUeXBlIiwgIiIsIHRydWUsIG51bGwsIFNjYWxhclR5cGUuY2xhc3MsIG51bGwsCisJCQkJRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKSk7CisKKwkJbWFwLnB1dCgiVHlwZVNpemUiLCBWYWx1ZVR5cGUuSU5URUdFUi5jcmVhdGUoIlR5cGVTaXplIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQltYXAucHV0KCJSYW5rIiwgVmFsdWVUeXBlLklOVEVHRVIuY3JlYXRlKCJSYW5rIiwgbnVsbCwgdHJ1ZSwgbnVsbCkpOworCQljb3JlID0gbmV3IENvcmVJbXBsKG1hcCk7CisJCWVmID0gbmV3IEVudGl0eUZhY3RvcnlJbXBsKGNvcmUpOworCQlDaGFubmVsIGNoYW5uZWwgPSBlZi5jcmVhdGVDaGFubmVsKCJjaGFubmVsIiwgbWVhc3VyZW1lbnQsIHF1YW50aXR5KTsKKwkJYXNzZXJ0RXF1YWxzKEludGVycG9sYXRpb24uTk9ORSwgY2hhbm5lbC5nZXRJbnRlcnBvbGF0aW9uKCkpOworCX0KKworCS8qKgorCSAqIGJhc2ljIHRlc3Qgb2Ygc29tZSBWYWx1VHlwZSBtZXRob2RzLgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHZhbHVlVHlwZSgpIHsKKwkJRW51bVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7CisJCWFzc2VydEVxdWFscyhWYWx1ZVR5cGUuU0hPUlRfU0VRVUVOQ0UudG9TaW5nbGVUeXBlKCksIFZhbHVlVHlwZS5TSE9SVCk7CisJCWFzc2VydEVxdWFscyhWYWx1ZVR5cGUuREFURS50b1NlcXVlbmNlVHlwZSgpLCBWYWx1ZVR5cGUuREFURV9TRVFVRU5DRSk7CisJCWFzc2VydEVxdWFscyhWYWx1ZVR5cGUuRU5VTUVSQVRJT05fU0VRVUVOQ0UudG9TaW5nbGVUeXBlKCksIFZhbHVlVHlwZS5FTlVNRVJBVElPTik7CisJCWFzc2VydEVxdWFscyhWYWx1ZVR5cGUuRU5VTUVSQVRJT04udG9TaW5nbGVUeXBlKCksIFZhbHVlVHlwZS5FTlVNRVJBVElPTik7CisJCWFzc2VydEVxdWFscyhWYWx1ZVR5cGUuRU5VTUVSQVRJT04sIFZhbHVlVHlwZS5FTlVNRVJBVElPTi52YWx1ZU9mKFZhbHVlVHlwZS5FTlVNRVJBVElPTi50b1NpbmdsZVR5cGUoKS5uYW1lKCkpKTsKKwkJYXNzZXJ0RXF1YWxzKEZsb2F0LmNsYXNzLCBWYWx1ZVR5cGUuRkxPQVQuZ2V0VmFsdWVDbGFzcygpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIFZhbHVlVHlwZS5ET1VCTEUuaXNBbnlGbG9hdFR5cGUoKSk7CisJCWFzc2VydEVxdWFscyh0cnVlLCBWYWx1ZVR5cGUuRE9VQkxFLmlzRG91YmxlKCkpOworCQlhc3NlcnRFcXVhbHMoZmFsc2UsIFZhbHVlVHlwZS5ET1VCTEUuaXNGbG9hdCgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIFZhbHVlVHlwZS5GTE9BVC5pc0FueUZsb2F0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBWYWx1ZVR5cGUuSU5URUdFUi5pc0FueUZsb2F0VHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIFZhbHVlVHlwZS5JTlRFR0VSLmlzSW50ZWdlcigpKTsKKwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBWYWx1ZVR5cGUuRkxPQVQuaXNJbnRlZ2VyKCkpOworCQlhc3NlcnRFcXVhbHModHJ1ZSwgVmFsdWVUeXBlLkZMT0FULmlzRmxvYXQoKSk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdHMgb2Ygc29tZSBTY2FsYXJUeXBlIG1ldGhvZHMKKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBzY2FsYXJUeXBlKCkgeworCQlhc3NlcnRFcXVhbHMoVmFsdWVUeXBlLkJZVEVfU0VRVUVOQ0UsIFNjYWxhclR5cGUuQllURS50b1ZhbHVlVHlwZSgpKTsKKwkJYXNzZXJ0RXF1YWxzKHRydWUsIFNjYWxhclR5cGUuTE9ORy5pc0xvbmcoKSk7CisJCWFzc2VydEVxdWFscyhmYWxzZSwgU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWC5pc0xvbmcoKSk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdCBvZiBzb21lIFNlcXVlbmNlUmVwcmVzdGVudGFpb24gbWV0aG9kcworCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSB7CisJCWFzc2VydE5vdEVxdWFscyhTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lULCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLklNUExJQ0lUX0NPTlNUQU5UKTsKKwkJYXNzZXJ0VHJ1ZShTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lULmlzRXhwbGljaXQoKSk7CisJCWFzc2VydFRydWUoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVF9FWFRFUk5BTC5pc0V4cGxpY2l0KCkpOworCQlhc3NlcnRUcnVlKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVRfRVhURVJOQUwuaXNFeHRlcm5hbCgpKTsKKwkJYXNzZXJ0RmFsc2UoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVF9FWFRFUk5BTC5pc0ltcGxpY2l0KCkpOworCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVC5vcmRpbmFsKCksIChJbnRlZ2VyKSAwKTsKKwkJYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSA1LCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19QT0xZTk9NSUFMLm9yZGluYWwoKSk7CisJCWFzc2VydEVxdWFscygoSW50ZWdlcikgNywgU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVF9FWFRFUk5BTC5vcmRpbmFsKCkpOworCQlhc3NlcnRFcXVhbHMoKEludGVnZXIpIDksIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX1BPTFlOT01JQUxfRVhURVJOQUwub3JkaW5hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSAxMCwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSX0NBTElCUkFURUQub3JkaW5hbCgpKTsKKwkJYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSAxMSwgU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUwub3JkaW5hbCgpKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0cyBvZiBUeXBlU3BlY2lmaWNhdGlvbgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHR5cGVTcGVjaWZpY2F0aW9uKCkgeworCQlhc3NlcnROb3RFcXVhbHMoVHlwZVNwZWNpZmljYXRpb24uQklUX0lOVEVHRVIsIFR5cGVTcGVjaWZpY2F0aW9uLkJJVF9GTE9BVF9CRU8pOworCQlhc3NlcnRFcXVhbHMoVHlwZVNwZWNpZmljYXRpb24uQk9PTEVBTiwgVHlwZVNwZWNpZmljYXRpb24uQk9PTEVBTik7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdHMgb2YgQXhpc1R6cGUgbWV0aG9kcworCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGF4aXNUeXBlKCkgeworCQlhc3NlcnRUcnVlKEF4aXNUeXBlLlhfQVhJUy5pc1hBeGlzKCkpOworCQlhc3NlcnRUcnVlKEF4aXNUeXBlLllfQVhJUy5pc1lBeGlzKCkpOworCQlhc3NlcnRUcnVlKEF4aXNUeXBlLlhZX0FYSVMuaXNYWUF4aXMoKSk7CisJCWFzc2VydEZhbHNlKEF4aXNUeXBlLlhfQVhJUy5pc1lBeGlzKCkpOworCQlhc3NlcnRGYWxzZShBeGlzVHlwZS5ZX0FYSVMuaXNYWUF4aXMoKSk7CisJCWFzc2VydEZhbHNlKEF4aXNUeXBlLlhZX0FYSVMuaXNYQXhpcygpKTsKKwl9CisKKwkvKioKKwkgKiBiYXNpYyB0ZXN0cyBvZiBWZXJzaW9uU3RhdGUgZW51bWVyYXRpb24KKwkgKi8KKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB2ZXJzaW9uU3RhdGUoKSB7CisJCWFzc2VydEZhbHNlKFZlcnNpb25TdGF0ZS5BUkNISVZFRC5pc0VkaXRhYmxlKCkpOworCQlhc3NlcnRUcnVlKFZlcnNpb25TdGF0ZS5BUkNISVZFRC5pc0FyY2hpdmVkKCkpOworCQlhc3NlcnRGYWxzZShWZXJzaW9uU3RhdGUuQVJDSElWRUQuaXNWYWxpZCgpKTsKKwkJYXNzZXJ0VHJ1ZShWZXJzaW9uU3RhdGUuRURJVEFCTEUuaXNFZGl0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoVmVyc2lvblN0YXRlLkVESVRBQkxFLmlzQXJjaGl2ZWQoKSk7CisJCWFzc2VydEZhbHNlKFZlcnNpb25TdGF0ZS5FRElUQUJMRS5pc1ZhbGlkKCkpOworCQlhc3NlcnRGYWxzZShWZXJzaW9uU3RhdGUuVkFMSUQuaXNFZGl0YWJsZSgpKTsKKwkJYXNzZXJ0RmFsc2UoVmVyc2lvblN0YXRlLlZBTElELmlzQXJjaGl2ZWQoKSk7CisJCWFzc2VydFRydWUoVmVyc2lvblN0YXRlLlZBTElELmlzVmFsaWQoKSk7CisJfQorCisJLyoqCisJICogYmFzaWMgdGVzdHMgb2YgaW50ZXJwb2xhdGlvbiBlbnVtZXJhdGlvbgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGludGVycG9sYXRpb24oKSB7CisJCWFzc2VydFRydWUoSW50ZXJwb2xhdGlvbi5MSU5FQVIuaXNMaW5lYXIoKSk7CisJCWFzc2VydEZhbHNlKEludGVycG9sYXRpb24uTk9ORS5pc1NwZWNpZmljKCkpOworCQlhc3NlcnRFcXVhbHMoSW50ZXJwb2xhdGlvbi5OT05FLm9yZGluYWwoKSwgKEludGVnZXIpIDApOworCQlhc3NlcnRFcXVhbHMoSW50ZXJwb2xhdGlvbi5MSU5FQVIub3JkaW5hbCgpLCAoSW50ZWdlcikgMSk7CisJCWFzc2VydEVxdWFscyhJbnRlcnBvbGF0aW9uLlNQRUNJRklDLm9yZGluYWwoKSwgKEludGVnZXIpIDIpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGVudW1SZWdpc3RyeSgpIHsKKwkJRW51bVJlZ2lzdHJ5IGVyID0gRW51bVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7CisJCWFzc2VydFRydWUoZXIuZ2V0KCJJbnRlcnBvbGF0aW9uIikgIT0gbnVsbCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvbW9kZWwvVmFsdWVUeXBlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI5MTRlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9iYXNlL21vZGVsL1ZhbHVlVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKK3B1YmxpYyBjbGFzcyBWYWx1ZVR5cGVUZXN0IHsKKworCUBCZWZvcmUKKwlwdWJsaWMgdm9pZCBpbml0KCkgeworCQlFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdFN0cmluZ0Zyb21Vbmtub3duKCkgeworCQlWYWx1ZSB2ID0gVmFsdWVUeXBlLlVOS05PV04uY3JlYXRlKCJOYW1lIiwgImFiY2QiKTsKKworCQlhc3NlcnRUaGF0KChTdHJpbmcpIHYuZXh0cmFjdCgpKS5pc0VxdWFsVG8oImFiY2QiKTsKKwkJYXNzZXJ0VGhhdCh2LmV4dHJhY3QoVmFsdWVUeXBlLlVOS05PV04pKS5pc0VxdWFsVG8oImFiY2QiKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdFN0cmluZygpIHsKKwkJVmFsdWUgdiA9IFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJOYW1lIiwgImFiY2QiKTsKKworCQlhc3NlcnRUaGF0KChTdHJpbmcpIHYuZXh0cmFjdCgpKS5pc0VxdWFsVG8oImFiY2QiKTsKKwkJYXNzZXJ0VGhhdCh2LmV4dHJhY3QoVmFsdWVUeXBlLlNUUklORykpLmlzRXF1YWxUbygiYWJjZCIpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0SW50ZWdlcigpIHsKKwkJVmFsdWUgdiA9IFZhbHVlVHlwZS5JTlRFR0VSLmNyZWF0ZSgiSWQiLCAxKTsKKworCQlhc3NlcnRUaGF0KChpbnQpIHYuZXh0cmFjdCgpKS5pc0VxdWFsVG8oMSk7CisJCWFzc2VydFRoYXQodi5leHRyYWN0KFZhbHVlVHlwZS5JTlRFR0VSKSkuaXNFcXVhbFRvKDEpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0SW50ZWdlclNlcXVlbmNlKCkgeworCQlpbnRbXSBpbnRzID0gbmV3IGludFtdIHsgMSwgMiwgMyB9OworCisJCVZhbHVlIHYgPSBWYWx1ZVR5cGUuSU5URUdFUl9TRVFVRU5DRS5jcmVhdGUoIklkcyIsIGludHMpOworCisJCWFzc2VydFRoYXQoKGludFtdKSB2LmV4dHJhY3QoKSkuaXNFcXVhbFRvKGludHMpOworCQlhc3NlcnRUaGF0KHYuZXh0cmFjdChWYWx1ZVR5cGUuSU5URUdFUl9TRVFVRU5DRSkpLmlzRXF1YWxUbyhpbnRzKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdEVudW1lcmF0aW9uKCkgeworCQlWYWx1ZSB2ID0gVmFsdWVUeXBlLkVOVU1FUkFUSU9OLmNyZWF0ZSgiU2NhbGFyVHlwZUZpZWxkIiwgIiIsIHRydWUsIFNjYWxhclR5cGUuSU5URUdFUiwKKwkJCQlFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUpOworCisJCWFzc2VydFRoYXQodi5leHRyYWN0KFZhbHVlVHlwZS5FTlVNRVJBVElPTikpLmlzRXF1YWxUbyhTY2FsYXJUeXBlLklOVEVHRVIpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RFeHRyYWN0RW51bWVyYXRpb25TZXF1ZW5jZSgpIHsKKwkJU2NhbGFyVHlwZVtdIHNjYWxhVHlwZXMgPSBuZXcgU2NhbGFyVHlwZVtdIHsgU2NhbGFyVHlwZS5GTE9BVCwgU2NhbGFyVHlwZS5JTlRFR0VSIH07CisKKwkJVmFsdWUgdiA9IFZhbHVlVHlwZS5FTlVNRVJBVElPTl9TRVFVRU5DRS5jcmVhdGUoIlNjYWxhclR5cGVTZXFGaWVsZCIsICIiLCB0cnVlLCBzY2FsYVR5cGVzLAorCQkJCUVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRSk7CisKKwkJYXNzZXJ0VGhhdCh2LmV4dHJhY3QoVmFsdWVUeXBlLkVOVU1FUkFUSU9OX1NFUVVFTkNFKSkuaXNFcXVhbFRvKHNjYWxhVHlwZXMpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvYmFzZS9xdWVyeS9GaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3YjY2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2Jhc2UvcXVlcnkvRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuRW50aXR5VHlwZUltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlJlbGF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuUmVsYXRpb25JbXBsLkF0dHJpYnV0ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1SZWdpc3RyeTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgdGhlIEZpbHRlciBjbGFzcworICogCisgKiBAYXV0aG9yIEFsZXhhbmRlciBOZWhtZXIKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJUZXN0IHsKKworCXN0YXRpYyBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiMSIsICIyIiwgIjMiIH07CisKKwlAQmVmb3JlCisJcHVibGljIHZvaWQgaW5pdCgpIHsKKwkJRW51bVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7CisJfQorCisJLyoqCisJICogVGVzdHMgaWRzKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGlkcykKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZHNFbnRpdHlUeXBlKCkgeworCQlGaWx0ZXIgZmlsdGVyID0gRmlsdGVyLmFuZCgpOworCQlhc3NlcnRFcXVhbHMoZmlsdGVyLnN0cmVhbSgpLnRvQXJyYXkoKS5sZW5ndGgsIDApOworCisJCWZpbHRlciA9IEZpbHRlci5hbmQoKS5pZHMobmV3IEVudGl0eVR5cGVJbXBsKCksIEFycmF5cy5hc0xpc3QodmFsdWVzKSk7CisKKwkJU3RyaW5nW10gZmlsdGVyQ29uZGl0aW9uID0gZmlsdGVyLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbmRpdGlvbigpLmdldFZhbHVlKCkuZXh0cmFjdCgpOworCisJCUl0ZXJhdG9yPFN0cmluZz4gdmFsdWVzSXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KHZhbHVlcykuaXRlcmF0b3IoKTsKKwkJSXRlcmF0b3I8U3RyaW5nPiBmaWx0ZXJDb25kaXRpb25JdGVyYXRvciA9IEFycmF5cy5zdHJlYW0oZmlsdGVyQ29uZGl0aW9uKS5pdGVyYXRvcigpOworCisJCXdoaWxlICh2YWx1ZXNJdGVyYXRvci5oYXNOZXh0KCkgJiYgZmlsdGVyQ29uZGl0aW9uSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisJCQlhc3NlcnRFcXVhbHModmFsdWVzSXRlcmF0b3IubmV4dCgpLCBmaWx0ZXJDb25kaXRpb25JdGVyYXRvci5uZXh0KCkpOworCQl9CisJfQorCisJLyoqCisJICogVGVzdHMgaWRzKFJlbGF0aW9uIHJlbGF0aW9uLCBDb2xsZWN0aW9uPFN0cmluZz4gaWRzKQorCSAqLworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElkc1JlbGF0aW9uKCkgeworCQlGaWx0ZXIgZmlsdGVyID0gRmlsdGVyLmFuZCgpOworCQlhc3NlcnRFcXVhbHMoZmlsdGVyLnN0cmVhbSgpLnRvQXJyYXkoKS5sZW5ndGgsIDApOworCisJCWZpbHRlciA9IEZpbHRlci5hbmQoKS5pZHMobmV3IFJlbGF0aW9uSW1wbChBdHRyaWJ1dGVUeXBlLklEKSwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKworCQlTdHJpbmdbXSBmaWx0ZXJDb25kaXRpb24gPSBmaWx0ZXIuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q29uZGl0aW9uKCkuZ2V0VmFsdWUoKS5leHRyYWN0KCk7CisKKwkJSXRlcmF0b3I8U3RyaW5nPiB2YWx1ZXNJdGVyYXRvciA9IEFycmF5cy5hc0xpc3QodmFsdWVzKS5pdGVyYXRvcigpOworCQlJdGVyYXRvcjxTdHJpbmc+IGZpbHRlckNvbmRpdGlvbkl0ZXJhdG9yID0gQXJyYXlzLnN0cmVhbShmaWx0ZXJDb25kaXRpb24pLml0ZXJhdG9yKCk7CisKKwkJd2hpbGUgKHZhbHVlc0l0ZXJhdG9yLmhhc05leHQoKSAmJiBmaWx0ZXJDb25kaXRpb25JdGVyYXRvci5oYXNOZXh0KCkpIHsKKwkJCWFzc2VydEVxdWFscyh2YWx1ZXNJdGVyYXRvci5uZXh0KCksIGZpbHRlckNvbmRpdGlvbkl0ZXJhdG9yLm5leHQoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBUZXN0cyBpZChFbnRpdHlUeXBlIGVudGl0eVR5cGUsIFN0cmluZyBpZCkKKwkgKi8KKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RJZEVudGl0eSgpIHsKKwkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKTsKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlci5zdHJlYW0oKS50b0FycmF5KCkubGVuZ3RoLCAwKTsKKworCQlmaWx0ZXIgPSBGaWx0ZXIuYW5kKCkuaWQobmV3IEVudGl0eVR5cGVJbXBsKCksICIxIik7CisKKwkJU3RyaW5nIGZpbHRlckNvbmRpdGlvbiA9IGZpbHRlci5pdGVyYXRvcigpLm5leHQoKS5nZXRDb25kaXRpb24oKS5nZXRWYWx1ZSgpLmV4dHJhY3QoKTsKKworCQlhc3NlcnRFcXVhbHMoZmlsdGVyQ29uZGl0aW9uLCAiMSIpOworCX0KKworCS8qKgorCSAqIFRlc3RzIGlkKFJlbGF0aW9uIHJlbGF0aW9uLCBTdHJpbmcgaWQpCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWRSZWxhdGlvbigpIHsKKwkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKTsKKwkJYXNzZXJ0RXF1YWxzKGZpbHRlci5zdHJlYW0oKS50b0FycmF5KCkubGVuZ3RoLCAwKTsKKworCQlmaWx0ZXIgPSBGaWx0ZXIuYW5kKCkuaWQobmV3IFJlbGF0aW9uSW1wbChBdHRyaWJ1dGVUeXBlLklEKSwgIjEiKTsKKworCQlTdHJpbmcgZmlsdGVyQ29uZGl0aW9uID0gZmlsdGVyLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbmRpdGlvbigpLmdldFZhbHVlKCkuZXh0cmFjdCgpOworCisJCWFzc2VydEVxdWFscyhmaWx0ZXJDb25kaXRpb24sICIxIik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0Ly5naXRpZ25vcmUgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY3OGFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0Ly5naXRpZ25vcmUKQEAgLTAsMCArMSwxNyBAQAorIyBlY2xpcHNlCisuY2xhc3NwYXRoCisucHJvamVjdAorLnNldHRpbmdzLworYmluLworCisjIGdyYWRsZQorLmdyYWRsZQorYnVpbGQvCisKKyMgaW50ZWxsaWoKKy5pZGVhLworb3V0LworKi5pcHIKKyouaW1sCisqLml3cworL2Jpbi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhlMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjc3IEBACitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAyLjAKKworICAgIFRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCisgICAgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCisgIGEpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb250ZW50CisgICAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgIGkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorICAgICBpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICBhbmQgYXJlIERpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24KKyAgIm9yaWdpbmF0ZXMiIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkKKyAgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLgorICBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGNoYW5nZXMgb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHRoYXQKKyAgYXJlIG5vdCBNb2RpZmllZCBXb3Jrcy4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaAorYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZQorb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgRGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMKK0FncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudAorb3IgYW55IFNlY29uZGFyeSBMaWNlbnNlIChhcyBhcHBsaWNhYmxlKSwgaW5jbHVkaW5nIENvbnRyaWJ1dG9ycy4KKworIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIENvZGUgb3Igb3RoZXIKK2Zvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFByb2dyYW0gYW5kIGZvciB3aGljaCB0aGUKK2VkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKK3JlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLgorCisiTW9kaWZpZWQgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmsgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybSB0aGF0CityZXN1bHRzIGZyb20gYW4gYWRkaXRpb24gdG8sIGRlbGV0aW9uIGZyb20sIG9yIG1vZGlmaWNhdGlvbiBvZiB0aGUKK2NvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLCBpbmNsdWRpbmcsIGZvciBwdXJwb3NlcyBvZiBjbGFyaXR5IGFueSBuZXcgZmlsZQoraW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGNvbnRhaW5zIGFueSBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbS4gTW9kaWZpZWQKK1dvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgY29udGFpbiBvbmx5IGRlY2xhcmF0aW9ucywKK2ludGVyZmFjZXMsIHR5cGVzLCBjbGFzc2VzLCBzdHJ1Y3R1cmVzLCBvciBmaWxlcyBvZiB0aGUgUHJvZ3JhbSBzb2xlbHkKK2luIGVhY2ggY2FzZSBpbiBvcmRlciB0byBsaW5rIHRvLCBiaW5kIGJ5IG5hbWUsIG9yIHN1YmNsYXNzIHRoZSBQcm9ncmFtCitvciBNb2RpZmllZCBXb3JrcyB0aGVyZW9mLgorCisiRGlzdHJpYnV0ZSIgbWVhbnMgdGhlIGFjdHMgb2YgYSkgZGlzdHJpYnV0aW5nIG9yIGIpIG1ha2luZyBhdmFpbGFibGUKK2luIGFueSBtYW5uZXIgdGhhdCBlbmFibGVzIHRoZSB0cmFuc2ZlciBvZiBhIGNvcHkuCisKKyJTb3VyY2UgQ29kZSIgbWVhbnMgdGhlIGZvcm0gb2YgYSBQcm9ncmFtIHByZWZlcnJlZCBmb3IgbWFraW5nCittb2RpZmljYXRpb25zLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLAorZG9jdW1lbnRhdGlvbiBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisiU2Vjb25kYXJ5IExpY2Vuc2UiIG1lYW5zIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCitWZXJzaW9uIDIuMCwgb3IgYW55IGxhdGVyIHZlcnNpb25zIG9mIHRoYXQgbGljZW5zZSwgaW5jbHVkaW5nIGFueQorZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFzIGlkZW50aWZpZWQgYnkgdGhlIGluaXRpYWwKK0NvbnRyaWJ1dG9yLgorCisyLiBHUkFOVCBPRiBSSUdIVFMKKworICBhKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodAorICBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LAorICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzLgorCisgIGIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgIGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsCisgIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwKKyAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQKKyAgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24KKyAgb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZQorICBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgorICBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKKyAgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgIGMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZQorICBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZQorICBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKKyAgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4KKyAgRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcworICBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorICBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZQorICByaWdodHMgYW5kIGxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkKKyAgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsCisgIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkKKyAgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIERpc3RyaWJ1dGUgdGhlCisgIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlCisgIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKKyAgZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMKKyAgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKKyAgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKworICBlKSBOb3R3aXRoc3RhbmRpbmcgdGhlIHRlcm1zIG9mIGFueSBTZWNvbmRhcnkgTGljZW5zZSwgbm8KKyAgQ29udHJpYnV0b3IgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbgorICB0aG9zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQpIGFzIGEgcmVzdWx0IG9mIHN1Y2ggUmVjaXBpZW50J3MKKyAgcmVjZWlwdCBvZiB0aGUgUHJvZ3JhbSB1bmRlciB0aGUgdGVybXMgb2YgYSBTZWNvbmRhcnkgTGljZW5zZQorICAoaWYgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDMpLgorCiszLiBSRVFVSVJFTUVOVFMKKworMy4xIElmIGEgQ29udHJpYnV0b3IgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0gaW4gYW55IGZvcm0sIHRoZW46CisKKyAgYSkgdGhlIFByb2dyYW0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGFzIFNvdXJjZSBDb2RlLCBpbgorICBhY2NvcmRhbmNlIHdpdGggc2VjdGlvbiAzLjIsIGFuZCB0aGUgQ29udHJpYnV0b3IgbXVzdCBhY2NvbXBhbnkKKyAgdGhlIFByb2dyYW0gd2l0aCBhIHN0YXRlbWVudCB0aGF0IHRoZSBTb3VyY2UgQ29kZSBmb3IgdGhlIFByb2dyYW0KKyAgaXMgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgaW5mb3JtcyBSZWNpcGllbnRzIGhvdyB0bworICBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5CisgIHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlOyBhbmQKKworICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgIGRpZmZlcmVudCB0aGFuIHRoaXMgQWdyZWVtZW50LCBwcm92aWRlZCB0aGF0IHN1Y2ggbGljZW5zZToKKyAgICAgaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKKyAgICAgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQKKyAgICAgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzCisgICAgIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKworICAgICBpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKKyAgICAgaWlpKSBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnRzJyByaWdodHMKKyAgICAgaW4gdGhlIFNvdXJjZSBDb2RlIHVuZGVyIHNlY3Rpb24gMy4yOyBhbmQKKworICAgICBpdikgcmVxdWlyZXMgYW55IHN1YnNlcXVlbnQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFueQorICAgICBwYXJ0eSB0byBiZSB1bmRlciBhIGxpY2Vuc2UgdGhhdCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cworICAgICBvZiB0aGlzIHNlY3Rpb24gMy4KKworMy4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6CisKKyAgYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudCwgb3IgaWYgdGhlCisgIFByb2dyYW0gKGkpIGlzIGNvbWJpbmVkIHdpdGggb3RoZXIgbWF0ZXJpYWwgaW4gYSBzZXBhcmF0ZSBmaWxlIG9yCisgIGZpbGVzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsCisgIENvbnRyaWJ1dG9yIGF0dGFjaGVkIHRvIHRoZSBTb3VyY2UgQ29kZSB0aGUgbm90aWNlIGRlc2NyaWJlZCBpbgorICBFeGhpYml0IEEgb2YgdGhpcyBBZ3JlZW1lbnQsIHRoZW4gdGhlIFByb2dyYW0gbWF5IGJlIG1hZGUgYXZhaWxhYmxlCisgIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisKKyAgYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YKKyAgdGhlIFByb2dyYW0uCisKKzMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LAordHJhZGVtYXJrLCBhdHRyaWJ1dGlvbiBub3RpY2VzLCBkaXNjbGFpbWVycyBvZiB3YXJyYW50eSwgb3IgbGltaXRhdGlvbnMKK29mIGxpYWJpbGl0eSAoIm5vdGljZXMiKSBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtIGZyb20gYW55IGNvcHkgb2YKK3RoZSBQcm9ncmFtIHdoaWNoIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZAordGhlaXIgb3duIGFwcHJvcHJpYXRlIG5vdGljZXMuCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCit3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMKK2xpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sCit0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CitvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAorbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkKK290aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsCitkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cworYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkCitDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQoraW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90CithcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQKK2ludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkCitDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KK3dyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsCithbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkKK3JlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKK3BhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8KK3BheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkKK3Rob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVAorUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiCitCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SCitJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GCitUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKK2FwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbAorcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCitpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCitjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcworb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBBTkQgVE8gVEhFIEVYVEVOVAorUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUworU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QKK1BST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KK0NPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCitBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRQorRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IgZW5mb3JjZWFiaWxpdHkgb2YKK3RoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyCithY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKK21pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUKK29yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncworcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZgordGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncworcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UKK2FuZCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLgorSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwKK2J1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgYW5kCittYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkCityZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCit0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudAorU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbgoraXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUKK3Jlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlCitlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcKK3ZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK0Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMKK3JlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwKK0NvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBEaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzCitDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uCisKK0V4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55CitDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLAorZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAordW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLiBOb3RoaW5nIGluIHRoaXMgQWdyZWVtZW50IGlzIGludGVuZGVkCit0byBiZSBlbmZvcmNlYWJsZSBieSBhbnkgZW50aXR5IHRoYXQgaXMgbm90IGEgQ29udHJpYnV0b3Igb3IgUmVjaXBpZW50LgorTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorCitFeGhpYml0IEEgLSBGb3JtIG9mIFNlY29uZGFyeSBMaWNlbnNlcyBOb3RpY2UKKworIlRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZworU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aAoraW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAordmVyc2lvbihzKSwgYW5kIGV4Y2VwdGlvbnMgb3IgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBoZXJlfS4iCisKKyAgU2ltcGx5IGluY2x1ZGluZyBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyB0aGlzIEV4aGliaXQgQQorICBpcyBub3Qgc3VmZmljaWVudCB0byBsaWNlbnNlIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBTZWNvbmRhcnkgTGljZW5zZXMuCisKKyAgSWYgaXQgaXMgbm90IHBvc3NpYmxlIG9yIGRlc2lyYWJsZSB0byBwdXQgdGhlIG5vdGljZSBpbiBhIHBhcnRpY3VsYXIKKyAgZmlsZSwgdGhlbiBZb3UgbWF5IGluY2x1ZGUgdGhlIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgTElDRU5TRQorICBmaWxlIGluIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8KKyAgbG9vayBmb3Igc3VjaCBhIG5vdGljZS4KKworICBZb3UgbWF5IGFkZCBhZGRpdGlvbmFsIGFjY3VyYXRlIG5vdGljZXMgb2YgY29weXJpZ2h0IG93bmVyc2hpcC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9OT1RJQ0UudHh0IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L05PVElDRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyODFjNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9OT1RJQ0UudHh0CkBAIC0wLDAgKzEsMzgyIEBACisjIE5vdGljZXMgZm9yIEVjbGlwc2UgTURNfEJMCisKK1RoaXMgY29udGVudCBpcyBwcm9kdWNlZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRWNsaXBzZSBNRE18QkwgcHJvamVjdCwKK2l0IGlzIGEgcHJvamVjdCBvZiB0aGUgb3Blbk1ETShSKSBFY2xpcHNlIFdvcmtpbmcgR3JvdXAuCisKKyogUHJvamVjdCBob21lOiBodHRwczovL3Byb2plY3RzLmVjbGlwc2Uub3JnL3Byb2plY3RzL3RlY2hub2xvZ3kubWRtYmwKKworIyMgVHJhZGVtYXJrcworCitFY2xpcHNlIE1ETXxCTCwgTURNfEJMIGFuZCBFY2xpcHNlIG9wZW5NRE0oUikgbG9nbyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzCitvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLgorCisjIyBDb3B5cmlnaHQKKworQWxsIGNvbnRlbnQgaXMgdGhlIHByb3BlcnR5IG9mIHRoZSBmb2xsb3dpbmcgcmVzcGVjdGl2ZSBhdXRob3JzIG9yIHRoZWlyIGVtcGxveWVycy4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhdXRob3JzaGlwIG9mIGNvbnRlbnQsIHBsZWFzZSBjb25zdWx0IHRoZSBsaXN0ZWQKK3NvdXJjZSBjb2RlIHJlcG9zaXRvcnkgbG9ncy4KKworQ29weXJpZ2h0IChjKSAyMDE2LTIwMTkgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKK0NvcHlyaWdodCAoYykgMjAxNi0yMDIwIFBlYWsgU29sdXRpb24gR21iSAorQ29weXJpZ2h0IChjKSAyMDE3LTIwMTggc2NpZW5jZSArIGNvbXB1dGluZyBBRyBUdWViaW5nZW4gKEFUT1MgU0UpCitDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBDYW5vbyBFbmdpbmVlcmluZyBBRworQ29weXJpZ2h0IChjKSAyMDE3IEZsb3JpYW4gU2NobWl0dAorQ29weXJpZ2h0IChjKSAyMDE3LTIwMjAgQW5nZWxpa2EgV2l0dGVrCitDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBFbGVrdHJvbmlzY2hlIEZhaHJ3ZXJrc3lzdGVtZSBHTUJICitDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBLYXJha3VuIEFHCitDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMCBBbGV4YW5kZXIgTmVobWVyCisKKyMjIERlY2xhcmVkIFByb2plY3QgTGljZW5zZXMKKworVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCit0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKK1NQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisKKyMjIFNvdXJjZSBDb2RlCisKK1RoZSBwcm9qZWN0IG1haW50YWlucyB0aGUgZm9sbG93aW5nIHNvdXJjZSBjb2RlIHJlcG9zaXRvcmllczoKKworb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmdpdAkgICAgLSBUaGUgb3Blbk1ETShSKSBBUEkuCitvcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQuZ2l0CSAgICAtIEV4dGVuc2lvbiBvZiB0aGUgb3Blbk1ETShSKSBBUEkgY29udGFpbmluZyBkZWZhdWx0IGVsZW1lbnRzLgorb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmdpdAktIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiBwZXJzaXN0ZW5jZSBhZGFwdGVyLgorb3JnLmVjbGlwc2UubWRtLm51Y2xldXMuZ2l0CSAgICAgICAgLSBDb3JlIGJ1aWxkaW5nIGJsb2NrcyBmb3IgdGhlIG9wZW5NRE0gQnVzaW5lc3MgTG9naWMgYW5kIFdlYiBGcm9udGVuZC4KKworIyMgVGhpcmQtcGFydHkgQ29udGVudAorCitUaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LgorSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nCitpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvCit0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS4KKworYW50bHI0LTQuNS4zLmphcigyLjUuMykKKyAgICAqIExpY2Vuc2U6IE5ldyBCU0QgbGljZW5zZQorCithb3BhbGxpYW5jZS1yZXBhY2thZ2VkLTIuNS4wLWIwNS5qYXIgKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwKKworY29tbW9ucy1jb2RlYy0xLjIuamFyICgxLjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2NvbW1vbnMtaHR0cGNsaWVudC0zLjEuamFyICAoMy4xKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitjb21tb25zLWxhbmczLTMuOC4xLmphciAoMy44LjEpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2NvbW1vbnMtdGV4dC0xLjYuamFyICgxLjYpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2dzb24tMi43LmphciAoMi43KQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitHb29nbGUgR3VhdmEgVmVyc2lvbjogMjUuMC1qcmUgICgyNS4wKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitHcmFkbGUgV3JhcHBlciAoNC4xMC4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitoazItYXBpLTIuNS4wLWIwNS5qYXIgKDIuNS4wLWIwNSkKKyAgICAqIExpY2Vuc2U6IENEREwtMS4xCisKK2hrMi1sb2NhdG9yLTIuNS4wLWIwNS5qYXIoMi41LjAtYjA1KQorICAgICogTGljZW5zZTogQ0RETAorCitoazItdXRpbHMtMi41LjAtYjA1LmphciAoMi41LjAtYjA1KQorICAgICogTGljZW5zZTogQ0RETAorCitqYWNrc29uLWFubm90YXRpb25zLTIuOS4wLmphciAgKDIuOS4wKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqYWNrc29uLWNvcmUtMi45LjIuamFyKDIuOS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqYWNrc29uLWRhdGFiaW5kLTIuOS4yLmphciAgKDIuOS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqYWNrc29uLWpheHJzLWJhc2UtMi45LjIuamFyKDIuOS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqYWNrc29uLWpheHJzLWpzb24tcHJvdmlkZXItMi45LjIuamFyKDIuOS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqYWNrc29uLW1vZHVsZS1qYXhiLWFubm90YXRpb25zLTIuOS4yLmphciAgKDIuOS4yKQorICAgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCitqYXZhc3Npc3QtMy4yMC4wLUdBLmphciAgKDIuMjAuMC1HQSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSAyLjAKKworamNsLW92ZXItc2xmNGotMS43LjI1LmphcigxLjcuMjUpCisgICAgKiBMaWNlbnNlOiBNSVQgTGljZW5zZQorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL3d3dy5zbGY0ai5vcmcvbGljZW5zZS5odG1sCisgICAgKiBQcm9qZWN0IFVSTDogIGh0dHBzOi8vd3d3LnNsZjRqLm9yZworICAgICogU291cmNlIFVSTDogICBodHRwczovL2dpdGh1Yi5jb20vcW9zLWNoL3NsZjRqCisKK2plcnNleS1jbGllbnQtMi4yMy4yLmphciAoMi4yMy4yKQorICAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWNvbW1vbi0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1jb250YWluZXItc2VydmxldC0yLjIzLjIuamFyICAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZS0yLjIzLjMuamFyKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWd1YXZhLTIuMjMuMi5qYXIgICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2plcnNleS1tZWRpYS1qYXhiLTIuMjMuMi5qYXIoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktbWVkaWEtc3NlLTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LW1lZGlhLW11bHRpcGFydC0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1zZXJ2ZXItMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitsb2c0ai1vdmVyLXNsZjRqLTEuNy4yNS5qYXIgKDEuNy4yNSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworbG9nYmFjay1jbGFzc2ljLTEuMi4zLmphcigxLjIuMykKKyAgICAqIExpY2Vuc2U6IEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMS4wCisKK2xvZ2JhY2stY29yZS0xLjIuMy5qYXIoMS4yLjMpCisgICAgKiBMaWNlbnNlOiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDEuMAorCittaW1lcHVsbC0xLjkuNi5qYXIgKDEuOS40KQorICAgICogTGljZW5zZTogQ0RETAorCitvcGVuYXRmeC0wLjcuNC5qYXIgKDAuNy40KQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitvc2dpLXJlc291cmNlLWxvY2F0b3ItMS4wLjEuamFyKDEuMC4xKQorICAgICogTGljZW5zZTogQ0RETAorCitwcm90b2J1Zi1qYXZhLTMuMi4wLmphciAoMy4yLjApCisgICAgKiBMaWNlbnNlOiBOZXcgQlNEIGxpY2Vuc2UKKworcHJvdG9idWYtamF2YS11dGlsLTMuMi4wLmphciAgKDMuMi4wKQorICAgICogTGljZW5zZTogTmV3IEJTRCBsaWNlbnNlCisKK3N3YWdnZXItYW5ub3RhdGlvbnMtMi4wLjguamFyICgyLjAuOCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworc3dhZ2dlci11aS0zLjIzLjAuamFyICgzLjIzLjApCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK3NsZjRqLWFwaS0xLjcuMjUuamFyICAoMS43LjI1KQorICAgICogTGljZW5zZTogTUlUIGxpY2Vuc2UKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly93d3cuc2xmNGoub3JnL2xpY2Vuc2UuaHRtbAorICAgICogUHJvamVjdCBVUkw6IGh0dHBzOi8vZ2l0aHViLmNvbS9xb3MtY2gvc2xmNGoKKyAgICAqIFNvdXJjZSBVUkw6ICBodHRwczovL2dpdGh1Yi5jb20vcW9zLWNoL3NsZjRqL3JlbGVhc2VzL3RhZy92XzEuNy4yNQorCitzdGF4Mi1hcGktMy4xLjQuamFyICgzLjEuNCkKKyAgICAqIExpY2Vuc2U6IEJTRC0yLUNsYXVzZQorCit2YWxpZGF0aW9uLWFwaS0xLjEuMC5GaW5hbC5qYXIgKDEuMS4wLkZpbmFsKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKwordmF2ci0wLjkuMS1zb3VyY2VzLmphciAoMC45LjEpCisgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCit2YXZyLW1hdGNoLTAuOS4xLmphciAoMC45LjEpCisgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCit3b29kc3RveC1jb3JlLWFzbC00LjQuMS5qYXIgKDQuNC4xKQorICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworCitGRkFNRkFNRkFNIFNpbGsgSWNvbiwgVmVyc2lvbiAxLjMKKyAgICAqIExpY2Vuc2U6IENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIExpY2Vuc2UKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LzMuMC8KKyAgICAqIFByb2plY3Q6IGh0dHA6Ly93d3cuZmFtZmFtZmFtLmNvbS9sYWIvaWNvbnMvc2lsay8KKyAgICAqIFNvdXJjZTogIGh0dHA6Ly93d3cuZmFtZmFtZmFtLmNvbS9sYWIvaWNvbnMvc2lsay8KKworQGFuZ3VsYXIvYW5pbWF0aW9uczo3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9hbmltYXRpb25zCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9jZGs6Ny4xLjEKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMS4xCisKKworQGFuZ3VsYXIvY29tbW9uQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2NvbW1vbgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjRyCisKK0Bhbmd1bGFyL2NvbXBpbGVyQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2NvcmVANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvZm9ybXNANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvaHR0cEA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWNANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlckA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9yb3V0ZXJANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworYm9vdHN0cmFwQDQuMS4zCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwCisKK2NsYXNzLXRyYW5zZm9ybWVyQDAuMS42CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3R5cGVzdGFjay9jbGFzcy10cmFuc2Zvcm1lci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vcGxlZXJvY2svY2xhc3MtdHJhbnNmb3JtZXIKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9wbGVlcm9jay9jbGFzcy10cmFuc2Zvcm1lcgorCitjb3JlLWpzQDIuNi4wCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvcmVsZWFzZXMvdGFnL3YyLjYuMAorCitmaWxlLXNhdmVyQDEuMy4zCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzL3Jhdy9tYXN0ZXIvTElDRU5TRS5tZAorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMKKworZm9udC1hd2Vzb21lQDQuNy4wCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL0ZvcnRBd2Vzb21lL0ZvbnQtQXdlc29tZS9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dAorICAgICogUHJvamVjdDogaHR0cHM6Ly9mb250YXdlc29tZS5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vRm9ydEF3ZXNvbWUvRm9udC1Bd2Vzb21lCisKK25nMi1zcGxpdC1wYW5lQDEuMy4xCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3dhbm5hYmVnZWVrL25nMi1zcGxpdC1wYW5lL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL3dhbm5hYmVnZWVrL25nMi1zcGxpdC1wYW5lCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vd2FubmFiZWdlZWsvbmcyLXNwbGl0LXBhbmUKKworbmd4LWJvb3RzdHJhcEAzLjEuMgorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZ3gtYm9vdHN0cmFwL2Jsb2IvdjMuMS4yL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vdmFsb3Itc29mdHdhcmUuY29tL25neC1ib290c3RyYXAKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxvci1zb2Z0d2FyZS9uZ3gtYm9vdHN0cmFwL3RyZWUvdjMuMS4yCisKK0BuZ3gtdHJhbnNsYXRlL2NvcmVAMTEuMC4xCisgICAgKiBMaWNlbnNlOiBNSVQgCisgICAgKiBMaWNlbmNlIFBhdGg6ICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvY29yZS9ibG9iL3YxMS4wLjEvTElDRU5TRSAgCisgICAgKiBQcm9qZWN0IFVSTDogICAgaHR0cDovL3d3dy5uZ3gtdHJhbnNsYXRlLmNvbS8KKyAgICAqIFNvdXJjZSBVUkw6ICAgICBodHRwczovL2dpdGh1Yi5jb20vbmd4LXRyYW5zbGF0ZS9jb3JlCisKK0BuZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyQDQuMC4wCisgICAgKiBMaWNlbnNlOiBNSVQgCisgICAgKiBMaWNlbmNlIFBhdGg6ICAgaHR0cHM6Ly9naXRodWIuY29tL25neC10cmFuc2xhdGUvaHR0cC1sb2FkZXIvYmxvYi92NC4wLjAvTElDRU5TRSAgCisgICAgKiBQcm9qZWN0IFVSTDogICAgaHR0cDovL3d3dy5uZ3gtdHJhbnNsYXRlLmNvbS8KKyAgICAqIFNvdXJjZSBVUkw6ICAgICBodHRwczovL2dpdGh1Yi5jb20vbmd4LXRyYW5zbGF0ZS9odHRwLWxvYWRlci90cmVlL3Y0LjAuMAorCitwcmltZWljb25zOjEuMC4wCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3ByaW1lZmFjZXMvcHJpbWVpY29ucy9ibG9iLzEuMC4wL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vd3d3LnByaW1lZmFjZXMub3JnL3ByaW1lbmcKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1laWNvbnMvdHJlZS8xLjAuMAorCitwcmltZW5nQDcuMC4xCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3ByaW1lZmFjZXMvcHJpbWVuZy9ibG9iLzcuMC4xL0xJQ0VOU0UubWQKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vd3d3LnByaW1lZmFjZXMub3JnL3ByaW1lbmcKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmltZWZhY2VzL3ByaW1lbmcvdHJlZS83LjAuMQorCityeGpzQDYuMy4zCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisgICAgKiBQcm9qZWN0OiBodHRwczovL3J4anMtZGV2LmZpcmViYXNlYXBwLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdGl2ZVgvcnhqcy90cmVlLzYuMy4zCisKK3J4anMtY29tcGF0OjYuMy4zCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisgICAgKiBQcm9qZWN0OiBodHRwczovL3J4anMtZGV2LmZpcmViYXNlYXBwLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdGl2ZVgvcnhqcy90cmVlLzYuMy4zL2NvbXBhdAorCit0c2xpYkAxLjkuMAorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC90c2xpYgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC90c2xpYi90cmVlLzEuOS4wCisKK3pvbmUuanNAMC44LjI2CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL3JlbGVhc2VzL3RhZy92MC44LjI2CisKK09NRyBFdmVudCBTZXJ2aWNlIFNwZWNpZmljYXRpb24gKDEuMikKKworKiBMaWNlbnNlOiBMaWNlbnNlUmVmIC0gT2JqZWN0LU1hbmFnZW1lbnQtR3JvdXAtTGljZW5zZQorKiBQcm9qZWN0OiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvRVZOVC8xLjIvCisqIFNvdXJjZTogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yL3BkZgorCitPTUcgTm90aWZpY2F0aW9uIFNlcnZpY2UgU3BlY2lmaWNhdGlvbiAoMS4xKQorCisqIExpY2Vuc2U6IExpY2Vuc2VSZWYgLSBPYmplY3QtTWFuYWdlbWVudC1Hcm91cC1MaWNlbnNlCisqIFByb2plY3Q6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvCisqIFNvdXJjZTogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL05PVC8xLjEvUERGCisKK29kczUzMC5pZGwKK0RhdGU6IEhvZWhlbmtpcmNoZW4sIDA2LzAxLzIwMTYKKyJUaGUgQVNBTSBCb2FyZCBvZiBEaXJlY3RvcnMgcmVsZWFzZXMgdGhlIElETCBmaWxlcyBmb3IgdXNlIHVuZGVyIHRoZSBFUEwgdG8gdGhlIEVjbGlwc2UgSVdHIG9wZW5NRE0uCitUaGlzIGlzIHZhbGlkIGZvciBhbGwgdmVyc2lvbnMgb2YgQVNBTSBPRFMgNS4zLnguCitUaGlzIHBlcm1pc3Npb24gaXMgdmFsaWQgdW5kZXIgdGhlIGNvbmRpdGlvbnMgb2YgRWNsaXBzZSB3aWxsIG5vdCBtb2RpZnkgdGhlIGZpbGUuIgorCitBdmFsb25FdmVudC5pZGwsIENvcmJhRmlsZVNlcnZlci5pZGwKK0RhdGU6IDA4LzE1LzIwMTYKKyJIZXJld2l0aCwgd2UgcmVsZWFzZSB0aGUgZ2VuZXJhdGVkIENsaWVudC1Tb3VyY2UtQ29kZSBnZW5lcmF0ZWQgZnJvbSBvdXIgQ09SQkEgSURMcywgbmFtZWx5CisqIENPUkJBTm90aWZpY2F0aW9uIFNlcnZpY2UgKGdlbmVyYXRlZCBmcm9tIOKAnkF2YWxvbkV2ZW50LmlkbOKAnSkKKyogQ09SQkFGaWxlU2VydmVyIChnZW5lcmF0ZWQgZnJvbSDigJ5Db3JiYUZpbGVTZXJ2ZXIuaWRs4oCcKSwKK1VuZGVyIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIChFUEwpLiBUaGlzIGFncmVlbWVudCBkb2VzIG5vdCBpbmNsdWRlIHRoZSDigJ5BdmFsb25FdmVudC5pZGzigJwgYW5kCivigJ5Db3JiYUZpbGVTZXJ2ZXIuaWRs4oCcIGl0c2VsZiwgd2hpY2ggcmVtYWluIHByb3RlY3RlZCBwcm9wZXJ0eSBvZiBIaWdoUVNvZnQuICIKKworIyMgQ3J5cHRvZ3JhcGh5CisKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMKK3Blcm1pdHRlZC4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9idWlsZC5ncmFkbGUgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmVjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZGVzY3JpcHRpb24gPSAnTURNIEFQSSAtIERlZmF1bHQgTW9kZWwnCitncm91cCA9ICdvcmcuZWNsaXBzZS5tZG0nCit2ZXJzaW9uID0gJzUuMi4wTTEnCisKK2FwcGx5IHBsdWdpbjogJ2phdmEnCithcHBseSBwbHVnaW46ICdtYXZlbicKK2FwcGx5IHBsdWdpbjogJ2VjbGlwc2UnCisKK3JlcG9zaXRvcmllcyB7CisJbWF2ZW5Mb2NhbCgpCisJbWF2ZW5DZW50cmFsKCkKK30KKworZGVwZW5kZW5jaWVzIHsKKwljb21waWxlICJvcmcuZWNsaXBzZS5tZG06b3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlOiR7dmVyc2lvbn0iCisKKwkvLyB0ZXN0aW5nCisJdGVzdENvbXBpbGUgJ2p1bml0Omp1bml0OjQuMTInCisJdGVzdENvbXBpbGUgJ29yZy5tb2NraXRvOm1vY2tpdG8tY29yZToyLjEzLjAnCisJdGVzdENvbXBpbGUgJ29yZy5hc3NlcnRqOmFzc2VydGotY29yZTozLjYuMicKK30KKworamFyIHsKKwltZXRhSW5mIHsgZnJvbSAnTk9USUNFLnR4dCcgfQorCW1ldGFJbmYgeyBmcm9tICdMSUNFTlNFLnR4dCcgfQorfQorCit0YXNrIHNvdXJjZXNKYXIodHlwZTogSmFyLCBkZXBlbmRzT246IGNsYXNzZXMpIHsKKwljbGFzc2lmaWVyID0gJ3NvdXJjZXMnCisJZnJvbSBzb3VyY2VTZXRzLm1haW4uYWxsU291cmNlCit9CisKK2FydGlmYWN0cyB7CisJYXJjaGl2ZXMgc291cmNlc0phcgorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWI1NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZS5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKK3NvdXJjZUNvbXBhdGliaWxpdHk9MS44Cit0YXJnZXRDb21wYXRpYmlsaXR5PTEuOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzI2NWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyZTAwNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsNSBAQAorZGlzdHJpYnV0aW9uQmFzZT1HUkFETEVfVVNFUl9IT01FDQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzDQoremlwU3RvcmVCYXNlPUdSQURMRV9VU0VSX0hPTUUNCit6aXBTdG9yZVBhdGg9d3JhcHBlci9kaXN0cw0KK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTQuMTAuMi1iaW4uemlwDQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jY2NkZDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcKQEAgLTAsMCArMSwxNzIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMKKyMjICBHcmFkbGUgc3RhcnQgdXAgc2NyaXB0IGZvciBVTipYCisjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQXR0ZW1wdCB0byBzZXQgQVBQX0hPTUUKKyMgUmVzb2x2ZSBsaW5rczogJDAgbWF5IGJlIGEgbGluaworUFJHPSIkMCIKKyMgTmVlZCB0aGlzIGZvciByZWxhdGl2ZSBzeW1saW5rcy4KK3doaWxlIFsgLWggIiRQUkciIF0gOyBkbworICAgIGxzPWBscyAtbGQgIiRQUkciYAorICAgIGxpbms9YGV4cHIgIiRscyIgOiAnLiotPiBcKC4qXCkkJ2AKKyAgICBpZiBleHByICIkbGluayIgOiAnLy4qJyA+IC9kZXYvbnVsbDsgdGhlbgorICAgICAgICBQUkc9IiRsaW5rIgorICAgIGVsc2UKKyAgICAgICAgUFJHPWBkaXJuYW1lICIkUFJHImAiLyRsaW5rIgorICAgIGZpCitkb25lCitTQVZFRD0iYHB3ZGAiCitjZCAiYGRpcm5hbWUgXCIkUFJHXCJgLyIgPi9kZXYvbnVsbAorQVBQX0hPTUU9ImBwd2QgLVBgIgorY2QgIiRTQVZFRCIgPi9kZXYvbnVsbAorCitBUFBfTkFNRT0iR3JhZGxlIgorQVBQX0JBU0VfTkFNRT1gYmFzZW5hbWUgIiQwImAKKworIyBBZGQgZGVmYXVsdCBKVk0gb3B0aW9ucyBoZXJlLiBZb3UgY2FuIGFsc28gdXNlIEpBVkFfT1BUUyBhbmQgR1JBRExFX09QVFMgdG8gcGFzcyBKVk0gb3B0aW9ucyB0byB0aGlzIHNjcmlwdC4KK0RFRkFVTFRfSlZNX09QVFM9IiIKKworIyBVc2UgdGhlIG1heGltdW0gYXZhaWxhYmxlLCBvciBzZXQgTUFYX0ZEICE9IC0xIHRvIHVzZSB0aGF0IHZhbHVlLgorTUFYX0ZEPSJtYXhpbXVtIgorCit3YXJuICgpIHsKKyAgICBlY2hvICIkKiIKK30KKworZGllICgpIHsKKyAgICBlY2hvCisgICAgZWNobyAiJCoiCisgICAgZWNobworICAgIGV4aXQgMQorfQorCisjIE9TIHNwZWNpZmljIHN1cHBvcnQgKG11c3QgYmUgJ3RydWUnIG9yICdmYWxzZScpLgorY3lnd2luPWZhbHNlCittc3lzPWZhbHNlCitkYXJ3aW49ZmFsc2UKK25vbnN0b3A9ZmFsc2UKK2Nhc2UgImB1bmFtZWAiIGluCisgIENZR1dJTiogKQorICAgIGN5Z3dpbj10cnVlCisgICAgOzsKKyAgRGFyd2luKiApCisgICAgZGFyd2luPXRydWUKKyAgICA7OworICBNSU5HVyogKQorICAgIG1zeXM9dHJ1ZQorICAgIDs7CisgIE5PTlNUT1AqICkKKyAgICBub25zdG9wPXRydWUKKyAgICA7OworZXNhYworCitDTEFTU1BBVEg9JEFQUF9IT01FL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgorCisjIERldGVybWluZSB0aGUgSmF2YSBjb21tYW5kIHRvIHVzZSB0byBzdGFydCB0aGUgSlZNLgoraWYgWyAtbiAiJEpBVkFfSE9NRSIgXSA7IHRoZW4KKyAgICBpZiBbIC14ICIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIiBdIDsgdGhlbgorICAgICAgICAjIElCTSdzIEpESyBvbiBBSVggdXNlcyBzdHJhbmdlIGxvY2F0aW9ucyBmb3IgdGhlIGV4ZWN1dGFibGVzCisgICAgICAgIEpBVkFDTUQ9IiRKQVZBX0hPTUUvanJlL3NoL2phdmEiCisgICAgZWxzZQorICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2Jpbi9qYXZhIgorICAgIGZpCisgICAgaWYgWyAhIC14ICIkSkFWQUNNRCIgXSA7IHRoZW4KKyAgICAgICAgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJEpBVkFfSE9NRQorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorICAgIGZpCitlbHNlCisgICAgSkFWQUNNRD0iamF2YSIKKyAgICB3aGljaCBqYXZhID4vZGV2L251bGwgMj4mMSB8fCBkaWUgIkVSUk9SOiBKQVZBX0hPTUUgaXMgbm90IHNldCBhbmQgbm8gJ2phdmEnIGNvbW1hbmQgY291bGQgYmUgZm91bmQgaW4geW91ciBQQVRILgorCitQbGVhc2Ugc2V0IHRoZSBKQVZBX0hPTUUgdmFyaWFibGUgaW4geW91ciBlbnZpcm9ubWVudCB0byBtYXRjaCB0aGUKK2xvY2F0aW9uIG9mIHlvdXIgSmF2YSBpbnN0YWxsYXRpb24uIgorZmkKKworIyBJbmNyZWFzZSB0aGUgbWF4aW11bSBmaWxlIGRlc2NyaXB0b3JzIGlmIHdlIGNhbi4KK2lmIFsgIiRjeWd3aW4iID0gImZhbHNlIiAtYSAiJGRhcndpbiIgPSAiZmFsc2UiIC1hICIkbm9uc3RvcCIgPSAiZmFsc2UiIF0gOyB0aGVuCisgICAgTUFYX0ZEX0xJTUlUPWB1bGltaXQgLUggLW5gCisgICAgaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgorICAgICAgICBpZiBbICIkTUFYX0ZEIiA9ICJtYXhpbXVtIiAtbyAiJE1BWF9GRCIgPSAibWF4IiBdIDsgdGhlbgorICAgICAgICAgICAgTUFYX0ZEPSIkTUFYX0ZEX0xJTUlUIgorICAgICAgICBmaQorICAgICAgICB1bGltaXQgLW4gJE1BWF9GRAorICAgICAgICBpZiBbICQ/IC1uZSAwIF0gOyB0aGVuCisgICAgICAgICAgICB3YXJuICJDb3VsZCBub3Qgc2V0IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEIgorICAgICAgICBmaQorICAgIGVsc2UKKyAgICAgICAgd2FybiAiQ291bGQgbm90IHF1ZXJ5IG1heGltdW0gZmlsZSBkZXNjcmlwdG9yIGxpbWl0OiAkTUFYX0ZEX0xJTUlUIgorICAgIGZpCitmaQorCisjIEZvciBEYXJ3aW4sIGFkZCBvcHRpb25zIHRvIHNwZWNpZnkgaG93IHRoZSBhcHBsaWNhdGlvbiBhcHBlYXJzIGluIHRoZSBkb2NrCitpZiAkZGFyd2luOyB0aGVuCisgICAgR1JBRExFX09QVFM9IiRHUkFETEVfT1BUUyBcIi1YZG9jazpuYW1lPSRBUFBfTkFNRVwiIFwiLVhkb2NrOmljb249JEFQUF9IT01FL21lZGlhL2dyYWRsZS5pY25zXCIiCitmaQorCisjIEZvciBDeWd3aW4sIHN3aXRjaCBwYXRocyB0byBXaW5kb3dzIGZvcm1hdCBiZWZvcmUgcnVubmluZyBqYXZhCitpZiAkY3lnd2luIDsgdGhlbgorICAgIEFQUF9IT01FPWBjeWdwYXRoIC0tcGF0aCAtLW1peGVkICIkQVBQX0hPTUUiYAorICAgIENMQVNTUEFUSD1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJENMQVNTUEFUSCJgCisgICAgSkFWQUNNRD1gY3lncGF0aCAtLXVuaXggIiRKQVZBQ01EImAKKworICAgICMgV2UgYnVpbGQgdGhlIHBhdHRlcm4gZm9yIGFyZ3VtZW50cyB0byBiZSBjb252ZXJ0ZWQgdmlhIGN5Z3BhdGgKKyAgICBST09URElSU1JBVz1gZmluZCAtTCAvIC1tYXhkZXB0aCAxIC1taW5kZXB0aCAxIC10eXBlIGQgMj4vZGV2L251bGxgCisgICAgU0VQPSIiCisgICAgZm9yIGRpciBpbiAkUk9PVERJUlNSQVcgOyBkbworICAgICAgICBST09URElSUz0iJFJPT1RESVJTJFNFUCRkaXIiCisgICAgICAgIFNFUD0ifCIKKyAgICBkb25lCisgICAgT1VSQ1lHUEFUVEVSTj0iKF4oJFJPT1RESVJTKSkiCisgICAgIyBBZGQgYSB1c2VyLWRlZmluZWQgcGF0dGVybiB0byB0aGUgY3lncGF0aCBhcmd1bWVudHMKKyAgICBpZiBbICIkR1JBRExFX0NZR1BBVFRFUk4iICE9ICIiIF0gOyB0aGVuCisgICAgICAgIE9VUkNZR1BBVFRFUk49IiRPVVJDWUdQQVRURVJOfCgkR1JBRExFX0NZR1BBVFRFUk4pIgorICAgIGZpCisgICAgIyBOb3cgY29udmVydCB0aGUgYXJndW1lbnRzIC0ga2x1ZGdlIHRvIGxpbWl0IG91cnNlbHZlcyB0byAvYmluL3NoCisgICAgaT0wCisgICAgZm9yIGFyZyBpbiAiJEAiIDsgZG8KKyAgICAgICAgQ0hFQ0s9YGVjaG8gIiRhcmcifGVncmVwIC1jICIkT1VSQ1lHUEFUVEVSTiIgLWAKKyAgICAgICAgQ0hFQ0syPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiXi0iYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyBEZXRlcm1pbmUgaWYgYW4gb3B0aW9uCisKKyAgICAgICAgaWYgWyAkQ0hFQ0sgLW5lIDAgXSAmJiBbICRDSEVDSzIgLWVxIDAgXSA7IHRoZW4gICAgICAgICAgICAgICAgICAgICMjIyBBZGRlZCBhIGNvbmRpdGlvbgorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPWBjeWdwYXRoIC0tcGF0aCAtLWlnbm9yZSAtLW1peGVkICIkYXJnImAKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXZhbCBgZWNobyBhcmdzJGlgPSJcIiRhcmdcIiIKKyAgICAgICAgZmkKKyAgICAgICAgaT0kKChpKzEpKQorICAgIGRvbmUKKyAgICBjYXNlICRpIGluCisgICAgICAgICgwKSBzZXQgLS0gOzsKKyAgICAgICAgKDEpIHNldCAtLSAiJGFyZ3MwIiA7OworICAgICAgICAoMikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiIDs7CisgICAgICAgICgzKSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgOzsKKyAgICAgICAgKDQpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiA7OworICAgICAgICAoNSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiIDs7CisgICAgICAgICg2KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgOzsKKyAgICAgICAgKDcpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiA7OworICAgICAgICAoOCkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciIDs7CisgICAgICAgICg5KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgIiRhcmdzNyIgIiRhcmdzOCIgOzsKKyAgICBlc2FjCitmaQorCisjIEVzY2FwZSBhcHBsaWNhdGlvbiBhcmdzCitzYXZlICgpIHsKKyAgICBmb3IgaSBkbyBwcmludGYgJXNcXG4gIiRpIiB8IHNlZCAicy8nLydcXFxcJycvZzsxcy9eLycvO1wkcy9cJC8nIFxcXFwvIiA7IGRvbmUKKyAgICBlY2hvICIgIgorfQorQVBQX0FSR1M9JChzYXZlICIkQCIpCisKKyMgQ29sbGVjdCBhbGwgYXJndW1lbnRzIGZvciB0aGUgamF2YSBjb21tYW5kLCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcworZXZhbCBzZXQgLS0gJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMgIlwiLURvcmcuZ3JhZGxlLmFwcG5hbWU9JEFQUF9CQVNFX05BTUVcIiIgLWNsYXNzcGF0aCAiXCIkQ0xBU1NQQVRIXCIiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAiJEFQUF9BUkdTIgorCisjIGJ5IGRlZmF1bHQgd2Ugc2hvdWxkIGJlIGluIHRoZSBjb3JyZWN0IHByb2plY3QgZGlyLCBidXQgd2hlbiBydW4gZnJvbSBGaW5kZXIgb24gTWFjLCB0aGUgY3dkIGlzIHdyb25nCitpZiBbICIkKHVuYW1lKSIgPSAiRGFyd2luIiBdICYmIFsgIiRIT01FIiA9ICIkUFdEIiBdOyB0aGVuCisgIGNkICIkKGRpcm5hbWUgIiQwIikiCitmaQorCitleGVjICIkSkFWQUNNRCIgIiRAIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcuYmF0IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L2dyYWRsZXcuYmF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTY0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvZ3JhZGxldy5iYXQKQEAgLTAsMCArMSw4NCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYNCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorQHJlbQ0KK0ByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cw0KK0ByZW0NCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwNCisNCitzZXQgRElSTkFNRT0lfmRwMA0KK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4NCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wDQorc2V0IEFQUF9IT01FPSVESVJOQU1FJQ0KKw0KK0ByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuDQorc2V0IERFRkFVTFRfSlZNX09QVFM9DQorDQorQHJlbSBGaW5kIGphdmEuZXhlDQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQ0KKw0KK3NldCBKQVZBX0VYRT1qYXZhLmV4ZQ0KKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxDQoraWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdA0KKw0KK2VjaG8uDQorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4NCitlY2hvLg0KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KKw0KK2dvdG8gZmFpbA0KKw0KKzpmaW5kSmF2YUZyb21KYXZhSG9tZQ0KK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUNCitzZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlDQorDQoraWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdA0KKw0KK2VjaG8uDQorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUNCitlY2hvLg0KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KKw0KK2dvdG8gZmFpbA0KKw0KKzppbml0DQorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cw0KKw0KK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzDQorDQorOndpbjl4TUVfYXJncw0KK0ByZW0gU2x1cnAgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuDQorc2V0IENNRF9MSU5FX0FSR1M9DQorc2V0IF9TS0lQPTINCisNCis6d2luOXhNRV9hcmdzX3NsdXJwDQoraWYgInglfjEiID09ICJ4IiBnb3RvIGV4ZWN1dGUNCisNCitzZXQgQ01EX0xJTkVfQVJHUz0lKg0KKw0KKzpleGVjdXRlDQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lDQorDQorc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcg0KKw0KK0ByZW0gRXhlY3V0ZSBHcmFkbGUNCisiJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUNCisNCis6ZW5kDQorQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQoraWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQNCisNCis6ZmFpbA0KK3JlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZg0KK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQ0KK2lmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxDQorZXhpdCAvYiAxDQorDQorOm1haW5FbmQNCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbA0KKw0KKzpvbWVnYQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zZXR0aW5ncy5ncmFkbGUgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc2V0dGluZ3MuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDAyYTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc2V0dGluZ3MuZ3JhZGxlCkBAIC0wLDAgKzEsMTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcm9vdFByb2plY3QubmFtZSA9ICdvcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvQXBwbGljYXRpb25Db250ZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvQXBwbGljYXRpb25Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgzMWVjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9BcHBsaWNhdGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkVudGl0eUZhY3Rvcnk7CisKKy8qKgorICogRXh0ZW5kcyB0aGUge0BsaW5rIEJhc2VBcHBsaWNhdGlvbkNvbnRleHR9IGludGVyZmFjZSB0byByZXR1cm4KKyAqIHtAbGluayBFbnRpdHlGYWN0b3J5fSBhbmQge0BsaW5rIEVudGl0eU1hbmFnZXJ9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQ29udGV4dCBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbkNvbnRleHQ8RW50aXR5RmFjdG9yeSwgRW50aXR5TWFuYWdlcj4geworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0FwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmRhZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0FwcGxpY2F0aW9uQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0OworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VBcHBsaWNhdGlvbkNvbnRleHRGYWN0b3J5OworCisvKioKKyAqIEV4dGVuZHMgdGhlIHtAbGluayBCYXNlQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeX0gaW50ZXJmYWNlIHRvIHJldHVybiBhbgorICoge0BsaW5rIEFwcGxpY2F0aW9uQ29udGV4dH0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeSBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbkNvbnRleHRGYWN0b3J5PEFwcGxpY2F0aW9uQ29udGV4dD4geworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvRW50aXR5TWFuYWdlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0VudGl0eU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk4MTAxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L0VudGl0eU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQmFzZUVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVmVyc2lvbmFibGU7CisKKy8qKgorICogRXh0ZW5kcyB0aGUge0BsaW5rIEJhc2VFbnRpdHlNYW5hZ2VyfSBpbnRlcmZhY2Ugd2l0aCBhZGRpdGlvbmFsIGxvYWQgbWV0aG9kcworICogZGVkaWNhdGVkIHRvIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIG1vZGVscy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGludGVyZmFjZSBFbnRpdHlNYW5hZ2VyIGV4dGVuZHMgQmFzZUVudGl0eU1hbmFnZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgdGhlIGVudGl0eSBpZGVudGlmaWVkIGJ5IGdpdmVuIGVudGl0eSBjbGFzcywge0BsaW5rIENvbnRleHRUeXBlfSBhbmQKKwkgKiBpdHMgaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVHlwZSBvZiB0aGUgcmV0dXJuZWQgZW50aXR5LgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKiBAcGFyYW0gaW5zdGFuY2VJRCAgVGhlIGluc3RhbmNlIElELgorCSAqIEByZXR1cm4gVGhlIGVudGl0eSB3aXRoIGdpdmVuIGluc3RhbmNlIElEIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gVCBsb2FkKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSwgU3RyaW5nIGluc3RhbmNlSUQpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8VD4gZW50aXRpZXMgPSBsb2FkKGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnN0YW5jZUlEKSk7CisJCWlmIChlbnRpdGllcy5zaXplKCkgIT0gMSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIGVudGl0eSBieSBpbnN0YW5jZSBJRC4iKTsKKwkJfQorCQlyZXR1cm4gZW50aXRpZXMuZ2V0KDApOworCisJfQorCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uOworCisJLyoqCisJICogTG9hZHMgYWxsIGF2YWlsYWJsZSBlbnRpdGllcyBvZiBnaXZlbiB0eXBlLgorCSAqCisJICogPHByZT4KKwkgKiB7CisJICogCSYjNjQ7Y29kZQorCSAqIAlMaXN0PENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzID0gZW50aXR5TWFuYWdlci5sb2FkQWxsKENhdGFsb2dDb21wb25lbnQuY2xhc3MsIFVOSVRVTkRFUlRFU1QpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVGhlIHtAbGluayBDb250ZXh0VHlwZX0uCisJICogQHJldHVybiBFbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGVudGl0aWVzLgorCSAqIEBzZWUgI2xvYWRBbGwoQ2xhc3MsIENvbnRleHRUeXBlLCBTdHJpbmcpCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRBbGwoZW50aXR5Q2xhc3MsIGNvbnRleHRUeXBlLCAiKiIpOworCX0KKworCS8qKgorCSAqIExvYWRzIGFsbCBhdmFpbGFibGUgZW50aXRpZXMgb2YgZ2l2ZW4gdHlwZSB3aG9zZSBuYW1lIGZ1bGZpbGxzIHRoZSBnaXZlbgorCSAqIHBhdHRlcm4uCisJICoKKwkgKiA8cHJlPgorCSAqIHsKKwkgKiAJJiM2NDtjb2RlCisJICogCS8vIHJldHJpZXZlIGFsbCB0ZW1wbGF0ZSByb290cyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoICdFeGFtcGxlJworCSAqIAlMaXN0PFRlbXBsYXRlUm9vdD4gdGVtcGxhdGVSb290cyA9IGVudGl0eU1hbmFnZXIubG9hZEFsbChUZW1wbGF0ZVJvb3QuY2xhc3MsIFVOSVRVTkRFUlRFU1QsICJFeGFtcGxlKiIpOworCSAqIH0KKwkgKiA8L3ByZT4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdGllcy4KKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVGhlIHtAbGluayBDb250ZXh0VHlwZX0uCisJICogQHBhcmFtIHBhdHRlcm4gICAgIElzIGFsd2F5cyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQKKwkgKiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcyBmb2xsb3dzOiAiPyIgZm9yIG9uZSBtYXRjaGluZyBjaGFyYWN0ZXIgYW5kCisJICogICAgICAgICAgICAgICAgICAgICIqIiBmb3IgYSBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gTWF0Y2hlZCBlbnRpdGllcyBhcmUgcmV0dXJuZWQgaW4gYSB7QGNvZGUgTGlzdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmV0cmlldmUgdGhlIGVudGl0aWVzLgorCSAqIEBzZWUgI2xvYWRBbGwoQ2xhc3MpCisJICovCisJPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZEFsbChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIFN0cmluZyBwYXR0ZXJuKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb247CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgbGF0ZXN0IHZhbGlkIHtAbGluayBWZXJzaW9uYWJsZX0gZW50aXR5IG9mIGdpdmVuIHR5cGUgYW5kIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGRlc2lyZWQgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgVHlwZSBvZiB0aGUgcmV0dXJuZWQgZW50aXR5LgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgZXhhY3QgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGVudGl0eS4KKwkgKiBAcmV0dXJuIE9wdGlvbmFsIGlzIGVtcHR5IGlmIG5vIHN1Y2ggZW50aXR5IHdhcyBmb3VuZAorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIFZlcnNpb25hYmxlPiBPcHRpb25hbDxUPiBsb2FkTGF0ZXN0VmFsaWQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbG9hZEFsbChlbnRpdHlDbGFzcywgbmFtZSkuc3RyZWFtKCkuZmlsdGVyKHYgLT4gdi5uYW1lRXF1YWxzKG5hbWUpKS5maWx0ZXIoVmVyc2lvbmFibGU6OmlzVmFsaWQpCisJCQkJLm1heChWZXJzaW9uYWJsZS5DT01QQVJBVE9SKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgbGF0ZXN0IHZhbGlkIHtAbGluayBWZXJzaW9uYWJsZX0gZW50aXR5IG9mIGdpdmVuIHR5cGUsCisJICoge0BsaW5rIENvbnRleHRUeXBlfSBhbmQgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICBUaGUgZGVzaXJlZCB0eXBlLgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUeXBlIG9mIHRoZSByZXR1cm5lZCBlbnRpdHkuCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBUaGUgZXhhY3QgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGVudGl0eS4KKwkgKiBAcmV0dXJuIE9wdGlvbmFsIGlzIGVtcHR5IGlmIG5vIHN1Y2ggZW50aXR5IHdhcyBmb3VuZAorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSBlbnRpdHkuCisJICovCisJZGVmYXVsdCA8VCBleHRlbmRzIFZlcnNpb25hYmxlPiBPcHRpb25hbDxUPiBsb2FkTGF0ZXN0VmFsaWQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlLAorCQkJU3RyaW5nIG5hbWUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRBbGwoZW50aXR5Q2xhc3MsIGNvbnRleHRUeXBlLCBuYW1lKS5zdHJlYW0oKS5maWx0ZXIodiAtPiB2Lm5hbWVFcXVhbHMobmFtZSkpCisJCQkJLmZpbHRlcihWZXJzaW9uYWJsZTo6aXNWYWxpZCkubWF4KFZlcnNpb25hYmxlLkNPTVBBUkFUT1IpOworCX0KKworCTxUIGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGF0dGVybik7CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgcmVmZXJlY2VkIHtAbGluayBUZW1wbGF0ZVRlc3R9IGZvciBhIHtAbGluayBUZXN0fS4KKwkgKiAKKwkgKiBAcGFyYW0gdGVzdCB7QGxpbmsgVGVzdH0gcmVmZXJlbmNpbmcgdGhlIGRlc2lyZWQgdGVtcGxhdGUKKwkgKiBAcmV0dXJuIHtAbGluayBPcHRpb25hbH0gd2l0aCB0aGUgbG9hZGVkIHtAbGluayBUZW1wbGF0ZVRlc3R9CisJICovCisJT3B0aW9uYWw8VGVtcGxhdGVUZXN0PiBsb2FkVGVtcGxhdGUoVGVzdCB0ZXN0KTsKKworCS8qKgorCSAqIExvYWRzIHRoZSByZWZlcmVuY2VkIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfSBmb3IgYSB7QGxpbmsgVGVzdFN0ZXB9CisJICogCisJICogQHBhcmFtIHRlc3RTdGVwIHtAbGluayBUZXN0U3RlcH0gcmVmZXJlbmNpbmcgdGhlIGRlc2lyZWQgdGVtcGxhdGUKKwkgKiBAcmV0dXJuIHtAbGluayBPcHRpb25hbH0gd2l0aCB0aGUgbG9hZGVkIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfQorCSAqLworCU9wdGlvbmFsPFRlbXBsYXRlVGVzdFN0ZXA+IGxvYWRUZW1wbGF0ZShUZXN0U3RlcCB0ZXN0U3RlcCk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvQ2F0YWxvZ0F0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzZjMjBkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDMyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNvcnRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjYXRhbG9nIGF0dHJpYnV0ZSBlbnRpdHkgdHlwZS4gQSBjYXRhbG9nIGF0dHJpYnV0ZSBpcyBhCisgKiBnZW5lcmljIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbiB0byBzdG9yZSBjb250ZXh0IGRhdGEgKCJhcyBtZWFzdXJlZCIsICJhcworICogb3JkZXJlZCIpLiBJdCBhbHdheXMgYmVsb25ncyB0byBhIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSBvciBhCisgKiB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0uIEl0cyBuYW1lIGhhcyB0byBiZSB1bmlxdWUgd2l0aGluIHRoZSBwYXJlbnQgYW5kIG1heQorICogbm90IGJlIGNoYW5nZWQsIG9uY2Ugd3JpdHRlbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgQ2F0YWxvZ0NvbXBvbmVudAorICogQHNlZSBDYXRhbG9nU2Vuc29yCisgKi8KK3B1YmxpYyBjbGFzcyBDYXRhbG9nQXR0cmlidXRlIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSwgRGVzY3JpYmFibGUsIFNvcnRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUgJ1ZhbHVlTGlzdFJlZmVyZW5jZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MSVNUX1JFRkVSRU5DRSA9ICJWYWx1ZUxpc3RSZWYiOworCisJLyoqCisJICogVGhlICdWYWx1ZUNvcHlhYmxlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NPUFlBQkxFID0gIlZhbHVlQ29weWFibGUiOworCisJLyoqCisJICogVGhlICdBY3Rpb25SZXF1ZXN0Q2xhc3NuYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0FDVElPTl9SRVFVRVNUX0NMQVNTTkFNRSA9ICJBY3Rpb25SZXF1ZXN0Q2xhc3NuYW1lIjsKKworCS8qKgorCSAqIFRoZSA8dT52aXJ0dWFsPC91PiAne0BsaXRlcmFsIEB9RW51bWVyYXRpb25OYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVRUUl9FTlVNRVJBVElPTl9OQU1FID0gIkBFbnVtZXJhdGlvbk5hbWUiOworCisJLyoqCisJICogVGhlIDx1PnZpcnR1YWw8L3U+ICd7QGxpdGVyYWwgQH1TY2FsYXJUeXBlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVRUUl9TQ0FMQVJfVFlQRSA9ICJAU2NhbGFyVHlwZSI7CisKKwkvKioKKwkgKiBUaGUgPHU+dmlydHVhbDwvdT4gJ3tAbGl0ZXJhbCBAfVNlcXVlbmNlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQVRUUl9TRVFVRU5DRSA9ICJAU2VxdWVuY2UiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgRW51bWVyYXRpb248Pz4gZW51bWVyYXRpb25PYmo7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZSBzY2FsYXJUeXBlVmFsdWU7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZSBzZXF1ZW5jZVZhbHVlOworCisJcHJpdmF0ZSBVbml0IHVuaXQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCUNhdGFsb2dBdHRyaWJ1dGUoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCisJCU1hcDxTdHJpbmcsIFZhbHVlPiB2YWx1ZXMgPSBjb3JlLmdldFZhbHVlcygpOworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKwkJVmFsdWUgZW51bVZhbHVlID0gdmFsdWVzLnJlbW92ZShWQVRUUl9FTlVNRVJBVElPTl9OQU1FKTsKKwkJaWYgKGVudW1WYWx1ZSAhPSBudWxsKSB7CisJCQllbnVtZXJhdGlvbk9iaiA9IGVyLmdldChlbnVtVmFsdWUuZXh0cmFjdChWYWx1ZVR5cGUuU1RSSU5HKSk7CisJCX0KKwkJc2NhbGFyVHlwZVZhbHVlID0gdmFsdWVzLnJlbW92ZShWQVRUUl9TQ0FMQVJfVFlQRSk7CisJCXNlcXVlbmNlVmFsdWUgPSB2YWx1ZXMucmVtb3ZlKFZBVFRSX1NFUVVFTkNFKTsKKworCQl1bml0ID0gY29yZS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVW5pdC5jbGFzcyk7CisJCWNvcmUuZ2V0TXV0YWJsZVN0b3JlKCkucmVtb3ZlKFVuaXQuY2xhc3MpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGl0IGlzIGFsbG93ZWQgdG8gc3RvcmUgb3RoZXIgZGF0YSB0aGFuIHRob3NlIHByb3ZpZGVkIHZpYQorCSAqIHJlbGF0ZWQge0BsaW5rIFZhbHVlTGlzdH0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIGZhbHNlfSBpZiBpdCBpcyBhbGxvd2VkIHRvIHN0b3JlIG90aGVyIHZhbHVlcyB0aGVuCisJICogICAgICAgICB0aG9zZSBwcm92aWRlZC4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc1ZhbHVlTGlzdFJlZmVyZW5jZSgpIHsKKwkJYm9vbGVhbiB2YWx1ZUxpc3RSZWZlcmVuY2UgPSBnZXRWYWx1ZShBVFRSX1ZBTFVFX0xJU1RfUkVGRVJFTkNFKS5leHRyYWN0KCk7CisJCXJldHVybiB2YWx1ZUxpc3RSZWZlcmVuY2UgJiYgZ2V0VmFsdWVMaXN0KCkuaXNQcmVzZW50KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyB2YWx1ZSByZWZlcmVuY2UgZmxhZyBmb3IgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZUxpc3RSZWZlcmVuY2UgVGhlIG5ldyB2YWx1ZSBsaXN0IHJlZmVyZW5jZSBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlTGlzdFJlZmVyZW5jZShCb29sZWFuIHZhbHVlTGlzdFJlZmVyZW5jZSkgeworCQlnZXRWYWx1ZShBVFRSX1ZBTFVFX0xJU1RfUkVGRVJFTkNFKS5zZXQodmFsdWVMaXN0UmVmZXJlbmNlKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBpdCBpcyBhbGxvd2VkIHRvIGNvcHkgdGhlIGNvbnRhaW5lZCB2YWx1ZSBpbiBjYXNlIG9mIGFuCisJICogYXNzb2NpYXRlZCBkZXNjcmlwdGl2ZSBjb21wb25lbnQgaXMgY29waWVkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBpdCBhbGxvd2VkIHRvIGNvcHkgYSBjb250YWluZWQgdmFsdWUuCisJICovCisJcHVibGljIEJvb2xlYW4gaXNWYWx1ZUNvcHlhYmxlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9WQUxVRV9DT1BZQUJMRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgdmFsdWUgY29weWFibGUgZmxhZyBmb3IgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZUNvcHlhYmxlIFRoZSBuZXcgdmFsdWUgY29weWFibGUgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvcHlhYmxlKEJvb2xlYW4gdmFsdWVDb3B5YWJsZSkgeworCQlnZXRWYWx1ZShBVFRSX1ZBTFVFX0NPUFlBQkxFKS5zZXQodmFsdWVDb3B5YWJsZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgYWN0aW9uIHJlcXVlc3QgY2xhc3MgbmFtZSBvZiB0aGlzIGNhdGFsb2cgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBUaGUgYWN0aW9uIHJlcXVlc3QgY2xhc3MgbmFtZSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldEFjdGlvblJlcXVlc3RDbGFzc25hbWUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0FDVElPTl9SRVFVRVNUX0NMQVNTTkFNRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgYWN0aW9uIHJlcXVlc3QgY2xhc3MgbmFtZSBmb3IgdGhpcyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gYWN0aW9uUmVxdWVzdENsYXNzbmFtZSBUaGUgbmV3IGFjdGlvbiByZXF1ZXN0IGNsYXNzIG5hbWUuCisJICovCisJcHVibGljIHZvaWQgc2V0QWN0aW9uUmVxdWVzdENsYXNzbmFtZShTdHJpbmcgYWN0aW9uUmVxdWVzdENsYXNzbmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX0FDVElPTl9SRVFVRVNUX0NMQVNTTkFNRSkuc2V0KGFjdGlvblJlcXVlc3RDbGFzc25hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlbGF0ZWQge0BsaW5rIFZhbHVlTGlzdH0uCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgbm8ge0Bjb2RlIFZhbHVlTGlzdH0gaXMgcmVsYXRlZC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VmFsdWVMaXN0PiBnZXRWYWx1ZUxpc3QoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVmFsdWVMaXN0LmNsYXNzKSk7CisJfQorCisJLyoqCisJICogUmVwbGFjZXMgY3VycmVudCB7QGxpbmsgVmFsdWVMaXN0fSByZWxhdGlvbiB3aXRoIHRoZSBnaXZlbiBvbmUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVMaXN0IFRoZSBuZXcge0Bjb2RlIFZhbHVlTGlzdH0gbWF5IGJlIG51bGwuCisJICovCisJcHVibGljIHZvaWQgc2V0VmFsdWVMaXN0KFZhbHVlTGlzdCB2YWx1ZUxpc3QpIHsKKwkJaWYgKHZhbHVlTGlzdCA9PSBudWxsKSB7CisJCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkucmVtb3ZlKFZhbHVlTGlzdC5jbGFzcyk7CisJCQlzZXRWYWx1ZUxpc3RSZWZlcmVuY2UoQm9vbGVhbi5GQUxTRSk7CisJCX0gZWxzZSB7CisJCQlnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHZhbHVlTGlzdCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0BsaW5rIENhdGFsb2dTZW5zb3J9IGlzIHBhcmVudCBvZgorCSAqICAgICAgICAgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYXRhbG9nU2Vuc29yKCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8Q2F0YWxvZ0NvbXBvbmVudD4gZ2V0Q2F0YWxvZ0NvbXBvbmVudCgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KENhdGFsb2dDb21wb25lbnQuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIENhdGFsb2dTZW5zb3J9LgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0BsaW5rIENhdGFsb2dDb21wb25lbnR9IGlzIHBhcmVudCBvZgorCSAqICAgICAgICAgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXRDYXRhbG9nQ29tcG9uZW50KCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8Q2F0YWxvZ1NlbnNvcj4gZ2V0Q2F0YWxvZ1NlbnNvcigpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGFuZCB1bm1vZGlmaWFibGUge0BsaW5rIFZhbHVlVHlwZX0gb2YgdGhpcyBjYXRhbG9nCisJICogYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFZhbHVlVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlVHlwZTw/PiBnZXRWYWx1ZVR5cGUoKSB7CisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZSA9IHNjYWxhclR5cGVWYWx1ZS5leHRyYWN0KCk7CisJCUJvb2xlYW4gc2VxdWVuY2UgPSBzZXF1ZW5jZVZhbHVlLmV4dHJhY3QoKTsKKwkJcmV0dXJuIHNlcXVlbmNlLmJvb2xlYW5WYWx1ZSgpID8gc2NhbGFyVHlwZS50b1ZhbHVlVHlwZSgpIDogc2NhbGFyVHlwZS50b1NpbmdsZVZhbHVlVHlwZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZpcnR1YWwgYW5kIHVubW9kaWZpYWJsZSBlbnVtZXJhdGlvbiBjbGFzcyBvZiB0aGlzIGNhdGFsb2cKKwkgKiBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBlbnVtZXJhdGlvbiBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBUaHJvd24gaWYgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZSdzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFZhbHVlVHlwZX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBWYWx1ZVR5cGUjaXNFbnVtZXJhdGlvblR5cGUoKX0gaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKwlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bWVyYXRpb25PYmplY3QoKSB7CisJCWlmICghZ2V0VmFsdWVUeXBlKCkuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2F0YWxvZyBhdHRyaWJ1dGUgaXMgbm90IG9mIHR5cGUgZW51bWVyYXRpb24uIik7CisJCX0KKwkJcmV0dXJuIGVudW1lcmF0aW9uT2JqOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBVbml0fSBvZiB0aGlzIGNhdGFsb2cgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIG5vIHVuaXQgaXMgZGVmaW5lZC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VW5pdD4gZ2V0VW5pdCgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUodW5pdCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyB7QGxpbmsgVW5pdH0gZm9yIHRoaXMgY2F0YWxvZyBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gdW5pdCBUaGUgbmV3IHtAY29kZSBVbml0fSBtYXkgYmUgbnVsbC4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRVbml0KFVuaXQgdW5pdCkgeworCQl0aGlzLnVuaXQgPSB1bml0OworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZSA9IHNjYWxhclR5cGVWYWx1ZS5leHRyYWN0KCk7CisJCXNiLmFwcGVuZCgiU2NhbGFyVHlwZSA9ICIpLmFwcGVuZChzY2FsYXJUeXBlKTsKKwkJaWYgKHNjYWxhclR5cGUuaXNFbnVtZXJhdGlvbigpKSB7CisJCQlzYi5hcHBlbmQoIiwgRW51bWVyYXRpb25PYmplY3QgPSAiKS5hcHBlbmQoZ2V0RW51bWVyYXRpb25PYmplY3QoKSk7CisJCX0KKworCQlzYi5hcHBlbmQoIiwgU2VxdWVuY2UgPSAiKS5hcHBlbmQoKGJvb2xlYW4pIHNlcXVlbmNlVmFsdWUuZXh0cmFjdCgpKTsKKworCQlPcHRpb25hbDxVbml0PiBjYXRhbG9nVW5pdCA9IGdldFVuaXQoKTsKKwkJaWYgKGNhdGFsb2dVbml0LmlzUHJlc2VudCgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVW5pdCA9ICIpLmFwcGVuZChjYXRhbG9nVW5pdC5nZXQoKSk7CisJCX0KKworCQlzYi5hcHBlbmQoIiwgIikuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFNldHMge0BsaW5rIFZhbHVlVHlwZX0gb2YgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgVGhlIHtAbGluayBWYWx1ZVR5cGV9LgorCSAqLworCXZvaWQgc2V0VmFsdWVUeXBlKFZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUpIHsKKwkJRW51bWVyYXRpb248Pz4gc2NhbGFyVHlwZUVudW0gPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFKTsKKwkJc2NhbGFyVHlwZVZhbHVlLnNldChzY2FsYXJUeXBlRW51bS52YWx1ZU9mKHZhbHVlVHlwZS50b1NpbmdsZVR5cGUoKS5uYW1lKCkpKTsKKwkJc2VxdWVuY2VWYWx1ZS5zZXQodmFsdWVUeXBlLmlzU2VxdWVuY2UoKSk7CisJfQorCisJLyoqCisJICogU2V0cyBlbnVtZXJhdGlvbiBPYmplY3Qgb2YgdGhpcyBjYXRhbG9nIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbk9iaiBUaGUgZW51bWVyYXRpb24uCisJICovCisJdm9pZCBzZXRFbnVtZXJhdGlvbk9iaihFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbk9iaikgeworCQlzZXRWYWx1ZVR5cGUoVmFsdWVUeXBlLkVOVU1FUkFUSU9OKTsKKwkJdGhpcy5lbnVtZXJhdGlvbk9iaiA9IGVudW1lcmF0aW9uT2JqOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dDb21wb25lbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9DYXRhbG9nQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxZGMxOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9DYXRhbG9nQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSwxOTIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRhdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjYXRhbG9nIGNvbXBvbmVudCBlbnRpdHkgdHlwZS4gQSBjYXRhbG9nIGNvbXBvbmVudCBhY3RzCisgKiBhcyBhIGNvbnRhaW5lciB0byBzdG9yZSBjb250ZXh0IGRhdGEgKCJhcyBtZWFzdXJlZCIsICJhcyBvcmRlcmVkIikuIEVhY2gKKyAqIGNhdGFsb2cgY29tcG9uZW50IGhhcyBhIGNvcnJlc3BvbmRpbmcgZW50aXR5IHR5cGUgd2hvc2UgbmFtZSBpcyBlcXVhbCB0byB0aGUKKyAqIG5hbWUgb2YgdGhlIGNhdGFsb2cgY29tcG9uZW50LiBUaGVyZWZvcmUgdGhlIG5hbWUgb2YgYSBjYXRhbG9nIGNvbXBvbmVudCBoYXMKKyAqIHRvIGJlIHVuaXF1ZSBhbmQgaXMgbm90IGFsbG93ZWQgdG8gYmUgbW9kaWZpZWQsIG9uY2Ugd3JpdHRlbi4gQSBjYXRhbG9nCisgKiBjb21wb25lbnQgY29uc2lzdHMgb2Yge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IHdoaWNoIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGVzCisgKiBvZiB0aGlzIGNvbnRhaW5lci4gSW4gY2FzZSBvZiB7QGxpbmsgQ29udGV4dFR5cGUjVEVTVEVRVUlQTUVOVH0gaXQgbWF5IGhhdmUKKyAqIHtAbGluayBDYXRhbG9nU2Vuc29yfXMgd2hpY2ggZGVzY3JpYmUgdGhlIGF2YWlsYWJsZSBtZWFzdXJlbWVudCBzZW5zb3JzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDYXRhbG9nQXR0cmlidXRlCisgKiBAc2VlIENhdGFsb2dTZW5zb3IKKyAqLworcHVibGljIGNsYXNzIENhdGFsb2dDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJQ2F0YWxvZ0NvbXBvbmVudChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisKKwkJU3RyaW5nIHR5cGVOYW1lID0gY29yZS5nZXRUeXBlTmFtZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5ST09UKTsKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZUNhbmRpZGF0ZSA6IENvbnRleHRUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAodHlwZU5hbWUuY29udGFpbnMoY29udGV4dFR5cGVDYW5kaWRhdGUubmFtZSgpKSkgeworCQkJCWNvbnRleHRUeXBlID0gY29udGV4dFR5cGVDYW5kaWRhdGU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29yZSBpcyBpbmNvbXBhdGlibGUuIik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRUeXBlfSBvZiB0aGlzIGNhdGFsb2cgY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENvbnRleHRUeXBlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoKSB7CisJCXJldHVybiBjb250ZXh0VHlwZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPENhdGFsb2dBdHRyaWJ1dGU+IGdldENhdGFsb2dBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENhdGFsb2dBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKGNhIC0+IGNhLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9cyByZWxhdGVkIHRvIHRoaXMgY2F0YWxvZworCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZXMoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldChDYXRhbG9nQXR0cmlidXRlLmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHRoYXQgaGFzIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZC4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVDYXRhbG9nQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPENhdGFsb2dBdHRyaWJ1dGU+IGNhdGFsb2dBdHRyaWJ1dGUgPSBnZXRDYXRhbG9nQXR0cmlidXRlKG5hbWUpOworCQlpZiAoY2F0YWxvZ0F0dHJpYnV0ZS5pc1ByZXNlbnQoKSkgeworCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUoY2F0YWxvZ0F0dHJpYnV0ZS5nZXQoKSk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHtAY29kZSBDYXRhbG9nU2Vuc29yfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIENhdGFsb2dTZW5zb3J9IHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPENhdGFsb2dTZW5zb3I+IGdldENhdGFsb2dTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldENhdGFsb2dTZW5zb3JzKCkuc3RyZWFtKCkuZmlsdGVyKGNzIC0+IGNzLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIENhdGFsb2dTZW5zb3J9cyByZWxhdGVkIHRvIHRoaXMgY2F0YWxvZworCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8Q2F0YWxvZ1NlbnNvcj4gZ2V0Q2F0YWxvZ1NlbnNvcnMoKSB7CisJCWlmIChjb250ZXh0VHlwZS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBDYXRhbG9nU2Vuc29yfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0gd2l0aCBnaXZlbiBuYW1lIGhhcworCSAqICAgICAgICAgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZUNhdGFsb2dTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJT3B0aW9uYWw8Q2F0YWxvZ1NlbnNvcj4gY2F0YWxvZ1NlbnNvciA9IGdldENhdGFsb2dTZW5zb3IobmFtZSk7CisJCWlmIChjYXRhbG9nU2Vuc29yLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZShjYXRhbG9nU2Vuc29yLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoIkNvbnRleHRUeXBlID0gIikuYXBwZW5kKGdldENvbnRleHRUeXBlKCkpLmFwcGVuZCgiLCAiKTsKKwkJc2IuYXBwZW5kKGdldFZhbHVlcygpLnZhbHVlcygpLnN0cmVhbSgpLm1hcChWYWx1ZTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisKKwkJTGlzdDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcyA9IGdldENhdGFsb2dBdHRyaWJ1dGVzKCk7CisJCWlmICghY2F0YWxvZ0F0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgQ2F0YWxvZ0F0dHJpYnV0ZXMgPSAiKS5hcHBlbmQoY2F0YWxvZ0F0dHJpYnV0ZXMpOworCQl9CisKKwkJTGlzdDxDYXRhbG9nU2Vuc29yPiBjYXRhbG9nU2Vuc29ycyA9IGdldENhdGFsb2dTZW5zb3JzKCk7CisJCWlmICghY2F0YWxvZ1NlbnNvcnMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgQ2F0YWxvZ1NlbnNvcnMgPSAiKS5hcHBlbmQoY2F0YWxvZ1NlbnNvcnMpOworCQl9CisKKwkJcmV0dXJuIHNiLmFwcGVuZCgnKScpLnRvU3RyaW5nKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvQ2F0YWxvZ1NlbnNvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dTZW5zb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY1YWJkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NhdGFsb2dTZW5zb3IuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGF0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGNhdGFsb2cgc2Vuc29yIGVudGl0eSB0eXBlLiBBIGNhdGFsb2cgc2Vuc29yIGFjdHMgYXMgYQorICogY29udGFpbmVyIHRvIHN0b3JlIHNlbnNvciBjb250ZXh0IGRhdGEgKCJhcyBtZWFzdXJlZCIsICJhcyBvcmRlcmVkIikuIEl0CisgKiBhbHdheXMgYmVsb25ncyB0byBhIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSBvZiB0eXBlCisgKiB7QGxpbmsgQ29udGV4dFR5cGUjVEVTVEVRVUlQTUVOVH0uIEVhY2ggY2F0YWxvZyBzZW5zb3IgaGFzIGEgY29ycmVzcG9uZGluZworICogZW50aXR5IHR5cGUgd2hvc2UgbmFtZSBpcyBlcXVhbCB0byB0aGUgbmFtZSBvZiB0aGUgY2F0YWxvZyBzZW5zb3IuIFRoZXJlZm9yZQorICogdGhlIG5hbWUgb2YgYSBjYXRhbG9nIHNlbnNvciBoYXMgdG8gYmUgdW5pcXVlIGFuZCBpcyBub3QgYWxsb3dlZCB0byBiZQorICogbW9kaWZpZWQsIG9uY2Ugd3JpdHRlbi4gQSBjYXRhbG9nIHNlbnNvciBjb25zaXN0cyBvZiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0KKyAqIHdoaWNoIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgY29udGFpbmVyLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDYXRhbG9nQ29tcG9uZW50CisgKiBAc2VlIENhdGFsb2dDb21wb25lbnQKKyAqLworcHVibGljIGNsYXNzIENhdGFsb2dTZW5zb3IgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCUNhdGFsb2dTZW5zb3IoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDYXRhbG9nQ29tcG9uZW50IGdldENhdGFsb2dDb21wb25lbnQoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoQ2F0YWxvZ0NvbXBvbmVudC5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0uCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9wdGlvbmFsfSBpcyBlbXB0eSBpZiBhIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB3aXRoCisJICogICAgICAgICBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxDYXRhbG9nQXR0cmlidXRlPiBnZXRDYXRhbG9nQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCXJldHVybiBnZXRDYXRhbG9nQXR0cmlidXRlcygpLnN0cmVhbSgpLmZpbHRlcihjYSAtPiBjYS5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIGNhdGFsb2cKKwkgKiBzZW5zb3IuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PENhdGFsb2dBdHRyaWJ1dGU+IGdldENhdGFsb2dBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB3aXRoIGdpdmVuIG5hbWUKKwkgKiAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlQ2F0YWxvZ0F0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCQlPcHRpb25hbDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlID0gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZShuYW1lKTsKKwkJaWYgKGNhdGFsb2dBdHRyaWJ1dGUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKGNhdGFsb2dBdHRyaWJ1dGUuZ2V0KCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoVmFsdWU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCisJCUxpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ0F0dHJpYnV0ZXMgPSBnZXRDYXRhbG9nQXR0cmlidXRlcygpOworCQlpZiAoIWNhdGFsb2dBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgeworCQkJc2IuYXBwZW5kKCIsIENhdGFsb2dBdHRyaWJ1dGVzID0gIikuYXBwZW5kKGNhdGFsb2dBdHRyaWJ1dGVzKTsKKwkJfQorCisJCXJldHVybiBzYi5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NsYXNzaWZpY2F0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvQ2xhc3NpZmljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2I5MWZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0NsYXNzaWZpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CisKK3B1YmxpYyBjbGFzcyBDbGFzc2lmaWNhdGlvbiBleHRlbmRzIEJhc2VFbnRpdHkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlDbGFzc2lmaWNhdGlvbihDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLyoqCisJICogQXNzaWducyB0aGlzIHN0YXR1cyB0byBnaXZlbiB7QGxpbmsgU3RhdHVzQXR0YWNoYWJsZX1zLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgIFRoZSBzdGF0dXMgYXR0YWNoYWJsZSB0eXBlLgorCSAqIEBwYXJhbSBzdGF0dXNBdHRhY2hhYmxlcyBUaGlzIHN0YXR1cyB3aWxsIGJlIGFzc2lnbmVkIHRvIGFsbCBvZiB0aGVtLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHZvaWQgYXNzaWduKExpc3Q8VD4gc3RhdHVzQXR0YWNoYWJsZXMpIHsKKwkJc3RhdHVzQXR0YWNoYWJsZXMuZm9yRWFjaCh0aGlzOjphc3NpZ24pOworCX0KKworCS8qKgorCSAqIEFzc2lnbnMgdGhpcyBzdGF0dXMgdG8gZ2l2ZW4ge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9LgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgVGhlIHN0YXR1cyBhdHRhY2hhYmxlIHR5cGUuCisJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGUgVGhpcyBzdGF0dXMgd2lsbCBiZSBhc3NpZ25lZCB0byBpdC4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBTdGF0dXNBdHRhY2hhYmxlPiB2b2lkIGFzc2lnbihUIHN0YXR1c0F0dGFjaGFibGUpIHsKKwkJZ2V0Q29yZShzdGF0dXNBdHRhY2hhYmxlKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGhpcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0RvbWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0RvbWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMWZjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRG9tYWluLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKKworcHVibGljIGNsYXNzIERvbWFpbiBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZXNjcmliYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCURvbWFpbihDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0VudGl0eUZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FbnRpdHlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4ZDc2MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FbnRpdHlGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMjQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUXVhbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WZXJzaW9uU3RhdGU7CisKKy8qKgorICogQ3JlYXRlcyBuZXcgZW50aXRpZXMgb2YgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gbW9kZWwuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFbnRpdHlGYWN0b3J5IGV4dGVuZHMgQmFzZUVudGl0eUZhY3RvcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUm9sZX0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBSb2xlfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBSb2xlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKFN0cmluZyBuYW1lKSB7CisJCVJvbGUgcm9sZSA9IG5ldyBSb2xlKGNyZWF0ZUNvcmUoUm9sZS5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJcm9sZS5zZXROYW1lKG5hbWUpOworCisJCXJldHVybiByb2xlOworCX0KKworCS8qKgorCSAqIEFsd2F5cyB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gc2luY2UgaW4gYSBkZWZhdWx0IG1vZGVsIGVhY2gKKwkgKiB7QGxpbmsgVGVzdH0gaGFzIGEgcGFyZW50IHtAbGluayBQb29sfS4KKwkgKgorCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gSXMgYWx3YXlzIHRocm93bi4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVGVzdCBjcmVhdGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGVzdCByZXF1aXJlcyBhIHBhcmVudCBQb29sLiIpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByb2plY3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgUHJvamVjdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUHJvamVjdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFByb2plY3QgY3JlYXRlUHJvamVjdChTdHJpbmcgbmFtZSkgeworCQlQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdChjcmVhdGVDb3JlKFByb2plY3QuY2xhc3MpKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXByb2plY3Quc2V0TmFtZShuYW1lKTsKKworCQlyZXR1cm4gcHJvamVjdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQb29sfSBmb3IgZ2l2ZW4ge0BsaW5rIFByb2plY3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgUG9vbH0uCisJICogQHBhcmFtIHByb2plY3QgVGhlIHBhcmVudCB7QGNvZGUgUHJvamVjdH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgUG9vbH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFBvb2wgY3JlYXRlUG9vbChTdHJpbmcgbmFtZSwgUHJvamVjdCBwcm9qZWN0KSB7CisJCVBvb2wgcG9vbCA9IG5ldyBQb29sKGNyZWF0ZUNvcmUoUG9vbC5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHBvb2wpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHByb2plY3QpOworCQlnZXRDb3JlKHByb2plY3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQocG9vbCk7CisKKwkJLy8gcHJvcGVydGllcworCQlwb29sLnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIHBvb2w7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdH0gZm9yIGdpdmVuIHtAbGluayBQb29sfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBwb29sIFRoZSBwYXJlbnQge0Bjb2RlIFBvb2x9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZXN0IGNyZWF0ZVRlc3QoU3RyaW5nIG5hbWUsIFBvb2wgcG9vbCkgeworCQlyZXR1cm4gY3JlYXRlVGVzdChuYW1lLCBwb29sLCAoU3RhdHVzKSBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSBmb3IgZ2l2ZW4ge0BsaW5rIFBvb2x9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBwb29sICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgUG9vbH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdCBUaGUgdGVtcGxhdGUgdGhlIHJldHVybmVkIHtAY29kZSBUZXN0fSB3aWxsIGJlIGRlcml2ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJLy8gVE9ETyBtYWtlIGEgZGVjaXNpb246IHN0YXR1cyBpbiBvciBvdXQhCisJcHVibGljIFRlc3QgY3JlYXRlVGVzdChTdHJpbmcgbmFtZSwgUG9vbCBwb29sLCBUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0KSB7CisJCXJldHVybiBjcmVhdGVUZXN0KG5hbWUsIHBvb2wsIG51bGwsIG51bGwsIHRlbXBsYXRlVGVzdCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dFJvb3R9IGZvciBnaXZlbiB7QGxpbmsgVGVzdFN0ZXB9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlUm9vdH0uCisJICoKKwkgKiBAcGFyYW0gdGVzdFN0ZXAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3RTdGVwfS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVSb290IFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIENvbnRleHRSb290fSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0Um9vdCBjcmVhdGVDb250ZXh0Um9vdChUZXN0U3RlcCB0ZXN0U3RlcCwgVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCkgeworCQlDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA9IGNyZWF0ZUNvbnRleHRSb290KHRlbXBsYXRlUm9vdCk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdFN0ZXApLmdldE11dGFibGVTdG9yZSgpLnNldChjb250ZXh0Um9vdCwgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpOworCisJCXJldHVybiBjb250ZXh0Um9vdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb250ZXh0Um9vdH0gZm9yIGdpdmVuIHtAbGluayBNZWFzdXJlbWVudH0gdXNpbmcgZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVSb290fS4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudCAgVGhlIHBhcmVudCB7QGNvZGUgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVJvb3QgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgQ29udGV4dFJvb3R9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0Um9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbnRleHRSb290IGNyZWF0ZUNvbnRleHRSb290KE1lYXN1cmVtZW50IG1lYXN1cmVtZW50LCBUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290KSB7CisJCXJldHVybiBjcmVhdGVDb250ZXh0Um9vdChBcnJheXMuYXNMaXN0KG1lYXN1cmVtZW50KSwgdGVtcGxhdGVSb290KTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb250ZXh0Um9vdH0gZm9yIGdpdmVuIHtAbGluayBMaXN0fSBpZgorCSAqIHtAbGluayBNZWFzdXJlbWVudH1zIHVzaW5nIGdpdmVuIHtAbGluayBUZW1wbGF0ZVJvb3R9LiBJZiBMaXN0IGlzIG51bGwgb3IKKwkgKiBlbXB0eSBjb250ZXh0IHJvb3QgaXMgY3JlYXRlZCB3aXRoIG5vIHJlbGF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlbWVudHMgVGhlIHBhcmVudCB7QGNvZGUgTWVhc3VyZW1lbnR9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVJvb3QgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgQ29udGV4dFJvb3R9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDb250ZXh0Um9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbnRleHRSb290IGNyZWF0ZUNvbnRleHRSb290KExpc3Q8TWVhc3VyZW1lbnQ+IG1lYXN1cmVtZW50cywgVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCkgeworCQlDb250ZXh0Um9vdCBjb250ZXh0Um9vdCA9IGNyZWF0ZUNvbnRleHRSb290KHRlbXBsYXRlUm9vdCk7CisKKwkJLy8gcmVsYXRpb25zCisJCWlmIChtZWFzdXJlbWVudHMgIT0gbnVsbCAmJiAhbWVhc3VyZW1lbnRzLmlzRW1wdHkoKSkgeworCQkJbWVhc3VyZW1lbnRzLmZvckVhY2gobSAtPiBnZXRDb3JlKG0pLmdldE11dGFibGVTdG9yZSgpLnNldChjb250ZXh0Um9vdCwgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpKTsKKwkJfQorCisJCXJldHVybiBjb250ZXh0Um9vdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBDb250ZXh0Um9vdH0gdXNpbmcgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlUm9vdH0uCisJICoKKwkgKiBAcGFyYW0gdGVtcGxhdGVSb290IFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIENvbnRleHRSb290fSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0Um9vdCBjcmVhdGVDb250ZXh0Um9vdChUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290KSB7CisJCUNvbnRleHRSb290IGNvbnRleHRSb290ID0gY3JlYXRlQ29udGV4dFJvb3QodGVtcGxhdGVSb290LmdldE5hbWUoKSwgdGVtcGxhdGVSb290LmdldENvbnRleHRUeXBlKCkpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNvbnRleHRSb290KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGVtcGxhdGVSb290KTsKKworCQkvLyBjcmVhdGUgZGVmYXVsdCBhY3RpdmUgYW5kIG1hbmRhdG9yeSBjb250ZXh0IGNvbXBvbmVudHMKKwkJdGVtcGxhdGVSb290LmdldFRlbXBsYXRlQ29tcG9uZW50cygpLnN0cmVhbSgpCisJCQkJLmZpbHRlcihUZW1wbGF0ZUNvbXBvbmVudC5JU19ERUZBVUxUX0FDVElWRS5vcihUZW1wbGF0ZUNvbXBvbmVudC5JU19NQU5EQVRPUlkpKQorCQkJCS5mb3JFYWNoKHRlbXBsYXRlQ29tcG9uZW50IC0+IHsKKwkJCQkJY3JlYXRlQ29udGV4dENvbXBvbmVudCh0ZW1wbGF0ZUNvbXBvbmVudC5nZXROYW1lKCksIGNvbnRleHRSb290KTsKKwkJCQl9KTsKKworCQlyZXR1cm4gY29udGV4dFJvb3Q7CisJfQorCisJLyoqCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IHdpdGggZ2l2ZW4gbmFtZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGV4aXN0LgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBDb250ZXh0Q29tcG9uZW50IGNyZWF0ZUNvbnRleHRDb21wb25lbnQoU3RyaW5nIG5hbWUsIENvbnRleHRSb290IGNvbnRleHRSb290KSB7CisJCWlmIChjb250ZXh0Um9vdC5nZXRDb250ZXh0Q29tcG9uZW50KG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZXh0IGNvbXBvbmVudCB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlUZW1wbGF0ZVJvb3QgdGVtcGxhdGVSb290ID0gVGVtcGxhdGVSb290Lm9mKGNvbnRleHRSb290KQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSByb290IGlzIG5vdCBhdmFpbGFibGUuIikpOworCisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlUm9vdC5nZXRUZW1wbGF0ZUNvbXBvbmVudChuYW1lKTsKKwkJaWYgKHRlbXBsYXRlQ29tcG9uZW50LmlzUHJlc2VudCgpKSB7CisJCQkvLyByZWN1cnNpdmVseSBjcmVhdGUgbWlzc2luZyBwYXJlbnQgY29udGV4dCBjb21wb25lbnRzCisJCQl0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRQYXJlbnRUZW1wbGF0ZUNvbXBvbmVudCgpCisJCQkJCS5maWx0ZXIodGMgLT4gIWNvbnRleHRSb290LmdldENvbnRleHRDb21wb25lbnQodGMuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSkKKwkJCQkJLmlmUHJlc2VudCh0YyAtPiBjcmVhdGVDb250ZXh0Q29tcG9uZW50KHRjLmdldE5hbWUoKSwgY29udGV4dFJvb3QpKTsKKworCQkJLy8gY3JlYXRlIGNvbnRleHQgY29tcG9uZW50IGlmIG5vdCBhbHJlYWR5IGRvbmUKKwkJCWlmICghY29udGV4dFJvb3QuZ2V0Q29udGV4dENvbXBvbmVudChuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJCUNvbnRleHRDb21wb25lbnQgY29udGV4dENvbXBvbmVudCA9IHN1cGVyLmNyZWF0ZUNvbnRleHRDb21wb25lbnQoCisJCQkJCQl0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRDYXRhbG9nQ29tcG9uZW50KCkuZ2V0TmFtZSgpLCBjb250ZXh0Um9vdCk7CisKKwkJCQkvLyByZWxhdGlvbnMKKwkJCQlnZXRDb3JlKGNvbnRleHRDb21wb25lbnQpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKSk7CisKKwkJCQkvLyBwcm9wZXJ0aWVzCisJCQkJY29udGV4dENvbXBvbmVudC5zZXROYW1lKG5hbWUpOworCQkJCWNvbnRleHRDb21wb25lbnQKKwkJCQkJCS5zZXRNaW1lVHlwZShjb250ZXh0Q29tcG9uZW50LmdldE1pbWVUeXBlKCkuYWRkU3ViVHlwZSh0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXROYW1lKCkpKTsKKwkJCQloaWRlVmFsdWVzKGdldENvcmUoY29udGV4dENvbXBvbmVudCksIHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpKTsKKwkJCQl0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKS5mb3JFYWNoKHRhIC0+IHsKKwkJCQkJY29udGV4dENvbXBvbmVudC5nZXRWYWx1ZSh0YS5nZXROYW1lKCkpLnNldCh0YS5nZXREZWZhdWx0VmFsdWUoKS5leHRyYWN0KCkpOworCQkJCX0pOworCisJCQkJLy8gY3JlYXRlIGRlZmF1bHQgYWN0aXZlIGFuZCBtYW5kYXRvcnkgY2hpbGQgY29udGV4dCBjb21wb25lbnRzCisJCQkJdGVtcGxhdGVDb21wb25lbnQuZ2V0KCkuZ2V0VGVtcGxhdGVDb21wb25lbnRzKCkuc3RyZWFtKCkuZmlsdGVyKFRlbXBsYXRlQ29tcG9uZW50LklTX0lNUExJQ0lUX0NSRUFURSkKKwkJCQkJCS5mb3JFYWNoKGNoaWxkVGVtcGxhdGVDb21wb25lbnQgLT4geworCQkJCQkJCWNyZWF0ZUNvbnRleHRDb21wb25lbnQoY2hpbGRUZW1wbGF0ZUNvbXBvbmVudC5nZXROYW1lKCksIGNvbnRleHRSb290KTsKKwkJCQkJCX0pOworCisJCQkJLy8gY3JlYXRlIGRlZmF1bHQgYWN0aXZlIGFuZCBtYW5kYXRvcnkgY29udGV4dCBzZW5zb3JzCisJCQkJdGVtcGxhdGVDb21wb25lbnQuZ2V0KCkuZ2V0VGVtcGxhdGVTZW5zb3JzKCkuc3RyZWFtKCkuZmlsdGVyKFRlbXBsYXRlU2Vuc29yLklTX0lNUExJQ0lUX0NSRUFURSkKKwkJCQkJCS5mb3JFYWNoKHRlbXBsYXRlU2Vuc29yIC0+IHsKKwkJCQkJCQljcmVhdGVDb250ZXh0U2Vuc29yKHRlbXBsYXRlU2Vuc29yLmdldE5hbWUoKSwgY29udGV4dENvbXBvbmVudCk7CisJCQkJCQl9KTsKKworCQkJCXJldHVybiBjb250ZXh0Q29tcG9uZW50OworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgY29tcG9uZW50IHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENvbnRleHRTZW5zb3IgY3JlYXRlQ29udGV4dFNlbnNvcihTdHJpbmcgbmFtZSwgQ29udGV4dENvbXBvbmVudCBjb250ZXh0Q29tcG9uZW50KSB7CisJCWlmIChjb250ZXh0Q29tcG9uZW50LmdldENvbnRleHRTZW5zb3IobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRleHQgc2Vuc29yIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCVRlbXBsYXRlQ29tcG9uZW50IHRlbXBsYXRlQ29tcG9uZW50ID0gVGVtcGxhdGVDb21wb25lbnQub2YoY29udGV4dENvbXBvbmVudCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgY29tcG9uZW50IGlzIG5vdCBhdmFpbGFibGUuIikpOworCisJCU9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvciA9IHRlbXBsYXRlQ29tcG9uZW50LmdldFRlbXBsYXRlU2Vuc29yKG5hbWUpOworCQlpZiAodGVtcGxhdGVTZW5zb3IuaXNQcmVzZW50KCkpIHsKKwkJCUNvbnRleHRTZW5zb3IgY29udGV4dFNlbnNvciA9IHN1cGVyLmNyZWF0ZUNvbnRleHRTZW5zb3IodGVtcGxhdGVTZW5zb3IuZ2V0KCkuZ2V0Q2F0YWxvZ1NlbnNvcigpLmdldE5hbWUoKSwKKwkJCQkJY29udGV4dENvbXBvbmVudCk7CisKKwkJCS8vIHJlbGF0aW9ucworCQkJZ2V0Q29yZShjb250ZXh0U2Vuc29yKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGVtcGxhdGVTZW5zb3IuZ2V0KCkpOworCisJCQkvLyBwcm9wZXJ0aWVzCisJCQljb250ZXh0U2Vuc29yLnNldE5hbWUobmFtZSk7CisJCQloaWRlVmFsdWVzKGdldENvcmUoY29udGV4dFNlbnNvciksIHRlbXBsYXRlU2Vuc29yLmdldCgpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpKTsKKwkJCXRlbXBsYXRlU2Vuc29yLmdldCgpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpLmZvckVhY2godGEgLT4geworCQkJCWNvbnRleHRTZW5zb3IuZ2V0VmFsdWUodGEuZ2V0TmFtZSgpKS5zZXQodGEuZ2V0RGVmYXVsdFZhbHVlKCkuZXh0cmFjdCgpKTsKKwkJCX0pOworCisJCQlyZXR1cm4gY29udGV4dFNlbnNvcjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIHNlbnNvciB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgZG9lcyBub3QgZXhpc3QuIik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9IGFuZAorCSAqIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gY29udGV4dFR5cGUgVGhlIHtAY29kZSBDb250ZXh0VHlwZX0uCisJICogQHBhcmFtIG5hbWUgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBuYW1lIGlzIG5vdCBhbGxvd2VkLgorCSAqLworCXB1YmxpYyBDYXRhbG9nQ29tcG9uZW50IGNyZWF0ZUNhdGFsb2dDb21wb25lbnQoQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIFN0cmluZyBuYW1lKSB7CisJCXZhbGlkYXRlQ2F0YWxvZ05hbWUobmFtZSwgZmFsc2UpOworCisJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCA9IG5ldyBDYXRhbG9nQ29tcG9uZW50KGNyZWF0ZUNvcmUoQ2F0YWxvZ0NvbXBvbmVudC5jbGFzcywgY29udGV4dFR5cGUpKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNhdGFsb2dDb21wb25lbnQuc2V0TmFtZShuYW1lKTsKKwkJY2F0YWxvZ0NvbXBvbmVudC5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKwkJY2F0YWxvZ0NvbXBvbmVudC5nZXRWYWx1ZSgiVmFsaWRGbGFnIikuc2V0KFZlcnNpb25TdGF0ZS5WQUxJRCk7CisKKwkJcmV0dXJuIGNhdGFsb2dDb21wb25lbnQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBUaGUge0BsaW5rIFZhbHVlVHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NUUklOR308L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NUUklOR19TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RBVEV9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNEQVRFX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjQk9PTEVBTn08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JPT0xFQU5fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNCWVRFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjQllURV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI1NIT1JUfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjU0hPUlRfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNJTlRFR0VSfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjSU5URUdFUl9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0xPTkd9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNMT05HX1NFUVVFTkNFfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVR9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0JZVEVfU1RSRUFNfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjQllURV9TVFJFQU1fU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGTE9BVF9DT01QTEVYfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRkxPQVRfQ09NUExFWF9TRVFVRU5DRX08L2xpPgorCSAqIDxsaT57QGxpbmsgVmFsdWVUeXBlI0RPVUJMRV9DT01QTEVYfTwvbGk+CisJICogPGxpPntAbGluayBWYWx1ZVR5cGUjRE9VQkxFX0NPTVBMRVhfU0VRVUVOQ0V9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGSUxFX0xJTkt9PC9saT4KKwkgKiA8bGk+e0BsaW5rIFZhbHVlVHlwZSNGSUxFX0xJTktfU0VRVUVOQ0V9PC9saT4KKwkgKiA8L3VsPgorCSAqCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gdmFsdWVUeXBlICAgICAgICBUaGUge0Bjb2RlIFZhbHVlVHlwZX0uCisJICogQHBhcmFtIGNhdGFsb2dDb21wb25lbnQgVGhlIHBhcmVudCB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2Ugb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYWxsb3dlZCBvciBnaXZlbiB7QGNvZGUgVmFsdWVUeXBlfSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHVibGljIENhdGFsb2dBdHRyaWJ1dGUgY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZShTdHJpbmcgbmFtZSwgVmFsdWVUeXBlPD8+IHZhbHVlVHlwZSwKKwkJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCkgeworCQl2YWxpZGF0ZUNhdGFsb2dOYW1lKG5hbWUsIHRydWUpOworCisJCWlmIChjYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dBdHRyaWJ1dGUobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhdGFsb2cgYXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfSBlbHNlIGlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSB8fCB2YWx1ZVR5cGUuaXNCeXRlU3RyZWFtVHlwZSgpIHx8IHZhbHVlVHlwZS5pc1Vua25vd24oKQorCQkJCXx8IHZhbHVlVHlwZS5pc0Jsb2IoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgdHlwZSAnIiArIHZhbHVlVHlwZSArICInIGlzIG5vdCBhbGxvd2VkLiIpOworCQl9CisKKwkJQ2F0YWxvZ0F0dHJpYnV0ZSBjYXRhbG9nQXR0cmlidXRlID0gbmV3IENhdGFsb2dBdHRyaWJ1dGUoCisJCQkJY3JlYXRlQ29yZShDYXRhbG9nQXR0cmlidXRlLmNsYXNzLCBjYXRhbG9nQ29tcG9uZW50LmdldENvbnRleHRUeXBlKCkpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjYXRhbG9nQXR0cmlidXRlKS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjYXRhbG9nQ29tcG9uZW50KTsKKwkJZ2V0Q29yZShjYXRhbG9nQ29tcG9uZW50KS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKGNhdGFsb2dBdHRyaWJ1dGUpOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldFZhbHVlVHlwZSh2YWx1ZVR5cGUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldFNvcnRJbmRleChuZXh0SW5kZXgoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlcygpKSk7CisKKwkJcmV0dXJuIGNhdGFsb2dBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gZW51bWVyYXRpb25PYmplY3QgVGhlIGVudW1lcmF0aW9uLgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50ICBUaGUgcGFyZW50IHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhbGxvd2VkIG9yIGdpdmVuIGVudW1lcmF0aW9uIGNsYXNzIGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZ0F0dHJpYnV0ZSBjcmVhdGVDYXRhbG9nQXR0cmlidXRlKFN0cmluZyBuYW1lLCBFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbk9iaiwKKwkJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCkgeworCQl2YWxpZGF0ZUNhdGFsb2dOYW1lKG5hbWUsIHRydWUpOworCQl2YWxpZGF0ZUVudW0oZW51bWVyYXRpb25PYmopOworCQlpZiAoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlKG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYXRhbG9nIGF0dHJpYnV0ZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlDYXRhbG9nQXR0cmlidXRlIGNhdGFsb2dBdHRyaWJ1dGUgPSBuZXcgQ2F0YWxvZ0F0dHJpYnV0ZSgKKwkJCQljcmVhdGVDb3JlKENhdGFsb2dBdHRyaWJ1dGUuY2xhc3MsIGNhdGFsb2dDb21wb25lbnQuZ2V0Q29udGV4dFR5cGUoKSkpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKGNhdGFsb2dBdHRyaWJ1dGUpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KGNhdGFsb2dDb21wb25lbnQpOworCQlnZXRDb3JlKGNhdGFsb2dDb21wb25lbnQpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQoY2F0YWxvZ0F0dHJpYnV0ZSk7CisKKwkJLy8gcHJvcGVydGllcworCQljYXRhbG9nQXR0cmlidXRlLnNldE5hbWUobmFtZSk7CisJCWNhdGFsb2dBdHRyaWJ1dGUuc2V0RW51bWVyYXRpb25PYmooZW51bWVyYXRpb25PYmopOworCQljYXRhbG9nQXR0cmlidXRlLnNldFNvcnRJbmRleChuZXh0SW5kZXgoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nQXR0cmlidXRlcygpKSk7CisKKwkJcmV0dXJuIGNhdGFsb2dBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nU2Vuc29yfS4gVGhlCisJICoge0BsaW5rIFZhbHVlVHlwZX0gbWF5IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpa2UgaW4KKwkgKiB7QGxpbmsgI2NyZWF0ZUNhdGFsb2dBdHRyaWJ1dGUoU3RyaW5nLCBWYWx1ZVR5cGUsIENhdGFsb2dDb21wb25lbnQpfToKKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9LgorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgICAgIFRoZSB7QGNvZGUgVmFsdWVUeXBlfS4KKwkgKiBAcGFyYW0gY2F0YWxvZ1NlbnNvciBUaGUgcGFyZW50IHtAY29kZSBDYXRhbG9nU2Vuc29yfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhbGxvd2VkIG9yIGdpdmVuIHtAY29kZSBWYWx1ZVR5cGV9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZ0F0dHJpYnV0ZSBjcmVhdGVDYXRhbG9nU2Vuc29yQXR0cmlidXRlKFN0cmluZyBuYW1lLCBWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlLAorCQkJQ2F0YWxvZ1NlbnNvciBjYXRhbG9nU2Vuc29yKSB7CisJCXZhbGlkYXRlQ2F0YWxvZ05hbWUobmFtZSwgdHJ1ZSk7CisKKwkJaWYgKGNhdGFsb2dTZW5zb3IuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZShuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2F0YWxvZ1NlbnNvciBhdHRyaWJ1dGUgd2l0aCBuYW1lICciICsgbmFtZSArICInIGFscmVhZHkgZXhpc3RzLiIpOworCQl9IGVsc2UgaWYgKHZhbHVlVHlwZS5pc0VudW1lcmF0aW9uVHlwZSgpIHx8IHZhbHVlVHlwZS5pc0J5dGVTdHJlYW1UeXBlKCkgfHwgdmFsdWVUeXBlLmlzVW5rbm93bigpCisJCQkJfHwgdmFsdWVUeXBlLmlzQmxvYigpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSB0eXBlICciICsgdmFsdWVUeXBlICsgIicgaXMgbm90IGFsbG93ZWQuIik7CisJCX0KKworCQlDYXRhbG9nQXR0cmlidXRlIGNhdGFsb2dBdHRyaWJ1dGUgPSBuZXcgQ2F0YWxvZ0F0dHJpYnV0ZShjcmVhdGVDb3JlKENhdGFsb2dBdHRyaWJ1dGUuY2xhc3MpKTsKKworCQkvLyByZWxhdGlvbnMKKwkJZ2V0Q29yZShjYXRhbG9nQXR0cmlidXRlKS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChjYXRhbG9nU2Vuc29yKTsKKwkJZ2V0Q29yZShjYXRhbG9nU2Vuc29yKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKGNhdGFsb2dBdHRyaWJ1dGUpOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2F0YWxvZ0F0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldFZhbHVlVHlwZSh2YWx1ZVR5cGUpOworCQljYXRhbG9nQXR0cmlidXRlLnNldFNvcnRJbmRleChuZXh0SW5kZXgoY2F0YWxvZ1NlbnNvci5nZXRDYXRhbG9nQXR0cmlidXRlcygpKSk7CisKKwkJcmV0dXJuIGNhdGFsb2dBdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0gZm9yIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nU2Vuc29yfS4KKwkgKiBAcGFyYW0gZW51bWVyYXRpb25PYmplY3QgVGhlIGVudW1lcmF0aW9uLgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50ICBUaGUgcGFyZW50IHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBDYXRhbG9nU2Vuc29yfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhbGxvd2VkCisJICovCisJcHVibGljIENhdGFsb2dTZW5zb3IgY3JlYXRlQ2F0YWxvZ1NlbnNvcihTdHJpbmcgbmFtZSwgQ2F0YWxvZ0NvbXBvbmVudCBjYXRhbG9nQ29tcG9uZW50KSB7CisJCXZhbGlkYXRlQ2F0YWxvZ05hbWUobmFtZSwgZmFsc2UpOworCisJCWlmICghY2F0YWxvZ0NvbXBvbmVudC5nZXRDb250ZXh0VHlwZSgpLmlzVGVzdEVxdWlwbWVudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYXRhbG9nIGNvbXBvbmVudCBpcyBub3Qgb2YgdHlwZSAnVEVTVEVRVUlQTUVOVCciKTsKKwkJfSBlbHNlIGlmIChjYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dTZW5zb3IobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhdGFsb2cgc2Vuc29yIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCUNhdGFsb2dTZW5zb3IgY2F0YWxvZ1NlbnNvciA9IG5ldyBDYXRhbG9nU2Vuc29yKGNyZWF0ZUNvcmUoQ2F0YWxvZ1NlbnNvci5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRQZXJtYW5lbnRTdG9yZShjYXRhbG9nU2Vuc29yKS5zZXQoY2F0YWxvZ0NvbXBvbmVudCk7CisJCWdldENoaWxkcmVuU3RvcmUoY2F0YWxvZ0NvbXBvbmVudCkuYWRkKGNhdGFsb2dTZW5zb3IpOworCisJCS8vIHByb3BlcnRpZXMKKwkJY2F0YWxvZ1NlbnNvci5zZXROYW1lKG5hbWUpOworCQljYXRhbG9nU2Vuc29yLnNldERhdGVDcmVhdGVkKExvY2FsRGF0ZVRpbWUubm93KCkpOworCisJCXJldHVybiBjYXRhbG9nU2Vuc29yOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlUm9vdH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9IGFuZCBuYW1lLgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqIEBwYXJhbSBuYW1lICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVJvb3R9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlUm9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlUm9vdCBjcmVhdGVUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIFN0cmluZyBuYW1lKSB7CisJCVRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QgPSBuZXcgVGVtcGxhdGVSb290KGNyZWF0ZUNvcmUoVGVtcGxhdGVSb290LmNsYXNzLCBjb250ZXh0VHlwZSkpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVtcGxhdGVSb290LnNldE5hbWUobmFtZSk7CisJCXRlbXBsYXRlUm9vdC5zZXREYXRlQ3JlYXRlZChMb2NhbERhdGVUaW1lLm5vdygpKTsKKwkJdGVtcGxhdGVSb290LnNldFZlcnNpb25TdGF0ZShWZXJzaW9uU3RhdGUuRURJVEFCTEUpOworCQl0ZW1wbGF0ZVJvb3Quc2V0VmVyc2lvbihJbnRlZ2VyLnZhbHVlT2YoMSkpOworCisJCXJldHVybiB0ZW1wbGF0ZVJvb3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IGZvciBnaXZlbiB7QGxpbmsgVGVtcGxhdGVSb290fSB1c2luZworCSAqIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVSb290ICAgICBUaGUgcGFyZW50IHtAY29kZSBUZW1wbGF0ZVJvb3R9LgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50IFRoZSBhc3NvY2lhdGVkIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHtAY29kZSBDb250ZXh0VHlwZX0gb2Yge0Bjb2RlCisJICogCQlUZW1wbGF0ZVJvb3R9ICAgICAgICAgICAgYW5kIHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fSBkbyBub3QgbWF0Y2ggb3IKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZUNvbXBvbmVudCBjcmVhdGVUZW1wbGF0ZUNvbXBvbmVudChTdHJpbmcgbmFtZSwgVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCwKKwkJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCkgeworCQlpZiAoIXRlbXBsYXRlUm9vdC5nZXRDb250ZXh0VHlwZSgpLmVxdWFscyhjYXRhbG9nQ29tcG9uZW50LmdldENvbnRleHRUeXBlKCkpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZXh0IHR5cGUgb2YgdGVtcGxhdGUgcm9vdCBhbmQgY2F0YWxvZyBjb21wb25lbnQgZG8gbm90IG1hdGNoLiIpOworCQl9IGVsc2UgaWYgKHRlbXBsYXRlUm9vdC5nZXRUZW1wbGF0ZUNvbXBvbmVudChuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgY29tcG9uZW50IHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCVRlbXBsYXRlQ29tcG9uZW50IHRlbXBsYXRlQ29tcG9uZW50ID0gbmV3IFRlbXBsYXRlQ29tcG9uZW50KAorCQkJCWNyZWF0ZUNvcmUoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MsIHRlbXBsYXRlUm9vdC5nZXRDb250ZXh0VHlwZSgpKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVtcGxhdGVDb21wb25lbnQpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHRlbXBsYXRlUm9vdCk7CisJCWdldENvcmUodGVtcGxhdGVDb21wb25lbnQpLmdldE11dGFibGVTdG9yZSgpLnNldChjYXRhbG9nQ29tcG9uZW50KTsKKwkJZ2V0Q29yZSh0ZW1wbGF0ZVJvb3QpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodGVtcGxhdGVDb21wb25lbnQpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0TmFtZShuYW1lKTsKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0RGVmYXVsdEFjdGl2ZShCb29sZWFuLlRSVUUpOworCQl0ZW1wbGF0ZUNvbXBvbmVudC5zZXRTZXJpZXNDb25zdGFudChCb29sZWFuLlRSVUUpOworCQl0ZW1wbGF0ZUNvbXBvbmVudC5zZXRTb3J0SW5kZXgobmV4dEluZGV4KHRlbXBsYXRlUm9vdC5nZXRUZW1wbGF0ZUNvbXBvbmVudHMoKSkpOworCisJCS8vIGNyZWF0ZSB0ZW1wbGF0ZSBhdHRyaWJ1dGVzCisJCWNhdGFsb2dDb21wb25lbnQuZ2V0Q2F0YWxvZ0F0dHJpYnV0ZXMoKS5mb3JFYWNoKGNhIC0+IGNyZWF0ZVRlbXBsYXRlQXR0cmlidXRlKGNhLmdldE5hbWUoKSwgdGVtcGxhdGVDb21wb25lbnQpKTsKKworCQlyZXR1cm4gdGVtcGxhdGVDb21wb25lbnQ7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IGZvciBnaXZlbiB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9CisJICogdXNpbmcgZ2l2ZW4ge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgVGVtcGxhdGVDb21wb25lbnR9LgorCSAqIEBwYXJhbSBwYXJ0ZW50Q29tcG9uZW50VGVtcGxhdGUgVGhlIHBhcmVudCB7QGNvZGUgVGVtcGxhdGVDb21wb25lbnR9LgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50ICAgICAgICAgVGhlIGFzc29jaWF0ZWQge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYge0Bjb2RlIENvbnRleHRUeXBlfSBvZiB7QGNvZGUKKwkgKiAJCVRlbXBsYXRlQ29tcG9uZW50fSAgICAgICBhbmQge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9IGRvIG5vdCBtYXRjaCBvcgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuCisJICovCisJcHVibGljIFRlbXBsYXRlQ29tcG9uZW50IGNyZWF0ZVRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lLCBUZW1wbGF0ZUNvbXBvbmVudCBwYXJ0ZW50Q29tcG9uZW50VGVtcGxhdGUsCisJCQlDYXRhbG9nQ29tcG9uZW50IGNhdGFsb2dDb21wb25lbnQpIHsKKwkJVGVtcGxhdGVSb290IHRlbXBsYXRlUm9vdCA9IHBhcnRlbnRDb21wb25lbnRUZW1wbGF0ZS5nZXRUZW1wbGF0ZVJvb3QoKTsKKwkJaWYgKCF0ZW1wbGF0ZVJvb3QuZ2V0Q29udGV4dFR5cGUoKS5lcXVhbHMoY2F0YWxvZ0NvbXBvbmVudC5nZXRDb250ZXh0VHlwZSgpKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udGV4dCB0eXBlIG9mIHRlbXBsYXRlIHJvb3QgYW5kIGNhdGFsb2cgY29tcG9uZW50IGRvIG5vdCBtYXRjaC4iKTsKKwkJfSBlbHNlIGlmICh0ZW1wbGF0ZVJvb3QuZ2V0VGVtcGxhdGVDb21wb25lbnQobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIGNvbXBvbmVudCB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlUZW1wbGF0ZUNvbXBvbmVudCB0ZW1wbGF0ZUNvbXBvbmVudCA9IG5ldyBUZW1wbGF0ZUNvbXBvbmVudCgKKwkJCQljcmVhdGVDb3JlKFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzLCB0ZW1wbGF0ZVJvb3QuZ2V0Q29udGV4dFR5cGUoKSkpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHRlbXBsYXRlQ29tcG9uZW50KS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChwYXJ0ZW50Q29tcG9uZW50VGVtcGxhdGUpOworCQlnZXRDb3JlKHRlbXBsYXRlQ29tcG9uZW50KS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQoY2F0YWxvZ0NvbXBvbmVudCk7CisJCWdldENvcmUocGFydGVudENvbXBvbmVudFRlbXBsYXRlKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKHRlbXBsYXRlQ29tcG9uZW50KTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCXRlbXBsYXRlQ29tcG9uZW50LnNldE5hbWUobmFtZSk7CisJCXRlbXBsYXRlQ29tcG9uZW50LnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CisJCXRlbXBsYXRlQ29tcG9uZW50LnNldERlZmF1bHRBY3RpdmUoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0U2VyaWVzQ29uc3RhbnQoQm9vbGVhbi5UUlVFKTsKKwkJdGVtcGxhdGVDb21wb25lbnQuc2V0U29ydEluZGV4KG5leHRJbmRleChwYXJ0ZW50Q29tcG9uZW50VGVtcGxhdGUuZ2V0VGVtcGxhdGVDb21wb25lbnRzKCkpKTsKKworCQkvLyBjcmVhdGUgdGVtcGxhdGUgYXR0cmlidXRlcworCQljYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dBdHRyaWJ1dGVzKCkuZm9yRWFjaChjYSAtPiBjcmVhdGVUZW1wbGF0ZUF0dHJpYnV0ZShjYS5nZXROYW1lKCksIHRlbXBsYXRlQ29tcG9uZW50KSk7CisKKwkJcmV0dXJuIHRlbXBsYXRlQ29tcG9uZW50OworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0uCisJICogQHBhcmFtIHRlbXBsYXRlQ29tcG9uZW50IFRoZSBwYXJlbnQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuCisJICovCisJcHVibGljIFRlbXBsYXRlQXR0cmlidXRlIGNyZWF0ZVRlbXBsYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lLCBUZW1wbGF0ZUNvbXBvbmVudCB0ZW1wbGF0ZUNvbXBvbmVudCkgeworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuZ2V0VGVtcGxhdGVBdHRyaWJ1dGUobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIGF0dHJpYnV0ZSB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgYWxyZWFkeSBleGlzdHMuIik7CisJCX0KKworCQlDYXRhbG9nQ29tcG9uZW50IGNhdGFsb2dDb21wb25lbnQgPSB0ZW1wbGF0ZUNvbXBvbmVudC5nZXRDYXRhbG9nQ29tcG9uZW50KCk7CisJCU9wdGlvbmFsPENhdGFsb2dBdHRyaWJ1dGU+IGNhdGFsb2dBdHRyaWJ1dGUgPSBjYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dBdHRyaWJ1dGUobmFtZSk7CisJCWlmIChjYXRhbG9nQXR0cmlidXRlLmlzUHJlc2VudCgpKSB7CisJCQlUZW1wbGF0ZUF0dHJpYnV0ZSB0ZW1wbGF0ZUF0dHJpYnV0ZSA9IG5ldyBUZW1wbGF0ZUF0dHJpYnV0ZSgKKwkJCQkJY3JlYXRlQ29yZShUZW1wbGF0ZUF0dHJpYnV0ZS5jbGFzcywgY2F0YWxvZ0NvbXBvbmVudC5nZXRDb250ZXh0VHlwZSgpKSk7CisKKwkJCS8vIHJlbGF0aW9ucworCQkJZ2V0Q29yZSh0ZW1wbGF0ZUF0dHJpYnV0ZSkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQodGVtcGxhdGVDb21wb25lbnQpOworCQkJZ2V0Q29yZSh0ZW1wbGF0ZUF0dHJpYnV0ZSkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNhdGFsb2dBdHRyaWJ1dGUuZ2V0KCkpOworCQkJZ2V0Q29yZSh0ZW1wbGF0ZUNvbXBvbmVudCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCh0ZW1wbGF0ZUF0dHJpYnV0ZSk7CisKKwkJCS8vIHByb3BlcnRpZXMKKwkJCXRlbXBsYXRlQXR0cmlidXRlLnNldE5hbWUobmFtZSk7CisJCQl0ZW1wbGF0ZUF0dHJpYnV0ZS5zZXRWYWx1ZVJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOworCQkJdGVtcGxhdGVBdHRyaWJ1dGUuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKKworCQkJcmV0dXJuIHRlbXBsYXRlQXR0cmlidXRlOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2F0YWxvZyBhdHRyaWJ1dGUgd2l0aCBuYW1lICciICsgbmFtZSArICInIGRvZXMgbm90IGV4aXN0cy4iKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZW1wbGF0ZVNlbnNvcn0gZm9yIGdpdmVuIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0KKwkgKiBiYXNlZCBvbiB0aGUgZ2l2ZW4ge0BsaW5rIENhdGFsb2dTZW5zb3J9LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVDb21wb25lbnQgVGhlIHBhcmVudCB7QGNvZGUgVGVtcGxhdGVDb21wb25lbnR9LgorCSAqIEBwYXJhbSBjYXRhbG9nU2Vuc29yICAgICByZWZlcmVuY2UgQ2F0YWxvZ1NlbnNvcgorCSAqIEBwYXJhbSBxdWFudGl0eSAgICAgICAgICBRdWFudGl0eSB0byBjcmVhdGUge0BsaW5rIFRlbXBsYXRlU2Vuc29yfSBmb3IKKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVNlbnNvcn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGdpdmVuIG5hbWUgaXMgYWxyZWFkeSBpbiB1c2UuCisJICovCisJcHVibGljIFRlbXBsYXRlU2Vuc29yIGNyZWF0ZVRlbXBsYXRlU2Vuc29yKFN0cmluZyBuYW1lLCBUZW1wbGF0ZUNvbXBvbmVudCB0ZW1wbGF0ZUNvbXBvbmVudCwKKwkJCUNhdGFsb2dTZW5zb3IgY2F0YWxvZ1NlbnNvciwgUXVhbnRpdHkgcXVhbnRpdHkpIHsKKwkJaWYgKHRlbXBsYXRlQ29tcG9uZW50LmdldFRlbXBsYXRlU2Vuc29yKG5hbWUpLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSBzZW5zb3Igd2l0aCBuYW1lICciICsgbmFtZSArICInIGFscmVhZHkgZXhpc3RzLiIpOworCQl9CisKKwkJaWYgKGNhdGFsb2dTZW5zb3IgIT0gbnVsbCkgeworCQkJVGVtcGxhdGVTZW5zb3IgdGVtcGxhdGVTZW5zb3IgPSBuZXcgVGVtcGxhdGVTZW5zb3IoY3JlYXRlQ29yZShUZW1wbGF0ZVNlbnNvci5jbGFzcykpOworCQkJLy8gY3JlYXRlIGFsbCBpbXBsaWNpdCBUZW1wbGF0ZUF0dHJpYnV0ZXMKKwkJCWZvciAoQ2F0YWxvZ0F0dHJpYnV0ZSBjYXRBdHRyIDogY2F0YWxvZ1NlbnNvci5nZXRDYXRhbG9nQXR0cmlidXRlcygpKSB7CisJCQkJVGVtcGxhdGVBdHRyaWJ1dGUgdHBsQXR0ciA9IG5ldyBUZW1wbGF0ZUF0dHJpYnV0ZShjcmVhdGVDb3JlKFRlbXBsYXRlQXR0cmlidXRlLmNsYXNzKSk7CisJCQkJdHBsQXR0ci5zZXROYW1lKGNhdEF0dHIuZ2V0TmFtZSgpKTsKKwkJCQl0cGxBdHRyLnNldFZhbHVlUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7CisJCQkJdHBsQXR0ci5zZXRPcHRpb25hbChCb29sZWFuLlRSVUUpOworCQkJCWdldFBlcm1hbmVudFN0b3JlKHRwbEF0dHIpLnNldCh0ZW1wbGF0ZVNlbnNvcik7CisJCQkJZ2V0TXV0YWJsZVN0b3JlKHRwbEF0dHIpLnNldChjYXRBdHRyKTsKKwkJCQlnZXRDb3JlKHRlbXBsYXRlU2Vuc29yKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKHRwbEF0dHIpOworCQkJfQorCisJCQkvLyByZWxhdGlvbnMKKwkJCWdldFBlcm1hbmVudFN0b3JlKHRlbXBsYXRlU2Vuc29yKS5zZXQodGVtcGxhdGVDb21wb25lbnQpOworCQkJZ2V0TXV0YWJsZVN0b3JlKHRlbXBsYXRlU2Vuc29yKS5zZXQoY2F0YWxvZ1NlbnNvcik7CisJCQlnZXRNdXRhYmxlU3RvcmUodGVtcGxhdGVTZW5zb3IpLnNldChxdWFudGl0eSk7CisJCQlnZXRDaGlsZHJlblN0b3JlKHRlbXBsYXRlQ29tcG9uZW50KS5hZGQodGVtcGxhdGVTZW5zb3IpOworCisJCQkvLyBwcm9wZXJ0aWVzCisJCQl0ZW1wbGF0ZVNlbnNvci5zZXROYW1lKG5hbWUpOworCQkJdGVtcGxhdGVTZW5zb3Iuc2V0RGVmYXVsdEFjdGl2ZSh0cnVlKTsKKwkJCXRlbXBsYXRlU2Vuc29yLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7CisKKwkJCXJldHVybiB0ZW1wbGF0ZVNlbnNvcjsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhdGFsb2cgYXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBkb2VzIG5vdCBleGlzdHMuIik7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVRlc3RTdGVwfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVtcGxhdGVUZXN0U3RlcCBjcmVhdGVUZW1wbGF0ZVRlc3RTdGVwKFN0cmluZyBuYW1lKSB7CisJCVRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCA9IG5ldyBUZW1wbGF0ZVRlc3RTdGVwKGNyZWF0ZUNvcmUoVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVtcGxhdGVUZXN0U3RlcC5zZXROYW1lKG5hbWUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwLnNldERhdGVDcmVhdGVkKExvY2FsRGF0ZVRpbWUubm93KCkpOworCQl0ZW1wbGF0ZVRlc3RTdGVwLnNldFZlcnNpb25TdGF0ZShWZXJzaW9uU3RhdGUuRURJVEFCTEUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwLnNldFZlcnNpb24oSW50ZWdlci52YWx1ZU9mKDEpKTsKKworCQlyZXR1cm4gdGVtcGxhdGVUZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZW1wbGF0ZVRlc3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVUZXN0fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZW1wbGF0ZVRlc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZVRlc3QgY3JlYXRlVGVtcGxhdGVUZXN0KFN0cmluZyBuYW1lKSB7CisJCVRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QgPSBuZXcgVGVtcGxhdGVUZXN0KGNyZWF0ZUNvcmUoVGVtcGxhdGVUZXN0LmNsYXNzKSk7CisKKwkJLy8gcHJvcGVydGllcworCQl0ZW1wbGF0ZVRlc3Quc2V0TmFtZShuYW1lKTsKKwkJdGVtcGxhdGVUZXN0LnNldERhdGVDcmVhdGVkKExvY2FsRGF0ZVRpbWUubm93KCkpOworCQl0ZW1wbGF0ZVRlc3Quc2V0VmVyc2lvbihJbnRlZ2VyLnZhbHVlT2YoMSkpOworCQl0ZW1wbGF0ZVRlc3Quc2V0VmVyc2lvblN0YXRlKFZlcnNpb25TdGF0ZS5FRElUQUJMRSk7CisKKwkJcmV0dXJuIHRlbXBsYXRlVGVzdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2V9IGZvciBnaXZlbiB7QGxpbmsgVGVtcGxhdGVUZXN0fQorCSAqIHVzaW5nIGdpdmVuIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdCAgICAgVGhlIHBhcmVudCB7QGxpbmsgVGVtcGxhdGVUZXN0fS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0U3RlcCBUaGUgcmVsYXRlZCB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVtcGxhdGVUZXN0U3RlcFVzYWdlIGNyZWF0ZVRlbXBsYXRlVGVzdFN0ZXBVc2FnZShTdHJpbmcgbmFtZSwgVGVtcGxhdGVUZXN0IHRlbXBsYXRlVGVzdCwKKwkJCVRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCkgeworCQlpZiAodGVtcGxhdGVUZXN0LmdldFRlbXBsYXRlVGVzdFN0ZXBVc2FnZShuYW1lKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgdGVzdCBzdGVwIHVzYWdlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBhbHJlYWR5IGV4aXN0cy4iKTsKKwkJfQorCisJCVRlbXBsYXRlVGVzdFN0ZXBVc2FnZSB0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2UgPSBuZXcgVGVtcGxhdGVUZXN0U3RlcFVzYWdlKAorCQkJCWNyZWF0ZUNvcmUoVGVtcGxhdGVUZXN0U3RlcFVzYWdlLmNsYXNzKSk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVtcGxhdGVUZXN0U3RlcFVzYWdlKS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldCh0ZW1wbGF0ZVRlc3QpOworCQlnZXRDb3JlKHRlbXBsYXRlVGVzdFN0ZXBVc2FnZSkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHRlbXBsYXRlVGVzdFN0ZXApOworCQlnZXRDb3JlKHRlbXBsYXRlVGVzdCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCh0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2UpOworCisJCS8vIHByb3BlcnRpZXMKKwkJdGVtcGxhdGVUZXN0U3RlcFVzYWdlLnNldE5hbWUobmFtZSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5zZXRPcHRpb25hbChCb29sZWFuLlRSVUUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2Uuc2V0RGVmYXVsdEFjdGl2ZShCb29sZWFuLlRSVUUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2Uuc2V0U29ydEluZGV4KG5leHRJbmRleCh0ZW1wbGF0ZVRlc3QuZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpKSk7CisKKwkJcmV0dXJuIHRlbXBsYXRlVGVzdFN0ZXBVc2FnZTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBWYWx1ZUxpc3R9LgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVmFsdWVMaXN0fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBWYWx1ZUxpc3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBWYWx1ZUxpc3QgY3JlYXRlVmFsdWVMaXN0KFN0cmluZyBuYW1lKSB7CisJCVZhbHVlTGlzdCB2YWx1ZUxpc3QgPSBuZXcgVmFsdWVMaXN0KGNyZWF0ZUNvcmUoVmFsdWVMaXN0LmNsYXNzKSk7CisKKwkJLy8gcHJvcGVydGllcworCQl2YWx1ZUxpc3Quc2V0TmFtZShuYW1lKTsKKwkJdmFsdWVMaXN0LnNldERhdGVDcmVhdGVkKExvY2FsRGF0ZVRpbWUubm93KCkpOworCisJCXJldHVybiB2YWx1ZUxpc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVmFsdWVMaXN0VmFsdWV9IGZvciBnaXZlbiB7QGxpbmsgVmFsdWVMaXN0fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVmFsdWVMaXN0VmFsdWV9LgorCSAqIEBwYXJhbSB2YWx1ZUxpc3QgVGhlIHBhcmVudCB7QGNvZGUgVmFsdWVMaXN0fS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBWYWx1ZUxpc3RWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFZhbHVlTGlzdFZhbHVlIGNyZWF0ZVZhbHVlTGlzdFZhbHVlKFN0cmluZyBuYW1lLCBWYWx1ZUxpc3QgdmFsdWVMaXN0KSB7CisJCWlmICh2YWx1ZUxpc3QuZ2V0VmFsdWVMaXN0VmFsdWUobmFtZSkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIGxpc3QgdmFsdWUgd2l0aCBuYW1lICciICsgbmFtZSArICInIGFscmVhZHkgZXhpc3RzLiIpOworCQl9CisKKwkJVmFsdWVMaXN0VmFsdWUgdmFsdWVMaXN0VmFsdWUgPSBuZXcgVmFsdWVMaXN0VmFsdWUoY3JlYXRlQ29yZShWYWx1ZUxpc3RWYWx1ZS5jbGFzcykpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHZhbHVlTGlzdFZhbHVlKS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldCh2YWx1ZUxpc3QpOworCQlnZXRDb3JlKHZhbHVlTGlzdCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCh2YWx1ZUxpc3RWYWx1ZSk7CisKKwkJLy8gcHJvcGVydGllcworCQl2YWx1ZUxpc3RWYWx1ZS5zZXROYW1lKG5hbWUpOworCQl2YWx1ZUxpc3RWYWx1ZS5zZXRTb3J0SW5kZXgobmV4dEluZGV4KHZhbHVlTGlzdC5nZXRWYWx1ZUxpc3RWYWx1ZXMoKSkpOworCisJCS8vIHRoaXMgcHJvcGVydHkgaXMgaGlkZGVuIGJ5IHRoZSBwdWJsaWMgQVBJIGFuZCBpcyBub3QgYWxsb3dlZCB0byBiZQorCQkvLyBtb2RpZmllZCEKKwkJdmFsdWVMaXN0VmFsdWUuZ2V0VmFsdWUoVmFsdWVMaXN0VmFsdWUuQVRUUl9TQ0FMQVJfVFlQRSkuc2V0KFNjYWxhclR5cGUuU1RSSU5HKTsKKworCQlyZXR1cm4gdmFsdWVMaXN0VmFsdWU7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ2xhc3NpZmljYXRpb259IGZvciBnaXZlbiB7QGxpbmsgRG9tYWlufSwKKwkgKiB7QGxpbmsgUHJvamVjdERvbWFpbn0gYW5kIHtAbGluayBTdGF0dXN9LgorCSAqIAorCSAqIEBwYXJhbSBkb21haW4gICAgICAgIFRoZSB7QGxpbmsgRG9tYWlufSBmb3IgdGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0KKwkgKiBAcGFyYW0gcHJvamVjdERvbWFpbiBUaGUge0BsaW5rIFByb2plY3REb21haW59IGZvciB0aGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufQorCSAqIEBwYXJhbSBzdGF0dXMgICAgICAgIFRoZSB7QGxpbmsgU3RhdHVzfSBmb3IgdGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAbGluayBDbGFzc2lmaWNhdGlvbn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENsYXNzaWZpY2F0aW9uIGNyZWF0ZUNsYXNzaWZpY2F0aW9uKERvbWFpbiBkb21haW4sIFByb2plY3REb21haW4gcHJvamVjdERvbWFpbiwgU3RhdHVzIHN0YXR1cykgeworCQlTdHJpbmcgbmFtZSA9IFN0cmluZy5mb3JtYXQoIlByb2pEb21haW5JZF8lcy5Eb21haW5JZF8lcy5TdGF0dXNJZF8lcyIsIHByb2plY3REb21haW4uZ2V0SUQoKSwgZG9tYWluLmdldElEKCksCisJCQkJc3RhdHVzLmdldElEKCkpOworCQlyZXR1cm4gY3JlYXRlQ2xhc3NpZmljYXRpb24obmFtZSwgc3RhdHVzLCBwcm9qZWN0RG9tYWluLCBkb21haW4pOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBmb3IgZ2l2ZW4ge0BsaW5rIERvbWFpbn0sCisJICoge0BsaW5rIFByb2plY3REb21haW59IGFuZCB7QGxpbmsgU3RhdHVzfS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICBUaGUgbmFtZSBmb3IgdGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0KKwkgKiBAcGFyYW0gc3RhdHVzICAgICAgICBUaGUge0BsaW5rIFN0YXR1c30gZm9yIHRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259CisJICogQHBhcmFtIHByb2plY3REb21haW4gVGhlIHtAbGluayBQcm9qZWN0RG9tYWlufSBmb3IgdGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0KKwkgKiBAcGFyYW0gZG9tYWluICAgICAgICBUaGUge0BsaW5rIERvbWFpbn0gZm9yIHRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259CisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDbGFzc2lmaWNhdGlvbiBjcmVhdGVDbGFzc2lmaWNhdGlvbihTdHJpbmcgbmFtZSwgU3RhdHVzIHN0YXR1cywgUHJvamVjdERvbWFpbiBwcm9qZWN0RG9tYWluLCBEb21haW4gZG9tYWluKSB7CisJCUNsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uID0gbmV3IENsYXNzaWZpY2F0aW9uKGNyZWF0ZUNvcmUoQ2xhc3NpZmljYXRpb24uY2xhc3MpKTsKKworCQlnZXRNdXRhYmxlU3RvcmUoY2xhc3NpZmljYXRpb24pLnNldChzdGF0dXMpOworCQlnZXRNdXRhYmxlU3RvcmUoY2xhc3NpZmljYXRpb24pLnNldChwcm9qZWN0RG9tYWluKTsKKwkJZ2V0TXV0YWJsZVN0b3JlKGNsYXNzaWZpY2F0aW9uKS5zZXQoZG9tYWluKTsKKworCQkvLyBwcm9wZXJ0aWVzCisJCWNsYXNzaWZpY2F0aW9uLnNldE5hbWUobmFtZSk7CisKKwkJcmV0dXJuIGNsYXNzaWZpY2F0aW9uOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByb2plY3REb21haW59IHdpdGggZ2l2ZW4gbmFtZS4KKwkgKiAKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGxpbmsgUHJvamVjdERvbWFpbn0KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAbGluayBQcm9qZWN0RG9tYWlufSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUHJvamVjdERvbWFpbiBjcmVhdGVQcm9qZWN0RG9tYWluKFN0cmluZyBuYW1lKSB7CisJCVByb2plY3REb21haW4gcHJvamVjdERvbWFpbiA9IG5ldyBQcm9qZWN0RG9tYWluKGNyZWF0ZUNvcmUoUHJvamVjdERvbWFpbi5jbGFzcykpOworCQkvLyBwcm9wZXJ0aWVzCisJCXByb2plY3REb21haW4uc2V0TmFtZShuYW1lKTsKKwkJcmV0dXJuIHByb2plY3REb21haW47CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRG9tYWlufSB3aXRoIGdpdmVuIG5hbWUuCisJICogCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0BsaW5rIERvbWFpbn0KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAbGluayBEb21haW59IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBEb21haW4gY3JlYXRlRG9tYWluKFN0cmluZyBuYW1lKSB7CisJCURvbWFpbiBkb21haW4gPSBuZXcgRG9tYWluKGNyZWF0ZUNvcmUoRG9tYWluLmNsYXNzKSk7CisKKwkJLy8gcHJvcGVydGllcworCQlkb21haW4uc2V0TmFtZShuYW1lKTsKKwkJcmV0dXJuIGRvbWFpbjsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJvdGVjdGVkIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSBmb3IgZ2l2ZW4ge0BsaW5rIFBvb2x9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdH0uCisJICoKKwkgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHBvb2wgICAgICAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFBvb2x9LgorCSAqIEBwYXJhbSBzdGF0dXNUZXN0ICAgICBUaGUgcmVsYXRlZCB7QGxpbmsgU3RhdHVzfSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUKKwkgKiAJCVRlc3R9ICAgICAgICAgLgorCSAqIEBwYXJhbSBzdGF0dXNUZXN0U3RlcCBUaGUgcmVsYXRlZCB7QGxpbmsgU3RhdHVzfSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUKKwkgKiAJCVRlc3RTdGVwfSAgICAgLgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVRlc3QgICBUaGUgdGVtcGxhdGUgdGhlIHJldHVybmVkIHtAY29kZSBUZXN0fSB3aWxsIGJlIGRlcml2ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgZnJvbS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwkvLyBUT0RPIG1ha2UgYSBkZWNpc2lvbjogc3RhdHVzIGluIG9yIG91dCEKKwlwcm90ZWN0ZWQgVGVzdCBjcmVhdGVUZXN0KFN0cmluZyBuYW1lLCBQb29sIHBvb2wsIFN0YXR1cyBzdGF0dXNUZXN0LCBTdGF0dXMgc3RhdHVzVGVzdFN0ZXAsCisJCQlUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0KSB7CisJCVRlc3QgdGVzdCA9IGNyZWF0ZVRlc3QobmFtZSwgcG9vbCwgc3RhdHVzVGVzdCk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHRlbXBsYXRlVGVzdCk7CisKKwkJLy8gY3JlYXRlIGRlZmF1bHQgYWN0aXZlIGFuZCBtYW5kYXRvcnkgdGVzdCBzdGVwcyBhY2NvcmRpbmcgdG8gdGhlCisJCS8vIHRlbXBsYXRlCisJCXRlbXBsYXRlVGVzdC5nZXRUZW1wbGF0ZVRlc3RTdGVwVXNhZ2VzKCkuc3RyZWFtKCkuZmlsdGVyKFRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5JU19JTVBMSUNJVF9DUkVBVEUpCisJCQkJLm1hcChUZW1wbGF0ZVRlc3RTdGVwVXNhZ2U6OmdldFRlbXBsYXRlVGVzdFN0ZXApLmZvckVhY2godGVtcGxhdGVUZXN0U3RlcCAtPiB7CisJCQkJCWNyZWF0ZVRlc3RTdGVwKHRlc3QsIHN0YXR1c1Rlc3RTdGVwLCB0ZW1wbGF0ZVRlc3RTdGVwKTsKKwkJCQl9KTsKKworCQlyZXR1cm4gdGVzdDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0fSBmb3IgZ2l2ZW4ge0BsaW5rIFBvb2x9IHVzaW5nIGdpdmVuIG5hbWUsCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdH0gYW5kIHtAbGluayBDbGFzc2lmaWNhdGlvbn0uCisJICogCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBwb29sICAgICAgICAgICBUaGUgcGFyZW50IHtAY29kZSBQb29sfS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0ICAgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgVGVzdH0gd2lsbCBiZSBkZXJpdmVkCisJICogICAgICAgICAgICAgICAgICAgICAgIGZyb20uCisJICogQHBhcmFtIGNsYXNzaWZpY2F0aW9uIFRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259IGZvciB0aGUgY3JlYXRlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVGVzdH0uCisJICogQHBhcmFtIHdpdGhUZXN0U3RlcHMgIElmIHRydWUsIHtAbGluayBUZXN0U3RlcH1zIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gY29uZmlndXJlZCB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdCBjcmVhdGVUZXN0KFN0cmluZyBuYW1lLCBQb29sIHBvb2wsIFRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QsIENsYXNzaWZpY2F0aW9uIGNsYXNzaWZpY2F0aW9uLAorCQkJYm9vbGVhbiB3aXRoVGVzdFN0ZXBzKSB7CisJCS8vIFRPRE8KKwkJVGVzdCB0ZXN0ID0gY3JlYXRlVGVzdChuYW1lLCBwb29sKTsKKworCQkvLyByZWxhdGlvbnMKKwkJaWYgKHRlbXBsYXRlVGVzdCAhPSBudWxsKSB7CisJCQlnZXRDb3JlKHRlc3QpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZVRlc3QpOworCQl9CisJCWdldENvcmUodGVzdCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNsYXNzaWZpY2F0aW9uKTsKKworCQlpZiAod2l0aFRlc3RTdGVwcyAmJiB0ZW1wbGF0ZVRlc3QgIT0gbnVsbCkgeworCQkJLy8gY3JlYXRlIGRlZmF1bHQgYWN0aXZlIGFuZCBtYW5kYXRvcnkgdGVzdCBzdGVwcyBhY2NvcmRpbmcgdG8gdGhlCisJCQkvLyB0ZW1wbGF0ZQorCQkJdGVtcGxhdGVUZXN0LmdldFRlbXBsYXRlVGVzdFN0ZXBVc2FnZXMoKS5zdHJlYW0oKS5maWx0ZXIoVGVtcGxhdGVUZXN0U3RlcFVzYWdlLklTX0lNUExJQ0lUX0NSRUFURSkKKwkJCQkJLm1hcChUZW1wbGF0ZVRlc3RTdGVwVXNhZ2U6OmdldFRlbXBsYXRlVGVzdFN0ZXApLmZvckVhY2godGVtcGxhdGVUZXN0U3RlcCAtPiB7CisJCQkJCQljcmVhdGVUZXN0U3RlcCh0ZXN0LCB0ZW1wbGF0ZVRlc3RTdGVwLCBjbGFzc2lmaWNhdGlvbik7CisJCQkJCX0pOworCQl9CisKKwkJcmV0dXJuIHRlc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdFN0ZXB9IGZvciBnaXZlbiB7QGxpbmsgVGVzdH0gdXNpbmcgZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0gYW5kIHtAbGluayBDbGFzc2lmaWNhdGlvbn0uCisJICogCisJICogQHBhcmFtIHRlc3QgICAgICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdFN0ZXAgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgVGVzdFN0ZXB9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHBhcmFtIGNsYXNzaWZpY2F0aW9uICAgVGhlIHtAbGluayBDbGFzc2lmaWNhdGlvbn0gZm9yIHRoZSBjcmVhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFRlc3RTdGVwfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZXN0U3RlcH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlc3RTdGVwIGNyZWF0ZVRlc3RTdGVwKFRlc3QgdGVzdCwgVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwLCBDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbikgeworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IGNyZWF0ZVRlc3RTdGVwKHRlc3QsIHRlbXBsYXRlVGVzdFN0ZXApOworCQlnZXRDb3JlKHRlc3RTdGVwKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQoY2xhc3NpZmljYXRpb24pOworCQlyZXR1cm4gdGVzdFN0ZXA7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdFN0ZXB9IGZvciBnaXZlbiB7QGxpbmsgVGVzdH0gdXNpbmcgZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0gYW5kIHtAbGluayBDbGFzc2lmaWNhdGlvbn0uCisJICogCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfS4KKwkgKiBAcGFyYW0gdGVzdCAgICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIGNsYXNzaWZpY2F0aW9uIFRoZSB7QGxpbmsgQ2xhc3NpZmljYXRpb259IGZvciB0aGUgY3JlYXRlZAorCSAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoU3RyaW5nIG5hbWUsIFRlc3QgdGVzdCwgQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24pIHsKKwkJVGVzdFN0ZXAgdGVzdFN0ZXAgPSBjcmVhdGVUZXN0U3RlcChuYW1lLCB0ZXN0KTsKKwkJZ2V0Q29yZSh0ZXN0U3RlcCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNsYXNzaWZpY2F0aW9uKTsKKwkJcmV0dXJuIHRlc3RTdGVwOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RTdGVwfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlc3R9IHVzaW5nIGdpdmVuIG5hbWUsCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IGFuZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259LgorCSAqIAorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfS4KKwkgKiBAcGFyYW0gdGVzdCAgICAgICAgICAgICBUaGUgcGFyZW50IHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0U3RlcCBUaGUgdGVtcGxhdGUgdGhlIHJldHVybmVkIHtAY29kZSBUZXN0U3RlcH0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcGFyYW0gY2xhc3NpZmljYXRpb24gICBUaGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBmb3IgdGhlIGNyZWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoU3RyaW5nIG5hbWUsIFRlc3QgdGVzdCwgVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwLAorCQkJQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24pIHsKKwkJVGVzdFN0ZXAgdGVzdFN0ZXAgPSBjcmVhdGVUZXN0U3RlcCh0ZXN0LCB0ZW1wbGF0ZVRlc3RTdGVwKTsKKwkJZ2V0Q29yZSh0ZXN0U3RlcCkuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KGNsYXNzaWZpY2F0aW9uKTsKKwkJdGVzdFN0ZXAuc2V0TmFtZShuYW1lKTsKKwkJcmV0dXJuIHRlc3RTdGVwOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgRXh0U3lzdGVtfQorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBleHRlcm5hbCBzeXN0ZW0KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEV4dFN5c3RlbSBjcmVhdGVFeHRTeXN0ZW0oU3RyaW5nIG5hbWUpIHsKKwkJRXh0U3lzdGVtIGV4dFN5c3RlbSA9IG5ldyBFeHRTeXN0ZW0oY3JlYXRlQ29yZShFeHRTeXN0ZW0uY2xhc3MpKTsKKwkJZXh0U3lzdGVtLnNldE5hbWUobmFtZSk7CisJCXJldHVybiBleHRTeXN0ZW07CisJfQorCisJLyoqCisJICogQ3JlYXRlIGEgbmV3IHtAbGluayBFeHRTeXN0ZW1BdHRyaWJ1dGV9CisJICogQHBhcmFtIG5hbWUgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBleHRlcm5hbCBzeXN0ZW0gYXR0cmlidXRlCisJICogQHBhcmFtIGV4dFN5c3RlbSAgIFRoZSBwYXJlbnQge0BsaW5rIEV4dFN5c3RlbX0KKwkgKiBAcmV0dXJuCisJICovCisJcHVibGljIEV4dFN5c3RlbUF0dHJpYnV0ZSBjcmVhdGVFeHRTeXN0ZW1BdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIEV4dFN5c3RlbSBleHRTeXN0ZW0pIHsKKwkJRXh0U3lzdGVtQXR0cmlidXRlIGV4dFN5c3RlbUF0dHJpYnV0ZSA9IG5ldyBFeHRTeXN0ZW1BdHRyaWJ1dGUoY3JlYXRlQ29yZShFeHRTeXN0ZW1BdHRyaWJ1dGUuY2xhc3MpKTsKKwkJZ2V0Q29yZShleHRTeXN0ZW1BdHRyaWJ1dGUpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KGV4dFN5c3RlbSk7CisJCWdldENvcmUoZXh0U3lzdGVtKS5nZXRDaGlsZHJlblN0b3JlKCkuYWRkKGV4dFN5c3RlbUF0dHJpYnV0ZSk7CisJCWV4dFN5c3RlbUF0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOworCQlyZXR1cm4gZXh0U3lzdGVtQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgTURNQXR0cmlidXRlfQorCSAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBtZG0gYXR0cmlidXRlCisJICogQHBhcmFtIGV4dFN5c3RlbUF0dHJpYnV0ZSAgVGhlIHBhcmVudCB7QGxpbmsgRXh0U3lzdGVtQXR0cmlidXRlfQorCSAqIEByZXR1cm4KKwkgKi8KKwlwdWJsaWMgTURNQXR0cmlidXRlIGNyZWF0ZU1ETUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgRXh0U3lzdGVtQXR0cmlidXRlIGV4dFN5c3RlbUF0dHJpYnV0ZSkgeworCQlNRE1BdHRyaWJ1dGUgbWRtQXR0cmlidXRlID0gbmV3IE1ETUF0dHJpYnV0ZShjcmVhdGVDb3JlKE1ETUF0dHJpYnV0ZS5jbGFzcykpOworCQlnZXRDb3JlKG1kbUF0dHJpYnV0ZSkuZ2V0UGVybWFuZW50U3RvcmUoKS5zZXQoZXh0U3lzdGVtQXR0cmlidXRlKTsKKwkJZ2V0Q29yZShleHRTeXN0ZW1BdHRyaWJ1dGUpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQobWRtQXR0cmlidXRlKTsKKwkJbWRtQXR0cmlidXRlLnNldE5hbWUobmFtZSk7CisJCVN0cmluZ1tdIHZhbHVlcyA9IG5hbWUuc3BsaXQoIlxcLiIpOworCQlpZih2YWx1ZXMubGVuZ3RoID09IDMpIHsKKwkJCW1kbUF0dHJpYnV0ZS5zZXRDb21wb25lbnRUeXBlKHZhbHVlc1swXSk7CisJCQltZG1BdHRyaWJ1dGUuc2V0Q29tcG9uZW50TmFtZSh2YWx1ZXNbMV0pOworCQkJbWRtQXR0cmlidXRlLnNldEF0dHJpYnV0ZU5hbWUodmFsdWVzWzJdKTsKKwkJfQorCQlyZXR1cm4gbWRtQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFRlc3RTdGVwfSBmb3IgZ2l2ZW4ge0BsaW5rIFRlc3R9IHVzaW5nIGdpdmVuCisJICoge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IGFuZCB7QGxpbmsgQ2xhc3NpZmljYXRpb259LiBEb2Vzbid0IGNyZWF0ZSBjb250ZXh0CisJICogcm9vdHMKKwkgKiAKKwkgKiBAcGFyYW0gdGVzdCAgICAgICAgICAgICBUaGUgcGFyZW50IHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0U3RlcCBUaGUgdGVtcGxhdGUgdGhlIHJldHVybmVkIHtAY29kZSBUZXN0U3RlcH0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcGFyYW0gY2xhc3NpZmljYXRpb24gICBUaGUge0BsaW5rIENsYXNzaWZpY2F0aW9ufSBmb3IgdGhlIGNyZWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgVGVzdFN0ZXB9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXBXaXRoT3V0Q29udGV4dFJvb3RzKFRlc3QgdGVzdCwgVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwLAorCQkJQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24pIHsKKwkJVGVzdFN0ZXAgdGVzdFN0ZXAgPSBjcmVhdGVUZXN0U3RlcFdpdGhPdXRDb250ZXh0Um9vdHModGVzdCwgdGVtcGxhdGVUZXN0U3RlcCk7CisJCWdldENvcmUodGVzdFN0ZXApLmdldE11dGFibGVTdG9yZSgpLnNldChjbGFzc2lmaWNhdGlvbik7CisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0U3RlcH0gZm9yIGdpdmVuIHtAbGluayBUZXN0fSB1c2luZyBnaXZlbgorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfS4gRG9lc24ndCBjcmVhdGUgY29udGV4dCByb290cworCSAqCisJICogQHBhcmFtIHRlc3QgICAgICAgICAgICAgVGhlIHBhcmVudCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHRlbXBsYXRlVGVzdFN0ZXAgVGhlIHRlbXBsYXRlIHRoZSByZXR1cm5lZCB7QGNvZGUgVGVzdFN0ZXB9IHdpbGwgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgVGVzdFN0ZXB9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZXN0U3RlcCBjcmVhdGVUZXN0U3RlcFdpdGhPdXRDb250ZXh0Um9vdHMoVGVzdCB0ZXN0LCBUZW1wbGF0ZVRlc3RTdGVwIHRlbXBsYXRlVGVzdFN0ZXApIHsKKwkJcmV0dXJuIGNyZWF0ZVRlc3RTdGVwV2l0aE91dENvbnRleHRSb290cyh0ZXN0LCBudWxsLCB0ZW1wbGF0ZVRlc3RTdGVwKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0U3RlcH0gZm9yIGdpdmVuIHtAbGluayBUZXN0fSB1c2luZyBnaXZlbgorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfS4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0ICAgICAgICAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBzdGF0dXMgICAgICAgICAgIFRoZSByZWxhdGVkIHtAbGluayBTdGF0dXN9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVRlc3RTdGVwIFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIFRlc3RTdGVwfSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwkvLyBUT0RPIG1ha2UgYSBkZWNpc2lvbjogc3RhdHVzIGluIG9yIG91dCEKKwlwcm90ZWN0ZWQgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXBXaXRoT3V0Q29udGV4dFJvb3RzKFRlc3QgdGVzdCwgU3RhdHVzIHN0YXR1cywgVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwKSB7CisJCVRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QgPSBUZW1wbGF0ZVRlc3Qub2YodGVzdCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGVtcGxhdGUgdGVzdCBpcyBub3QgYXZhaWxhYmxlLiIpKTsKKwkJaWYgKCF0ZW1wbGF0ZVRlc3QuY29udGFpbnModGVtcGxhdGVUZXN0U3RlcCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRlbXBsYXRlIHRlc3Qgc3RlcCBpcyBub3QgcGFydCBvZiB0aGUgdGVzdCB0ZW1wbGF0ZS4iKTsKKwkJfQorCisJCVRlc3RTdGVwIHRlc3RTdGVwID0gY3JlYXRlVGVzdFN0ZXAodGVtcGxhdGVUZXN0U3RlcC5nZXROYW1lKCksIHRlc3QsIHN0YXR1cyk7CisKKwkJLy8gcmVsYXRpb25zCisJCWdldENvcmUodGVzdFN0ZXApLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZVRlc3RTdGVwKTsKKworCQlyZXR1cm4gdGVzdFN0ZXA7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdH0gZm9yIGdpdmVuIHtAbGluayBQb29sfS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHBvb2wgICBUaGUgcGFyZW50IHtAY29kZSBQb29sfS4KKwkgKiBAcGFyYW0gc3RhdHVzIFRoZSByZWxhdGVkIHtAbGluayBTdGF0dXN9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3R9IGlzIHJldHVybmVkLgorCSAqLworCS8vIFRPRE8gbWFrZSBhIGRlY2lzaW9uOiBzdGF0dXMgaW4gb3Igb3V0IQorCXByb3RlY3RlZCBUZXN0IGNyZWF0ZVRlc3QoU3RyaW5nIG5hbWUsIFBvb2wgcG9vbCwgU3RhdHVzIHN0YXR1cykgeworCQlUZXN0IHRlc3QgPSBzdXBlci5jcmVhdGVUZXN0KG5hbWUpOworCisJCS8vIHJlbGF0aW9ucworCQlnZXRDb3JlKHRlc3QpLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHBvb2wpOworCQlnZXRDb3JlKHBvb2wpLmdldENoaWxkcmVuU3RvcmUoKS5hZGQodGVzdCk7CisKKwkJcmV0dXJuIHRlc3Q7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGVzdFN0ZXB9IGZvciBnaXZlbiB7QGxpbmsgVGVzdH0gdXNpbmcgZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0uCisJICoKKwkgKiBAcGFyYW0gdGVzdCAgICAgICAgICAgICBUaGUgcGFyZW50IHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0U3RlcCBUaGUgdGVtcGxhdGUgdGhlIHJldHVybmVkIHtAY29kZSBUZXN0U3RlcH0gd2lsbCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlcml2ZWQgZnJvbS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBUZXN0U3RlcH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlc3RTdGVwIGNyZWF0ZVRlc3RTdGVwKFRlc3QgdGVzdCwgVGVtcGxhdGVUZXN0U3RlcCB0ZW1wbGF0ZVRlc3RTdGVwKSB7CisJCXJldHVybiBjcmVhdGVUZXN0U3RlcCh0ZXN0LCBudWxsLCB0ZW1wbGF0ZVRlc3RTdGVwKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0U3RlcH0gZm9yIGdpdmVuIHtAbGluayBUZXN0fSB1c2luZyBnaXZlbgorCSAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwfS4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0ICAgICAgICAgICAgIFRoZSBwYXJlbnQge0Bjb2RlIFRlc3R9LgorCSAqIEBwYXJhbSBzdGF0dXMgICAgICAgICAgIFRoZSByZWxhdGVkIHtAbGluayBTdGF0dXN9LgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVRlc3RTdGVwIFRoZSB0ZW1wbGF0ZSB0aGUgcmV0dXJuZWQge0Bjb2RlIFRlc3RTdGVwfSB3aWxsIGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgZGVyaXZlZCBmcm9tLgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwkvLyBUT0RPIG1ha2UgYSBkZWNpc2lvbjogc3RhdHVzIGluIG9yIG91dCEKKwlwcm90ZWN0ZWQgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoVGVzdCB0ZXN0LCBTdGF0dXMgc3RhdHVzLCBUZW1wbGF0ZVRlc3RTdGVwIHRlbXBsYXRlVGVzdFN0ZXApIHsKKworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IGNyZWF0ZVRlc3RTdGVwV2l0aE91dENvbnRleHRSb290cyh0ZXN0LCBzdGF0dXMsIHRlbXBsYXRlVGVzdFN0ZXApOworCisJCS8vIGNyZWF0ZSBpbml0aWFsIGNvbnRleHQgcm9vdHMKKwkJdGVtcGxhdGVUZXN0U3RlcC5nZXRUZW1wbGF0ZVJvb3RzKCkuZm9yRWFjaCh0ZW1wbGF0ZVJvb3QgLT4gY3JlYXRlQ29udGV4dFJvb3QodGVzdFN0ZXAsIHRlbXBsYXRlUm9vdCkpOworCisJCXJldHVybiB0ZXN0U3RlcDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBUZXN0U3RlcH0gZm9yIGdpdmVuIHtAbGluayBUZXN0fS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lICAgTmFtZSBvZiB0aGUgY3JlYXRlZCB7QGNvZGUgVGVzdH0uCisJICogQHBhcmFtIHRlc3QgICBUaGUgcGFyZW50IHtAY29kZSBUZXN0fS4KKwkgKiBAcGFyYW0gc3RhdHVzIFRoZSByZWxhdGVkIHtAbGluayBTdGF0dXN9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIFRlc3RTdGVwfSBpcyByZXR1cm5lZC4KKwkgKi8KKwkvLyBUT0RPIG1ha2UgYSBkZWNpc2lvbjogc3RhdHVzIGluIG9yIG91dCEKKwlwcm90ZWN0ZWQgVGVzdFN0ZXAgY3JlYXRlVGVzdFN0ZXAoU3RyaW5nIG5hbWUsIFRlc3QgdGVzdCwgU3RhdHVzIHN0YXR1cykgeworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IHN1cGVyLmNyZWF0ZVRlc3RTdGVwKG5hbWUsIHRlc3QpOworCisJCWlmIChzdGF0dXMgIT0gbnVsbCkgeworCQkJc3RhdHVzLmFzc2lnbih0ZXN0U3RlcCk7CisJCX0KKworCQlyZXR1cm4gdGVzdFN0ZXA7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEJhc2VFbnRpdHk+IFQgY3JlYXRlQmFzZUVudGl0eShDbGFzczxUPiBjbGF6eiwgQ29yZSBjb3JlKSB7CisJCXRyeSB7CisJCQlDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3IoQ29yZS5jbGFzcyk7CisJCQl0cnkgeworCQkJCXJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShjb3JlKTsKKwkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjKSB7CisJCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUJhc2VFbnRpdHkoY2xhenosIGNvcmUpOworCQkJfQorCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXhjLmdldE1lc3NhZ2UoKSwgZXhjKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIGVudW1lcmF0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG1vZGVsIG9yIG5vdC4KKwkgKgorCSAqIEBwYXJhbSBlbnVtZXJhdGlvbk9iaiBUaGUgY2hlY2tlZCBlbnVtZXJhdGlvbiBjbGFzcy4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gZW51bWVyYXRpb24gY2xhc3MgaXMgbm90CisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLgorCSAqLworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlRW51bShFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbk9iaik7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gY2F0YWxvZyBuYW1lIGlzIGFsbG93ZWQgb3Igbm90LgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgICAgICBUaGUgY2hlY2tlZCBuYW1lLgorCSAqIEBwYXJhbSBpc0F0dHJpYnV0ZU5hbWUgRmxhZyBpbmRpY2F0ZXMgd2hldGhlciBnaXZlbiBuYW1lIGlzIGZvciBhIGNhdGFsb2cKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZ2l2ZW4gbmFtZSBpcyBub3QgYWxsb3dlZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ2F0YWxvZ05hbWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBdHRyaWJ1dGVOYW1lKSB7CisJCWlmICghaXNWYWxpZENhdGFsb2dOYW1lKG5hbWUpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiQSBjYXRhbG9nIG5hbWUgaXMgbm90IGFsbG93ZWQgdG8gYmUgZW1wdHkgYW5kICIgKyAibXVzdCBub3QgZXhjZWVkIDMwIGNoYXJhY3RlcnMuIik7CisJCX0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkuc3RhcnRzV2l0aCgiYW8iKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBjYXRhbG9nIG5hbWUgaXMgbm90IGFsbG93ZWQgdG8gIiArICJzdGFydCB3aXRoICdhbycgKGNhc2UgaWdub3JlZCkuIik7CisJCX0gZWxzZSBpZiAoIW5hbWUubWF0Y2hlcygiXltcXHddKyQiKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIkEgY2FsYXRvZyBuYW1lIG1heSBvbmx5IGNvbnN0aXN0cyBvZiB0aGUgIiArICJmb2xsb3dpbmcgY2hhcmFjdGVyczogYS16LCBBLVosIDAtOSBvciBfLiIpOworCQl9IGVsc2UgaWYgKGlzQXR0cmlidXRlTmFtZSAmJiBBcnJheXMuYXNMaXN0KCJpZCIsICJuYW1lIiwgIm1pbWV0eXBlIikuY29udGFpbnMobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiQSBjYXRhbG9nIGF0dHJpYnV0ZSBuYW1lIGlzIG5vdCBhbGxvd2VkIHRvIGJlICIgKyAiJ2lkJywgJ25hbWUnIG9yICdtaW1ldHlwZScgKGNhc2UgaWdub3JlZCkuIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiBjYXRhbG9nIG5hbWUgaXMgdmFsaWQKKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBjaGVja2VkIG5hbWUuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBuYW1lIGlzIGEgdmFsaWQgY2F0YWxvZyBuYW1lCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2F0YWxvZ05hbWUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIG5hbWUgIT0gbnVsbCAmJiAhbmFtZS5pc0VtcHR5KCkgJiYgbmFtZS5sZW5ndGgoKSA8PSAzMDsKKwl9CisKKwkvKioKKwkgKiBIaWRlcyB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMgbWlzc2luZyBpbiB0aGUgdGVtcGxhdGVzLgorCSAqCisJICogQHBhcmFtIGNvbnRleHRDb3JlICAgICAgICBUaGUge0BsaW5rIENvbnRleHRDb21wb25lbnR9IHtAbGluayBDb3JlfS4KKwkgKiBAcGFyYW0gdGVtcGxhdGVBdHRyaWJ1dGVzIFRoZSB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9cyBvZiB0aGUgdGVtcGxhdGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBoaWRlVmFsdWVzKENvcmUgY29udGV4dENvcmUsIExpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+IHRlbXBsYXRlQXR0cmlidXRlcykgeworCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PD4oY29udGV4dENvcmUuZ2V0VmFsdWVzKCkua2V5U2V0KCkpOworCQluYW1lcy5yZW1vdmUoRW50aXR5LkFUVFJfTkFNRSk7CisJCW5hbWVzLnJlbW92ZShFbnRpdHkuQVRUUl9NSU1FVFlQRSk7CisJCXRlbXBsYXRlQXR0cmlidXRlcy5zdHJlYW0oKS5tYXAoRW50aXR5OjpnZXROYW1lKS5mb3JFYWNoKG5hbWVzOjpyZW1vdmUpOworCQljb250ZXh0Q29yZS5oaWRlVmFsdWVzKG5hbWVzKTsKKwl9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRXh0U3lzdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRXh0U3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjNDViMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FeHRTeXN0ZW0uamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGFuIGV4dGVybmFsIHN5c3RlbSBlbnRpdHkgdHlwZS4gQW4gZXh0ZXJuYWwgc3lzdGVtCisgKiBhdHRyaWJ1dGUgY29udGFpbnMgc2V2ZXJhbCBtZG0gYXR0cmlidXRlcy4KKyAqCisgKiBAYXV0aG9yIEp1ZXJnZW4gS2xlY2ssIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworcHVibGljIGNsYXNzIEV4dFN5c3RlbSBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZXNjcmliYWJsZSwgRGVsZXRhYmxlIHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgRXh0U3lzdGVtKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwlwdWJsaWMgTGlzdDxFeHRTeXN0ZW1BdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7CisJCXJldHVybiBnZXRFeHRTeXN0ZW1BdHRyaWJ1dGVzKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBFeHRTeXN0ZW1BdHRyaWJ1dGV9cyByZWxhdGVkIHRvIHRoaXMgZXh0ZXJuYWwKKwkgKiBzeXN0ZW0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PEV4dFN5c3RlbUF0dHJpYnV0ZT4gZ2V0RXh0U3lzdGVtQXR0cmlidXRlcygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KEV4dFN5c3RlbUF0dHJpYnV0ZS5jbGFzcyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRXh0U3lzdGVtQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRXh0U3lzdGVtQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2YmE1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9FeHRTeXN0ZW1BdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGFuIGV4dGVybmFsIHN5c3RlbSBhdHRyaWJ1dGUgZW50aXR5IHR5cGUuIEFuIGV4dGVybmFsCisgKiBzeXN0ZW0gYXR0cmlidXRlIGNvbnRhaW5zIHNldmVyYWwgbWRtIGF0dHJpYnV0ZXMuCisgKgorICogQGF1dGhvciBKdWVyZ2VuIEtsZWNrLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRTeXN0ZW1BdHRyaWJ1dGUgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVzY3JpYmFibGUsIERlbGV0YWJsZSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJcHJvdGVjdGVkIEV4dFN5c3RlbUF0dHJpYnV0ZShDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJcHVibGljIExpc3Q8TURNQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0TURNQXR0cmlidXRlcygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSB7QGxpbmsgTURNQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIGV4dGVybmFsIHN5c3RlbQorCSAqIGF0dHJpYnV0ZS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8TURNQXR0cmlidXRlPiBnZXRNRE1BdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoTURNQXR0cmlidXRlLmNsYXNzKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9NRE1BdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9NRE1BdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWIwNDlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL01ETUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMjAgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIGFuIGV4dGVybmFsIHN5c3RlbSBlbnRpdHkgdHlwZS4gQW4gZXh0ZXJuYWwgc3lzdGVtCisgKiBhdHRyaWJ1dGUgY29udGFpbnMgc2V2ZXJhbCBtZG0gYXR0cmlidXRlcy4KKyAqCisgKiBAYXV0aG9yIEp1ZXJnZW4gS2xlY2ssIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworcHVibGljIGNsYXNzIE1ETUF0dHJpYnV0ZSBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZXNjcmliYWJsZSwgRGVsZXRhYmxlIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09NUE9ORU5UX1RZUEUgPSAiQ29tcFR5cGUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ09NUE9ORU5UX05BTUUgPSAiQ29tcE5hbWUiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQVRUUklCVVRFX05BTUUgPSAiQXR0ck5hbWUiOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCXByb3RlY3RlZCBNRE1BdHRyaWJ1dGUoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZQorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50VHlwZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQ09NUE9ORU5UX1RZUEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBhdHRyaWJ1dGUKKwkgKgorCSAqIEBwYXJhbSBjb21wVHlwZSBUaGUgY29tcG9uZW50IHR5cGUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKFN0cmluZyBjb21wVHlwZSkgeworCQlnZXRWYWx1ZShBVFRSX0NPTVBPTkVOVF9UWVBFKS5zZXQoY29tcFR5cGUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBuYW1lIGZvciB0aGlzIGF0dHJpYnV0ZQorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBjb21wb25lbnQgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50TmFtZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQ09NUE9ORU5UX05BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBjb21wb25lbnQgbmFtZSBmb3IgdGhpcyBhdHRyaWJ1dGUKKwkgKgorCSAqIEBwYXJhbSBjb21wTmFtZSBUaGUgY29tcG9uZW50IG5hbWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnROYW1lKFN0cmluZyBjb21wTmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX0NPTVBPTkVOVF9OQU1FKS5zZXQoY29tcE5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGlzIGF0dHJpYnV0ZQorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgbmFtZQorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfQVRUUklCVVRFX05BTUUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3IgdGhpcyBhdHRyaWJ1dGUKKwkgKgorCSAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgYXR0cmlidXRlIG5hbWUKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKFN0cmluZyBhdHRyTmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX0FUVFJJQlVURV9OQU1FKS5zZXQoYXR0ck5hbWUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1Bvb2wuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Qb29sLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNmNlNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Qb29sLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHBvb2wgZW50aXR5IHR5cGUuIFRoZSBwb29sIGVudGl0eSBpcyB1c2VkIHRvIGVzdGFibGlzaAorICogYSBmdXJ0aGVyIG5hdmlnYXRpb24gc3RydWN0dXJlIHRocm91Z2ggdGhlIHN0b3JlZCBtZWFzdXJlbWVudCBkYXRhLiBJdHMgbmFtZQorICogbWF5IGJlIGZyZWVseSBjaG9zZW4gYnV0IGhhcyB0byB0byBiZSB1bmlxdWUuIEEgcHJvamVjdCBjb250YWlucyB7QGxpbmsgVGVzdH0KKyAqIGVudGl0aWVzIGFzIGl0cyBjaGlsZHJlbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgUHJvamVjdAorICogQHNlZSBUZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBQb29sIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIHtAbGluayBQcm9qZWN0fSBwYXJlbnQgdHlwZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFByb2plY3Q+IFBBUkVOVF9UWVBFX1BST0pFQ1QgPSBQcm9qZWN0LmNsYXNzOworCisJLyoqCisJICogVGhlIHtAbGluayBUZXN0fSBjaGlsZCB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2xhc3M8VGVzdD4gQ0hJTERfVFlQRV9URVNUID0gVGVzdC5jbGFzczsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJUG9vbChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUHJvamVjdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1Byb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzcxYjRkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1Byb2plY3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvamVjdCBlbnRpdHkgdHlwZS4gVGhlIHByb2plY3QgaXMgdGhlIHRvcCBsZXZlbCBvZgorICogc3RvcmVkIG1lYXN1cmVtZW50IGRhdGEuIEl0cyBuYW1lIG1heSBiZSBmcmVlbHkgY2hvc2VuIGJ1dCBoYXMgdG8gdG8gYmUKKyAqIHVuaXF1ZS4gQSBwcm9qZWN0IGNvbnRhaW5zIHtAbGluayBQb29sfSBlbnRpdGllcyBhcyBpdHMgY2hpbGRyZW4uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFBvb2wKKyAqLworcHVibGljIGNsYXNzIFByb2plY3QgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGUge0BsaW5rIFBvb2x9IGNoaWxkIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczxQb29sPiBDSElMRF9UWVBFX1BPT0wgPSBQb29sLmNsYXNzOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlQcm9qZWN0KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Qcm9qZWN0RG9tYWluLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUHJvamVjdERvbWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZTdiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUHJvamVjdERvbWFpbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKKworcHVibGljIGNsYXNzIFByb2plY3REb21haW4gZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVzY3JpYmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlQcm9qZWN0RG9tYWluKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvUm9sZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1JvbGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTEyNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1JvbGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZXNjcmliYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcm9sZSBlbnRpdHkgdHlwZS4gRWFjaCByb2xlIGNhbiBjb250YWluIG11bHRpcGxlCisgKiB7QGxpbmsgVXNlcn0gYW5kIGVhY2gge0BsaW5rIFVzZXJ9IGNhbiBiZSBhc3NpZ25lZCBtdWx0aXBsZSB7QGxpbmsgUm9sZX1zLgorICovCitwdWJsaWMgY2xhc3MgUm9sZSBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUsIERlc2NyaWJhYmxlIHsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1VQRVJVU0VSX0ZMQUcgPSAiU3VwZXJ1c2VyRmxhZyI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMX0dST1VQUzJVU0VSUyA9ICJncm91cHMydXNlcnMiOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVJvbGUoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCQlnZXRWYWx1ZShBVFRSX1NVUEVSVVNFUl9GTEFHKS5zZXQoKHNob3J0KSAwKTsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gdXNlciBVc2VyIHRvIGFkZAorCSAqLworCXB1YmxpYyB2b2lkIGFkZFVzZXIoVXNlciB1c2VyKSB7CisJCWdldENvcmUoKS5nZXROdG9NU3RvcmUoKS5hZGQoUkVMX0dST1VQUzJVU0VSUywgdXNlcik7CisJfQorCisJLyoqCisJICogQHBhcmFtIHVzZXIge0BsaW5rIFVzZXJ9IHRvIHJlbW92ZQorCSAqLworCXB1YmxpYyB2b2lkIHJlbW92ZVVzZXIoVXNlciB1c2VyKSB7CisJCWdldENvcmUoKS5nZXROdG9NU3RvcmUoKS5yZW1vdmUoUkVMX0dST1VQUzJVU0VSUywgdXNlcik7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1N0YXR1cy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1N0YXR1cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMmFkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvU3RhdHVzLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TdGF0dXNBdHRhY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RhdHVzIGVudGl0eSB0eXBlLiBBIHN0YXR1cyBtYXkgYmUgYXR0YWNoZWQgdG8KKyAqIHtAbGluayBTdGF0dXNBdHRhY2hhYmxlfSBlbnRpdGllcyBsaWtlIHtAbGluayBUZXN0fSBvciB7QGxpbmsgVGVzdFN0ZXB9IHRvCisgKiBpbmRpY2F0ZSB0aGV5IGhhdmUgYSBzdGF0ZSBpbiBhIGNvbXBsZXRlIHdvcmtmbG93LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgU3RhdHVzIGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlc2NyaWJhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJU3RhdHVzKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBBc3NpZ25zIHRoaXMgc3RhdHVzIHRvIGdpdmVuIHtAbGluayBTdGF0dXNBdHRhY2hhYmxlfXMuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICAgVGhlIHN0YXR1cyBhdHRhY2hhYmxlIHR5cGUuCisJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGVzIFRoaXMgc3RhdHVzIHdpbGwgYmUgYXNzaWduZWQgdG8gYWxsIG9mIHRoZW0uCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4gdm9pZCBhc3NpZ24oTGlzdDxUPiBzdGF0dXNBdHRhY2hhYmxlcykgeworCQlzdGF0dXNBdHRhY2hhYmxlcy5mb3JFYWNoKHRoaXM6OmFzc2lnbik7CisJfQorCisJLyoqCisJICogQXNzaWducyB0aGlzIHN0YXR1cyB0byBnaXZlbiB7QGxpbmsgU3RhdHVzQXR0YWNoYWJsZX0uCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICBUaGUgc3RhdHVzIGF0dGFjaGFibGUgdHlwZS4KKwkgKiBAcGFyYW0gc3RhdHVzQXR0YWNoYWJsZSBUaGlzIHN0YXR1cyB3aWxsIGJlIGFzc2lnbmVkIHRvIGl0LgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHZvaWQgYXNzaWduKFQgc3RhdHVzQXR0YWNoYWJsZSkgeworCQlDbGFzc2lmaWNhdGlvbiBjbGFzc2lmaWNhdGlvbiA9IGdldENvcmUoc3RhdHVzQXR0YWNoYWJsZSkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENsYXNzaWZpY2F0aW9uLmNsYXNzKTsKKwkJaWYgKGNsYXNzaWZpY2F0aW9uID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJNYW5kYXRvcnkgZWxlbWVudCBjbGFzc2lmaWNhdGlvbiBub3QgZm91bmQhIik7CisJCX0KKworCQlnZXRDb3JlKGNsYXNzaWZpY2F0aW9uKS5nZXRNdXRhYmxlU3RvcmUoKS5zZXQodGhpcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFN0YXR1c30gYXR0YWNoZWQgdG8gZ2l2ZW4ge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9LgorCSAqCisJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGUgVGhlIHtAY29kZSBTdGF0dXNBdHRhY2hhYmxlfS4KKwkgKiBAcmV0dXJuIE9wdGlvbmFsIGlzIGVtcHR5IGlmIG5vIHtAY29kZSBTdGF0dXN9IGlzIGF0dGFjaGVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U3RhdHVzPiBvZihTdGF0dXNBdHRhY2hhYmxlIHN0YXR1c0F0dGFjaGFibGUpIHsKKwkJQ2xhc3NpZmljYXRpb24gY2xhc3NpZmljYXRpb24gPSBnZXRDb3JlKHN0YXR1c0F0dGFjaGFibGUpLmdldE11dGFibGVTdG9yZSgpLmdldChDbGFzc2lmaWNhdGlvbi5jbGFzcyk7CisJCWlmIChjbGFzc2lmaWNhdGlvbiA9PSBudWxsKSB7CisJCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKGNsYXNzaWZpY2F0aW9uKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoU3RhdHVzLmNsYXNzKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvU3lzdGVtUGFyYW1ldGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvU3lzdGVtUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwYTY1NAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9TeXN0ZW1QYXJhbWV0ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbg0KKyAqDQorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbA0KKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KKyAqDQorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlDQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdA0KKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4NCisgKg0KKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7DQorDQoraW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7DQoraW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5Ow0KKw0KKy8qKg0KKyAqIEBhdXRob3IgYWtuDQorICoNCisgKi8NCitwdWJsaWMgY2xhc3MgU3lzdGVtUGFyYW1ldGVyIGV4dGVuZHMgQmFzZUVudGl0eSB7DQorDQorCVN5c3RlbVBhcmFtZXRlcihDb3JlIGNvcmUpIHsNCisJCXN1cGVyKGNvcmUpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk4ODYyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZUF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNDA4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRG91YmxlQ29tcGxleDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GbG9hdENvbXBsZXg7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1pbWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBhdHRyaWJ1dGUgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgYXR0cmlidXRlCisgKiBhZGRzIG1ldGEgZGF0YSB0byBhIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIEl0IGFsd2F5cworICogYmVsb25ncyB0byBhIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gb3IgYSB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9LiBJdHMgbmFtZQorICogaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IGFuZCBpcyBub3QKKyAqIGFsbG93ZWQgdG8gYmUgbW9kaWZpZWQgYXQgYWxsLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBUZW1wbGF0ZUNvbXBvbmVudAorICogQHNlZSBUZW1wbGF0ZVNlbnNvcgorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVBdHRyaWJ1dGUgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGlzIHtAY29kZSBDb21wYXJhdG9yfSBjb21wYXJlcyB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9cyBieSB0aGUgc29ydCBpbmRleAorCSAqIG9mIHRoZWlyIGNvcnJlc3BvbmRpbmcge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IGluIGFzY2VuZGluZyBvcmRlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8VGVtcGxhdGVBdHRyaWJ1dGU+IENPTVBBUkFUT1IgPSBDb21wYXJhdG9yCisJCQkuY29tcGFyaW5nKHRhIC0+IHRhLmdldENhdGFsb2dBdHRyaWJ1dGUoKS5nZXRTb3J0SW5kZXgoKSk7CisKKwkvKioKKwkgKiBUaGUgJ0RlZmF1bHRWYWx1ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX1ZBTFVFID0gIkRlZmF1bHRWYWx1ZSI7CisKKwkvKioKKwkgKiBUaGUgJ1ZhbHVlUmVhZE9ubHknIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVBRE9OTFkgPSAiVmFsdWVSZWFkb25seSI7CisKKwkvKioKKwkgKiBUaGUgJ09wdGlvbmFsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09QVElPTkFMID0gIk9ibGlnYXRvcnkiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFZhbHVlVHlwZTw/PiwgRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+PiBWQUxVRVRZUEVfRlVOQ1RJT05fTUFQID0gbmV3IEhhc2hNYXA8PigpOworCisJc3RhdGljIHsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLlNUUklORywgdiAtPiB2KTsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLkRBVEUsIHYgLT4gTG9jYWxEYXRlVGltZS5wYXJzZSh2LCBWYWx1ZS5MT0NBTF9EQVRFX1RJTUVfRk9STUFUVEVSKSk7CisJCVZBTFVFVFlQRV9GVU5DVElPTl9NQVAucHV0KFZhbHVlVHlwZS5CT09MRUFOLCBCb29sZWFuOjp2YWx1ZU9mKTsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLkJZVEUsIEJ5dGU6OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuU0hPUlQsIFNob3J0Ojp2YWx1ZU9mKTsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLklOVEVHRVIsIEludGVnZXI6OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuTE9ORywgTG9uZzo6dmFsdWVPZik7CisJCVZBTFVFVFlQRV9GVU5DVElPTl9NQVAucHV0KFZhbHVlVHlwZS5GTE9BVCwgRmxvYXQ6OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuRE9VQkxFLCBEb3VibGU6OnZhbHVlT2YpOworCQlWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLnB1dChWYWx1ZVR5cGUuRkxPQVRfQ09NUExFWCwgRmxvYXRDb21wbGV4Ojp2YWx1ZU9mKTsKKwkJVkFMVUVUWVBFX0ZVTkNUSU9OX01BUC5wdXQoVmFsdWVUeXBlLkRPVUJMRV9DT01QTEVYLCBEb3VibGVDb21wbGV4Ojp2YWx1ZU9mKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVRlbXBsYXRlQXR0cmlidXRlKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHtAbGluayBWYWx1ZX0gb2YgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIFRoZSBkZWZhdWx0IHtAY29kZSBWYWx1ZX0gaXMgcmV0dXJuZWQuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiIH0pCisJcHVibGljIFZhbHVlIGdldERlZmF1bHRWYWx1ZSgpIHsKKwkJVmFsdWVUeXBlIHZhbHVlVHlwZSA9IGdldENhdGFsb2dBdHRyaWJ1dGUoKS5nZXRWYWx1ZVR5cGUoKTsKKwkJVmFsdWUgZGVmYXVsdFZhbHVlID0gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1ZBTFVFKTsKKwkJYm9vbGVhbiBpc1ZhbGlkID0gZGVmYXVsdFZhbHVlLmlzVmFsaWQoKTsKKwkJU3RyaW5nIHZhbHVlID0gZGVmYXVsdFZhbHVlLmV4dHJhY3QoKTsKKwkJaWYgKHZhbHVlVHlwZS5pc0VudW1lcmF0aW9uVHlwZSgpKSB7CisJCQlFbnVtZXJhdGlvbiBlbnVtT2JqZWN0ID0gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZSgpLmdldEVudW1lcmF0aW9uT2JqZWN0KCk7CisJCQlyZXR1cm4gdmFsdWVUeXBlLmNyZWF0ZShnZXROYW1lKCksICIiLCBpc1ZhbGlkLCBpc1ZhbGlkID8gZW51bU9iamVjdC52YWx1ZU9mKHZhbHVlKSA6IG51bGwsCisJCQkJCWVudW1PYmplY3QuZ2V0TmFtZSgpKTsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiB2YWx1ZVR5cGUuY3JlYXRlKGdldE5hbWUoKSwgaXNWYWxpZCA/IHBhcnNlKHZhbHVlLCB2YWx1ZVR5cGUpIDogbnVsbCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTZXRzIGEgbmV3IGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlLiBHaXZlbiBpbnB1dCB3aWxsIGJlCisJICogc3RvcmVkIGluIGl0cyB7QGxpbmsgU3RyaW5nfSByZXByZXNlbnRhdGlvbi4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUgbmV3IGRlZmF1bHQgdmFsdWUuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKE9iamVjdCBpbnB1dCkgeworCQlpZiAoaW5wdXQgPT0gbnVsbCkgeworCQkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1ZBTFVFKS5zZXQobnVsbCk7CisJCQlyZXR1cm47CisJCX0KKworCQlWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlID0gZ2V0Q2F0YWxvZ0F0dHJpYnV0ZSgpLmdldFZhbHVlVHlwZSgpOworCQlib29sZWFuIHNlcXVlbmNlID0gdmFsdWVUeXBlLmlzU2VxdWVuY2UoKTsKKworCQkvLyBpZiB0aGlzIHBhc3NlcyAtPiBpbnB1dCBpcyB2YWxpZAorCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlVHlwZS5jcmVhdGUoIm5vdFJlbGV2YW50IiwgaW5wdXQpOworCisJCVN0cmluZyBzdHJpbmdWYWx1ZTsKKwkJaWYgKHZhbHVlVHlwZS5pc0ZpbGVMaW5rVHlwZSgpKSB7CisJCQlzdHJpbmdWYWx1ZSA9IGdldFN0cmluZ1ZhbHVlRm9yRmlsZUxpbmtUeXBlKHZhbHVlLCBzZXF1ZW5jZSk7CisJCX0gZWxzZSBpZiAodmFsdWVUeXBlLmlzRGF0ZVR5cGUoKSkgeworCQkJTG9jYWxEYXRlVGltZVtdIHZhbHVlcyA9IHNlcXVlbmNlID8gdmFsdWUuZXh0cmFjdCgpIDogbmV3IExvY2FsRGF0ZVRpbWVbXSB7IHZhbHVlLmV4dHJhY3QoKSB9OworCQkJc3RyaW5nVmFsdWUgPSBTdHJlYW0ub2YodmFsdWVzKS5tYXAobGR0IC0+IGxkdC5mb3JtYXQoVmFsdWUuTE9DQUxfREFURV9USU1FX0ZPUk1BVFRFUikpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChpbnB1dC5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworCQkJCXN0cmluZ1ZhbHVlID0gSW50U3RyZWFtLnJhbmdlKDAsIEFycmF5LmdldExlbmd0aChpbnB1dCkpLm1hcFRvT2JqKGkgLT4gQXJyYXkuZ2V0KGlucHV0LCBpKS50b1N0cmluZygpKQorCQkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJpbmdWYWx1ZSA9IHZhbHVlLmV4dHJhY3QoKS50b1N0cmluZygpOworCQkJfQorCQl9CisKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX1ZBTFVFKS5zZXQoc3RyaW5nVmFsdWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIHJlYWQgb25seSBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBpdCBpcyBub3QgYWxsb3dlZCB0byBtb2RpZnkge0BsaW5rIFZhbHVlfXMKKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHRlbXBsYXRlIGF0dHJpYnV0ZS4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc1ZhbHVlUmVhZE9ubHkoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1ZBTFVFX1JFQURPTkxZKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyB2YWx1ZSByZWFkIG9ubHkgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gdmFsdWVSZWFkT25seSBUaGUgbmV3IHZhbHVlIHJlYWQgb25seSBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldFZhbHVlUmVhZE9ubHkoQm9vbGVhbiB2YWx1ZVJlYWRPbmx5KSB7CisJCWdldFZhbHVlKEFUVFJfVkFMVUVfUkVBRE9OTFkpLnNldCh2YWx1ZVJlYWRPbmx5KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBpdCBpcyBhbGxvd2VkIHRvIG9taXQgYSB7QGxpbmsgVmFsdWV9IGRlcml2ZWQKKwkgKiAgICAgICAgIGZyb20gdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICovCisJcHVibGljIEJvb2xlYW4gaXNPcHRpb25hbCgpIHsKKwkJYm9vbGVhbiBtYW5kYXRvcnkgPSBnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5leHRyYWN0KCk7CisJCXJldHVybiBtYW5kYXRvcnkgPyBCb29sZWFuLkZBTFNFIDogQm9vbGVhbi5UUlVFOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgb3B0aW9uYWwgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uYWwgVGhlIG5ldyBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuc2V0KG9wdGlvbmFsID8gQm9vbGVhbi5GQUxTRSA6IEJvb2xlYW4uVFJVRSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlIGlzIGFzc29jaWF0ZWQKKwkgKiB3aXRoLgorCSAqCisJICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENhdGFsb2dBdHRyaWJ1dGUgZ2V0Q2F0YWxvZ0F0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFRlbXBsYXRlUm9vdH0gdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUgYmVsb25ncyB0by4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBUZW1wbGF0ZVJvb3R9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZVJvb3QgZ2V0VGVtcGxhdGVSb290KCkgeworCQlPcHRpb25hbDxUZW1wbGF0ZUNvbXBvbmVudD4gdGVtcGxhdGVDb21wb25lbnQgPSBnZXRUZW1wbGF0ZUNvbXBvbmVudCgpOworCQlPcHRpb25hbDxUZW1wbGF0ZVNlbnNvcj4gdGVtcGxhdGVTZW5zb3IgPSBnZXRUZW1wbGF0ZVNlbnNvcigpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCXJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5nZXRUZW1wbGF0ZVJvb3QoKTsKKwkJfSBlbHNlIGlmICh0ZW1wbGF0ZVNlbnNvci5pc1ByZXNlbnQoKSkgeworCQkJcmV0dXJuIHRlbXBsYXRlU2Vuc29yLmdldCgpLmdldFRlbXBsYXRlUm9vdCgpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyZW50IGVudGl0eSBpcyB1bmtub3duLiIpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFyZW50IHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gb2YgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9IGlzIHBhcmVudCBvZgorCSAqICAgICAgICAgdGhpcyB0ZW1wbGF0ZSBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0VGVtcGxhdGVTZW5zb3IoKQorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZUNvbXBvbmVudD4gZ2V0VGVtcGxhdGVDb21wb25lbnQoKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUoKS5nZXRQZXJtYW5lbnRTdG9yZSgpLmdldChUZW1wbGF0ZUNvbXBvbmVudC5jbGFzcykpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9IG9mIHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlLgorCSAqCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fSBpcyBwYXJlbnQgb2YKKwkgKiAgICAgICAgIHRoaXMgdGVtcGxhdGUgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFRlbXBsYXRlQ29tcG9uZW50KCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVTZW5zb3I+IGdldFRlbXBsYXRlU2Vuc29yKCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVTZW5zb3IuY2xhc3MpKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUGFyc2VzIGdpdmVuIHtAY29kZSBTdHJpbmd9IHRvIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgb2YgZ2l2ZW4KKwkgKiB7QGxpbmsgVmFsdWVUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgVGhlIHtAY29kZSBTdHJpbmd9IHZhbHVlLgorCSAqIEBwYXJhbSB2YWx1ZVR5cGUgVXNlZCB0byByZXNvbHZlIHRoZSBjb3JyZXNwb25kaW5nIGNvbnZlcnRlci4KKwkgKiBAcmV0dXJuIFRoZSBwYXJzZWQgb2JqZWN0IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIE9iamVjdCBwYXJzZShTdHJpbmcgdmFsdWUsIFZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUpIHsKKwkJaWYgKHZhbHVlVHlwZS5pc0ZpbGVMaW5rVHlwZSgpKSB7CisJCQlQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIihbXixdLio/KVxcWyguKj8pLCguKj8pXFxdIik7CisJCQlNYXRjaGVyIG1hdGNoZXIgPSBwYXR0ZXJuLm1hdGNoZXIodmFsdWUpOworCQkJTGlzdDxGaWxlTGluaz4gZmlsZUxpbmtzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQl3aGlsZSAobWF0Y2hlci5maW5kKCkpIHsKKwkJCQlmaWxlTGlua3MuYWRkKEZpbGVMaW5rUGFyc2VyLnBhcnNlKG1hdGNoZXIuZ3JvdXAoKSkpOworCQkJfQorCisJCQlyZXR1cm4gdmFsdWVUeXBlLmlzU2VxdWVuY2UoKSA/IGZpbGVMaW5rcy50b0FycmF5KG5ldyBGaWxlTGlua1tmaWxlTGlua3Muc2l6ZSgpXSkgOiBmaWxlTGlua3MuZ2V0KDApOworCQl9IGVsc2UgeworCQkJRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+IGNvbnZlcnRlciA9IGdldFBhcnNlcih2YWx1ZVR5cGUpOworCQkJaWYgKHZhbHVlVHlwZS5pc1NlcXVlbmNlKCkpIHsKKwkJCQlMaXN0PE9iamVjdD4gdmFsdWVzID0gU3RyZWFtLm9mKHZhbHVlLnNwbGl0KCIsIikpLm1hcChjb252ZXJ0ZXIpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQkJT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UodmFsdWVUeXBlLmdldFZhbHVlQ2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCksIHZhbHVlcy5zaXplKCkpOworCisJCQkJaWYgKHZhbHVlVHlwZS5nZXRWYWx1ZUNsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLmlzUHJpbWl0aXZlKCkpIHsKKwkJCQkJSW50U3RyZWFtLnJhbmdlKDAsIHZhbHVlcy5zaXplKCkpLmZvckVhY2goaSAtPiBBcnJheS5zZXQoYXJyYXksIGksIHZhbHVlcy5nZXQoaSkpKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2YWx1ZXMudG9BcnJheSgoT2JqZWN0W10pIGFycmF5KTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gYXJyYXk7CisJCQl9IGVsc2UgeworCQkJCXJldHVybiBjb252ZXJ0ZXIuYXBwbHkodmFsdWUpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0Bjb2RlIFN0cmluZ30gY29udmVyc2lvbiBmdW5jdGlvbiBmb3IgZ2l2ZW4ge0BsaW5rIFZhbHVlVHlwZX0uCisJICoKKwkgKiBAcGFyYW0gdmFsdWVUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgU3RyaW5nfSBjb252ZXJzaW9uIHtAY29kZSBGdW5jdGlvbn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGEgY29ycmVzcG9uZGluZyB7QGNvZGUgU3RyaW5nfSBpcworCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzdXBwb3J0ZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+IGdldFBhcnNlcihWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgT2JqZWN0PiBjb252ZXJ0ZXIgPSBWQUxVRVRZUEVfRlVOQ1RJT05fTUFQLmdldCh2YWx1ZVR5cGUpOworCQlpZiAoY29udmVydGVyID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBjb252ZXJzaW9uIGZvciB2YWx1ZSB0eXBlICciICsgdmFsdWVUeXBlICsgIicgbm90IHN1cHBvcnRlZC4iKTsKKwkJfQorCQlyZXR1cm4gY29udmVydGVyOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVXRpbGl0eSBjbGFzcyByZXN0b3JlIGEge0BsaW5rIEZpbGVMaW5rfSBmcm9tIGdpdmVuIHtAY29kZSBTdHJpbmd9LgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVMaW5rUGFyc2VyIHsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENsYXNzIHZhcmlhYmxlcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLy8gbWFya2VycworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fREVTQ19NQVJLRVIgPSAiTk9fREVTQyMiOworCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQUxfTUFSS0VSID0gIkxPQ0FMUEFUSCMiOworCisJCS8vIHBhdHRlcm4gZ3JvdXAgbmFtZXMKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1JTUVUWVBFID0gIm1pbWV0eXBlIjsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAicGF0aCI7CisKKwkJLy8gcGF0dGVybgorCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEZJTEVfTElOS19QQVRURVJOID0gUGF0dGVybgorCQkJCS5jb21waWxlKCIoPzwiICsgREVTQ1JJUFRJT04gKyAiPi4qPylcXFsoPzwiICsgTUlNRVRZUEUgKyAiPi4qPyksKD88IiArIFBBVEggKyAiPi4qPylcXF0iKTsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIFB1YmxpYyBtZXRob2RzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogUGFyc2VzIGdpdmVuIHtAY29kZSBTdHJpbmd9IGFuZCByZXR1cm5zIGl0IGFzIHtAbGluayBGaWxlTGlua30uCisJCSAqCisJCSAqIEBwYXJhbSB2YWx1ZSBUaGUge0Bjb2RlIFN0cmluZ30gdmFsdWUgd2hpY2ggd2lsbCBiZSBwYXJzZWQuCisJCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIEZpbGVMaW5rfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXB1YmxpYyBzdGF0aWMgRmlsZUxpbmsgcGFyc2UoU3RyaW5nIHZhbHVlKSB7CisJCQlNYXRjaGVyIG1hdGNoZXIgPSBGSUxFX0xJTktfUEFUVEVSTi5tYXRjaGVyKHZhbHVlKTsKKwkJCWlmICghbWF0Y2hlci5maW5kKCkpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzdG9yZSBmaWxlIGxpbmsuIik7CisJCQl9CisJCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBtYXRjaGVyLmdyb3VwKERFU0NSSVBUSU9OKTsKKwkJCVN0cmluZyBwYXRoID0gbWF0Y2hlci5ncm91cChQQVRIKTsKKwkJCUZpbGVMaW5rIGZpbGVMaW5rOworCQkJaWYgKHBhdGguc3RhcnRzV2l0aChMT0NBTF9NQVJLRVIpKSB7CisJCQkJdHJ5IHsKKwkJCQkJZmlsZUxpbmsgPSBGaWxlTGluay5uZXdMb2NhbChQYXRocy5nZXQocGF0aC5yZXBsYWNlRmlyc3QoTE9DQUxfTUFSS0VSLCAiIikpKTsKKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byByZXN0b3JlIGxvY2FsIGZpbGUgbGluay4iLCBlKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZpbGVMaW5rID0gRmlsZUxpbmsubmV3UmVtb3RlKHBhdGgsIG5ldyBNaW1lVHlwZShtYXRjaGVyLmdyb3VwKE1JTUVUWVBFKSksIGRlc2NyaXB0aW9uKTsKKwkJCX0KKworCQkJZmlsZUxpbmsuc2V0RGVzY3JpcHRpb24oTk9fREVTQ19NQVJLRVIuZXF1YWxzKGRlc2NyaXB0aW9uKSA/IG51bGwgOiBkZXNjcmlwdGlvbik7CisJCQlyZXR1cm4gZmlsZUxpbms7CisJCX0KKworCX0KKworCS8qKgorCSAqIEdldCBzdHJpbmcgdmFsdWUgZm9yIEZpbGVMaW5rVHlwZQorCSAqCisJICogQHBhcmFtIHZhbHVlICAgIFRoZSB7QGNvZGUgVmFsdWV9IHZhbHVlLgorCSAqIEBwYXJhbSBzZXF1ZW5jZSBUaGUge0Bjb2RlIGJvb2xlYW59IHNlcXVlbmNlLgorCSAqIEByZXR1cm4gUmV0dXJuIHtAY29kZSBTdHJpbmd9IHN0cmluZyB2YWx1ZSBmb3IgRmlsZUxpbmtUeXBlCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nVmFsdWVGb3JGaWxlTGlua1R5cGUoVmFsdWUgdmFsdWUsIGJvb2xlYW4gc2VxdWVuY2UpIHsKKwkJRmlsZUxpbmtbXSB2YWx1ZXMgPSBzZXF1ZW5jZSA/IHZhbHVlLmV4dHJhY3QoKSA6IG5ldyBGaWxlTGlua1tdIHsgdmFsdWUuZXh0cmFjdCgpIH07CisJCXJldHVybiBTdHJlYW0ub2YodmFsdWVzKS5tYXAoZmwgLT4geworCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQlpZiAoZmwuZ2V0RGVzY3JpcHRpb24oKS5pc0VtcHR5KCkpIHsKKwkJCQlzYi5hcHBlbmQoRmlsZUxpbmtQYXJzZXIuTk9fREVTQ19NQVJLRVIpOworCQkJfSBlbHNlIHsKKwkJCQlzYi5hcHBlbmQoZmwuZ2V0RGVzY3JpcHRpb24oKSk7CisJCQl9CisJCQlzYi5hcHBlbmQoJ1snKS5hcHBlbmQoZmwuZ2V0TWltZVR5cGUoKSkuYXBwZW5kKCcsJyk7CisJCQlpZiAoZmwuaXNSZW1vdGUoKSkgeworCQkJCXNiLmFwcGVuZChmbC5nZXRSZW1vdGVQYXRoKCkpOworCQkJfSBlbHNlIGlmIChmbC5pc0xvY2FsKCkpIHsKKwkJCQlzYi5hcHBlbmQoRmlsZUxpbmtQYXJzZXIuTE9DQUxfTUFSS0VSKS5hcHBlbmQoZmwuZ2V0TG9jYWxTdHJlYW0oKSk7CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZpbGUgbGluayBpcyBuZWl0aGVyIGluIGxvY2FsIG5vciByZW1vdGUgc3RhdGU6ICIgKyBmbCk7CisJCQl9CisKKwkJCXJldHVybiBzYi5hcHBlbmQoJ10nKTsKKwkJfSkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQ29tcG9uZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2FhN2QyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSw0MDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU29ydGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGVtcGxhdGUgY29tcG9uZW50IGVudGl0eSB0eXBlLiBBIHRlbXBsYXRlIGF0dHJpYnV0ZQorICogYWRkcyBtZXRhIGRhdGEgdG8gYSB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJdCBhbHdheXMKKyAqIGJlbG9uZ3MgdG8gYSB0ZW1wbGF0ZSByb290IG9yIGFub3RoZXIgdGVtcGxhdGUgY29tcG9uZW50LiBJdHMgbmFtZSBoYXMgdG8gYmUKKyAqIHVuaXF1ZSB3aXRoaW4gYWxsIHRlbXBsYXRlIGNvbXBvbmVudHMgYmVsb25naW5nIHRvIHRoZSBzYW1lCisgKiB7QGxpbmsgVGVtcGxhdGVSb290fS4gQSB0ZW1wbGF0ZSBjb21wb25lbnQgbWF5IGRlZmluZSB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9cworICogd2hlcmUgZWFjaCBleHRlbmRzIGEge0BsaW5rIENhdGFsb2dTZW5zb3J9IHByb3ZpZGVkIGJ5IHRoZSBhc3NvY2lhdGVkIHtAY29kZQorICogQ2F0YWxvZ0NvbXBvbmVudH0uIEl0IG1heSBkZWZpbmUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgd2hlcmUgZWFjaAorICogdW5pcXVlbHkgZXh0ZW5kcyBhIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfSBwcm92aWRlZCBieSB0aGUgYXNzb2NpYXRlZAorICoge0Bjb2RlIENhdGFsb2dDb21wb25lbnR9LgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBDYXRhbG9nQ29tcG9uZW50CisgKiBAc2VlIFRlbXBsYXRlUm9vdAorICogQHNlZSBUZW1wbGF0ZUF0dHJpYnV0ZQorICogQHNlZSBUZW1wbGF0ZVNlbnNvcgorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVDb21wb25lbnQgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBTb3J0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIG9wdGlvbmFsIGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVDb21wb25lbnQ+IElTX09QVElPTkFMID0gVGVtcGxhdGVDb21wb25lbnQ6OmlzT3B0aW9uYWw7CisKKwkvKioKKwkgKiBUaGUgbWFuZGF0b3J5IGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uIFRoaXMgaXMgdGhlIGludmVyc2lvbiBvZgorCSAqIHtAbGluayAjSVNfT1BUSU9OQUx9IHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlQ29tcG9uZW50PiBJU19NQU5EQVRPUlkgPSBJU19PUFRJT05BTC5uZWdhdGUoKTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IGFjdGl2ZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlQ29tcG9uZW50PiBJU19ERUZBVUxUX0FDVElWRSA9IFRlbXBsYXRlQ29tcG9uZW50Ojppc0RlZmF1bHRBY3RpdmU7CisKKwkvKioKKwkgKiBUaGUgc2VyaWVzIGNvbnN0YW50IGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVDb21wb25lbnQ+IElTX1NFUklFU19DT05TVEFOVCA9IFRlbXBsYXRlQ29tcG9uZW50Ojppc1Nlcmllc0NvbnN0YW50OworCisJLyoqCisJICogVGhlIHNlcmllcyB2YXJpYWJsZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LiBUaGlzIGlzIHRoZSBpbnZlcnNpb24gb2YgdGhlCisJICoge0BsaW5rICNJU19TRVJJRVNfQ09OU1RBTlR9IHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlQ29tcG9uZW50PiBJU19TRVJJRVNfVkFSSUFCTEUgPSBJU19TRVJJRVNfQ09OU1RBTlQubmVnYXRlKCk7CisKKwkvKioKKwkgKiBUaGUgaW1wbGljaXQgY3JlYXRlIGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uIFRoaXMgaXMgYW4gT1IgY29tYmluYXRpb24gb2YKKwkgKiB7QGxpbmsgI0lTX0RFRkFVTFRfQUNUSVZFfSBhbmQge0BsaW5rICNJU19NQU5EQVRPUll9IHtAY29kZSBQcmVkaWNhdGV9cy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxUZW1wbGF0ZUNvbXBvbmVudD4gSVNfSU1QTElDSVRfQ1JFQVRFID0gSVNfREVGQVVMVF9BQ1RJVkUub3IoSVNfTUFOREFUT1JZKTsKKworCS8qKgorCSAqIFRoZSAnVGVzdFN0ZXBTZXJpZXNWYXJpYWJsZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TRVJJRVNfQ09OU1RBTlQgPSAiVGVzdFN0ZXBTZXJpZXNWYXJpYWJsZSI7CisKKwkvKioKKwkgKiBUaGUgJ0RlZmF1bHRBY3RpdmUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREVGQVVMVF9BQ1RJVkUgPSAiRGVmYXVsdEFjdGl2ZSI7CisKKwkvKioKKwkgKiBUaGUgJ09wdGlvbmFsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09QVElPTkFMID0gIk9wdGlvbmFsIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVDb21wb25lbnQoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIGFsbG93ZWQgdG8gb21pdCBhCisJICogICAgICAgICB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gZGVyaXZlZCBmcm9tIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50LgorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzT3B0aW9uYWwoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBvcHRpb25hbCBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIGNvbXBvbmVudC4KKwkgKgorCSAqIEBwYXJhbSBvcHRpb25hbCBUaGUgbmV3IG9wdGlvbmFsIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgeworCQlnZXRWYWx1ZShBVFRSX09QVElPTkFMKS5zZXQob3B0aW9uYWwpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYWN0aXZlIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGEge0BsaW5rIENvbnRleHRDb21wb25lbnR9IGhhcyB0byBiZSBjcmVhdGVkCisJICogICAgICAgICBhdXRvbWF0aWNhbGx5IGVhY2ggdGltZSBhIG5ldyB7QGxpbmsgQ29udGV4dFJvb3R9IGlzIGRlcml2ZWQgZnJvbSB0aGUKKwkgKiAgICAgICAgIHtAbGluayBUZW1wbGF0ZVJvb3R9IHRoaXMgdGVtcGxhdGUgY29tcG9uZW50IGJlbG9uZ3MgdG8uCisJICovCisJcHVibGljIEJvb2xlYW4gaXNEZWZhdWx0QWN0aXZlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgZGVmYXVsdCBhY3RpdmUgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdEFjdGl2ZSBUaGUgbmV3IGRlZmF1bHQgYWN0aXZlIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2ZShCb29sZWFuIGRlZmF1bHRBY3RpdmUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuc2V0KGRlZmF1bHRBY3RpdmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHNlcmllcyBjb25zdGFudCBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0BsaW5rIENvbnRleHRDb21wb25lbnR9J3Mge0BsaW5rIFZhbHVlfXMKKwkgKiAgICAgICAgIGFjcm9zcyB7QGxpbmsgVGVzdFN0ZXB9IHNpYmxpbmdzIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzLgorCSAqLworCXB1YmxpYyBCb29sZWFuIGlzU2VyaWVzQ29uc3RhbnQoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1NFUklFU19DT05TVEFOVCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgc2VyaWVzIGNvbnN0YW50IGZsYWcgZm9yIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50LgorCSAqCisJICogQHBhcmFtIHNlcmllc0NvbnN0YW50IFRoZSBuZXcgc2VyaWVzIGNvbnN0YW50IGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0U2VyaWVzQ29uc3RhbnQoQm9vbGVhbiBzZXJpZXNDb25zdGFudCkgeworCQlnZXRWYWx1ZShBVFRSX1NFUklFU19DT05TVEFOVCkuc2V0KHNlcmllc0NvbnN0YW50KTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ0NvbXBvbmVudH0gdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQgaXMgYXNzb2NpYXRlZAorCSAqIHdpdGguCisJICoKKwkgKiBAcmV0dXJuIFRoZSBhc3NvY2lhdGVkIHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2F0YWxvZ0NvbXBvbmVudCBnZXRDYXRhbG9nQ29tcG9uZW50KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChDYXRhbG9nQ29tcG9uZW50LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGlzIHRlbXBsYXRlIGNvbXBvbmVudCBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlUm9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlUm9vdCBnZXRUZW1wbGF0ZVJvb3QoKSB7CisJCVRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QgPSBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVSb290LmNsYXNzKTsKKwkJaWYgKHRlbXBsYXRlUm9vdCA9PSBudWxsKSB7CisJCQlyZXR1cm4gZ2V0UGFyZW50VGVtcGxhdGVDb21wb25lbnQoKQorCQkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyZW50IGVudGl0eSBpcyB1bmtub3duLiIpKS5nZXRUZW1wbGF0ZVJvb3QoKTsKKwkJfQorCisJCXJldHVybiB0ZW1wbGF0ZVJvb3Q7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFyZW50IHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gb2YgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQuCisJICoKKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQgaXMgYW4gaW1tZWRpYXRlCisJICogICAgICAgICBjaGlsZCBvZiB0aGUge0BsaW5rIFRlbXBsYXRlUm9vdH0uCisJICogQHNlZSAjZ2V0VGVtcGxhdGVSb290KCkKKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVDb21wb25lbnQ+IGdldFBhcmVudFRlbXBsYXRlQ29tcG9uZW50KCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiBnZXRUZW1wbGF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKHRhIC0+IHRhLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlCisJICogY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQXR0cmlidXRlfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZSA9IGdldFRlbXBsYXRlQXR0cmlidXRlKG5hbWUpOworCQlpZiAodGVtcGxhdGVBdHRyaWJ1dGUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHRlbXBsYXRlQXR0cmlidXRlLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFRoZSBuYW1lcyBvZiA8dT5hbGw8L3U+IHRlbXBsYXRlIGNvbXBvbmVudHMgYmVsb25naW5nIHRvIHRoZQorCSAqIHNhbWUge0BsaW5rIFRlbXBsYXRlUm9vdH0gbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyAobm8gbWF0dGVyIHRoZXkgYXJlCisJICogaW1tZWRpYXRlIGNoaWxkcmVuIG9yIG5vdCkuIFRoZXJlZm9yZSwgaWYgdGhpcyB0ZW1wbGF0ZSBjb21wb25lbnQgZG9lcyBub3QKKwkgKiBoYXZlIGFuIGltbWVkaWF0ZSB0ZW1wbGF0ZSBjb21wb25lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGhpcyBsb29rdXAgcmVxdWVzdAorCSAqIGlzIHJlY3Vyc2l2ZWx5IGRlbGVnYXRlZCB0byBhbGwgb2YgaXRzIGNoaWxkIHRlbXBsYXRlIGNvbXBvbmVudHMuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB3aXRoCisJICogICAgICAgICBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0IChuZWl0aGVyIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50IG5vciBvbmUgb2YKKwkgKiAgICAgICAgIGl0cyBjaGlsZHJlbiBoYXMgYSB0ZW1wbGF0ZSBjb21wb25lbnQgd2l0aCBnaXZlbiBuYW1lKS4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVDb21wb25lbnQ+IGdldFRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCUxpc3Q8VGVtcGxhdGVDb21wb25lbnQ+IHRlbXBsYXRlQ29tcG9uZW50cyA9IGdldFRlbXBsYXRlQ29tcG9uZW50cygpOworCQlPcHRpb25hbDxUZW1wbGF0ZUNvbXBvbmVudD4gdGVtcGxhdGVDb21wb25lbnQgPSB0ZW1wbGF0ZUNvbXBvbmVudHMuc3RyZWFtKCkuZmlsdGVyKHRjIC0+IHRjLm5hbWVFcXVhbHMobmFtZSkpCisJCQkJLmZpbmRBbnkoKTsKKwkJaWYgKHRlbXBsYXRlQ29tcG9uZW50LmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gdGVtcGxhdGVDb21wb25lbnQ7CisJCX0KKworCQlyZXR1cm4gdGVtcGxhdGVDb21wb25lbnRzLnN0cmVhbSgpLm1hcChjdCAtPiBjdC5nZXRUZW1wbGF0ZUNvbXBvbmVudChuYW1lKSkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpCisJCQkJLm1hcChPcHRpb25hbDo6Z2V0KS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgaW1tZWRpYXRlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH1zIHJlbGF0ZWQgdG8gdGhpcyB0ZW1wbGF0ZQorCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VGVtcGxhdGVDb21wb25lbnQ+IGdldFRlbXBsYXRlQ29tcG9uZW50cygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIDxwPgorCSAqIDxiPk5PVEU6PC9iPiBUaGUgbmFtZXMgb2YgPHU+YWxsPC91PiB0ZW1wbGF0ZSBjb21wb25lbnRzIGJlbG9uZ2luZyB0byB0aGUKKwkgKiBzYW1lIHtAbGluayBUZW1wbGF0ZVJvb3R9IG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMgKG5vIG1hdHRlciB0aGV5IGFyZQorCSAqIGltbWVkaWF0ZSBjaGlsZHJlbiBvciBub3QpLiBUaGVyZWZvcmUsIGlmIHRoaXMgdGVtcGxhdGUgY29tcG9uZW50IGRvZXMgbm90CisJICogaGF2ZSBhbiBpbW1lZGlhdGUgdGVtcGxhdGUgY29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG5hbWUsIHRoaXMgcmVtb3ZlIHJlcXVlc3QKKwkgKiBpcyByZWN1cnNpdmVseSBkZWxlZ2F0ZWQgdG8gYWxsIG9mIGl0cyBjaGlsZCB0ZW1wbGF0ZSBjb21wb25lbnRzLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IGdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFBhcmVudFRlbXBsYXRlQ29tcG9uZW50KCk7CisJCQlpZiAocGFyZW50VGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCQlwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5yZW1vdmVUZW1wbGF0ZUNvbXBvbmVudChuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUodGVtcGxhdGVDb21wb25lbnQuZ2V0KCkpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFRlbXBsYXRlU2Vuc29yfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlU2Vuc29yfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlU2Vuc29yfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZVNlbnNvcj4gZ2V0VGVtcGxhdGVTZW5zb3IoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldFRlbXBsYXRlU2Vuc29ycygpLnN0cmVhbSgpLmZpbHRlcih0cyAtPiB0cy5uYW1lRXF1YWxzKG5hbWUpKS5maW5kQW55KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBUZW1wbGF0ZVNlbnNvcn1zIHJlbGF0ZWQgdG8gdGhpcyB0ZW1wbGF0ZQorCSAqIGNvbXBvbmVudC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8VGVtcGxhdGVTZW5zb3I+IGdldFRlbXBsYXRlU2Vuc29ycygpIHsKKwkJaWYgKGdldENhdGFsb2dDb21wb25lbnQoKS5nZXRDb250ZXh0VHlwZSgpLmlzVGVzdEVxdWlwbWVudCgpKSB7CisJCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVTZW5zb3IuY2xhc3MpOworCQl9CisKKwkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZVNlbnNvcn0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlU2Vuc29yfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZVNlbnNvcn0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlU2Vuc29yKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvciA9IGdldFRlbXBsYXRlU2Vuc29yKG5hbWUpOworCQlpZiAodGVtcGxhdGVTZW5zb3IuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHRlbXBsYXRlU2Vuc29yLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZXMgPSBnZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVBdHRyaWJ1dGVzID0gIikuYXBwZW5kKHRlbXBsYXRlQXR0cmlidXRlcyk7CisJCX0KKworCQlMaXN0PFRlbXBsYXRlU2Vuc29yPiB0ZW1wbGF0ZVNlbnNvcnMgPSBnZXRUZW1wbGF0ZVNlbnNvcnMoKTsKKwkJaWYgKCF0ZW1wbGF0ZVNlbnNvcnMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVTZW5zb3JzID0gIikuYXBwZW5kKHRlbXBsYXRlU2Vuc29ycyk7CisJCX0KKworCQlMaXN0PFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudHMgPSBnZXRUZW1wbGF0ZUNvbXBvbmVudHMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUNvbXBvbmVudHMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVDb21wb25lbnRzID0gIikuYXBwZW5kKHRlbXBsYXRlQ29tcG9uZW50cyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gaXMKKwkgKiBkZXJpdmVkIGZyb20uCisJICoKKwkgKiBAcGFyYW0gY29udGV4dENvbXBvbmVudCBUaGUge0Bjb2RlIENvbnRleHRDb21wb25lbnR9IHdob3NlIHtAY29kZQorCSAqIAkJVGVtcGxhdGVDb21wb25lbnR9IGlzIHJlcXVlc3RlZC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGdpdmVuIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fSBpcworCSAqICAgICAgICAgbm90IGRlcml2ZWQgZnJvbSBhIHRlbXBsYXRlLCB3aGljaCBpcyBkYXRhIHNvdXJjZSBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBvZihDb250ZXh0Q29tcG9uZW50IGNvbnRleHRDb21wb25lbnQpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZShjb250ZXh0Q29tcG9uZW50KS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVJvb3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVJvb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWYwNGExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlUm9vdC5qYXZhCkBAIC0wLDAgKzEsMTg3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBhdHRyaWJ1dGUgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgcm9vdCBkZWZpbmVzCisgKiBhIHRyZWUgb2Yge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fXMuIFN1Y2ggYSB0cmVlIGZvcm1zIGEgaGllcmFyY2hpY2FsCisgKiB0ZW1wbGF0ZSBzdHJ1Y3R1cmUgd2hpY2ggaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgY29tcG9zaXRpb24gb2YgYQorICoge0BsaW5rIENvbnRleHRSb290fS4gQSB0ZW1wbGF0ZSByb290IGltcGxlbWVudHMgdGhlIHtAbGluayBWZXJzaW9uYWJsZX0KKyAqIGludGVyZmFjZSBhbmQgaGVuY2UgaGFzIGEgdmVyc2lvbiBhbmQgYSBzdGF0ZS4gQXMgbG9uZyBhcworICoge0BsaW5rICNpc0VkaXRhYmxlKCl9IHJldHVybnMge0Bjb2RlIHRydWV9IGFueSBwYXJ0IG9mIHRoYXQgdGVtcGxhdGUgcm9vdCBpcworICogYWxsb3dlZCB0byBiZSBtb2RpZmllZC4gT25jZSBhIHRlbXBsYXRlIHJvb3QgaXMgc2V0IHRvIGJlIHZhbGlkCisgKiAoe0BsaW5rICNpc1ZhbGlkKCl9ID09IHtAY29kZSB0cnVlfSkgaXQgbWF5IGJlIHVzZWQgdG8gY29tcG9zZSBhCisgKiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0gYW5kIHRoZW4gaXMgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gYmUgbW9kaWZpZWQgaW4gYW55CisgKiB3YXkuIElmIGEgdmFsaWQgdGVtcGxhdGUgcm9vdCBuZWVkcyB0byBiZSBtb2RpZmllZCwgdGhlbiBhIGRlZXAgY29weSB3aXRoIGEKKyAqIHVuaXF1ZSBuYW1lIGFuZCB2ZXJzaW9uIGNvbWJpbmF0aW9uIGhhcyB0byBiZSBjcmVhdGVkIChkZWVwIGNvcHkgbWVhbnMgbmV3CisgKiBpbnN0YW5jZXMpLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBUZW1wbGF0ZUNvbXBvbmVudAorICogQHNlZSBWZXJzaW9uYWJsZQorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVSb290IGV4dGVuZHMgQmFzZUVudGl0eSBpbXBsZW1lbnRzIERlbGV0YWJsZSwgVmVyc2lvbmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgQ29udGV4dFR5cGUgY29udGV4dFR5cGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVRlbXBsYXRlUm9vdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisKKwkJU3RyaW5nIHR5cGVOYW1lID0gY29yZS5nZXRUeXBlTmFtZSgpLnRvVXBwZXJDYXNlKExvY2FsZS5ST09UKTsKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZUNhbmRpZGF0ZSA6IENvbnRleHRUeXBlLnZhbHVlcygpKSB7CisJCQlpZiAodHlwZU5hbWUuY29udGFpbnMoY29udGV4dFR5cGVDYW5kaWRhdGUubmFtZSgpKSkgeworCQkJCWNvbnRleHRUeXBlID0gY29udGV4dFR5cGVDYW5kaWRhdGU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29yZSBpcyBpbmNvbXBhdGlibGUuIik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRUeXBlfSBvZiB0aGlzIHRlbXBsYXRlIHJvb3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZSgpIHsKKwkJcmV0dXJuIGNvbnRleHRUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFRoZSBuYW1lcyBvZiA8dT5hbGw8L3U+IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH1zIGJlbG9uZ2luZyB0bworCSAqIHRoZSBzYW1lIHRlbXBsYXRlIHJvb3QgbXVzdCBoYXZlIHVuaXF1ZSBuYW1lcyAobm8gbWF0dGVyIHRoZXkgYXJlIGltbWVkaWF0ZQorCSAqIGNoaWxkcmVuIG9yIG5vdCkuIFRoZXJlZm9yZSwgaWYgdGhpcyB0ZW1wbGF0ZSByb290IGRvZXMgbm90IGhhdmUgYW4gaW1tZWRpYXRlCisJICoge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB3aXRoIHRoZSBnaXZlbiBuYW1lLCB0aGlzIGxvb2t1cCByZXF1ZXN0IGlzCisJICogcmVjdXJzaXZlbHkgZGVsZWdhdGVkIHRvIGFsbCBvZiBpdHMgY2hpbGQge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fXMuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB3aXRoCisJICogICAgICAgICBnaXZlbiBuYW1lIGRvZXMgbm90IGV4aXN0IGF0IGFsbCB3aXRoaW4gdGhpcyB0ZW1wbGF0ZSByb290LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZUNvbXBvbmVudD4gZ2V0VGVtcGxhdGVDb21wb25lbnQoU3RyaW5nIG5hbWUpIHsKKwkJTGlzdDxUZW1wbGF0ZUNvbXBvbmVudD4gdGVtcGxhdGVDb21wb25lbnRzID0gZ2V0VGVtcGxhdGVDb21wb25lbnRzKCk7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlQ29tcG9uZW50cy5zdHJlYW0oKS5maWx0ZXIodGMgLT4gdGMubmFtZUVxdWFscyhuYW1lKSkKKwkJCQkuZmluZEFueSgpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCXJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudDsKKwkJfQorCisJCXJldHVybiB0ZW1wbGF0ZUNvbXBvbmVudHMuc3RyZWFtKCkubWFwKHRjIC0+IHRjLmdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpKS5maWx0ZXIoT3B0aW9uYWw6OmlzUHJlc2VudCkKKwkJCQkubWFwKE9wdGlvbmFsOjpnZXQpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBpbW1lZGlhdGUge0BsaW5rIFRlbXBsYXRlQ29tcG9uZW50fXMgcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlCisJICogY29tcG9uZW50LgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZW1wbGF0ZUNvbXBvbmVudD4gZ2V0VGVtcGxhdGVDb21wb25lbnRzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVDb21wb25lbnQuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogPHA+CisJICogPGI+Tk9URTo8L2I+IFRoZSBuYW1lcyBvZiA8dT5hbGw8L3U+IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH1zIGJlbG9uZ2luZyB0bworCSAqIHRoZSBzYW1lIHRlbXBsYXRlIHJvb3RzIG11c3QgaGF2ZSB1bmlxdWUgbmFtZXMgKG5vIG1hdHRlciB0aGV5IGFyZSBpbW1lZGlhdGUKKwkgKiBjaGlsZHJlbiBvciBub3QpLiBUaGVyZWZvcmUsIGlmIHRoaXMgdGVtcGxhdGUgcm9vdCBkb2VzIG5vdCBoYXZlIGFuIGltbWVkaWF0ZQorCSAqIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgdGhpcyByZW1vdmUgcmVxdWVzdCBpcworCSAqIHJlY3Vyc2l2ZWx5IGRlbGVnYXRlZCB0byBhbGwgb2YgaXRzIGNoaWxkIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH1zLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQ29tcG9uZW50KFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudCA9IGdldFRlbXBsYXRlQ29tcG9uZW50KG5hbWUpOworCQlpZiAodGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCU9wdGlvbmFsPFRlbXBsYXRlQ29tcG9uZW50PiBwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudCA9IHRlbXBsYXRlQ29tcG9uZW50LmdldCgpLmdldFBhcmVudFRlbXBsYXRlQ29tcG9uZW50KCk7CisJCQlpZiAocGFyZW50VGVtcGxhdGVDb21wb25lbnQuaXNQcmVzZW50KCkpIHsKKwkJCQlwYXJlbnRUZW1wbGF0ZUNvbXBvbmVudC5nZXQoKS5yZW1vdmVUZW1wbGF0ZUNvbXBvbmVudChuYW1lKTsKKwkJCX0gZWxzZSB7CisJCQkJZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5yZW1vdmUodGVtcGxhdGVDb21wb25lbnQuZ2V0KCkpOworCQkJfQorCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZCgiQ29udGV4dFR5cGUgPSAiKS5hcHBlbmQoZ2V0Q29udGV4dFR5cGUoKSkuYXBwZW5kKCIsICIpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudHMgPSBnZXRUZW1wbGF0ZUNvbXBvbmVudHMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUNvbXBvbmVudHMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVDb21wb25lbnRzID0gIikuYXBwZW5kKHRlbXBsYXRlQ29tcG9uZW50cyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGUgZ2l2ZW4ge0BsaW5rIENvbnRleHRSb290fSBpcyBkZXJpdmVkCisJICogZnJvbS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0Um9vdCBUaGUge0Bjb2RlIENvbnRleHRSb290fSB3aG9zZSB7QGNvZGUgVGVtcGxhdGVSb290fSBpcworCSAqICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZSBnaXZlbiB7QGNvZGUgQ29udGV4dFJvb3R9IGlzIG5vdAorCSAqICAgICAgICAgZGVyaXZlZCBmcm9tIGEgdGVtcGxhdGUsIHdoaWNoIGlzIGRhdGEgc291cmNlIHNwZWNpZmljLgorCSAqLworCXB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8VGVtcGxhdGVSb290PiBvZihDb250ZXh0Um9vdCBjb250ZXh0Um9vdCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKGNvbnRleHRSb290KS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVSb290LmNsYXNzKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVTZW5zb3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVNlbnNvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzhjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVTZW5zb3IuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0U2Vuc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5RdWFudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU29ydGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBzZW5zb3IgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgc2Vuc29yIGFkZHMKKyAqIG1ldGEgZGF0YSB0byBhIHtAbGluayBDYXRhbG9nU2Vuc29yfSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIEl0IGFsd2F5cyBiZWxvbmdzCisgKiB0byBhIHRlbXBsYXRlIGNvbXBvbmVudCBvciBhIHRlbXBsYXRlIHNlbnNvci4gSXRzIG5hbWUgaGFzIHRvIGJlIHVuaXF1ZQorICogd2l0aGluIGFsbCB0ZW1wbGF0ZSBzZW5zb3JzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9LgorICogQSB0ZW1wbGF0ZSBzZW5zb3IgZGVmaW5lIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX1zIHdoZXJlIGVhY2ggdW5pcXVlbHkKKyAqIGV4dGVuZHMgYSB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gcHJvdmlkZWQgYnkgdGhlIGFzc29jaWF0ZWQge0Bjb2RlCisgKiBDYXRhbG9nU2Vuc29yfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgQ2F0YWxvZ1NlbnNvcgorICogQHNlZSBUZW1wbGF0ZUNvbXBvbmVudAorICogQHNlZSBUZW1wbGF0ZUF0dHJpYnV0ZQorICovCitwdWJsaWMgY2xhc3MgVGVtcGxhdGVTZW5zb3IgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgU29ydGFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSBvcHRpb25hbCBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlU2Vuc29yPiBJU19PUFRJT05BTCA9IFRlbXBsYXRlU2Vuc29yOjppc09wdGlvbmFsOworCisJLyoqCisJICogVGhlIG1hbmRhdG9yeSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LiBUaGlzIGlzIHRoZSBpbnZlcnNpb24gb2YKKwkgKiB7QGxpbmsgI0lTX09QVElPTkFMfSB7QGNvZGUgUHJlZGljYXRlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxUZW1wbGF0ZVNlbnNvcj4gSVNfTUFOREFUT1JZID0gSVNfT1BUSU9OQUwubmVnYXRlKCk7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCBhY3RpdmUgZmxhZyB7QGNvZGUgUHJlZGljYXRlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxUZW1wbGF0ZVNlbnNvcj4gSVNfREVGQVVMVF9BQ1RJVkUgPSBUZW1wbGF0ZVNlbnNvcjo6aXNEZWZhdWx0QWN0aXZlOworCisJLyoqCisJICogVGhlIGltcGxpY2l0IGNyZWF0ZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LiBUaGlzIGlzIGFuIE9SIGNvbWJpbmF0aW9uIG9mCisJICoge0BsaW5rICNJU19ERUZBVUxUX0FDVElWRX0gYW5kIHtAbGluayAjSVNfTUFOREFUT1JZfSB7QGNvZGUgUHJlZGljYXRlfXMuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVTZW5zb3I+IElTX0lNUExJQ0lUX0NSRUFURSA9IElTX0RFRkFVTFRfQUNUSVZFLm9yKElTX01BTkRBVE9SWSk7CisKKwkvKioKKwkgKiBUaGUgJ09wdGlvbmFsJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09QVElPTkFMID0gIk9wdGlvbmFsIjsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdEFjdGl2ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0FDVElWRSA9ICJEZWZhdWx0QWN0aXZlIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNFZGl0YWJsZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTUkVEX1ZBTFVFU19FRElUQUJMRSA9ICJNZWFRdWFudGl0eVZhbHVlc0VkaXRhYmxlIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNHZW5lcmF0b3JOYW1lJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX01FQVNSRURfVkFMVUVTX0dFTkVSQVRPUl9OQU1FID0gIk1lYVF1YW50aXR5RWRpdG9yUGx1Z2luIjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNJbmRlcGVuZGVudCcgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTUkVEX1ZBTFVFU19JTkRFUEVOREVOVCA9ICJNZWFRdWFudGl0eUluZGVwZW5kZW50IjsKKworCS8qKgorCSAqIFRoZSAnTWVhc3VyZWRWYWx1ZXNBeGlzVHlwZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9NRUFTUkVEX1ZBTFVFU19BWElTVFlQRSA9ICJNZWFRdWFudGl0eUF4aXNUeXBlIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVTZW5zb3IoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1lYXN1cmVkIHZhbHVlcyBlZGl0YWJsZSBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIGVkaXRhYmxlIGZsYWcgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEJvb2xlYW4gYXJlTWVhc3VyZWRWYWx1ZXNFZGl0YWJsZSgpIHsKKwkJcmV0dXJuIGdldFZhbHVlKEFUVFJfTUVBU1JFRF9WQUxVRVNfRURJVEFCTEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIGEgbmV3IG1lYXN1cmVkIHZhbHVlcyBlZGl0YWJsZSBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlZFZhbHVlc0VkaXRhYmxlIFRoZSBtZWFzdXJlZCB2YWx1ZXMgZWRpdGFibGUgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZWFzdXJlZFZhbHVlc0VkaXRhYmxlKEJvb2xlYW4gbWVhc3VyZWRWYWx1ZXNFZGl0YWJsZSkgeworCQlnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0VESVRBQkxFKS5zZXQobWVhc3VyZWRWYWx1ZXNFZGl0YWJsZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbWVhc3VyZWQgdmFsdWVzIGdlbmVyYXRvciBuYW1lIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIGdlbmVyYXRvciBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TWVhc3VyZWRWYWx1ZXNHZW5lcmF0b3JOYW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9NRUFTUkVEX1ZBTFVFU19HRU5FUkFUT1JfTkFNRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgbWVhc3VyZWQgdmFsdWVzIGdlbmVyYXRvciBuYW1lIGZvciB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEBwYXJhbSBtZWFzdXJlZFZhbHVlc0dlbmVyYXRvck5hbWUgVGhlIG1lYXN1cmVkIHZhbHVlcyBnZW5lcmF0b3IgbmFtZS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNZWFzdXJlZFZhbHVlc0dlbmVyYXRvck5hbWUoU3RyaW5nIG1lYXN1cmVkVmFsdWVzR2VuZXJhdG9yTmFtZSkgeworCQlnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0dFTkVSQVRPUl9OQU1FKS5zZXQobWVhc3VyZWRWYWx1ZXNHZW5lcmF0b3JOYW1lKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZWFzdXJlZCB2YWx1ZXMgaW5kZXBlbmRlbnQgZmxhZyBvZiB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG1lYXN1cmVkIHZhbHVlcyBpbmRlcGVuZGVudCBmbGFnIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBCb29sZWFuIGFyZU1lYXN1cmVkVmFsdWVzSW5kZXBlbmRlbnQoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0lOREVQRU5ERU5UKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBtZWFzdXJlZCB2YWx1ZXMgaW5kZXBlbmRlbnQgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBzZW5zb3IuCisJICoKKwkgKiBAcGFyYW0gbWVhc3VyZWRWYWx1ZXNJbmRlcGVuZGVudCBUaGUgbWVhc3VyZWQgdmFsdWVzIGluZGVwZW5kZW50IGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0TWVhc3VyZWRWYWx1ZXNJbmRlcGVuZGVudChCb29sZWFuIG1lYXN1cmVkVmFsdWVzSW5kZXBlbmRlbnQpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NRUFTUkVEX1ZBTFVFU19JTkRFUEVOREVOVCkuc2V0KG1lYXN1cmVkVmFsdWVzSW5kZXBlbmRlbnQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1lYXN1cmVkIHZhbHVlcyB7QGxpbmsgQXhpc1R5cGV9IG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgbWVhc3VyZWQgdmFsdWVzIHtAY29kZSBBeGlzVHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEF4aXNUeXBlIGdldE1lYXN1cmVkVmFsdWVzQXhpc1R5cGUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX01FQVNSRURfVkFMVUVTX0FYSVNUWVBFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBtZWFzdXJlZCB2YWx1ZXMge0BsaW5rIEF4aXNUeXBlfSBmb3IgdGhpcyB0ZW1wbGF0ZSBzZW5zb3IuCisJICoKKwkgKiBAcGFyYW0gYXhpc1R5cGUgVGhlIG1lYXN1cmVkIHZhbHVlcyB7QGNvZGUgQXhpc1R5cGV9LgorCSAqLworCXB1YmxpYyB2b2lkIHNldE1lYXN1cmVkVmFsdWVzQXhpc1R5cGUoQXhpc1R5cGUgYXhpc1R5cGUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9NRUFTUkVEX1ZBTFVFU19BWElTVFlQRSkuc2V0KGF4aXNUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBvcHRpb25hbCBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBpdCBpcyBhbGxvd2VkIHRvIG9taXQgYSB7QGxpbmsgQ29udGV4dFNlbnNvcn0KKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgb3B0aW9uYWwgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSBzZW5zb3IuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uYWwgVGhlIG5ldyBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuc2V0KG9wdGlvbmFsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IGFjdGl2ZSBmbGFnIG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhIHtAbGluayBDb250ZXh0U2Vuc29yfSBoYXMgdG8gYmUgY3JlYXRlZAorCSAqICAgICAgICAgYXV0b21hdGljYWxseSBlYWNoIHRpbWUgYSBuZXcge0BsaW5rIENvbnRleHRDb21wb25lbnR9IGlzIGRlcml2ZWQKKwkgKiAgICAgICAgIGZyb20gdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gdGhpcyB0ZW1wbGF0ZSBzZW5zb3IgYmVsb25ncyB0by4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc0RlZmF1bHRBY3RpdmUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX0RFRkFVTFRfQUNUSVZFKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBhIG5ldyBkZWZhdWx0IGFjdGl2ZSBmbGFnIGZvciB0aGlzIHRlbXBsYXRlIHNlbnNvci4KKwkgKgorCSAqIEBwYXJhbSBkZWZhdWx0QWN0aXZlIFRoZSBuZXcgZGVmYXVsdCBhY3RpdmUgZmxhZy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREZWZhdWx0QWN0aXZlKEJvb2xlYW4gZGVmYXVsdEFjdGl2ZSkgeworCQlnZXRWYWx1ZShBVFRSX0RFRkFVTFRfQUNUSVZFKS5zZXQoZGVmYXVsdEFjdGl2ZSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENhdGFsb2dTZW5zb3J9IHRoaXMgdGVtcGxhdGUgc2Vuc29yIGlzIGFzc29jaWF0ZWQgd2l0aC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQge0Bjb2RlIENhdGFsb2dTZW5zb3J9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBDYXRhbG9nU2Vuc29yIGdldENhdGFsb2dTZW5zb3IoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBRdWFudGl0eX0gbWVhc3VyZWQgZGF0YSBhcmUgYXNzb2NpYXRlZCB3aXRoLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFF1YW50aXR5fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgUXVhbnRpdHkgZ2V0UXVhbnRpdHkoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFF1YW50aXR5LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVSb290fSB0aGlzIHRlbXBsYXRlIHNlbnNvciBiZWxvbmdzIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlUm9vdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlUm9vdCBnZXRUZW1wbGF0ZVJvb3QoKSB7CisJCXJldHVybiBnZXRUZW1wbGF0ZUNvbXBvbmVudCgpLmdldFRlbXBsYXRlUm9vdCgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCB7QGxpbmsgVGVtcGxhdGVDb21wb25lbnR9IG9mIHRoaXMgdGVtcGxhdGUgc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgcGFyZW50IHtAY29kZSBUZW1wbGF0ZUNvbXBvbmVudH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlQ29tcG9uZW50IGdldFRlbXBsYXRlQ29tcG9uZW50KCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9IHdpdGgKKwkgKiAgICAgICAgIGdpdmVuIG5hbWUgZG9lcyBub3QgZXhpc3QuCisJICovCisJcHVibGljIE9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiBnZXRUZW1wbGF0ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkuc3RyZWFtKCkuZmlsdGVyKHRhIC0+IHRhLm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlCisJICogc2Vuc29yLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZ2V0VGVtcGxhdGVBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gZ2V0Q29yZSgpLmdldENoaWxkcmVuU3RvcmUoKS5nZXQoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MpOworCX0KKworCS8qKgorCSAqIFJlbW92ZXMgdGhlIHtAbGluayBUZW1wbGF0ZUF0dHJpYnV0ZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlQXR0cmlidXRlfSB0aGF0IGhhcyB0byBiZSByZW1vdmVkLgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSBUZW1wbGF0ZUF0dHJpYnV0ZX0gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZSA9IGdldFRlbXBsYXRlQXR0cmlidXRlKG5hbWUpOworCQlpZiAodGVtcGxhdGVBdHRyaWJ1dGUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHRlbXBsYXRlQXR0cmlidXRlLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZXMgPSBnZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKTsKKwkJaWYgKCF0ZW1wbGF0ZUF0dHJpYnV0ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVBdHRyaWJ1dGVzID0gIikuYXBwZW5kKHRlbXBsYXRlQXR0cmlidXRlcyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVTZW5zb3J9IHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dFNlbnNvcn0gaXMgZGVyaXZlZAorCSAqIGZyb20uCisJICoKKwkgKiBAcGFyYW0gY29udGV4dFNlbnNvciBUaGUge0Bjb2RlIENvbnRleHRTZW5zb3J9IHdob3NlIHtAY29kZQorCSAqIAkJVGVtcGxhdGVTZW5zb3J9IGlzIHJlcXVlc3RlZC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGdpdmVuIHtAY29kZSBDb250ZXh0U2Vuc29yfSBpcyBub3QKKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSBhIHRlbXBsYXRlLCB3aGljaCBpcyBkYXRhIHNvdXJjZSBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRlbXBsYXRlU2Vuc29yPiBvZihDb250ZXh0U2Vuc29yIGNvbnRleHRTZW5zb3IpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZShjb250ZXh0U2Vuc29yKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVTZW5zb3IuY2xhc3MpKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9UZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM5YWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSB0ZXN0IGVudGl0eSB0eXBlLiBBIHRlbXBsYXRlIHRlc3QgY29uc2lzdHMgb2YKKyAqIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2V9cyB3aXRoIHVuaXF1ZSBuYW1lcy4gSXQgZGVzY3JpYmVzIGEgdGVtcGxhdGUgZm9yCisgKiBhIHRlc3QgcnVuIGFuZCBwcm92aWRlcyBtZXRhIGRhdGEgdG8gcmVzb2x2ZSBob29rcyBhbmQgZGF0YSBzb3VyY2VzIGZvcgorICogbmFtaW5nLCBwcm9wZXJ0eSB2YWxpZGF0aW9uLCByZXNvbHV0aW9uIGFuZCBvdGhlciBwdXJwb3Nlcy4gQSB0ZW1wbGF0ZSB0ZXN0CisgKiBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgVmVyc2lvbmFibGV9IGludGVyZmFjZSBhbmQgaGVuY2UgaGFzIGEgdmVyc2lvbiBhbmQgYQorICogc3RhdGUuIEFzIGxvbmcgYXMge0BsaW5rICNpc0VkaXRhYmxlKCl9IHJldHVybnMge0Bjb2RlIHRydWV9IGFueSBwYXJ0IG9mIHRoYXQKKyAqIHRlbXBsYXRlIHRlc3QgaXMgYWxsb3dlZCB0byBiZSBtb2RpZmllZC4gT25jZSBhIHRlbXBsYXRlIHRlc3QgaXMgc2V0IHRvIGJlCisgKiB2YWxpZCAoe0BsaW5rICNpc1ZhbGlkKCl9ID09IHtAY29kZSB0cnVlfSkgaXQgbWF5IGJlIHVzZWQgdG8gZGVmaW5lIGEgdGVzdAorICogcnVuIHRoZXJlZm9yZSBpcyBubyBsb25nZXIgYWxsb3dlZCB0byBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LiBJZiBhIHZhbGlkCisgKiB0ZW1wbGF0ZSB0ZXN0IG5lZWRzIHRvIGJlIG1vZGlmaWVkLCB0aGVuIGEgZGVlcCBjb3B5IHdpdGggYSB1bmlxdWUgbmFtZSBhbmQKKyAqIHZlcnNpb24gY29tYmluYXRpb24gaGFzIHRvIGJlIGNyZWF0ZWQgKGRlZXAgY29weSBtZWFucyBuZXcgaW5zdGFuY2VzKS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlCisgKiBAc2VlIFZlcnNpb25hYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgVmVyc2lvbmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRoZSAnTmFtZUhlbHBlckNsYXNzbmFtZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FSEVMUEVSX0NMQVNTTkFNRSA9ICJOYW1lSGVscGVyQ2xhc3NuYW1lIjsKKworCS8qKgorCSAqIFRoZSAnRGF0YVNvdXJjZVBsdWdpbkNsYXNzbmFtZXMnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfREFUQVNPVVJDRV9QTFVHSU5fQ0xBU1NOQU1FUyA9ICJEYXRhU291cmNlUGx1Z2luQ2xhc3NuYW1lcyI7CisKKwkvKioKKwkgKiBUaGUgJ1Rlc3RPcmRlckFjdGlvbkNsYXNzbmFtZXMnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVEVTVF9PUkRFUl9BQ1RJT05fQ0xBU1NOQU1FUyA9ICJUZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzIjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGxpbmsgQ29yZX0uCisJICovCisJVGVtcGxhdGVUZXN0KENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBuYW1lIGhlbHBlciBjbGFzcyBuYW1lIG9mIHRoaXMgdGVtcGxhdGUgdGVzdC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIG5hbWUgaGVscGVyIGNsYXNzIG5hbWUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lSGVscGVyQ2xhc3NuYW1lKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9OQU1FSEVMUEVSX0NMQVNTTkFNRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgbmFtZSBoZWxwZXIgY2xhc3MgbmFtZSBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHBhcmFtIG5hbWVIZWxwZXJDbGFzc25hbWUgVGhlIG5ldyBuYW1lIGhlbHBlciBjbGFzcyBuYW1lLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE5hbWVIZWxwZXJDbGFzc25hbWUoU3RyaW5nIG5hbWVIZWxwZXJDbGFzc25hbWUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9OQU1FSEVMUEVSX0NMQVNTTkFNRSkuc2V0KG5hbWVIZWxwZXJDbGFzc25hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRhdGEgc291cmNlIHBsdWctaW4gY2xhc3MgbmFtZXMgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUgZGF0YSBzb3VyY2UgcGx1Zy1pbiBjbGFzcyBuYW1lcyBhcmUgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZ1tdIGdldERhdGFTb3VyY2VQbHVnaW5DbGFzc25hbWVzKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9EQVRBU09VUkNFX1BMVUdJTl9DTEFTU05BTUVTKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgZGF0YSBzb3VyY2UgcGx1Zy1pbiBjbGFzcyBuYW1lcyBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHBhcmFtIGRhdGFTb3VyY2VQbHVnaW5DbGFzc25hbWVzIFRoZSBuZXcgZGF0YSBzb3VyY2UgcGx1Zy1pbiBjbGFzcyBuYW1lcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlQ2xhc3NuYW1lcyhTdHJpbmdbXSBkYXRhU291cmNlUGx1Z2luQ2xhc3NuYW1lcykgeworCQlnZXRWYWx1ZShBVFRSX0RBVEFTT1VSQ0VfUExVR0lOX0NMQVNTTkFNRVMpLnNldChkYXRhU291cmNlUGx1Z2luQ2xhc3NuYW1lcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0LgorCSAqCisJICogQHJldHVybiBUaGUgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMgYXJlIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmdbXSBnZXRUZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9URVNUX09SREVSX0FDVElPTl9DTEFTU05BTUVTKS5leHRyYWN0KCk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMgZm9yIHRoaXMgdGVtcGxhdGUgdGVzdC4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzIFRoZSBuZXcgdGVzdCBvcmRlciBhY3Rpb24gY2xhc3MgbmFtZXMuCisJICovCisJcHVibGljIHZvaWQgc2V0VGVzdE9yZGVyQWN0aW9uQ2xhc3NuYW1lcyhTdHJpbmdbXSB0ZXN0T3JkZXJBY3Rpb25DbGFzc25hbWVzKSB7CisJCWdldFZhbHVlKEFUVFJfVEVTVF9PUkRFUl9BQ1RJT05fQ0xBU1NOQU1FUykuc2V0KHRlc3RPcmRlckFjdGlvbkNsYXNzbmFtZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2V9IGlkZW50aWZpZWQgYnkgZ2l2ZW4gbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gd2l0aAorCSAqICAgICAgICAgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiBnZXRUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldFRlbXBsYXRlVGVzdFN0ZXBVc2FnZXMoKS5zdHJlYW0oKS5maWx0ZXIodHRzdSAtPiB0dHN1Lm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX1zIHJlbGF0ZWQgdG8gdGhpcyB0ZW1wbGF0ZQorCSAqIHRlc3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkuZ2V0KFRlbXBsYXRlVGVzdFN0ZXBVc2FnZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0gdGhhdCBoYXMgdG8gYmUgcmVtb3ZlZC4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGhhcyBiZWVuIHJlbW92ZWQuCisJICovCisJcHVibGljIGJvb2xlYW4gcmVtb3ZlVGVtcGxhdGVUZXN0U3RlcFVzYWdlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gdGVtcGxhdGVUZXN0U3RlcFVzYWdlID0gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlKG5hbWUpOworCQlpZiAodGVtcGxhdGVUZXN0U3RlcFVzYWdlLmlzUHJlc2VudCgpKSB7CisJCQlnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLnJlbW92ZSh0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2UuZ2V0KCkpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYXBwZW5kKCcoJyk7CisJCXNiLmFwcGVuZChnZXRWYWx1ZXMoKS52YWx1ZXMoKS5zdHJlYW0oKS5tYXAoVmFsdWU6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworCisJCUxpc3Q8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiB0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VzID0gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpOworCQlpZiAoIXRlbXBsYXRlVGVzdFN0ZXBVc2FnZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVGVtcGxhdGVUZXN0U3RlcFVzYWdlcyA9ICIpLmFwcGVuZCh0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VzKTsKKwkJfQorCisJCXJldHVybiBzYi5hcHBlbmQoJyknKS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBUZW1wbGF0ZUNvbXBvbmVudH0gdGhlIGdpdmVuIHtAbGluayBDb250ZXh0Q29tcG9uZW50fSBpcworCSAqIGRlcml2ZWQgZnJvbS4KKwkgKgorCSAqIEBwYXJhbSB0ZXN0IFRoZSB7QGNvZGUgQ29udGV4dENvbXBvbmVudH0gd2hvc2Uge0Bjb2RlIFRlbXBsYXRlQ29tcG9uZW50fSBpcworCSAqICAgICAgICAgICAgIHJlcXVlc3RlZC4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgdGhlIGdpdmVuIHtAY29kZSBDb250ZXh0Q29tcG9uZW50fSBpcworCSAqICAgICAgICAgbm90IGRlcml2ZWQgZnJvbSBhIHRlbXBsYXRlLCB3aGljaCBpcyBkYXRhIHNvdXJjZSBzcGVjaWZpYy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFRlbXBsYXRlVGVzdD4gb2YoVGVzdCB0ZXN0KSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGdldENvcmUodGVzdCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFRlbXBsYXRlVGVzdC5jbGFzcykpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQYWNrYWdlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciBnaXZlbiB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSBpcyBjb250YWluZWQgaW4gdGhpcworCSAqIHRlbXBsYXRlIHRlc3QuCisJICoKKwkgKiBAcGFyYW0gdGVtcGxhdGVUZXN0U3RlcCBUaGUge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXBVc2FnZX0uCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBnaXZlbiB7QGNvZGUgVGVtcGxhdGVUZXN0U3RlcFVzYWdlfSBpcworCSAqICAgICAgICAgY29udGFpbmVkIGluIHRoaXMgdGVtcGxhdGUgdGVzdC4KKwkgKi8KKwlib29sZWFuIGNvbnRhaW5zKFRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcCkgeworCQlyZXR1cm4gZ2V0VGVtcGxhdGVUZXN0U3RlcFVzYWdlcygpLnN0cmVhbSgpLm1hcChUZW1wbGF0ZVRlc3RTdGVwVXNhZ2U6OmdldFRlbXBsYXRlVGVzdFN0ZXApCisJCQkJLmZpbHRlcih0dHMgLT4gdHRzLmdldE5hbWUoKS5lcXVhbHModGVtcGxhdGVUZXN0U3RlcC5nZXROYW1lKCkpKQorCQkJCS5maWx0ZXIodHRzIC0+IHR0cy5nZXRWZXJzaW9uKCkuZXF1YWxzKHRlbXBsYXRlVGVzdFN0ZXAuZ2V0VmVyc2lvbigpKSkuZmluZEZpcnN0KCkuaXNQcmVzZW50KCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVUZXN0U3RlcC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjkwNTYyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXAuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgZW50aXR5IHR5cGUuIEEgdGVtcGxhdGUgdGVzdCBzdGVwCisgKiBkZXNjcmliZXMgdGhlIGNvbXBvc2l0aW9uIG9mIHtAbGluayBUZW1wbGF0ZVJvb3R9cyB3aGljaCBpbiBmaW5hbGx5IGlzIGEKKyAqIHRlbXBsYXRlIGZvciBhIHBlcnNpc3RlZCBjb250ZXh0IGRlc2NyaXB0aW9uICgiYXMgbWVhc3VyZWQiLCAiYXMgb3JkZXJlZCIpLiBBCisgKiB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgaW1wbGVtZW50cyB0aGUge0BsaW5rIFZlcnNpb25hYmxlfSBpbnRlcmZhY2UgYW5kIGhlbmNlIGhhcworICogYSB2ZXJzaW9uIGFuZCBhIHN0YXRlLiBBcyBsb25nIGFzIHtAbGluayAjaXNFZGl0YWJsZSgpfSByZXR1cm5zIHtAY29kZQorICogdHJ1ZX0gYW55IHBhcnQgb2YgdGhhdCB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgaXMgYWxsb3dlZCB0byBiZSBtb2RpZmllZC4gT25jZSBhCisgKiB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgaXMgc2V0IHRvIGJlIHZhbGlkICh7QGxpbmsgI2lzVmFsaWQoKX0gPT0ge0Bjb2RlIHRydWV9KSBpdAorICogbWF5IGJlIHVzZWQgdG8gY29tcG9zZSBhIHtAbGluayBUZW1wbGF0ZVRlc3R9IGFuZCB0aGVuIGlzIG5vIGxvbmdlciBhbGxvd2VkCisgKiB0byBiZSBtb2RpZmllZCBpbiBhbnkgd2F5LiBJZiBhIHZhbGlkIHRlbXBsYXRlIHRlc3Qgc3RlcCBuZWVkcyB0byBiZQorICogbW9kaWZpZWQsIHRoZW4gYSBkZWVwIGNvcHkgd2l0aCBhIHVuaXF1ZSBuYW1lIGFuZCB2ZXJzaW9uIGNvbWJpbmF0aW9uIGhhcyB0bworICogYmUgY3JlYXRlZCAoZGVlcCBjb3B5IG1lYW5zIG5ldyBpbnN0YW5jZXMpLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBUZW1wbGF0ZVJvb3QKKyAqIEBzZWUgVmVyc2lvbmFibGUKKyAqLworcHVibGljIGNsYXNzIFRlbXBsYXRlVGVzdFN0ZXAgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBEZXNjcmliYWJsZSwgVmVyc2lvbmFibGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlUZW1wbGF0ZVRlc3RTdGVwKENvcmUgY29yZSkgeworCQlzdXBlcihjb3JlKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZWxhdGVkIHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggZ2l2ZW4ge0BsaW5rIENvbnRleHRUeXBlfSBvZgorCSAqIHRoaXMgdGVtcGxhdGUgdGVzdCBzdGVwLgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIHtAY29kZSBPcHRpb25hbH0gaXMgZW1wdHkgaWYgYSB7QGNvZGUgVGVtcGxhdGVSb290fSBvZiBnaXZlbgorCSAqICAgICAgICAge0Bjb2RlIENvbnRleHRUeXBlfSBkb2VzIG5vdCBleGlzdC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVSb290PiBnZXRUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLmdldChUZW1wbGF0ZVJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgYXZhaWxhYmxlIHtAbGluayBUZW1wbGF0ZVJvb3R9cyByZWxhdGVkIHRvIHRoaXMgdGVtcGxhdGUgdGVzdAorCSAqIHN0ZXAuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIExpc3R9IGNvbnRhaW5zIHVwIHRvIDMge0Bjb2RlIFRlbXBsYXRlUm9vdH1zIHdpdGgKKwkgKiAgICAgICAgIGRpc3RpbmN0IHtAbGluayBDb250ZXh0VHlwZX1zLgorCSAqLworCXB1YmxpYyBMaXN0PFRlbXBsYXRlUm9vdD4gZ2V0VGVtcGxhdGVSb290cygpIHsKKwkJTGlzdDxUZW1wbGF0ZVJvb3Q+IHRlbXBsYXRlUm9vdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZ2V0VGVtcGxhdGVSb290KENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpLmlmUHJlc2VudCh0ZW1wbGF0ZVJvb3RzOjphZGQpOworCQlnZXRUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKS5pZlByZXNlbnQodGVtcGxhdGVSb290czo6YWRkKTsKKwkJZ2V0VGVtcGxhdGVSb290KENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpLmlmUHJlc2VudCh0ZW1wbGF0ZVJvb3RzOjphZGQpOworCQlyZXR1cm4gdGVtcGxhdGVSb290czsKKwl9CisKKwkvKioKKwkgKiBSZXBsYWNlcyBjdXJyZW50IHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggdGhlIGdpdmVuIG9uZS4KKwkgKgorCSAqIEBwYXJhbSB0ZW1wbGF0ZVJvb3QgSXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4KKwkgKiBAc2VlICNyZW1vdmVUZW1wbGF0ZVJvb3QoQ29udGV4dFR5cGUpCisJICovCisJcHVibGljIHZvaWQgc2V0VGVtcGxhdGVSb290KFRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QpIHsKKwkJZ2V0Q29yZSgpLmdldE11dGFibGVTdG9yZSgpLnNldCh0ZW1wbGF0ZVJvb3QsIHRlbXBsYXRlUm9vdC5nZXRDb250ZXh0VHlwZSgpKTsKKwl9CisKKwkvKioKKwkgKiBSZW1vdmVzIGN1cnJlbnQge0BsaW5rIFRlbXBsYXRlUm9vdH0gd2l0aCBnaXZlbiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB7QGNvZGUgVGVtcGxhdGVSb290fSBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVRlbXBsYXRlUm9vdChDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlib29sZWFuIGNvbnRhaW5lZCA9IGdldFRlbXBsYXRlUm9vdChjb250ZXh0VHlwZSkuaXNQcmVzZW50KCk7CisJCWdldENvcmUoKS5nZXRNdXRhYmxlU3RvcmUoKS5yZW1vdmUoVGVtcGxhdGVSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCXJldHVybiBjb250YWluZWQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IHRoZSBnaXZlbiB7QGxpbmsgVGVzdFN0ZXB9IGlzIGRlcml2ZWQKKwkgKiBmcm9tLgorCSAqCisJICogQHBhcmFtIHRlc3RTdGVwIFRoZSB7QGNvZGUgVGVzdFN0ZXB9IHdob3NlIHtAY29kZSBUZW1wbGF0ZVRlc3RTdGVwfSBpcworCSAqICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHRoZSBnaXZlbiB7QGNvZGUgVGVzdFN0ZXB9IGlzIG5vdAorCSAqICAgICAgICAgZGVyaXZlZCBmcm9tIGEgdGVtcGxhdGUuCisJICovCisJcHVibGljIHN0YXRpYyBPcHRpb25hbDxUZW1wbGF0ZVRlc3RTdGVwPiBvZihUZXN0U3RlcCB0ZXN0U3RlcCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRDb3JlKHRlc3RTdGVwKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXBVc2FnZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1RlbXBsYXRlVGVzdFN0ZXBVc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MzIzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVGVtcGxhdGVUZXN0U3RlcFVzYWdlLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Tb3J0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlIHRlc3Qgc3RlcCB1c2FnZSBlbnRpdHkgdHlwZS4gQSB0ZW1wbGF0ZSB0ZXN0CisgKiByZWxhdGVzIGEge0BsaW5rIFRlbXBsYXRlVGVzdFN0ZXB9IHdpdGggYSBwYXJlbnQge0BsaW5rIFRlbXBsYXRlVGVzdH0gKG46bSkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKiBAc2VlIFRlbXBsYXRlVGVzdAorICogQHNlZSBUZW1wbGF0ZVRlc3RTdGVwCisgKi8KK3B1YmxpYyBjbGFzcyBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGVsZXRhYmxlLCBTb3J0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlIG9wdGlvbmFsIGZsYWcge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiBJU19PUFRJT05BTCA9IFRlbXBsYXRlVGVzdFN0ZXBVc2FnZTo6aXNPcHRpb25hbDsKKworCS8qKgorCSAqIFRoZSBtYW5kYXRvcnkgZmxhZyB7QGNvZGUgUHJlZGljYXRlfS4gVGhpcyBpcyB0aGUgaW52ZXJzaW9uIG9mCisJICoge0BsaW5rICNJU19PUFRJT05BTH0ge0Bjb2RlIFByZWRpY2F0ZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiBJU19NQU5EQVRPUlkgPSBJU19PUFRJT05BTC5uZWdhdGUoKTsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IGFjdGl2ZSBmbGFnIHtAY29kZSBQcmVkaWNhdGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gSVNfREVGQVVMVF9BQ1RJVkUgPSBUZW1wbGF0ZVRlc3RTdGVwVXNhZ2U6OmlzRGVmYXVsdEFjdGl2ZTsKKworCS8qKgorCSAqIFRoZSBpbXBsaWNpdCBjcmVhdGUgZmxhZyB7QGNvZGUgUHJlZGljYXRlfS4gVGhpcyBpcyBhbiBPUiBjb21iaW5hdGlvbiBvZgorCSAqIHtAbGluayAjSVNfREVGQVVMVF9BQ1RJVkV9IGFuZCB7QGxpbmsgI0lTX01BTkRBVE9SWX0ge0Bjb2RlIFByZWRpY2F0ZX1zLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPFRlbXBsYXRlVGVzdFN0ZXBVc2FnZT4gSVNfSU1QTElDSVRfQ1JFQVRFID0gSVNfREVGQVVMVF9BQ1RJVkUub3IoSVNfTUFOREFUT1JZKTsKKworCS8qKgorCSAqIFRoZSAnRGVmYXVsdEFjdGl2ZScgYXR0cmlidXRlIG5hbWUuCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9ERUZBVUxUX0FDVElWRSA9ICJEZWZhdWx0QWN0aXZlIjsKKworCS8qKgorCSAqIFRoZSAnT3B0aW9uYWwnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfT1BUSU9OQUwgPSAiT3B0aW9uYWwiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UoQ29yZSBjb3JlKSB7CisJCXN1cGVyKGNvcmUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgYWN0aXZlIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgdXNhZ2UuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGEge0BsaW5rIFRlc3RTdGVwfSBoYXMgdG8gYmUgY3JlYXRlZAorCSAqICAgICAgICAgYXV0b21hdGljYWxseSBlYWNoIHRpbWUgYSBuZXcge0BsaW5rIFRlc3R9IGlzIGRlcml2ZWQgZnJvbSB0aGUKKwkgKiAgICAgICAgIHtAbGluayBUZW1wbGF0ZVRlc3R9IHRoaXMgdGVtcGxhdGUgdGVzdCBzdGVwIHVzYWdlIGJlbG9uZ3MgdG8uCisJICovCisJcHVibGljIEJvb2xlYW4gaXNEZWZhdWx0QWN0aXZlKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgZGVmYXVsdCBhY3RpdmUgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgdXNhZ2UuCisJICoKKwkgKiBAcGFyYW0gZGVmYXVsdEFjdGl2ZSBUaGUgbmV3IGRlZmF1bHQgYWN0aXZlIGZsYWcuCisJICovCisJcHVibGljIHZvaWQgc2V0RGVmYXVsdEFjdGl2ZShCb29sZWFuIGRlZmF1bHRBY3RpdmUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9ERUZBVUxUX0FDVElWRSkuc2V0KGRlZmF1bHRBY3RpdmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIGZsYWcgb2YgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGl0IGlzIGFsbG93ZWQgdG8gb21pdCBhIHtAbGluayBUZXN0U3RlcH0KKwkgKiAgICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHRlbXBsYXRlIHRlc3Qgc3RlcCB1c2FnZS4KKwkgKi8KKwlwdWJsaWMgQm9vbGVhbiBpc09wdGlvbmFsKCkgeworCQlyZXR1cm4gZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuZXh0cmFjdCgpOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcgb3B0aW9uYWwgZmxhZyBmb3IgdGhpcyB0ZW1wbGF0ZSB0ZXN0IHN0ZXAgdXNhZ2UuCisJICoKKwkgKiBAcGFyYW0gb3B0aW9uYWwgVGhlIG5ldyBvcHRpb25hbCBmbGFnLgorCSAqLworCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKKwkJZ2V0VmFsdWUoQVRUUl9PUFRJT05BTCkuc2V0KG9wdGlvbmFsKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIFRlbXBsYXRlVGVzdH0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBwYXJlbnQge0Bjb2RlIFRlbXBsYXRlVGVzdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRlbXBsYXRlVGVzdCBnZXRUZW1wbGF0ZVRlc3QoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0UGVybWFuZW50U3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0LmNsYXNzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVGVtcGxhdGVUZXN0U3RlcH0gcmVsYXRlZCB0byB0aGlzIHRlbXBsYXRlIHRlc3Qgc3RlcAorCSAqIHVzYWdlLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFRlbXBsYXRlVGVzdFN0ZXB9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBUZW1wbGF0ZVRlc3RTdGVwIGdldFRlbXBsYXRlVGVzdFN0ZXAoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0TXV0YWJsZVN0b3JlKCkuZ2V0KFRlbXBsYXRlVGVzdFN0ZXAuY2xhc3MpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1VzZXJQYXJhbWV0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Vc2VyUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5N2FiNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9Vc2VyUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKiBDb3B5cmlnaHQgKGMpIDIwMjAgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24NCisgKg0KKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwNCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4NCisgKg0KKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQ0KKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQNCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuDQorICoNCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMA0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOw0KKw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOw0KK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsNCisNCisvKioNCisgKiBAYXV0aG9yIGFrbg0KKyAqDQorICovDQorcHVibGljIGNsYXNzIFVzZXJQYXJhbWV0ZXIgZXh0ZW5kcyBCYXNlRW50aXR5IHsNCisNCisJVXNlclBhcmFtZXRlcihDb3JlIGNvcmUpIHsNCisJCXN1cGVyKGNvcmUpOw0KKwl9DQorDQorfQ0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9WYWx1ZUxpc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9WYWx1ZUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjMyN2IzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZhbHVlTGlzdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkJhc2VFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRhdGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB2YWx1ZSBsaXN0IGVudGl0eSB0eXBlLiBBIHZhbHVlIGxpc3QgcHJvdmlkZXMgYSBzZXQgb2YKKyAqIGRlZmF1bHQgdmFsdWVzIHdoaWNoIG1heSBiZSB1c2VkIGFzIG9wdGlvbnMgd2hpbGUgZGVmaW5pbmcgZGVmYXVsdCB2YWx1ZXMgaW4KKyAqIHRlbXBsYXRlcyBvciBtb2RpZnlpbmcgY29udGV4dCBkYXRhLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNlZSBWYWx1ZUxpc3RWYWx1ZQorICogQHNlZSBDYXRhbG9nQXR0cmlidXRlCisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZUxpc3QgZXh0ZW5kcyBCYXNlRW50aXR5IGltcGxlbWVudHMgRGF0YWJsZSwgRGVzY3JpYmFibGUsIERlbGV0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0BsaW5rIENvcmV9LgorCSAqLworCVZhbHVlTGlzdChDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlTGlzdFZhbHVlfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUge0Bjb2RlIFZhbHVlTGlzdFZhbHVlfS4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIGEge0Bjb2RlIFZhbHVlTGlzdFZhbHVlfSB3aXRoIGdpdmVuCisJICogICAgICAgICBuYW1lIGRvZXMgbm90IGV4aXN0LgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxWYWx1ZUxpc3RWYWx1ZT4gZ2V0VmFsdWVMaXN0VmFsdWUoU3RyaW5nIG5hbWUpIHsKKwkJcmV0dXJuIGdldFZhbHVlTGlzdFZhbHVlcygpLnN0cmVhbSgpLmZpbHRlcih2bHYgLT4gdmx2Lm5hbWVFcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCBhdmFpbGFibGUge0BsaW5rIFZhbHVlTGlzdFZhbHVlfXMgcmVsYXRlZCB0byB0aGlzIHZhbHVlIGxpc3QuCisJICoKKwkgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCB7QGNvZGUgTGlzdH0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PFZhbHVlTGlzdFZhbHVlPiBnZXRWYWx1ZUxpc3RWYWx1ZXMoKSB7CisJCXJldHVybiBnZXRDb3JlKCkuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldChWYWx1ZUxpc3RWYWx1ZS5jbGFzcyk7CisJfQorCisJLyoqCisJICogUmVtb3ZlcyB0aGUge0BsaW5rIFZhbHVlTGlzdFZhbHVlfSBpZGVudGlmaWVkIGJ5IGdpdmVuIG5hbWUuCisJICoKKwkgKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB7QGNvZGUgVmFsdWVMaXN0VmFsdWV9IHRoYXQgaGFzIHRvIGJlIHJlbW92ZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIFZhbHVlTGlzdFZhbHVlc30gd2l0aCBnaXZlbiBuYW1lCisJICogICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorCSAqLworCXB1YmxpYyBib29sZWFuIHJlbW92ZVZhbHVlTGlzdFZhbHVlKFN0cmluZyBuYW1lKSB7CisJCU9wdGlvbmFsPFZhbHVlTGlzdFZhbHVlPiB2YWx1ZUxpc3RWYWx1ZSA9IGdldFZhbHVlTGlzdFZhbHVlKG5hbWUpOworCQlpZiAodmFsdWVMaXN0VmFsdWUuaXNQcmVzZW50KCkpIHsKKwkJCWdldENvcmUoKS5nZXRDaGlsZHJlblN0b3JlKCkucmVtb3ZlKHZhbHVlTGlzdFZhbHVlLmdldCgpKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLmFwcGVuZCgnKCcpOworCQlzYi5hcHBlbmQoZ2V0VmFsdWVzKCkudmFsdWVzKCkuc3RyZWFtKCkubWFwKFZhbHVlOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKworCQlMaXN0PFZhbHVlTGlzdFZhbHVlPiB2YWx1ZUxpc3RWYWx1ZXMgPSBnZXRWYWx1ZUxpc3RWYWx1ZXMoKTsKKwkJaWYgKCF2YWx1ZUxpc3RWYWx1ZXMuaXNFbXB0eSgpKSB7CisJCQlzYi5hcHBlbmQoIiwgVmFsdWVMaXN0VmFsdWVzID0gIikuYXBwZW5kKHZhbHVlTGlzdFZhbHVlcyk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9WYWx1ZUxpc3RWYWx1ZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZhbHVlTGlzdFZhbHVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2YWQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvZGZsdC9tb2RlbC9WYWx1ZUxpc3RWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EZWxldGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Tb3J0YWJsZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFsdWUgbGlzdCB2YWx1ZSBlbnRpdHkgdHlwZS4gQSB2YWx1ZSBsaXN0IHZhbHVlIGlzIGEKKyAqIHVuaXF1ZSB2YWx1ZSBvcHRpb24gd2l0aGluIHRoZSBwYXJlbnQge0BsaW5rIFZhbHVlTGlzdH0uIFRoZXJlZm9yZSB0aGUgbmFtZXMKKyAqIG9mIHRoZSB2YWx1ZSBsaXN0IHZhbHVlcyB3aXRoaW4gYSB7QGNvZGUgVmFsdWVMaXN0fSBoYXZlIHRvIGJlIHVuaXF1ZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqIEBzZWUgVmFsdWVMaXN0CisgKi8KK3B1YmxpYyBjbGFzcyBWYWx1ZUxpc3RWYWx1ZSBleHRlbmRzIEJhc2VFbnRpdHkgaW1wbGVtZW50cyBEZWxldGFibGUsIERlc2NyaWJhYmxlLCBTb3J0YWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVGhlICdTY2FsYXJUeXBlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NDQUxBUl9UWVBFID0gIkRhdGFUeXBlIjsKKworCS8qKgorCSAqIFRoZSAnVmFsdWUnIGF0dHJpYnV0ZSBuYW1lLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUUgPSAiVmFsdWUiOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlWYWx1ZUxpc3RWYWx1ZShDb3JlIGNvcmUpIHsKKwkJc3VwZXIoY29yZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZ2V0VmFsdWUoQVRUUl9WQUxVRSkuc2V0KG5hbWUpOworCQlzdXBlci5zZXROYW1lKG5hbWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCB7QGxpbmsgVmFsdWVMaXN0fS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHBhcmVudCB7QGNvZGUgVmFsdWVMaXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgVmFsdWVMaXN0IGdldFZhbHVlTGlzdCgpIHsKKwkJcmV0dXJuIGdldENvcmUoKS5nZXRQZXJtYW5lbnRTdG9yZSgpLmdldChWYWx1ZUxpc3QuY2xhc3MpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZlcnNpb25hYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvVmVyc2lvbmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EwMGY0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL1ZlcnNpb25hYmxlLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5EYXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WZXJzaW9uU3RhdGU7CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB0aGUge0BsaW5rIERhdGFibGV9IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgZ2V0dGVyIGFuZAorICogc2V0dGVyIG1ldGhvZHMgZm9yIHRoZSAnVmVyc2lvbicgYW5kICdWZXJzaW9uU3RhdGUnIGZpZWxkcyBvZiBhbiBlbnRpdHkuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbmFibGUgZXh0ZW5kcyBEYXRhYmxlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBUaGlzIHtAY29kZSBDb21wYXJhdG9yfSBjb21wYXJlcyB7QGxpbmsgVmVyc2lvbmFibGV9cyBieSB0aGVpciBuYW1lIChpbgorCSAqIGFzY2VuZGluZyBvcmRlcikgYW5kIHZlcnNpb24gKGluIGRlc2NlbmRpbmcgb3JkZXIpLgorCSAqLworCUNvbXBhcmF0b3I8VmVyc2lvbmFibGU+IENPTVBBUkFUT1IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhWZXJzaW9uYWJsZTo6Z2V0TmFtZSkKKwkJCS50aGVuQ29tcGFyaW5nKENvbXBhcmF0b3IuY29tcGFyaW5nKFZlcnNpb25hYmxlOjpnZXRWZXJzaW9uKS5yZXZlcnNlZCgpKTsKKworCS8qKgorCSAqIFRoZSAnVmVyc2lvbicgYXR0cmlidXRlIG5hbWUuCisJICovCisJU3RyaW5nIEFUVFJfVkVSU0lPTiA9ICJWZXJzaW9uIjsKKworCS8qKgorCSAqIFRoZSAnVmVyc2lvblN0YXRlJyBhdHRyaWJ1dGUgbmFtZS4KKwkgKi8KKwlTdHJpbmcgQVRUUl9WRVJTSU9OX1NUQVRFID0gIlZhbGlkRmxhZyI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoaXMgZW50aXR5LgorCSAqCisJICogQHJldHVybiBUaGUgdmVyc2lvbiBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IEludGVnZXIgZ2V0VmVyc2lvbigpIHsKKwkJcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRWYWx1ZShBVFRSX1ZFUlNJT04pLmV4dHJhY3QoKSk7CisJfQorCisJLyoqCisJICogU2V0cyBuZXcgdmVyc2lvbiBmb3IgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gdmVyc2lvbiBUaGUgbmV3IHZlcnNpb24uCisJICovCisJZGVmYXVsdCB2b2lkIHNldFZlcnNpb24oSW50ZWdlciB2ZXJzaW9uKSB7CisJCWdldFZhbHVlKEFUVFJfVkVSU0lPTikuc2V0KHZlcnNpb24udG9TdHJpbmcoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZlcnNpb25TdGF0ZX0gb2YgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgVmVyc2lvblN0YXRlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlkZWZhdWx0IFZlcnNpb25TdGF0ZSBnZXRWZXJzaW9uU3RhdGUoKSB7CisJCXJldHVybiBnZXRWYWx1ZShBVFRSX1ZFUlNJT05fU1RBVEUpLmV4dHJhY3QoKTsKKwl9CisKKwkvKioKKwkgKiBTZXRzIG5ldyB7QGxpbmsgVmVyc2lvblN0YXRlfSBmb3IgdGhpcyBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gdmVyc2lvblN0YXRlIFRoZSBuZXcge0Bjb2RlIFZlcnNpb25TdGF0ZX0uCisJICovCisJZGVmYXVsdCB2b2lkIHNldFZlcnNpb25TdGF0ZShWZXJzaW9uU3RhdGUgdmVyc2lvblN0YXRlKSB7CisJCWdldFZhbHVlKEFUVFJfVkVSU0lPTl9TVEFURSkuc2V0KHZlcnNpb25TdGF0ZSk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgcGFydHMgb2YgdGhpcyB2ZXJzaW9uYWJsZSBhcmUgYWxsb3dlZCB0byBiZSBtb2RpZmllZC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgbW9kaWZpY2F0aW9ucyBhcmUgYWxsb3dlZC4KKwkgKi8KKwlkZWZhdWx0IGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKKwkJcmV0dXJuIGdldFZlcnNpb25TdGF0ZSgpLmlzRWRpdGFibGUoKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIHZlcnNpb25hYmxlIGlzIHZhbGlkIGFuZCB0aGVyZWZvcmUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQKKwkgKiB0byBiZSBtb2RpZmllZC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyB2ZXJzaW9uYWJsZSBpcyB2YWxpZC4KKwkgKi8KKwlkZWZhdWx0IGJvb2xlYW4gaXNWYWxpZCgpIHsKKwkJcmV0dXJuIGdldFZlcnNpb25TdGF0ZSgpLmlzVmFsaWQoKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIHZlcnNpb25hYmxlIGlzIGFyY2hpdmVkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHZlcnNpb25hYmxlIGlzIGFyY2hpdmVkLgorCSAqLworCWRlZmF1bHQgYm9vbGVhbiBpc0FyY2hpdmVkKCkgeworCQlyZXR1cm4gZ2V0VmVyc2lvblN0YXRlKCkuaXNBcmNoaXZlZCgpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0VudGl0eUZhY3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL2RmbHQvbW9kZWwvRW50aXR5RmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc3YmRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0L3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9kZmx0L21vZGVsL0VudGl0eUZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgRW50aXR5RmFjdG9yeVRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjcmVhdGVCYXNlRW50aXRpZXMoKSB7CisJCUVudGl0eUZhY3RvcnkgZW50aXR5RmFjdG9yeSA9IG1vY2soRW50aXR5RmFjdG9yeS5jbGFzcyk7CisJCXdoZW4oZW50aXR5RmFjdG9yeS5jcmVhdGVCYXNlRW50aXR5KGFueSgpLCBhbnkoKSkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCisJCS8vIFRoZSBFbnRpdGllcyBiZWxvdyB3ZXJlIGNob3NlbiBhcyByZXByZXNlbnRhdGl2ZXMgb2YgdGhlaXIgcmVzcGVjdGl2ZQorCQkvLyBwYWNrYWdlcyBzaW5jZSB0aGVpciBjb25zdHJ1Y3RvcnMgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgQ29yZSBpbnN0YW5jZXMKKwkJLy8gcGFzc2VkIHRvIHRoZW0sIHNvIGEgbnVsbCBwb2ludGVyIGlzIHN1ZmZpY2llbnQgZm9yIHRoaXMgdGVzdC4KKworCQkvLyBDaGFubmVsIGNsYXNzIGlzIGluIHBhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsCisJCS8vIChCYXNlRW50aXR5RmFjdG9yeSdzIHBhY2thZ2UpOgorCQlhc3NlcnRUaGF0KGVudGl0eUZhY3RvcnkuY3JlYXRlQmFzZUVudGl0eShDaGFubmVsLmNsYXNzLCBudWxsKSkuaXNJbnN0YW5jZU9mKENoYW5uZWwuY2xhc3MpOworCQkvLyBDYXRhbG9nU2Vuc29yIGNsYXNzIGlzIGluIHBhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsCisJCS8vIChFbnRpdHlGYWN0b3J5J3MgcGFja2FnZSk6CisJCWFzc2VydFRoYXQoZW50aXR5RmFjdG9yeS5jcmVhdGVCYXNlRW50aXR5KENhdGFsb2dTZW5zb3IuY2xhc3MsIG51bGwpKS5pc0luc3RhbmNlT2YoQ2F0YWxvZ1NlbnNvci5jbGFzcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLy5naXRpZ25vcmUgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmE2ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwxOCBAQAorIyBlY2xpcHNlCisuY2xhc3NwYXRoCisucHJvamVjdAorLnNldHRpbmdzLworYmluLworc3JjL2dlbi8KKworIyBncmFkbGUKKy5ncmFkbGUKK2J1aWxkLworCisjIGludGVsbGlqCisuaWRlYS8KK291dC8KKyouaXByCisqLmltbAorKi5pd3MKKy9iaW4vClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0OGUwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyNzcgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDIuMAorCisgICAgVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OCisgICAgT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKKyAgYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvbnRlbnQKKyAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCisgIGIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKyAgICAgaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisgICAgIGlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisgIHdoZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tCisgIGFuZCBhcmUgRGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbgorICAib3JpZ2luYXRlcyIgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieQorICBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuCisgIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgY2hhbmdlcyBvciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gdGhhdAorICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorCisiQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgRGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCisKKyJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoCithcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCitvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBEaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcworQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50CitvciBhbnkgU2Vjb25kYXJ5IExpY2Vuc2UgKGFzIGFwcGxpY2FibGUpLCBpbmNsdWRpbmcgQ29udHJpYnV0b3JzLgorCisiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgUHJvZ3JhbSBhbmQgZm9yIHdoaWNoIHRoZQorZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisKKyJNb2RpZmllZCBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yayBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtIHRoYXQKK3Jlc3VsdHMgZnJvbSBhbiBhZGRpdGlvbiB0bywgZGVsZXRpb24gZnJvbSwgb3IgbW9kaWZpY2F0aW9uIG9mIHRoZQorY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCitpbiBTb3VyY2UgQ29kZSBmb3JtIHRoYXQgY29udGFpbnMgYW55IGNvbnRlbnRzIG9mIHRoZSBQcm9ncmFtLiBNb2RpZmllZAorV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCBjb250YWluIG9ubHkgZGVjbGFyYXRpb25zLAoraW50ZXJmYWNlcywgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseQoraW4gZWFjaCBjYXNlIGluIG9yZGVyIHRvIGxpbmsgdG8sIGJpbmQgYnkgbmFtZSwgb3Igc3ViY2xhc3MgdGhlIFByb2dyYW0KK29yIE1vZGlmaWVkIFdvcmtzIHRoZXJlb2YuCisKKyJEaXN0cmlidXRlIiBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQoraW4gYW55IG1hbm5lciB0aGF0IGVuYWJsZXMgdGhlIHRyYW5zZmVyIG9mIGEgY29weS4KKworIlNvdXJjZSBDb2RlIiBtZWFucyB0aGUgZm9ybSBvZiBhIFByb2dyYW0gcHJlZmVycmVkIGZvciBtYWtpbmcKK21vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCitkb2N1bWVudGF0aW9uIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyJTZWNvbmRhcnkgTGljZW5zZSIgbWVhbnMgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK1ZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CitleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgYXMgaWRlbnRpZmllZCBieSB0aGUgaW5pdGlhbAorQ29udHJpYnV0b3IuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCisgIGEpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieQorICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0CisgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgIHB1YmxpY2x5IHBlcmZvcm0sIERpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCisgIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MuCisKKyAgYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBwYXRlbnQKKyAgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwKKyAgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAorICBpZiBhbnksIGluIFNvdXJjZSBDb2RlIG9yIG90aGVyIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwKKyAgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdAorICB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbgorICBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlCisgIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8gYW55IG90aGVyCisgIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworICBsaWNlbnNlZCBoZXJldW5kZXIuCisKKyAgYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlCisgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorICBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LgorICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCisgIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlCisgIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieQorICBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwKKyAgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eQorICBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUKKyAgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UKKyAgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworICBkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcworICBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAorICB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCisgIGUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubworICBDb250cmlidXRvciBtYWtlcyBhZGRpdGlvbmFsIGdyYW50cyB0byBhbnkgUmVjaXBpZW50IChvdGhlciB0aGFuCisgIHRob3NlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudCkgYXMgYSByZXN1bHQgb2Ygc3VjaCBSZWNpcGllbnQncworICByZWNlaXB0IG9mIHRoZSBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlCisgIChpZiBwZXJtaXR0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMykuCisKKzMuIFJFUVVJUkVNRU5UUworCiszLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjoKKworICBhKSB0aGUgUHJvZ3JhbSBtdXN0IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYXMgU291cmNlIENvZGUsIGluCisgIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uIDMuMiwgYW5kIHRoZSBDb250cmlidXRvciBtdXN0IGFjY29tcGFueQorICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICBpcyBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZCBpbmZvcm1zIFJlY2lwaWVudHMgaG93IHRvCisgIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorCisgIGIpIHRoZSBDb250cmlidXRvciBtYXkgRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSB1bmRlciBhIGxpY2Vuc2UKKyAgZGlmZmVyZW50IHRoYW4gdGhpcyBBZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQgc3VjaCBsaWNlbnNlOgorICAgICBpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZworICAgICB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZAorICAgICBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MKKyAgICAgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCisgICAgIGlpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIG90aGVyIENvbnRyaWJ1dG9ycyBhbGwKKyAgICAgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworICAgICBpaWkpIGRvZXMgbm90IGF0dGVtcHQgdG8gbGltaXQgb3IgYWx0ZXIgdGhlIHJlY2lwaWVudHMnIHJpZ2h0cworICAgICBpbiB0aGUgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorCisgICAgIGl2KSByZXF1aXJlcyBhbnkgc3Vic2VxdWVudCBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkgYW55CisgICAgIHBhcnR5IHRvIGJlIHVuZGVyIGEgbGljZW5zZSB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzCisgICAgIG9mIHRoaXMgc2VjdGlvbiAzLgorCiszLjIgV2hlbiB0aGUgUHJvZ3JhbSBpcyBEaXN0cmlidXRlZCBhcyBTb3VyY2UgQ29kZToKKworICBhKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBvciBpZiB0aGUKKyAgUHJvZ3JhbSAoaSkgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IKKyAgZmlsZXMgbWFkZSBhdmFpbGFibGUgdW5kZXIgYSBTZWNvbmRhcnkgTGljZW5zZSwgYW5kIChpaSkgdGhlIGluaXRpYWwKKyAgQ29udHJpYnV0b3IgYXR0YWNoZWQgdG8gdGhlIFNvdXJjZSBDb2RlIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluCisgIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHN1Y2ggU2Vjb25kYXJ5IExpY2Vuc2VzLCBhbmQKKworICBiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZgorICB0aGUgUHJvZ3JhbS4KKworMy4zIENvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0LCBwYXRlbnQsCit0cmFkZW1hcmssIGF0dHJpYnV0aW9uIG5vdGljZXMsIGRpc2NsYWltZXJzIG9mIHdhcnJhbnR5LCBvciBsaW1pdGF0aW9ucworb2YgbGlhYmlsaXR5ICgibm90aWNlcyIpIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0gZnJvbSBhbnkgY29weSBvZgordGhlIFByb2dyYW0gd2hpY2ggdGhleSBEaXN0cmlidXRlLCBwcm92aWRlZCB0aGF0IENvbnRyaWJ1dG9ycyBtYXkgYWRkCit0aGVpciBvd24gYXBwcm9wcmlhdGUgbm90aWNlcy4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMKK3dpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcworbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwKK3RoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKK29mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCitsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeQorb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywKK2RhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzCithbmQgb3RoZXIgbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQKK0NvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtCitpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QKK2FwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZAoraW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQKK0NvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgord3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwKK2FuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueQorcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQorcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCitDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5CithbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCitkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0bworcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheQordGhvc2UgZGFtYWdlcy4KKworNS4gTk8gV0FSUkFOVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UCitQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIKK0JBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IKK0lNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YKK1RJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQorYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsCityaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCwKK2luY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKK2NvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zCitvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UCitQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTCitTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVAorUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKK0FSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCitFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCitQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKzcuIEdFTkVSQUwKKworSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIKK2FjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQorbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQorUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZQorb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzCityaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0CitmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mCit0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCityaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZQorYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuCitIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCitncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LAorYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQKK21heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQKK3Jlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKK3RoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50CitTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uCitpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZQorcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUKK2VudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZwordmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorRGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcworcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLAorQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMKK0NvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4KKworRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50CityZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkKK0NvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCitlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkCit1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuIE5vdGhpbmcgaW4gdGhpcyBBZ3JlZW1lbnQgaXMgaW50ZW5kZWQKK3RvIGJlIGVuZm9yY2VhYmxlIGJ5IGFueSBlbnRpdHkgdGhhdCBpcyBub3QgYSBDb250cmlidXRvciBvciBSZWNpcGllbnQuCitObyB0aGlyZC1wYXJ0eSBiZW5lZmljaWFyeSByaWdodHMgYXJlIGNyZWF0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQuCisKK0V4aGliaXQgQSAtIEZvcm0gb2YgU2Vjb25kYXJ5IExpY2Vuc2VzIE5vdGljZQorCisiVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nCitTZWNvbmRhcnkgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoCitpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSwgdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IHtuYW1lIGxpY2Vuc2UocyksCit2ZXJzaW9uKHMpLCBhbmQgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGhlcmV9LiIKKworICBTaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGxpY2Vuc2UgdGhlIFNvdXJjZSBDb2RlIHVuZGVyIFNlY29uZGFyeSBMaWNlbnNlcy4KKworICBJZiBpdCBpcyBub3QgcG9zc2libGUgb3IgZGVzaXJhYmxlIHRvIHB1dCB0aGUgbm90aWNlIGluIGEgcGFydGljdWxhcgorICBmaWxlLCB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFCisgIGZpbGUgaW4gYSByZWxldmFudCBkaXJlY3RvcnkpIHdoZXJlIGEgcmVjaXBpZW50IHdvdWxkIGJlIGxpa2VseSB0bworICBsb29rIGZvciBzdWNoIGEgbm90aWNlLgorCisgIFlvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL05PVElDRS50eHQgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvTk9USUNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI4MWM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL05PVElDRS50eHQKQEAgLTAsMCArMSwzODIgQEAKKyMgTm90aWNlcyBmb3IgRWNsaXBzZSBNRE18QkwKKworVGhpcyBjb250ZW50IGlzIHByb2R1Y2VkIGFuZCBtYWludGFpbmVkIGJ5IHRoZSBFY2xpcHNlIE1ETXxCTCBwcm9qZWN0LAoraXQgaXMgYSBwcm9qZWN0IG9mIHRoZSBvcGVuTURNKFIpIEVjbGlwc2UgV29ya2luZyBHcm91cC4KKworKiBQcm9qZWN0IGhvbWU6IGh0dHBzOi8vcHJvamVjdHMuZWNsaXBzZS5vcmcvcHJvamVjdHMvdGVjaG5vbG9neS5tZG1ibAorCisjIyBUcmFkZW1hcmtzCisKK0VjbGlwc2UgTURNfEJMLCBNRE18QkwgYW5kIEVjbGlwc2Ugb3Blbk1ETShSKSBsb2dvIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3MKK29mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24uCisKKyMjIENvcHlyaWdodAorCitBbGwgY29udGVudCBpcyB0aGUgcHJvcGVydHkgb2YgdGhlIGZvbGxvd2luZyByZXNwZWN0aXZlIGF1dGhvcnMgb3IgdGhlaXIgZW1wbG95ZXJzLgorRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGF1dGhvcnNoaXAgb2YgY29udGVudCwgcGxlYXNlIGNvbnN1bHQgdGhlIGxpc3RlZAorc291cmNlIGNvZGUgcmVwb3NpdG9yeSBsb2dzLgorCitDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorQ29weXJpZ2h0IChjKSAyMDE2LTIwMjAgUGVhayBTb2x1dGlvbiBHbWJICitDb3B5cmlnaHQgKGMpIDIwMTctMjAxOCBzY2llbmNlICsgY29tcHV0aW5nIEFHIFR1ZWJpbmdlbiAoQVRPUyBTRSkKK0NvcHlyaWdodCAoYykgMjAxNy0yMDE4IENhbm9vIEVuZ2luZWVyaW5nIEFHCitDb3B5cmlnaHQgKGMpIDIwMTcgRmxvcmlhbiBTY2htaXR0CitDb3B5cmlnaHQgKGMpIDIwMTctMjAyMCBBbmdlbGlrYSBXaXR0ZWsKK0NvcHlyaWdodCAoYykgMjAxOC0yMDE5IEVsZWt0cm9uaXNjaGUgRmFocndlcmtzeXN0ZW1lIEdNQkgKK0NvcHlyaWdodCAoYykgMjAxOC0yMDIwIEthcmFrdW4gQUcKK0NvcHlyaWdodCAoYykgMjAxOC0yMDIwIEFsZXhhbmRlciBOZWhtZXIKKworIyMgRGVjbGFyZWQgUHJvamVjdCBMaWNlbnNlcworCitUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKworIyMgU291cmNlIENvZGUKKworVGhlIHByb2plY3QgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgc291cmNlIGNvZGUgcmVwb3NpdG9yaWVzOgorCitvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuZ2l0CSAgICAtIFRoZSBvcGVuTURNKFIpIEFQSS4KK29yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdC5naXQJICAgIC0gRXh0ZW5zaW9uIG9mIHRoZSBvcGVuTURNKFIpIEFQSSBjb250YWluaW5nIGRlZmF1bHQgZWxlbWVudHMuCitvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZ2l0CS0gT0RTIGltcGxlbWVudGF0aW9uIG9mIHBlcnNpc3RlbmNlIGFkYXB0ZXIuCitvcmcuZWNsaXBzZS5tZG0ubnVjbGV1cy5naXQJICAgICAgICAtIENvcmUgYnVpbGRpbmcgYmxvY2tzIGZvciB0aGUgb3Blbk1ETSBCdXNpbmVzcyBMb2dpYyBhbmQgV2ViIEZyb250ZW5kLgorCisjIyBUaGlyZC1wYXJ0eSBDb250ZW50CisKK1RoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuCitJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcKK2lzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8KK3RoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLgorCithbnRscjQtNC41LjMuamFyKDIuNS4zKQorICAgICogTGljZW5zZTogTmV3IEJTRCBsaWNlbnNlCisKK2FvcGFsbGlhbmNlLXJlcGFja2FnZWQtMi41LjAtYjA1LmphciAoMi41LjAtYjA1KQorICAgICogTGljZW5zZTogQ0RETAorCitjb21tb25zLWNvZGVjLTEuMi5qYXIgKDEuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworY29tbW9ucy1odHRwY2xpZW50LTMuMS5qYXIgICgzLjEpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2NvbW1vbnMtbGFuZzMtMy44LjEuamFyICgzLjguMSkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworY29tbW9ucy10ZXh0LTEuNi5qYXIgKDEuNikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworZ3Nvbi0yLjcuamFyICgyLjcpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK0dvb2dsZSBHdWF2YSBWZXJzaW9uOiAyNS4wLWpyZSAgKDI1LjApCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK0dyYWRsZSBXcmFwcGVyICg0LjEwLjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2hrMi1hcGktMi41LjAtYjA1LmphciAoMi41LjAtYjA1KQorICAgICogTGljZW5zZTogQ0RETC0xLjEKKworaGsyLWxvY2F0b3ItMi41LjAtYjA1LmphcigyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2hrMi11dGlscy0yLjUuMC1iMDUuamFyICgyLjUuMC1iMDUpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2phY2tzb24tYW5ub3RhdGlvbnMtMi45LjAuamFyICAoMi45LjApCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2phY2tzb24tY29yZS0yLjkuMi5qYXIoMi45LjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2phY2tzb24tZGF0YWJpbmQtMi45LjIuamFyICAoMi45LjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2phY2tzb24tamF4cnMtYmFzZS0yLjkuMi5qYXIoMi45LjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2phY2tzb24tamF4cnMtanNvbi1wcm92aWRlci0yLjkuMi5qYXIoMi45LjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2phY2tzb24tbW9kdWxlLWpheGItYW5ub3RhdGlvbnMtMi45LjIuamFyICAoMi45LjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK2phdmFzc2lzdC0zLjIwLjAtR0EuamFyICAoMi4yMC4wLUdBKQorICAgICogTGljZW5zZTogQXBhY2hlIDIuMAorCitqY2wtb3Zlci1zbGY0ai0xLjcuMjUuamFyKDEuNy4yNSkKKyAgICAqIExpY2Vuc2U6IE1JVCBMaWNlbnNlCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vd3d3LnNsZjRqLm9yZy9saWNlbnNlLmh0bWwKKyAgICAqIFByb2plY3QgVVJMOiAgaHR0cHM6Ly93d3cuc2xmNGoub3JnCisgICAgKiBTb3VyY2UgVVJMOiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9xb3MtY2gvc2xmNGoKKworamVyc2V5LWNsaWVudC0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktY29tbW9uLTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LTIuMjMuMi5qYXIgICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1jb250YWluZXItc2VydmxldC1jb3JlLTIuMjMuMy5qYXIoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktZ3VhdmEtMi4yMy4yLmphciAgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjAKKworamVyc2V5LW1lZGlhLWpheGItMi4yMy4yLmphcigyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK2plcnNleS1tZWRpYS1zc2UtMi4yMy4yLmphciAoMi4yMy4yKQorICAgICogTGljZW5zZTogQ0RETAorCitqZXJzZXktbWVkaWEtbXVsdGlwYXJ0LTIuMjMuMi5qYXIgKDIuMjMuMikKKyAgICAqIExpY2Vuc2U6IENEREwKKworamVyc2V5LXNlcnZlci0yLjIzLjIuamFyICgyLjIzLjIpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK2xvZzRqLW92ZXItc2xmNGotMS43LjI1LmphciAoMS43LjI1KQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitsb2diYWNrLWNsYXNzaWMtMS4yLjMuamFyKDEuMi4zKQorICAgICogTGljZW5zZTogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAxLjAKKworbG9nYmFjay1jb3JlLTEuMi4zLmphcigxLjIuMykKKyAgICAqIExpY2Vuc2U6IEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMS4wCisKK21pbWVwdWxsLTEuOS42LmphciAoMS45LjQpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK29wZW5hdGZ4LTAuNy40LmphciAoMC43LjQpCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisKK29zZ2ktcmVzb3VyY2UtbG9jYXRvci0xLjAuMS5qYXIoMS4wLjEpCisgICAgKiBMaWNlbnNlOiBDRERMCisKK3Byb3RvYnVmLWphdmEtMy4yLjAuamFyICgzLjIuMCkKKyAgICAqIExpY2Vuc2U6IE5ldyBCU0QgbGljZW5zZQorCitwcm90b2J1Zi1qYXZhLXV0aWwtMy4yLjAuamFyICAoMy4yLjApCisgICAgKiBMaWNlbnNlOiBOZXcgQlNEIGxpY2Vuc2UKKworc3dhZ2dlci1hbm5vdGF0aW9ucy0yLjAuOC5qYXIgKDIuMC44KQorICAgICogTGljZW5zZTogQXBhY2hlLTIuMAorCitzd2FnZ2VyLXVpLTMuMjMuMC5qYXIgKDMuMjMuMCkKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKworc2xmNGotYXBpLTEuNy4yNS5qYXIgICgxLjcuMjUpCisgICAgKiBMaWNlbnNlOiBNSVQgbGljZW5zZQorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL3d3dy5zbGY0ai5vcmcvbGljZW5zZS5odG1sCisgICAgKiBQcm9qZWN0IFVSTDogaHR0cHM6Ly9naXRodWIuY29tL3Fvcy1jaC9zbGY0agorICAgICogU291cmNlIFVSTDogIGh0dHBzOi8vZ2l0aHViLmNvbS9xb3MtY2gvc2xmNGovcmVsZWFzZXMvdGFnL3ZfMS43LjI1CisKK3N0YXgyLWFwaS0zLjEuNC5qYXIgKDMuMS40KQorICAgICogTGljZW5zZTogQlNELTItQ2xhdXNlCisKK3ZhbGlkYXRpb24tYXBpLTEuMS4wLkZpbmFsLmphciAoMS4xLjAuRmluYWwpCisgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCit2YXZyLTAuOS4xLXNvdXJjZXMuamFyICgwLjkuMSkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK3ZhdnItbWF0Y2gtMC45LjEuamFyICgwLjkuMSkKKyAgKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wCisKK3dvb2RzdG94LWNvcmUtYXNsLTQuNC4xLmphciAoNC40LjEpCisgICogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMAorCisKK0ZGQU1GQU1GQU0gU2lsayBJY29uLCBWZXJzaW9uIDEuMworICAgICogTGljZW5zZTogQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgTGljZW5zZQorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnkvMy4wLworICAgICogUHJvamVjdDogaHR0cDovL3d3dy5mYW1mYW1mYW0uY29tL2xhYi9pY29ucy9zaWxrLworICAgICogU291cmNlOiAgaHR0cDovL3d3dy5mYW1mYW1mYW0uY29tL2xhYi9pY29ucy9zaWxrLworCitAYW5ndWxhci9hbmltYXRpb25zOjcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2FuaW1hdGlvbnMKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL2Nkazo3LjEuMQorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaQorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4xLjEKKworCitAYW5ndWxhci9jb21tb25ANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pby9hcGkvY29tbW9uCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNHIKKworQGFuZ3VsYXIvY29tcGlsZXJANy4yLjQKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vYW5ndWxhci5pbworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9yZWxlYXNlcy90YWcvNy4yLjQKKworQGFuZ3VsYXIvY29yZUA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9mb3Jtc0A3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9odHRwQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pY0A3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyQDcuMi40CisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iL21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2FuZ3VsYXIuaW8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcmVsZWFzZXMvdGFnLzcuMi40CisKK0Bhbmd1bGFyL3JvdXRlckA3LjIuNAorICAgICogTGljZW5zZTogTUlUCisgICAgKiBMaWNlbmNlIFBhdGg6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9hbmd1bGFyLmlvCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3JlbGVhc2VzL3RhZy83LjIuNAorCitib290c3RyYXBANC4xLjMKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dldGJvb3RzdHJhcC5jb20vCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAKKworY2xhc3MtdHJhbnNmb3JtZXJAMC4xLjYKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vdHlwZXN0YWNrL2NsYXNzLXRyYW5zZm9ybWVyL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS9wbGVlcm9jay9jbGFzcy10cmFuc2Zvcm1lcgorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3BsZWVyb2NrL2NsYXNzLXRyYW5zZm9ybWVyCisKK2NvcmUtanNAMi42LjAKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9yYXcvbWFzdGVyL0xJQ0VOU0UKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9yZWxlYXNlcy90YWcvdjIuNi4wCisKK2ZpbGUtc2F2ZXJAMS4zLjMKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvcmF3L21hc3Rlci9MSUNFTlNFLm1kCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcworCitmb250LWF3ZXNvbWVANC43LjAKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vRm9ydEF3ZXNvbWUvRm9udC1Bd2Vzb21lL2Jsb2IvbWFzdGVyL0xJQ0VOU0UudHh0CisgICAgKiBQcm9qZWN0OiBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS8KKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9Gb3J0QXdlc29tZS9Gb250LUF3ZXNvbWUKKworbmcyLXNwbGl0LXBhbmVAMS4zLjEKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vd2FubmFiZWdlZWsvbmcyLXNwbGl0LXBhbmUvcmF3L21hc3Rlci9MSUNFTlNFCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vd2FubmFiZWdlZWsvbmcyLXNwbGl0LXBhbmUKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS93YW5uYWJlZ2Vlay9uZzItc3BsaXQtcGFuZQorCituZ3gtYm9vdHN0cmFwQDMuMS4yCisgICAgKiBMaWNlbnNlOiBNSVQKKyAgICAqIExpY2VuY2UgUGF0aDogaHR0cHM6Ly9naXRodWIuY29tL3ZhbG9yLXNvZnR3YXJlL25neC1ib290c3RyYXAvYmxvYi92My4xLjIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly92YWxvci1zb2Z0d2FyZS5jb20vbmd4LWJvb3RzdHJhcAorICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3ZhbG9yLXNvZnR3YXJlL25neC1ib290c3RyYXAvdHJlZS92My4xLjIKKworQG5neC10cmFuc2xhdGUvY29yZUAxMS4wLjEKKyAgICAqIExpY2Vuc2U6IE1JVCAKKyAgICAqIExpY2VuY2UgUGF0aDogICBodHRwczovL2dpdGh1Yi5jb20vbmd4LXRyYW5zbGF0ZS9jb3JlL2Jsb2IvdjExLjAuMS9MSUNFTlNFICAKKyAgICAqIFByb2plY3QgVVJMOiAgICBodHRwOi8vd3d3Lm5neC10cmFuc2xhdGUuY29tLworICAgICogU291cmNlIFVSTDogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2NvcmUKKworQG5neC10cmFuc2xhdGUvaHR0cC1sb2FkZXJANC4wLjAKKyAgICAqIExpY2Vuc2U6IE1JVCAKKyAgICAqIExpY2VuY2UgUGF0aDogICBodHRwczovL2dpdGh1Yi5jb20vbmd4LXRyYW5zbGF0ZS9odHRwLWxvYWRlci9ibG9iL3Y0LjAuMC9MSUNFTlNFICAKKyAgICAqIFByb2plY3QgVVJMOiAgICBodHRwOi8vd3d3Lm5neC10cmFuc2xhdGUuY29tLworICAgICogU291cmNlIFVSTDogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtdHJhbnNsYXRlL2h0dHAtbG9hZGVyL3RyZWUvdjQuMC4wCisKK3ByaW1laWNvbnM6MS4wLjAKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZWljb25zL2Jsb2IvMS4wLjAvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly93d3cucHJpbWVmYWNlcy5vcmcvcHJpbWVuZworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3ByaW1lZmFjZXMvcHJpbWVpY29ucy90cmVlLzEuMC4wCisKK3ByaW1lbmdANy4wLjEKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vcHJpbWVmYWNlcy9wcmltZW5nL2Jsb2IvNy4wLjEvTElDRU5TRS5tZAorICAgICogUHJvamVjdDogaHR0cHM6Ly93d3cucHJpbWVmYWNlcy5vcmcvcHJpbWVuZworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL3ByaW1lZmFjZXMvcHJpbWVuZy90cmVlLzcuMC4xCisKK3J4anNANi4zLjMKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vcnhqcy1kZXYuZmlyZWJhc2VhcHAuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL3RyZWUvNi4zLjMKKworcnhqcy1jb21wYXQ6Ni4zLjMKKyAgICAqIExpY2Vuc2U6IEFwYWNoZS0yLjAKKyAgICAqIFByb2plY3Q6IGh0dHBzOi8vcnhqcy1kZXYuZmlyZWJhc2VhcHAuY29tLworICAgICogU291cmNlOiAgaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL3RyZWUvNi4zLjMvY29tcGF0CisKK3RzbGliQDEuOS4wCisgICAgKiBMaWNlbnNlOiBBcGFjaGUtMi4wCisgICAgKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L3RzbGliCisgICAgKiBTb3VyY2U6ICBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L3RzbGliL3RyZWUvMS45LjAKKworem9uZS5qc0AwLjguMjYKKyAgICAqIExpY2Vuc2U6IE1JVAorICAgICogTGljZW5jZSBQYXRoOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL3Jhdy9tYXN0ZXIvTElDRU5TRQorICAgICogUHJvamVjdDogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIKKyAgICAqIFNvdXJjZTogIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvcmVsZWFzZXMvdGFnL3YwLjguMjYKKworT01HIEV2ZW50IFNlcnZpY2UgU3BlY2lmaWNhdGlvbiAoMS4yKQorCisqIExpY2Vuc2U6IExpY2Vuc2VSZWYgLSBPYmplY3QtTWFuYWdlbWVudC1Hcm91cC1MaWNlbnNlCisqIFByb2plY3Q6IGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9FVk5ULzEuMi8KKyogU291cmNlOiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvRVZOVC8xLjIvcGRmCisKK09NRyBOb3RpZmljYXRpb24gU2VydmljZSBTcGVjaWZpY2F0aW9uICgxLjEpCisKKyogTGljZW5zZTogTGljZW5zZVJlZiAtIE9iamVjdC1NYW5hZ2VtZW50LUdyb3VwLUxpY2Vuc2UKKyogUHJvamVjdDogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL05PVC8KKyogU291cmNlOiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULzEuMS9QREYKKworb2RzNTMwLmlkbAorRGF0ZTogSG9laGVua2lyY2hlbiwgMDYvMDEvMjAxNgorIlRoZSBBU0FNIEJvYXJkIG9mIERpcmVjdG9ycyByZWxlYXNlcyB0aGUgSURMIGZpbGVzIGZvciB1c2UgdW5kZXIgdGhlIEVQTCB0byB0aGUgRWNsaXBzZSBJV0cgb3Blbk1ETS4KK1RoaXMgaXMgdmFsaWQgZm9yIGFsbCB2ZXJzaW9ucyBvZiBBU0FNIE9EUyA1LjMueC4KK1RoaXMgcGVybWlzc2lvbiBpcyB2YWxpZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBFY2xpcHNlIHdpbGwgbm90IG1vZGlmeSB0aGUgZmlsZS4iCisKK0F2YWxvbkV2ZW50LmlkbCwgQ29yYmFGaWxlU2VydmVyLmlkbAorRGF0ZTogMDgvMTUvMjAxNgorIkhlcmV3aXRoLCB3ZSByZWxlYXNlIHRoZSBnZW5lcmF0ZWQgQ2xpZW50LVNvdXJjZS1Db2RlIGdlbmVyYXRlZCBmcm9tIG91ciBDT1JCQSBJRExzLCBuYW1lbHkKKyogQ09SQkFOb3RpZmljYXRpb24gU2VydmljZSAoZ2VuZXJhdGVkIGZyb20g4oCeQXZhbG9uRXZlbnQuaWRs4oCdKQorKiBDT1JCQUZpbGVTZXJ2ZXIgKGdlbmVyYXRlZCBmcm9tIOKAnkNvcmJhRmlsZVNlcnZlci5pZGzigJwpLAorVW5kZXIgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgKEVQTCkuIFRoaXMgYWdyZWVtZW50IGRvZXMgbm90IGluY2x1ZGUgdGhlIOKAnkF2YWxvbkV2ZW50LmlkbOKAnCBhbmQKK+KAnkNvcmJhRmlsZVNlcnZlci5pZGzigJwgaXRzZWxmLCB3aGljaCByZW1haW4gcHJvdGVjdGVkIHByb3BlcnR5IG9mIEhpZ2hRU29mdC4gIgorCisjIyBDcnlwdG9ncmFwaHkKKworQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseQorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcworcGVybWl0dGVkLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL1JFQURNRS5tZCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlNzNkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9SRUFETUUubWQKQEAgLTAsMCArMSwxNjQgQEAKKyMgTURNNSBBUEkgIworCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzZXJ2aWNlcyBkZWZpbmVkIGluIHRoZSBNRE01IEFQSS4KKworCisjIyAxLiBJbnRyb2R1Y3Rpb24gIyMKKworVGhlIE1ETTUgQVBJIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcHJvamVjdHM6CisKKworLSAgICoqb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlKipcCisgICAgRGVmaW5lcyB0aGUgY29yZSBzZXJ2aWNlcyBhbmQgZW50aXRpZXMuIEVudGl0aWVzIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgcHJvamVjdCBtdXN0IGJlIHN1cHBvcnRlZCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorCistICAgKipvcmcuZWNsaXBzZS5tZG0uYXBpLmRlZmF1bHQqKlwKKyAgICBFeHRlbmRzIHRoZSBjb3JlIEFQSSB3aXRoIGNhdGFsb2cgYW5kIHRlbXBsYXRlIGVudGl0aWVzIHRvIG9yZ2FuaXplCisgICAgdGhlIHN0b3JhZ2Ugb2YgY29udGV4dCBkYXRhLgorCistICAgKipvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIqKlwKKyAgICBJbXBsZW1lbnRzIGJvdGggb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlIGFuZCBvcmcuZWNsaXBzZS5tZG0uZGVmYXVsdAorICAgIHVzaW5nIHRoZSBxdWVyeSBiYXNlZCBBU0FNIE9EUyBPTyBBUEkuCisKKworIyMgMi4gRW50aXR5TWFuYWdlciAjIworCitPbmNlIGEgY29ubmVjdGlvbiB0byBhIHBlcnNpc3RlbmNlIChlLmcuIE9EUyBzZXJ2ZXIpIGlzIGVzdGFibGlzaGVkLCB0aGUKK2VudGl0eSBtYW5hZ2VyIGFsbG93cyB0byBsb2FkIGVudGl0aWVzIG9mIGFueSBraW5kIGFuZCBwcm92aWRlcyBhY2Nlc3MKK3RvIGF2YWlsYWJsZSBzZXJ2aWNlcy4KKworCitSZXR1cm5lZCBlbnRpdGllcyBhcmUgYWx3YXlzIGNvbXBsZXRlLiBUaGlzIG1lYW5zIHRoZXkgYXJlIGxvYWRlZCB3aXRoCithbGwgb2YgdGhlaXIgcHJvcGVydGllcyBhbmQgcmVsYXRlZCBlbnRpdGllcyAoYXMgZXhwb3NlZCBieSB0aGVpciBBUEkpLgorVGhlcmVmb3JlIGl0IGRvZXMgbm90IG1hdHRlciBob3cgZW50aXRpZXMgYXJlIHJldHJpZXZlZCAoZS5nLiBlbnRpdHkKK21hbmFnZXIgb3Igc2VhcmNoIHNlcnZpY2UpLiBUaGUgZW50aXR5IG1hbmFnZXIgcHJvdmlkZXMgdmFyaW91cyBtZXRob2RzCit0byBsb2FkIGluc3RhbmNlcyBieSB0aGVpciBpZCwgbG9hZCBwYXJlbnQgb3IgY2hpbGQgZW50aXRpZXMgZm9yIGEgZ2l2ZW4KK2VudGl0eSBvciBmaWx0ZXIgbG9hZGVkIGVudGl0aWVzIHdpdGggYSBnaXZlbiBuYW1pbmcgcGF0dGVybi4gQ29udGV4dAorZGF0YSBtYXkgYmUgbG9hZGVkIGZvciBUZXN0U3RlcCBvciBNZWFzdXJlbWVudCBlbnRpdGllcy4KKworCitNYXNzIGRhdGEgbWF5IGJlIGxvYWRlZCBieSBkZWZpbmluZyBhIGNvcnJlc3BvbmRpbmcgcmVxdWVzdC4gU3VjaCBhCityZXF1ZXN0IGNvbnNpc3RzIG9mIGEgQ2hhbm5lbEdyb3VwIGFuZCBhIHN1YnNldCBvZiByZWxhdGVkIENoYW5uZWxzLgorRmluYWxseSwgYSByYW5nZSBpcyBkZWZpbmVkIHRvIGxvYWRlZCBzdG9yZWQgdmFsdWVzIGl0ZXJhdGl2ZWx5IG9yIGFsbCBhdAorb25jZS4gVGhpcyBhbGxvd3MgYSBmaW5lIGdyYWluZWQgYWNjZXNzIHRvIHN0b3JlZCBtYXNzIGRhdGEuCisKKworIyMjIDIuMS4gU2VhcmNoU2VydmljZSAjIyMKKworVGhlIHNlYXJjaCBzZXJ2aWNlIGFsbG93cyB0byBzZWFyY2ggZm9yIGVudGl0aWVzIGxpa2UgVGVzdCwgVGVzdFN0ZXAsCitNZWFzdXJlbWVudCBhbmQgQ2hhbm5lbCBhY3Jvc3MgaGllcmFyY2hpZXMuIFNvIG9uZSBjYW4sIGZvciBleGFtcGxlLAorc2VhcmNoIGZvciBUZXN0cyBhbmQgYXBwbHkgZmlsdGVyIGNyaXRlcmlhIGZvciBjb250ZXh0IGRhdGEgb2YgcmVsYXRlZAorVGVzdFN0ZXBzIGFuZCBNZWFzdXJlbWVudHMgd2l0aG91dCBkZWZpbmluZyBhbnkgam9pbnMuIFRoaXMgaXMgZG9uZSBieQordGhlIGludGVybmFsbHkgdXNlZCBzZWFyY2ggcXVlcmllcy4gRWFjaCBzZWFyY2ggcXVlcnkgZGVmaW5lcyBhIHNldCBvZgorc3VwcG9ydGVkIGVudGl0eSB0eXBlcyBhbmQgaGVuY2UgYWxsIG9mIGl0cyBhdHRyaWJ1dGVzIG1heSBiZSB1c2VkIGZvcgorc2VsZWN0aW9ucyBvciBmaWx0ZXIgY3JpdGVyaWEuIFRoZSBzZWFyY2ggc2VydmljZSBhbGxvd3MgdG8gcXVlcnkKK3Bvc3NpYmxlIGZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggc3VwcG9ydGVkIGF0dHJpYnV0ZS4KKworCitJbiBhZGRpdGlvbiB0byB0aGF0IGEgcXVlcnkgc3RyaW5nIG1heSBiZSB1c2VkIHRvIHNlYXJjaCBmb3IgZW50aXRpZXMuCitUaGlzIHF1ZXJ5IHN0cmluZyBpcyBldmFsdWF0ZWQgYW5kIHByb2Nlc3NlZCBieSBhIGZ1bGwgdGV4dCBzZWFyY2gKK3doaWNoIHJldHVybnMgYSByZXN1bHQgY29uc2lzdGluZyBvZiBUZXN0LCBUZXN0U3RlcCBvciBNZWFzdXJlbWVudAorZW50aXRpZXMuCisKKworIyMjIDIuMi4gTm90aWZpY2F0aW9uICMjIworCitUT0RPCisKKworIyMjIDIuMy4gRmlsZVNlcnZpY2UgIyMjCisKK1RoZSBmaWxlIHNlcnZpY2UgbWF5IGJlIHVzZWQgdG8gZG93bmxvYWQgZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMsIHF1ZXJ5Cit0aGVpciBzaXplIG9yIG9wZW4gYSBjb25zdW1hYmxlIGRvd25sb2FkIHN0cmVhbSBmb3IgYSBnaXZlbiBleHRlcm5hbGx5CitsaW5rZWQgZmlsZS4gU2VxdWVudGlhbCBvciBwYXJhbGxlbCBkb3dubG9hZCBvZiBtdWx0aXBsZSBmaWxlcyBpcworcG9zc2libGUgYXMgd2VsbC4gQSBkb3dubG9hZCByZXF1ZXN0IHdpdGggbXVsdGlwbGUgZmlsZXMgbWF5IGhhdmUKK211bHRpcGxlIGxpbmtzIHRvIHRoZSBzYW1lIGZpbGUuIEluIHN1Y2ggYSBjYXNlIHRoaXMgZmlsZSBpcyBkb3dubG9hZGVkCitvbmx5IG9uY2UgYW5kIGFsbCBsaW5rcyB3aWxsIHBvaW50IHRvIHRoZSBzYW1lIGxvY2FsIGNvcHkgb2YgdGhlCitkb3dubG9hZGVkIGZpbGUuIFNpbmNlIGRvd25sb2FkaW5nIGxhcmdlIGZpbGVzIG1heSB0YWtlIGl0cyB0aW1lIHRvCitjb21wbGV0ZSwgb25lIGNhbiBwYXNzIGEgbGlzdGVuZXIgdG8gdHJhY2sgdGhlIG92ZXJhbGwgcHJvZ3Jlc3MuCisKK05PVEU6CitgYGAKK1RoaXMgc2VydmljZSBkb2VzIG5vdCBhbGxvdyBtYW51YWxseSB1cGxvYWRpbmcgb3IgZGVsZXRpbmcgZmlsZXMuIEluc3RlYWQgCitmaWxlcyBhcmUgYXV0b21hdGljYWxseSB1cGxvYWRlZCAvIGRlbGV0ZWQgd2hpbGUgZW50aXRpZXMgYXJlIHdyaXR0ZW4gCit3aXRoaW4gYSBTZWN0aW9uIDIuNSwgIlRyYW5zYWN0aW9uIi4KK2BgYAorCisjIyMgMi40LiBFbnRpdHlGYWN0b3J5ICMjIworCitUaGUgZW50aXR5IGZhY3RvcnkgaXMgdGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSBuZXcgZW50aXRpZXMuIEVhY2ggZW50aXR5CityZXR1cm5lZCBieSB0aGlzIHNlcnZpY2UgaXMgY29uc2lkZXJlZCB0byBiZSB2aXJ0dWFsLCBzaW5jZSBpdCBkb2VzIG5vdAoraGF2ZSBhbiBpZCB1bnRpbCBpdCBpcyB3cml0dGVuLiBFbnRpdGllcyB3aXRoIGluZm9ybWF0aW9uYWwgcmVsYXRpb25zCitsaWtlIFF1YW50aXR5IChyZWZlcmVuY2VzIGEgVW5pdCkgb3IgVW5pdCAocmVmZXJlbmNlcyBhCitQaHlzaWNhbERpbWVuc2lvbikgbWF5IG9ubHkgcmVmZXJlbmNlIGFscmVhZHkgcGVyc2lzdGVkIGVudGl0aWVzLiBUaGlzCittZWFucyB0aGF0IGEgbmV3IFF1YW50aXR5IG1heSBvbmx5IGJlIGNyZWF0ZWQgd2l0aCBhbiBhbHJlYWR5IHBlcnNpc3RlZAorVW5pdCBhbmQgYSBuZXcgVW5pdCBtYXkgb25seSBiZSBjcmVhdGVkIHdpdGggYW4gYWxyZWFkeSBwZXJzaXN0ZWQKK1BoeXNpY2FsRGltZW5zaW9uLgorCisKK09uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBwb3NzaWJsZSB0byBjcmVhdGUgcGFyZW50IC8gY2hpbGQgdHJlZXMKK2NvbnNpc3Rpbmcgb2YgdmlydHVhbCBvciBwZXJzaXN0ZWQgZW50aXRpZXMgKHBhcmVudCBhbmQgY2hpbGQgZW50aXRpZXMKK2FyZSBpbnRlcm5hbGx5IGxpbmtlZCB0b2dldGhlcikuIFdpdGhpbiBhIHRyYW5zYWN0aW9uIHN1Y2ggdHJlZXMgYXJlCityZWN1cnNpdmVseSBwcm9jZXNzZWQsIHRoZXJlZm9yZSBpdCBpcyBub3QgcmVxdWlyZWQgdG8gZXhwbGljaXRseQorY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNoaWxkIGVudGl0aWVzLCBpbnN0ZWFkIGl0IGlzIHN1ZmZpY2llbnQgYW5kCitoaWdobHkgcmVjb21tZW5kZWQgdG8gd3JpdGUgb25seSB0aGUgcm9vdCBlbnRpdHkgb2YgdGhlIHRyZWUocykuIFRoZQordHJhbnNhY3Rpb24gc2VydmljZSByZWN1cnNpdmVseSByZXNvbHZlcyBzdWNoIHRyZWVzIGFuZCBleGVjdXRlcyBiYXRjaAoraW5zZXJ0LSwgdXBkYXRlLSBvciBkZWxldGUtc3RhdGVtZW50cyBmb3IgdGhlIGNoaWxkcmVuLgorCisKKyMjIyAyLjUuIFRyYW5zYWN0aW9uICMjIworCitUaGUgdHJhbnNhY3Rpb24gc2VydmljZSBlZmZlY3RpdmVseSBtb2RpZmllcyB0aGUgc3RvcmVkIGNvbnRlbnRzLgorRW50aXRpZXMgYXJlIGdyb3VwZWQgYnkgdGhlaXIgdHlwZSBiZWZvcmUgdGhleSBhcmUgcHJvY2Vzc2VkLiBFYWNoIGdyb3VwCitpcyBwcm9jZXNzZWQgYXQgb25jZSB3aXRoIGEgYmF0Y2ggc3RhdGVtZW50LiBFYWNoIHdyaXR0ZW4gZW50aXR5IGlzCitzY2FubmVkIGZvciBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4gTmV3IG9uZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQsCit3aGlsZSByZW1vdmVkIG9uZXMgYXJlIGRlbGV0ZWQuIEluIGNhc2Ugb2YgZXJyb3JzIGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlCitwZXJzaXN0ZW5jZSBhcmUgY2FuY2VsbGVkIGFuZCBoZW5jZSBhbnkgc3VjY2Vzc2Z1bGx5IHVwbG9hZGVkIGZpbGUgaGFzIHRvCitiZSBkZWxldGVkLiBVbmZvcnR1bmF0ZWx5LCB0aGUgcmVtb3ZhbCBvZiB1cGxvYWRlZCBmaWxlcyBjYW5ub3QgYmUKK2d1YXJhbnRlZWQgKGUuZy4gYSBicm9rZW4gY29ubmVjdGlvbiksIGluc3RlYWQgYSBkZWxldGUgcmVxdWVzdCBmb3IgdGhlCit1cGxvYWRlZCBmaWxlcyBpcyBzZW5kIG9uIGEgYmVzdCBlZmZvcnQgYmFzaXMuCisKK0lNUE9SVEFOVDoKK2BgYAorRXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMgb2YgZGVsZXRlZCBlbnRpdGllcyBhcmUgb25seSByZW1vdmVkIGlmIHRoZQorZW50aXR5IGlzIGFuIGluc3RhbmNlIG9mIEZpbGVzQXR0YWNoYWJsZSAoVGVzdCwgVGVzdFN0ZXAsIE1lYXN1cmVtZW50KS4KK0luIGFueSBvdGhlciBjYXNlLCBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBhcmUgbm90IHJlbW92ZWQgc2luY2UgdGhpcyAKK21heSBoYXZlIGFuIGltcGFjdCBvbiBvdGhlciBlbnRpdGllcyB3aGljaCByZWZlcmVuY2UgdGhlIHNhbWUgZmlsZS4KK2BgYAorCitCZXNpZGVzIHRoZSBtb2RpZmljYXRpb24gb2YgZW50aXRpZXMsIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlIG1hc3MgZGF0YQorYnkgZGVmaW5pbmcgd3JpdGUgcmVxdWVzdHMuIEEgd3JpdGUgcmVxdWVzdCBkZXNjcmliZXMgaW4gZGV0YWlsIGhvdyB0aGUKK21hc3MgZGF0YSBvZiBhIENoYW5uZWwgaXMgb3JnYW5pemVkIChlLmcuIHZhbHVlcyBhcmUgZXhwbGljaXQgb3IKK2dlbmVyYXRlZCwgc3RvcmVkIGluIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzIGV0Yy4pLgorCisKKworIyMgMy4gQ29ubmVjdCB0byBhbiBPRFMgU2VydmVyICMjCisKK1RoZSBPRFMgZW50aXR5IG1hbmFnZXIgZmFjdG9yeSBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gYW4gT0RTIHNlcnZlci4gSXQKK3Rha2VzIHBhcmFtZXRlcnMsIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93LCB0byBlc3RhYmxpc2ggYQorY29ubmVjdGlvbi4gT24gc3VjY2VzcyBhbiBlbnRpdHkgbWFuYWdlciBpcyByZXR1cm5lZC4KKworYGBgamF2YQorICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFLCAiY29yYmFsb2M6OjEuMkA8U0VSVkVSPjo8UE9SVD4vTmFtZVNlcnZpY2UiKTsKKyAgICBjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fU0VSVklDRU5BTUUsICI8U0VSVklDRT4uQVNBTS1PRFMiKTsKKyAgICBjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fVVNFUiwgInNhIik7CisgICAgY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5LlBBUkFNX1BBU1NXT1JELCAic2EiKTsKKyAgICBFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXIgPSBuZXcgT0RTRW50aXR5TWFuYWdlckZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKyAgICAvLyBkbyBzb21ldGhpbmcgdXNlZnVsCisgICAgZW50aXR5TWFuYWdlci5jbG9zZSgpOworYGBgCisKKyMjIDQuIENvcHlyaWdodCBhbmQgTGljZW5zZSAjIworQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKworIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKworIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9idWlsZC5ncmFkbGUgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NWUzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvYnVpbGQuZ3JhZGxlCkBAIC0wLDAgKzEsMTkzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2Rlc2NyaXB0aW9uID0gJ01ETSBBUEkgLSBPRFNBZGFwdGVyJworZ3JvdXAgPSAnb3JnLmVjbGlwc2UubWRtJwordmVyc2lvbiA9ICc1LjIuME0xJworCithcHBseSBwbHVnaW46ICdqYXZhJworYXBwbHkgcGx1Z2luOiAnbWF2ZW4nCithcHBseSBwbHVnaW46ICdlY2xpcHNlJworYXBwbHkgcGx1Z2luOiAnY29tLmdvb2dsZS5wcm90b2J1ZicKKworYnVpbGRzY3JpcHQgeworCXJlcG9zaXRvcmllcyB7CisJCW1hdmVuQ2VudHJhbCgpCisJfQorCWRlcGVuZGVuY2llcyB7CisJCWNsYXNzcGF0aCAnY29tLmdvb2dsZS5wcm90b2J1Zjpwcm90b2J1Zi1ncmFkbGUtcGx1Z2luOjAuOC4xJworCX0KK30KKworcmVwb3NpdG9yaWVzIHsKKwlqY2VudGVyKCkKKwltYXZlbkxvY2FsKCkKKwltYXZlbkNlbnRyYWwoKQorfQorCitzb3VyY2VTZXRzIHsKKworCWdlbmVyYXRlZCB7CisJCWphdmEgeworCQkJc3JjRGlyICdzcmMvZ2VuL2phdmEnCisJCQlzcmNEaXIgJ2J1aWxkL2dlbmVyYXRlZC9zb3VyY2UvcHJvdG8vbWFpbi9qYXZhJworCQl9CisJfQorCisJbWFpbiB7CisJCWNvbXBpbGVDbGFzc3BhdGggKz0gZ2VuZXJhdGVkLm91dHB1dAorCQlydW50aW1lQ2xhc3NwYXRoICs9IGdlbmVyYXRlZC5vdXRwdXQKKwl9CisKKwl0ZXN0IHsKKwkJY29tcGlsZUNsYXNzcGF0aCArPSBnZW5lcmF0ZWQub3V0cHV0CisJCXJ1bnRpbWVDbGFzc3BhdGggKz0gZ2VuZXJhdGVkLm91dHB1dAorCX0KK30KKworY29uZmlndXJhdGlvbnMuYWxsIHsKKwlleGNsdWRlIGdyb3VwOiAnamF2YXguaW5qZWN0JywgbW9kdWxlOiAnamF2YXguaW5qZWN0JworCWV4Y2x1ZGUgZ3JvdXA6ICdjb21tb25zLWxvZ2dpbmcnLCBtb2R1bGU6ICdjb21tb25zLWxvZ2dpbmcnCisJCisJLy8gZXhjbHVkZSBndWF2YSBkZXBlbmRlbmNpZXMKKwlleGNsdWRlIGdyb3VwOiAnY29tLmdvb2dsZS5jb2RlLmZpbmRidWdzJywgbW9kdWxlOiAnanNyMzA1JworCWV4Y2x1ZGUgZ3JvdXA6ICdjb20uZ29vZ2xlLmVycm9ycHJvbmUnLCBtb2R1bGU6ICdlcnJvcl9wcm9uZV9hbm5vdGF0aW9ucycKKwlleGNsdWRlIGdyb3VwOiAnY29tLmdvb2dsZS5qMm9iamMnLCBtb2R1bGU6ICdqMm9iamMtYW5ub3RhdGlvbnMnCisJZXhjbHVkZSBncm91cDogJ29yZy5jb2RlaGF1cy5tb2pvJywgbW9kdWxlOiAnYW5pbWFsLXNuaWZmZXItYW5ub3RhdGlvbnMnCisJZXhjbHVkZSBncm91cDogJ29yZy5jaGVja2VyZnJhbWV3b3JrJywgbW9kdWxlOiAnY2hlY2tlci1jb21wYXQtcXVhbCcKK30KKworZGVwZW5kZW5jaWVzIHsKKwljb21waWxlT25seSAnamF2YXg6amF2YWVlLWFwaTo3LjAnCisKKwkvLyBsb2dnaW5nCisJY29tcGlsZSAnb3JnLnNsZjRqOnNsZjRqLWFwaToxLjcuMjUnCisJLy8gaHR0cGNsaWVudCB1c2VzIGNvbW1vbnMtbG9nZ2luZworCWNvbXBpbGUgJ29yZy5zbGY0ajpqY2wtb3Zlci1zbGY0ajoxLjcuMjUnCisKKwkvLyBNRE01IEFQSQorCWNvbXBpbGUgIm9yZy5lY2xpcHNlLm1kbTpvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2U6JHt2ZXJzaW9ufSIKKwljb21waWxlICJvcmcuZWNsaXBzZS5tZG06b3JnLmVjbGlwc2UubWRtLmFwaS5kZWZhdWx0OiR7dmVyc2lvbn0iCisKKwkvLyBjb21waWxlIENPUkJBIGlkbCB1c2luZyBKREsgdG9vbHMKKwlnZW5lcmF0ZWRDb21waWxlIGZpbGVzKFN5c3RlbS5nZXRlbnYoJ0pBVkFfSE9NRScpICsgJy9saWIvdG9vbHMuamFyJykKKyAgICBnZW5lcmF0ZWRDb21waWxlIGZpbGVzKCdzcmMvbWFpbi9pZGwvJykKKyAgICAKKwkvLyBQZWFrIG5vdGlmaWNhdGlvbiBzZXJ2aWNlCisJY29tcGlsZSAnY29tLmdvb2dsZS5wcm90b2J1Zjpwcm90b2J1Zi1qYXZhOjMuMi4wJworCWNvbXBpbGUgJ2NvbS5nb29nbGUucHJvdG9idWY6cHJvdG9idWYtamF2YS11dGlsOjMuMi4wJworCWNvbXBpbGUgJ2NvbS5nb29nbGUuZ3VhdmE6Z3VhdmE6MjUuMC1qcmUnCisJY29tcGlsZSAnb3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTpqZXJzZXktY2xpZW50OjIuMjMuMicKKwljb21waWxlICdvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTpqZXJzZXktbWVkaWEtc3NlOjIuMjMuMicKKwlnZW5lcmF0ZWRDb21waWxlICdjb20uZ29vZ2xlLnByb3RvYnVmOnByb3RvYnVmLWphdmE6My4yLjAnCisKKwkvLyBxdWVyeWluZyBlcworCWNvbXBpbGUgJ2NvbW1vbnMtaHR0cGNsaWVudDpjb21tb25zLWh0dHBjbGllbnQ6My4xJworCWNvbXBpbGUgJ29yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLXRleHQ6MS42JworCisJLy8gdGVzdGluZworCXRlc3RDb21waWxlICdqdW5pdDpqdW5pdDo0LjEyJworCXRlc3RSdW50aW1lICdvcmcuc2xmNGo6c2xmNGotc2ltcGxlOjEuNy4yNScKKwl0ZXN0Q29tcGlsZSAnb3JnLm1vY2tpdG86bW9ja2l0by1jb3JlOjIuMTMuMCcKKwl0ZXN0Q29tcGlsZSAnb3JnLmFzc2VydGo6YXNzZXJ0ai1jb3JlOjMuNi4yJworCQorCXRlc3RDb21waWxlICJvcmcuZWxhc3RpY3NlYXJjaC5jbGllbnQ6ZWxhc3RpY3NlYXJjaC1yZXN0LWNsaWVudDo2LjQuMSIKKwl0ZXN0Q29tcGlsZSAib3JnLnRlc3Rjb250YWluZXJzOmVsYXN0aWNzZWFyY2g6MS4xMi41IgorfQorCit0ZXN0IHsKKwlpZihwcm9qZWN0Lmhhc1Byb3BlcnR5KCdob3N0JykpIHsKKwkJc3lzdGVtUHJvcGVydHkgJ2hvc3QnLCBwcm9qZWN0LnByb3BlcnR5KCdob3N0JykKKwl9IGVsc2UgeworCQlzeXN0ZW1Qcm9wZXJ0eSAnaG9zdCcsICc8aG9zdD4nCisJfQorCisJaWYocHJvamVjdC5oYXNQcm9wZXJ0eSgncG9ydCcpKSB7CisJCXN5c3RlbVByb3BlcnR5ICdwb3J0JywgcHJvamVjdC5wcm9wZXJ0eSgncG9ydCcpCisJfSBlbHNlIHsKKwkJc3lzdGVtUHJvcGVydHkgJ3BvcnQnLCAnMjgwOScKKwl9CisJCisJaWYocHJvamVjdC5oYXNQcm9wZXJ0eSgnc2VydmljZScpKSB7CisJCXN5c3RlbVByb3BlcnR5ICdzZXJ2aWNlJywgcHJvamVjdC5wcm9wZXJ0eSgnc2VydmljZScpCisJfSBlbHNlIHsKKwkJc3lzdGVtUHJvcGVydHkgJ3NlcnZpY2UnLCAnPHNlcnZpY2U+JworCX0KKworCWp2bUFyZ3MgJy1Eb3JnLnNsZjRqLnNpbXBsZUxvZ2dlci5kZWZhdWx0TG9nTGV2ZWw9ZGVidWcnCit9CisKK3Byb3RvYnVmIHsKKwlwcm90b2MgeworCQlhcnRpZmFjdCA9ICdjb20uZ29vZ2xlLnByb3RvYnVmOnByb3RvYzozLjIuMCcKKwl9Cit9CisKKwordGFzayBjb21waWxlSURMKHR5cGU6IEphdmFFeGVjKSB7CisJY2xhc3NwYXRoID0gY29uZmlndXJhdGlvbnMuZ2VuZXJhdGVkQ29tcGlsZQorCisJbWFpbiA9ICdjb20uc3VuLnRvb2xzLmNvcmJhLnNlLmlkbC50b0phdmFQb3J0YWJsZS5Db21waWxlJworCisJLy8gYWRkICdmYWxsVElFJyBpZiA8VHlwZT5QT0EgJiA8VHlwZT5QT0FUaWUgaGF2ZSB0byBiZSBnZW5lcmF0ZWQgICAKKwlhcmdzICctZmFsbFRJRScsICctdGQnLCAnc3JjL2dlbi9qYXZhLycsICdzcmMvbWFpbi9pZGwvb2RzNTMwLmlkbCcKKworCW91dHB1dHMuZGlyKCJzcmMvZ2VuL2phdmEiKQorfQorCit0YXNrIGNvbXBpbGVOb3RpZmljYXRpb25TZXJ2aWNlSURMKHR5cGU6IEphdmFFeGVjKSB7CisJY2xhc3NwYXRoID0gY29uZmlndXJhdGlvbnMuZ2VuZXJhdGVkQ29tcGlsZQorCisJbWFpbiA9ICdjb20uc3VuLnRvb2xzLmNvcmJhLnNlLmlkbC50b0phdmFQb3J0YWJsZS5Db21waWxlJworCisJYXJncyAnLWVtaXRBbGwnLCAnLWZhbGxUSUUnLCAnLWknLCAnc3JjL21haW4vaWRsLycsICctdGQnLCAnc3JjL2dlbi9qYXZhLycsICdzcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q2hhbm5lbEFkbWluLmlkbCcKKworCW91dHB1dHMuZGlyKCJzcmMvZ2VuL2phdmEiKQorCW91dHB1dHMudXBUb0RhdGVXaGVuIHsgZmFsc2UgfQorfQorCitjb21waWxlR2VuZXJhdGVkSmF2YSB7CisJaW5wdXRzLmRpcigiYnVpbGQvZ2VuZXJhdGVkL3NvdXJjZSIpCisJaW5wdXRzLmRpcigic3JjL2dlbi9qYXZhIikKK30KKworLy8gZ2VuZXJhdGUgY2xhc3NlcyBmcm9tIGlkbCBhbmQgY29tcGlsZSB0aGVtCitjb21waWxlR2VuZXJhdGVkSmF2YS5kZXBlbmRzT24gY29tcGlsZUlETAorY29tcGlsZUdlbmVyYXRlZEphdmEuZGVwZW5kc09uIGNvbXBpbGVOb3RpZmljYXRpb25TZXJ2aWNlSURMCisKK2NvbXBpbGVKYXZhLmRlcGVuZHNPbiBjb21waWxlR2VuZXJhdGVkSmF2YQorCitqYXIgeworCWZyb20gc291cmNlU2V0cy5nZW5lcmF0ZWQub3V0cHV0CisJZGVwZW5kc09uIGdlbmVyYXRlZENsYXNzZXMKKworCW1ldGFJbmYgeyBmcm9tICdOT1RJQ0UudHh0JyB9CisJbWV0YUluZiB7IGZyb20gJ0xJQ0VOU0UudHh0JyB9Cit9CisKK3Rhc2sgc291cmNlc0phcih0eXBlOiBKYXIsIGRlcGVuZHNPbjogY2xhc3NlcykgeworCWNsYXNzaWZpZXIgPSAnc291cmNlcycKKwlmcm9tIHNvdXJjZVNldHMubWFpbi5hbGxTb3VyY2UKK30KKworYXJ0aWZhY3RzIHsKKwlhcmNoaXZlcyBzb3VyY2VzSmFyCit9CisKK3Rhc2sgZGVsZXRlR2VuZXJhdGVkKHR5cGU6IERlbGV0ZSkgeworCWRlbGV0ZSAnc3JjL2dlbicKKwlkZWxldGUgJ2J1aWxkJworfQorCitjbGVhbi5kZXBlbmRzT24gZGVsZXRlR2VuZXJhdGVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiNTQzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGUucHJvcGVydGllcwpAQCAtMCwwICsxLDE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgCitzb3VyY2VDb21wYXRpYmlsaXR5PTEuOAordGFyZ2V0Q29tcGF0aWJpbGl0eT0xLjgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMyNjVlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLmphcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MmUwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcwpAQCAtMCwwICsxLDUgQEAKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQ0KK2Rpc3RyaWJ1dGlvblBhdGg9d3JhcHBlci9kaXN0cw0KK3ppcFN0b3JlQmFzZT1HUkFETEVfVVNFUl9IT01FDQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMNCitkaXN0cmlidXRpb25Vcmw9aHR0cHNcOi8vc2VydmljZXMuZ3JhZGxlLm9yZy9kaXN0cmlidXRpb25zL2dyYWRsZS00LjEwLjItYmluLnppcA0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3IGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2NjZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3CkBAIC0wLDAgKzEsMTcyIEBACisjIS91c3IvYmluL2VudiBzaAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjCisjIyAgR3JhZGxlIHN0YXJ0IHVwIHNjcmlwdCBmb3IgVU4qWAorIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEF0dGVtcHQgdG8gc2V0IEFQUF9IT01FCisjIFJlc29sdmUgbGlua3M6ICQwIG1heSBiZSBhIGxpbmsKK1BSRz0iJDAiCisjIE5lZWQgdGhpcyBmb3IgcmVsYXRpdmUgc3ltbGlua3MuCit3aGlsZSBbIC1oICIkUFJHIiBdIDsgZG8KKyAgICBscz1gbHMgLWxkICIkUFJHImAKKyAgICBsaW5rPWBleHByICIkbHMiIDogJy4qLT4gXCguKlwpJCdgCisgICAgaWYgZXhwciAiJGxpbmsiIDogJy8uKicgPiAvZGV2L251bGw7IHRoZW4KKyAgICAgICAgUFJHPSIkbGluayIKKyAgICBlbHNlCisgICAgICAgIFBSRz1gZGlybmFtZSAiJFBSRyJgIi8kbGluayIKKyAgICBmaQorZG9uZQorU0FWRUQ9ImBwd2RgIgorY2QgImBkaXJuYW1lIFwiJFBSR1wiYC8iID4vZGV2L251bGwKK0FQUF9IT01FPSJgcHdkIC1QYCIKK2NkICIkU0FWRUQiID4vZGV2L251bGwKKworQVBQX05BTUU9IkdyYWRsZSIKK0FQUF9CQVNFX05BTUU9YGJhc2VuYW1lICIkMCJgCisKKyMgQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuCitERUZBVUxUX0pWTV9PUFRTPSIiCisKKyMgVXNlIHRoZSBtYXhpbXVtIGF2YWlsYWJsZSwgb3Igc2V0IE1BWF9GRCAhPSAtMSB0byB1c2UgdGhhdCB2YWx1ZS4KK01BWF9GRD0ibWF4aW11bSIKKword2FybiAoKSB7CisgICAgZWNobyAiJCoiCit9CisKK2RpZSAoKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBFc2NhcGUgYXBwbGljYXRpb24gYXJncworc2F2ZSAoKSB7CisgICAgZm9yIGkgZG8gcHJpbnRmICVzXFxuICIkaSIgfCBzZWQgInMvJy8nXFxcXCcnL2c7MXMvXi8nLztcJHMvXCQvJyBcXFxcLyIgOyBkb25lCisgICAgZWNobyAiICIKK30KK0FQUF9BUkdTPSQoc2F2ZSAiJEAiKQorCisjIENvbGxlY3QgYWxsIGFyZ3VtZW50cyBmb3IgdGhlIGphdmEgY29tbWFuZCwgZm9sbG93aW5nIHRoZSBzaGVsbCBxdW90aW5nIGFuZCBzdWJzdGl0dXRpb24gcnVsZXMKK2V2YWwgc2V0IC0tICRERUZBVUxUX0pWTV9PUFRTICRKQVZBX09QVFMgJEdSQURMRV9PUFRTICJcIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FXCIiIC1jbGFzc3BhdGggIlwiJENMQVNTUEFUSFwiIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRBUFBfQVJHUyIKKworIyBieSBkZWZhdWx0IHdlIHNob3VsZCBiZSBpbiB0aGUgY29ycmVjdCBwcm9qZWN0IGRpciwgYnV0IHdoZW4gcnVuIGZyb20gRmluZGVyIG9uIE1hYywgdGhlIGN3ZCBpcyB3cm9uZworaWYgWyAiJCh1bmFtZSkiID0gIkRhcndpbiIgXSAmJiBbICIkSE9NRSIgPSAiJFBXRCIgXTsgdGhlbgorICBjZCAiJChkaXJuYW1lICIkMCIpIgorZmkKKworZXhlYyAiJEpBVkFDTUQiICIkQCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3LmJhdCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTU2NDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL2dyYWRsZXcuYmF0CkBAIC0wLDAgKzEsODQgQEAKK0BpZiAiJURFQlVHJSIgPT0gIiIgQGVjaG8gb2ZmDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KK0ByZW0NCitAcmVtICBHcmFkbGUgc3RhcnR1cCBzY3JpcHQgZm9yIFdpbmRvd3MNCitAcmVtDQorQHJlbSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKw0KK0ByZW0gU2V0IGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlT1MlIj09IldpbmRvd3NfTlQiIHNldGxvY2FsDQorDQorc2V0IERJUk5BTUU9JX5kcDANCitpZiAiJURJUk5BTUUlIiA9PSAiIiBzZXQgRElSTkFNRT0uDQorc2V0IEFQUF9CQVNFX05BTUU9JX5uMA0KK3NldCBBUFBfSE9NRT0lRElSTkFNRSUNCisNCitAcmVtIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0Lg0KK3NldCBERUZBVUxUX0pWTV9PUFRTPQ0KKw0KK0ByZW0gRmluZCBqYXZhLmV4ZQ0KK2lmIGRlZmluZWQgSkFWQV9IT01FIGdvdG8gZmluZEphdmFGcm9tSmF2YUhvbWUNCisNCitzZXQgSkFWQV9FWEU9amF2YS5leGUNCislSkFWQV9FWEUlIC12ZXJzaW9uID5OVUwgMj4mMQ0KK2lmICIlRVJST1JMRVZFTCUiID09ICIwIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBub3Qgc2V0IGFuZCBubyAnamF2YScgY29tbWFuZCBjb3VsZCBiZSBmb3VuZCBpbiB5b3VyIFBBVEguDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6ZmluZEphdmFGcm9tSmF2YUhvbWUNCitzZXQgSkFWQV9IT01FPSVKQVZBX0hPTUU6Ij0lDQorc2V0IEpBVkFfRVhFPSVKQVZBX0hPTUUlL2Jpbi9qYXZhLmV4ZQ0KKw0KK2lmIGV4aXN0ICIlSkFWQV9FWEUlIiBnb3RvIGluaXQNCisNCitlY2hvLg0KK2VjaG8gRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICVKQVZBX0hPTUUlDQorZWNoby4NCitlY2hvIFBsZWFzZSBzZXQgdGhlIEpBVkFfSE9NRSB2YXJpYWJsZSBpbiB5b3VyIGVudmlyb25tZW50IHRvIG1hdGNoIHRoZQ0KK2VjaG8gbG9jYXRpb24gb2YgeW91ciBKYXZhIGluc3RhbGxhdGlvbi4NCisNCitnb3RvIGZhaWwNCisNCis6aW5pdA0KK0ByZW0gR2V0IGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGhhbmRsaW5nIFdpbmRvd3MgdmFyaWFudHMNCisNCitpZiBub3QgIiVPUyUiID09ICJXaW5kb3dzX05UIiBnb3RvIHdpbjl4TUVfYXJncw0KKw0KKzp3aW45eE1FX2FyZ3MNCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLg0KK3NldCBDTURfTElORV9BUkdTPQ0KK3NldCBfU0tJUD0yDQorDQorOndpbjl4TUVfYXJnc19zbHVycA0KK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlDQorDQorc2V0IENNRF9MSU5FX0FSR1M9JSoNCisNCis6ZXhlY3V0ZQ0KK0ByZW0gU2V0dXAgdGhlIGNvbW1hbmQgbGluZQ0KKw0KK3NldCBDTEFTU1BBVEg9JUFQUF9IT01FJVxncmFkbGVcd3JhcHBlclxncmFkbGUtd3JhcHBlci5qYXINCisNCitAcmVtIEV4ZWN1dGUgR3JhZGxlDQorIiVKQVZBX0VYRSUiICVERUZBVUxUX0pWTV9PUFRTJSAlSkFWQV9PUFRTJSAlR1JBRExFX09QVFMlICItRG9yZy5ncmFkbGUuYXBwbmFtZT0lQVBQX0JBU0VfTkFNRSUiIC1jbGFzc3BhdGggIiVDTEFTU1BBVEglIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gJUNNRF9MSU5FX0FSR1MlDQorDQorOmVuZA0KK0ByZW0gRW5kIGxvY2FsIHNjb3BlIGZvciB0aGUgdmFyaWFibGVzIHdpdGggd2luZG93cyBOVCBzaGVsbA0KK2lmICIlRVJST1JMRVZFTCUiPT0iMCIgZ290byBtYWluRW5kDQorDQorOmZhaWwNCityZW0gU2V0IHZhcmlhYmxlIEdSQURMRV9FWElUX0NPTlNPTEUgaWYgeW91IG5lZWQgdGhlIF9zY3JpcHRfIHJldHVybiBjb2RlIGluc3RlYWQgb2YNCityZW0gdGhlIF9jbWQuZXhlIC9jXyByZXR1cm4gY29kZSENCitpZiAgbm90ICIiID09ICIlR1JBRExFX0VYSVRfQ09OU09MRSUiIGV4aXQgMQ0KK2V4aXQgL2IgMQ0KKw0KKzptYWluRW5kDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgZW5kbG9jYWwNCisNCis6b21lZ2ENCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc2V0dGluZ3MuZ3JhZGxlIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NldHRpbmdzLmdyYWRsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWU4MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NldHRpbmdzLmdyYWRsZQpAQCAtMCwwICsxLDE1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3Jvb3RQcm9qZWN0Lm5hbWUgPSAnb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyJwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2RvYy9tZG01X2FwaS5hZG9jIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2RvYy9tZG01X2FwaS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzY1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vZG9jL21kbTVfYXBpLmFkb2MKQEAgLTAsMCArMSw4NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCis9IE1ETTUgQVBJCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzZXJ2aWNlcyBkZWZpbmVkIGluIHRoZSBNRE01IEFQSS4KKworPT0gSW50cm9kdWN0aW9uCitUaGUgTURNNSBBUEkgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwcm9qZWN0czoKKworKiAqb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlKiArCisgICAgRGVmaW5lcyB0aGUgY29yZSBzZXJ2aWNlcyBhbmQgZW50aXRpZXMuIEVudGl0aWVzIGNvbnRhaW5lZCBpbiB0aGlzIHByb2plY3QgbXVzdCBiZSBzdXBwb3J0ZWQgYnkgYWxsIGltcGxlbWVudGF0aW9ucy4KKyogKm9yZy5lY2xpcHNlLm1kbS5hcGkuZGVmYXVsdCogKworICAgIEV4dGVuZHMgdGhlIGNvcmUgQVBJIHdpdGggY2F0YWxvZyBhbmQgdGVtcGxhdGUgZW50aXRpZXMgdG8gb3JnYW5pemUgdGhlIHN0b3JhZ2Ugb2YgY29udGV4dCBkYXRhLiAKKyogKm9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlciogKworICAgIEltcGxlbWVudHMgYm90aCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UgYW5kIG9yZy5lY2xpcHNlLm1kbS5kZWZhdWx0IHVzaW5nIHRoZSBxdWVyeSBiYXNlZCBBU0FNIE9EUyBPTyBBUEkuCisgICAgCis9PSBFbnRpdHlNYW5hZ2VyCisKK09uY2UgYSBjb25uZWN0aW9uIHRvIGEgcGVyc2lzdGVuY2UgKGUuZy4gT0RTIHNlcnZlcikgaXMgZXN0YWJsaXNoZWQsIHRoZSBlbnRpdHkgbWFuYWdlciBhbGxvd3MgdG8gbG9hZCBlbnRpdGllcyBvZiBhbnkga2luZCBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIGF2YWlsYWJsZSBzZXJ2aWNlcy4gCisKK1JldHVybmVkIGVudGl0aWVzIGFyZSBhbHdheXMgY29tcGxldGUuIFRoaXMgbWVhbnMgdGhleSBhcmUgbG9hZGVkIHdpdGggYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYW5kIHJlbGF0ZWQgZW50aXRpZXMgKGFzIGV4cG9zZWQgYnkgdGhlaXIgQVBJKS4gVGhlcmVmb3JlIGl0IGRvZXMgbm90IG1hdHRlciBob3cgZW50aXRpZXMgYXJlIHJldHJpZXZlZCAoZS5nLiBlbnRpdHkgbWFuYWdlciBvciBzZWFyY2ggc2VydmljZSkuIFRoZSBlbnRpdHkgbWFuYWdlciBwcm92aWRlcyB2YXJpb3VzIG1ldGhvZHMgdG8gbG9hZCBpbnN0YW5jZXMgYnkgdGhlaXIgaWQsIGxvYWQgcGFyZW50IG9yIGNoaWxkIGVudGl0aWVzIGZvciBhIGdpdmVuIGVudGl0eSBvciBmaWx0ZXIgbG9hZGVkIGVudGl0aWVzIHdpdGggYSBnaXZlbiBuYW1pbmcgcGF0dGVybi4gQ29udGV4dCBkYXRhIG1heSBiZSBsb2FkZWQgZm9yIFRlc3RTdGVwIG9yIE1lYXN1cmVtZW50IGVudGl0aWVzLgorCitNYXNzIGRhdGEgbWF5IGJlIGxvYWRlZCBieSBkZWZpbmluZyBhIGNvcnJlc3BvbmRpbmcgcmVxdWVzdC4gU3VjaCBhIHJlcXVlc3QgY29uc2lzdHMgb2YgYSBDaGFubmVsR3JvdXAgYW5kIGEgc3Vic2V0IG9mIHJlbGF0ZWQgQ2hhbm5lbHMuIEZpbmFsbHkgYSByYW5nZSBpcyBkZWZpbmVkIHRvIGxvYWRlZCBzdG9yZWQgdmFsdWVzIGl0ZXJhdGl2ZWx5IG9yIGFsbCBhdCBvbmNlLiBUaGlzIGFsbG93cyBhIGZpbmUgZ3JhaW5lZCBhY2Nlc3MgdG8gc3RvcmVkIG1hc3MgZGF0YS4KKworPT09IFNlYXJjaFNlcnZpY2UKK1RoZSBzZWFyY2ggc2VydmljZSBhbGxvd3MgdG8gc2VhcmNoIGZvciBlbnRpdGllcyBsaWtlIFRlc3QsIFRlc3RTdGVwLCBNZWFzdXJlbWVudCBhbmQgQ2hhbm5lbCBhY3Jvc3MgaGllcmFyY2hpZXMuIFNvIG9uZSBjYW4sIGZvciBleGFtcGxlLCBzZWFyY2ggZm9yIFRlc3RzIGFuZCBhcHBseSBmaWx0ZXIgY3JpdGVyaWEgZm9yIGNvbnRleHQgZGF0YSBvZiByZWxhdGVkIFRlc3RTdGVwcyBhbmQgTWVhc3VyZW1lbnRzIHdpdGhvdXQgZGVmaW5pbmcgYW55IGpvaW5zLiBUaGlzIGlzIGRvbmUgYnkgdGhlIGludGVybmFsbHkgdXNlZCBzZWFyY2ggcXVlcmllcy4gRWFjaCBzZWFyY2ggcXVlcnkgZGVmaW5lcyBhIHNldCBvZiBzdXBwb3J0ZWQgZW50aXR5IHR5cGVzIGFuZCBoZW5jZSBhbGwgb2YgaXRzIGF0dHJpYnV0ZXMgbWF5IGJlIHVzZWQgZm9yIHNlbGVjdGlvbnMgb3IgZmlsdGVyIGNyaXRlcmlhLiBUaGUgc2VhcmNoIHNlcnZpY2UgYWxsb3dzIHRvIHF1ZXJ5IHBvc3NpYmxlIGZpbHRlciB2YWx1ZXMgZm9yIGVhY2ggc3VwcG9ydGVkIGF0dHJpYnV0ZS4KKworSW4gYWRkaXRpb24gdG8gdGhhdCBhIHF1ZXJ5IHN0cmluZyBtYXkgYmUgdXNlZCB0byBzZWFyY2ggZm9yIGVudGl0aWVzLiBUaGlzIHF1ZXJ5IHN0cmluZyBpcyBldmFsdWF0ZWQgYW5kIHByb2Nlc3NlZCBieSBhIGZ1bGwgdGV4dCBzZWFyY2ggd2hpY2ggcmV0dXJucyBhIHJlc3VsdCBjb25zaXN0aW5nIG9mIFRlc3QsIFRlc3RTdGVwIG9yIE1lYXN1cmVtZW50IGVudGl0aWVzLgorCis9PT0gTm90aWZpY2F0aW9uCitUT0RPCisKKz09PSBGaWxlU2VydmljZQorVGhlIGZpbGUgc2VydmljZSBtYXkgYmUgdXNlZCB0byBkb3dubG9hZCBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcywgcXVlcnkgdGhlaXIgc2l6ZSBvciBvcGVuIGEgY29uc3VtYWJsZSBkb3dubG9hZCBzdHJlYW0gZm9yIGEgZ2l2ZW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZS4gU2VxdWVudGlhbCBvciBwYXJhbGxlbCBkb3dubG9hZCBvZiBtdWx0aXBsZSBmaWxlcyBpcyBwb3NzaWJsZSBhcyB3ZWxsLiBBIGRvd25sb2FkIHJlcXVlc3Qgd2l0aCBtdWx0aXBsZSBmaWxlcyBtYXkgaGF2ZSBtdWx0aXBsZSBsaW5rcyB0byB0aGUgc2FtZSBmaWxlLiBJbiBzdWNoIGEgY2FzZSB0aGlzIGZpbGUgaXMgZG93bmxvYWRlZCBvbmx5IG9uY2UgYW5kIGFsbCBsaW5rcyB3aWxsIHBvaW50IHRvIHRoZSBzYW1lIGxvY2FsIGNvcHkgb2YgdGhlIGRvd25sb2FkZWQgZmlsZS4gU2luY2UgZG93bmxvYWRpbmcgbGFyZ2UgZmlsZXMgbWF5IHRha2UgaXRzIHRpbWUgdG8gY29tcGxldGUsIG9uZSBjYW4gcGFzcyBhIGxpc3RlbmVyIHRvIHRyYWNrIHRoZSBvdmVyYWxsIHByb2dyZXNzLgorCitbTk9URV0KKz09PT0KK1RoaXMgc2VydmljZSBkb2VzIG5vdCBhbGxvdyBtYW51YWxseSB1cGxvYWRpbmcgb3IgZGVsZXRpbmcgZmlsZXMuIEluc3RlYWQgZmlsZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQgLyBkZWxldGVkIHdoaWxlIGVudGl0aWVzIGFyZSB3cml0dGVuIHdpdGhpbiBhIDw8VHJhbnNhY3Rpb24+Pi4KKz09PT0KKworPT09IEVudGl0eUZhY3RvcnkKK1RoZSBlbnRpdHkgZmFjdG9yeSBpcyB0aGUgb25seSB3YXkgdG8gY3JlYXRlIG5ldyBlbnRpdGllcy4gRWFjaCBlbnRpdHkgcmV0dXJuZWQgYnkgdGhpcyBzZXJ2aWNlIGlzIGNvbnNpZGVyZWQgdG8gYmUgdmlydHVhbCwgc2luY2UgaXQgZG9lcyBub3QgaGF2ZSBhbiBpZCB1bnRpbCBpdCBpcyB3cml0dGVuLiBFbnRpdGllcyB3aXRoIGluZm9ybWF0aW9uYWwgcmVsYXRpb25zIGxpa2UgUXVhbnRpdHkgKHJlZmVyZW5jZXMgYSBVbml0KSBvciBVbml0IChyZWZlcmVuY2VzIGEgUGh5c2ljYWxEaW1lbnNpb24pIG1heSBvbmx5IHJlZmVyZW5jZSBhbHJlYWR5IHBlcnNpc3RlZCBlbnRpdGllcy4gVGhpcyBtZWFucyB0aGF0IGEgbmV3IFF1YW50aXR5IG1heSBvbmx5IGJlIGNyZWF0ZWQgd2l0aCBhbiBhbHJlYWR5IHBlcnNpc3RlZCBVbml0IGFuZCBhIG5ldyBVbml0IG1heSBvbmx5IGJlIGNyZWF0ZWQgd2l0aCBhbiBhbHJlYWR5IHBlcnNpc3RlZCBQaHlzaWNhbERpbWVuc2lvbi4KKworT24gdGhlIG90aGVyIGhhbmQgaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIHBhcmVudCAvIGNoaWxkIHRyZWVzIGNvbnNpc3Rpbmcgb2YgdmlydHVhbCBvciBwZXJzaXN0ZWQgZW50aXRpZXMgKHBhcmVudCBhbmQgY2hpbGQgZW50aXRpZXMgYXJlIGludGVybmFsbHkgbGlua2VkIHRvZ2V0aGVyKS4gV2l0aGluIGEgdHJhbnNhY3Rpb24gc3VjaCB0cmVlcyBhcmUgcmVjdXJzaXZlbHkgcHJvY2Vzc2VkLCB0aGVyZWZvcmUgaXQgaXMgbm90IHJlcXVpcmVkIHRvIGV4cGxpY2l0bHkgY3JlYXRlLCB1cGRhdGUgb3IgZGVsZXRlIGNoaWxkIGVudGl0aWVzLCBpbnN0ZWFkIGl0IGlzIHN1ZmZpY2llbnQgYW5kIGhpZ2hseSByZWNvbW1lbmRlZCB0byB3cml0ZSBvbmx5IHRoZSByb290IGVudGl0eSBvZiB0aGUgdHJlZShzKS4gVGhlIHRyYW5zYWN0aW9uIHNlcnZpY2UgcmVjdXJzaXZlbHkgcmVzb2x2ZXMgc3VjaCB0cmVlcyBhbmQgZXhlY3V0ZXMgYmF0Y2ggaW5zZXJ0LSwgdXBkYXRlLSBvciBkZWxldGUtc3RhdGVtZW50cyBmb3IgdGhlIGNoaWxkcmVuLgorCis9PT0gVHJhbnNhY3Rpb24KK1RoZSB0cmFuc2FjdGlvbiBzZXJ2aWNlIGVmZmVjdGl2ZWx5IG1vZGlmaWVzIHRoZSBzdG9yZWQgY29udGVudHMuIEVudGl0aWVzIGFyZSBncm91cGVkIGJ5IHRoZWlyIHR5cGUgYmVmb3JlIHRoZXkgYXJlIHByb2Nlc3NlZC4gRWFjaCBncm91cCBpcyBwcm9jZXNzZWQgYXQgb25jZSB3aXRoIGEgYmF0Y2ggc3RhdGVtZW50LiBFYWNoICB3cml0dGVuIGVudGl0eSBpcyBzY2FubmVkIGZvciBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4gTmV3IG9uZXMgYXJlIGF1dG9tYXRpY2FsbHkgdXBsb2FkZWQsIHdoaWxlIHJlbW92ZWQgb25lcyBhcmUgZGVsZXRlZC4gSW4gY2FzZSBvZiBlcnJvcnMgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgcGVyc2lzdGVuY2UgYXJlIGNhbmNlbGxlZCBhbmQgaGVuY2UgYW55IHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCBmaWxlIGhhcyB0byBiZSBkZWxldGVkLiBVbmZvcnR1bmF0ZWx5IHRoZSByZW1vdmFsIG9mIHVwbG9hZGVkIGZpbGVzIGNhbm5vdCBiZSBndWFyYW50ZWVkIChlLmcuIGEgYnJva2VuIGNvbm5lY3Rpb24pLCBpbnN0ZWFkIGEgZGVsZXRlIHJlcXVlc3QgZm9yIHRoZSB1cGxvYWRlZCBmaWxlcyBpcyBzZW5kIG9uIGEgYmVzdCBlZmZvcnQgYmFzaXMuCisKK1tJTVBPUlRBTlRdCis9PT09CitFeHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBvZiBkZWxldGVkIGVudGl0aWVzIGFyZSBvbmx5IHJlbW92ZWQgaWYgdGhlIGVudGl0eSBpcyBhbiBpbnN0YW5jZSBvZiBGaWxlc0F0dGFjaGFibGUgKFRlc3QsIFRlc3RTdGVwLCBNZWFzdXJlbWVudCkuIEluIGFueSBvdGhlciBjYXNlIGV4dGVybmFsbHkgbGlua2VkIGZpbGVzIGFyZSBub3QgcmVtb3ZlZCwgc2luY2UgdGhpcyBtYXkgaGF2ZSBhbiBpbXBhY3Qgb24gb3RoZXIgZW50aXRpZXMgd2hpY2ggcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUuCis9PT09CisKK0Jlc2lkZXMgdGhlIG1vZGlmaWNhdGlvbiBvZiBlbnRpdGllcywgaXQgaXMgcG9zc2libGUgdG8gd3JpdGUgbWFzcyBkYXRhIGJ5IGRlZmluaW5nIHdyaXRlIHJlcXVlc3RzLiBBIHdyaXRlIHJlcXVlc3QgZGVzY3JpYmVzIGluIGRldGFpbCBob3cgdGhlIG1hc3MgZGF0YSBvZiBhIENoYW5uZWwgaXMgb3JnYW5pemVkIChlLmcuIHZhbHVlcyBhcmUgZXhwbGljaXQgb3IgZ2VuZXJhdGVkLCBzdG9yZWQgaW4gZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMgZXRjLikuCisKKz09IENvbm5lY3QgdG8gYW4gT0RTIFNlcnZlcgorVGhlIE9EUyBlbnRpdHkgbWFuYWdlciBmYWN0b3J5IGlzIHVzZWQgdG8gY29ubmVjdCB0byBhbiBPRFMgc2VydmVyLiBJdCB0YWtlcyBwYXJhbWV0ZXJzLCBzaG93biBpbiB0aGUgZXhhcG1wbGUgYmVsb3csIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24uIE9uIHN1Y2Nlc3MgYW4gZW50aXR5IG1hbmFnZXIgaXMgcmV0dXJuZWQuCisKK1tzb3VyY2UsamF2YV0KKy0tLS0KK01hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7Citjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0UsICJjb3JiYWxvYzo6MS4yQDxTRVJWRVI+OjxQT1JUPi9OYW1lU2VydmljZSIpOworY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KE9EU0VudGl0eU1hbmFnZXJGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FLCAiPFNFUlZJQ0U+LkFTQU0tT0RTIik7Citjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fVVNFUiwgInNhIik7Citjb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoT0RTRW50aXR5TWFuYWdlckZhY3RvcnkuUEFSQU1fUEFTU1dPUkQsICJzYSIpOworCitFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXIgPSBuZXcgT0RTRW50aXR5TWFuYWdlckZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKworLy8gZG8gc29tZXRoaW5nIHVzZWZ1bAorCitlbnRpdHlNYW5hZ2VyLmNsb3NlKCk7CistLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NFdmVudENoYW5uZWxBZG1pbi5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc0V2ZW50Q2hhbm5lbEFkbWluLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRmM2EzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NFdmVudENoYW5uZWxBZG1pbi5pZGwKQEAgLTAsMCArMSw1OSBAQAorLyoqDQorICogVGhpcyBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgQ09SQkEgRXZlbnQgU2VydmljZQ0KKyAqIDEuMiwgYXMgZGVzY3JpYmVkIGluOg0KKyAqDQorICogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL0VWTlQvMS4yLw0KKyAqDQorICogVGhlIGlkbCB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGZvbGxvd2luZyBQREY6DQorICogZm9ybWFsLzA0LTEwLTAyIA0KKyAqLw0KKw0KKyNpZm5kZWYgX0NPU19FVkVOVF9DSEFOTkVMX0FETUlOX0lETF8NCisjZGVmaW5lIF9DT1NfRVZFTlRfQ0hBTk5FTF9BRE1JTl9JRExfDQorDQorI2luY2x1ZGUgIkNvc0V2ZW50Q29tbS5pZGwiCisNCisjcHJhZ21hIHByZWZpeCAib21nLm9yZyINCisKK21vZHVsZSBDb3NFdmVudENoYW5uZWxBZG1pbiB7CisKKyAgIGV4Y2VwdGlvbiBBbHJlYWR5Q29ubmVjdGVkIHt9OworICAgZXhjZXB0aW9uIFR5cGVFcnJvciB7fTsKKworICAgaW50ZXJmYWNlIFByb3h5UHVzaENvbnN1bWVyOiBDb3NFdmVudENvbW06OlB1c2hDb25zdW1lciB7CisgICAgICB2b2lkIGNvbm5lY3RfcHVzaF9zdXBwbGllcihpbiBDb3NFdmVudENvbW06OlB1c2hTdXBwbGllciBwdXNoX3N1cHBsaWVyKQorICAgICAgICAgcmFpc2VzKEFscmVhZHlDb25uZWN0ZWQpOworICAgfTsKKworICAgaW50ZXJmYWNlIFByb3h5UHVsbFN1cHBsaWVyOiBDb3NFdmVudENvbW06OlB1bGxTdXBwbGllciB7CisgICAgICB2b2lkIGNvbm5lY3RfcHVsbF9jb25zdW1lcihpbiBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciBwdWxsX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKEFscmVhZHlDb25uZWN0ZWQpOworICAgfTsKKworICAgaW50ZXJmYWNlIFByb3h5UHVsbENvbnN1bWVyOiBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciB7CisgICAgICB2b2lkIGNvbm5lY3RfcHVsbF9zdXBwbGllcihpbiBDb3NFdmVudENvbW06OlB1bGxTdXBwbGllciBwdWxsX3N1cHBsaWVyKQorICAgICAgICAgcmFpc2VzKEFscmVhZHlDb25uZWN0ZWQsVHlwZUVycm9yKTsKKyAgIH07CisKKyAgIGludGVyZmFjZSBQcm94eVB1c2hTdXBwbGllcjogQ29zRXZlbnRDb21tOjpQdXNoU3VwcGxpZXIgeworICAgICAgdm9pZCBjb25uZWN0X3B1c2hfY29uc3VtZXIoaW4gQ29zRXZlbnRDb21tOjpQdXNoQ29uc3VtZXIgcHVzaF9jb25zdW1lcikKKyAgICAgICAgIHJhaXNlcyhBbHJlYWR5Q29ubmVjdGVkLCBUeXBlRXJyb3IpOworICAgfTsKKworICAgaW50ZXJmYWNlIENvbnN1bWVyQWRtaW4geworICAgICAgUHJveHlQdXNoU3VwcGxpZXIgb2J0YWluX3B1c2hfc3VwcGxpZXIoKTsKKyAgICAgIFByb3h5UHVsbFN1cHBsaWVyIG9idGFpbl9wdWxsX3N1cHBsaWVyKCk7CisgICB9OworCisgICBpbnRlcmZhY2UgU3VwcGxpZXJBZG1pbiB7CisgICAgICBQcm94eVB1c2hDb25zdW1lciBvYnRhaW5fcHVzaF9jb25zdW1lcigpOworICAgICAgUHJveHlQdWxsQ29uc3VtZXIgb2J0YWluX3B1bGxfY29uc3VtZXIoKTsKKyAgIH07CisKKyAgIGludGVyZmFjZSBFdmVudENoYW5uZWwgeworICAgICAgQ29uc3VtZXJBZG1pbiBmb3JfY29uc3VtZXJzKCk7CisgICAgICBTdXBwbGllckFkbWluIGZvcl9zdXBwbGllcnMoKTsKKyAgICAgIHZvaWQgZGVzdHJveSgpOworICAgfTsKK307CisjZW5kaWYgLyogaWZuZGVmIF9DT1NfRVZFTlRfQ0hBTk5FTF9BRE1JTl9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc0V2ZW50Q29tbS5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc0V2ZW50Q29tbS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ODY5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zRXZlbnRDb21tLmlkbApAQCAtMCwwICsxLDQxIEBACisvKioNCisgKiBUaGlzIG1vZHVsZSBpcyB0YWtlbiBmcm9tIHRoZSBzdGFuZGFyZCBDT1JCQSBFdmVudCBTZXJ2aWNlDQorICogMS4yLCBhcyBkZXNjcmliZWQgaW46DQorICoNCisgKiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvRVZOVC8xLjIvDQorICoNCisgKiBUaGUgaWRsIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIFBERjoNCisgKiBmb3JtYWwvMDQtMTAtMDIgDQorICovDQorIA0KKyNpZm5kZWYgX0NPU19FVkVOVF9DT01NX0lETF8NCisjZGVmaW5lIF9DT1NfRVZFTlRfQ09NTV9JRExfDQorDQorI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciDQorDQorbW9kdWxlIENvc0V2ZW50Q29tbSB7CisKKyAgIGV4Y2VwdGlvbiBEaXNjb25uZWN0ZWR7fTsKKworICAgaW50ZXJmYWNlIFB1c2hDb25zdW1lciB7CisgICAgICB2b2lkIHB1c2ggKGluIGFueSBkYXRhKSByYWlzZXMoRGlzY29ubmVjdGVkKTsKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9wdXNoX2NvbnN1bWVyKCk7CisgICB9OworCisgICAgaW50ZXJmYWNlIFB1c2hTdXBwbGllciB7CisgICAgICB2b2lkIGRpc2Nvbm5lY3RfcHVzaF9zdXBwbGllcigpOworICAgfTsKKworICAgaW50ZXJmYWNlIFB1bGxTdXBwbGllciB7CisgICAgICBhbnkgcHVsbCAoKSByYWlzZXMoRGlzY29ubmVjdGVkKTsKKyAgICAgIGFueSB0cnlfcHVsbCAob3V0IGJvb2xlYW4gaGFzX2V2ZW50KSByYWlzZXMoRGlzY29ubmVjdGVkKTsKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9wdWxsX3N1cHBsaWVyKCk7CisgICB9OworCisgICBpbnRlcmZhY2UgUHVsbENvbnN1bWVyIHsKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9wdWxsX2NvbnN1bWVyKCk7CisgICB9OworCit9OworCisjZW5kaWYgLyogaWZuZGVmIF9DT1NfRVZFTlRfQ09NTV9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmaWNhdGlvbi5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmaWNhdGlvbi5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4OTcwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZpY2F0aW9uLmlkbApAQCAtMCwwICsxLDE4MCBAQAorLyoqDQorICogVGhpcyBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgQ09SQkEgTm90aWZpY2F0aW9uIFNlcnZpY2UNCisgKiAxLjEsIGFzIGRlc2NyaWJlZCBpbjoNCisgKg0KKyAqIGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xLw0KKyAqDQorICogVGhlIGlkbCB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGZvbGxvd2luZyBQREY6DQorICogZm9ybWFsLzA0LTEwLTEzDQorICovDQorDQorI2lmbmRlZiBfQ09TX05PVElGSUNBVElPTl9JRExfDQorI2RlZmluZSBfQ09TX05PVElGSUNBVElPTl9JRExfDQorDQorI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciDQorDQorbW9kdWxlIENvc05vdGlmaWNhdGlvbiB7CisKKyAgIHR5cGVkZWYgc3RyaW5nIElzdHJpbmc7CisgICB0eXBlZGVmIElzdHJpbmcgUHJvcGVydHlOYW1lOworICAgdHlwZWRlZiBhbnkgUHJvcGVydHlWYWx1ZTsKKworICAgc3RydWN0IFByb3BlcnR5IHsKKyAgICAgIFByb3BlcnR5TmFtZSBuYW1lOworICAgICAgUHJvcGVydHlWYWx1ZSB2YWx1ZTsKKyAgIH07CisgICB0eXBlZGVmIHNlcXVlbmNlPFByb3BlcnR5PiBQcm9wZXJ0eVNlcTsKKworICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgdGhlIHNhbWUsIGJ1dCBzZXJ2ZSBkaWZmZXJlbnQgcHVycG9zZXMuCisgICB0eXBlZGVmIFByb3BlcnR5U2VxIE9wdGlvbmFsSGVhZGVyRmllbGRzOworICAgdHlwZWRlZiBQcm9wZXJ0eVNlcSBGaWx0ZXJhYmxlRXZlbnRCb2R5OworICAgdHlwZWRlZiBQcm9wZXJ0eVNlcSBRb1NQcm9wZXJ0aWVzOworICAgdHlwZWRlZiBQcm9wZXJ0eVNlcSBBZG1pblByb3BlcnRpZXM7CisKKyAgIHN0cnVjdCBfRXZlbnRUeXBlIHsKKyAgICAgIHN0cmluZyBkb21haW5fbmFtZTsKKyAgICAgIHN0cmluZyB0eXBlX25hbWU7CisgICB9OworICAgdHlwZWRlZiBzZXF1ZW5jZTxfRXZlbnRUeXBlPiBFdmVudFR5cGVTZXE7CisKKyAgIHN0cnVjdCBQcm9wZXJ0eVJhbmdlIHsKKyAgICAgIFByb3BlcnR5VmFsdWUgbG93X3ZhbDsKKyAgICAgIFByb3BlcnR5VmFsdWUgaGlnaF92YWw7CisgICB9OworCisgICBzdHJ1Y3QgTmFtZWRQcm9wZXJ0eVJhbmdlIHsKKyAgICAgIFByb3BlcnR5TmFtZSBuYW1lOworICAgICAgUHJvcGVydHlSYW5nZSByYW5nZTsKKyAgIH07CisgICB0eXBlZGVmIHNlcXVlbmNlPE5hbWVkUHJvcGVydHlSYW5nZT4gTmFtZWRQcm9wZXJ0eVJhbmdlU2VxOworCisgICBlbnVtIFFvU0Vycm9yX2NvZGUgeworICAgICAgVU5TVVBQT1JURURfUFJPUEVSVFksCisgICAgICBVTkFWQUlMQUJMRV9QUk9QRVJUWSwKKyAgICAgIFVOU1VQUE9SVEVEX1ZBTFVFLAorICAgICAgVU5BVkFJTEFCTEVfVkFMVUUsCisgICAgICBCQURfUFJPUEVSVFksCisgICAgICBCQURfVFlQRSwKKyAgICAgIEJBRF9WQUxVRQorICAgfTsKKworICAgc3RydWN0IFByb3BlcnR5RXJyb3IgeworICAgICAgUW9TRXJyb3JfY29kZSBjb2RlOworICAgICAgUHJvcGVydHlOYW1lIG5hbWU7CisgICAgICBQcm9wZXJ0eVJhbmdlIGF2YWlsYWJsZV9yYW5nZTsKKyAgIH07CisgICB0eXBlZGVmIHNlcXVlbmNlPFByb3BlcnR5RXJyb3I+IFByb3BlcnR5RXJyb3JTZXE7CisKKyAgIGV4Y2VwdGlvbiBVbnN1cHBvcnRlZFFvUyB7IFByb3BlcnR5RXJyb3JTZXEgcW9zX2VycjsgfTsKKyAgIGV4Y2VwdGlvbiBVbnN1cHBvcnRlZEFkbWluIHsgUHJvcGVydHlFcnJvclNlcSBhZG1pbl9lcnI7IH07CisKKyAgIC8vIERlZmluZSB0aGUgU3RydWN0dXJlZCBFdmVudCBzdHJ1Y3R1cmUKKyAgIHN0cnVjdCBGaXhlZEV2ZW50SGVhZGVyIHsKKyAgICAgIF9FdmVudFR5cGUgZXZlbnRfdHlwZTsKKyAgICAgIHN0cmluZyBldmVudF9uYW1lOworICAgfTsKKworICAgc3RydWN0IEV2ZW50SGVhZGVyIHsKKyAgICAgIEZpeGVkRXZlbnRIZWFkZXIgZml4ZWRfaGVhZGVyOworICAgICAgT3B0aW9uYWxIZWFkZXJGaWVsZHMgdmFyaWFibGVfaGVhZGVyOworICAgfTsKKworICAgc3RydWN0IFN0cnVjdHVyZWRFdmVudCB7CisgICAgICBFdmVudEhlYWRlciBoZWFkZXI7CisgICAgICBGaWx0ZXJhYmxlRXZlbnRCb2R5IGZpbHRlcmFibGVfZGF0YTsKKyAgICAgIGFueSByZW1haW5kZXJfb2ZfYm9keTsKKyAgIH07IC8vIFN0cnVjdHVyZWRFdmVudAorICAgdHlwZWRlZiBzZXF1ZW5jZTxTdHJ1Y3R1cmVkRXZlbnQ+IEV2ZW50QmF0Y2g7CisKKyAgIC8vIFRoZSBmb2xsb3dpbmcgY29uc3RhbnQgZGVjbGFyYXRpb25zIGRlZmluZSB0aGUgc3RhbmRhcmQKKyAgIC8vIFFvUyBwcm9wZXJ0eSBuYW1lcyBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGVhY2ggcHJvcGVydHkKKyAgIC8vIGNhbiB0YWtlIG9uLiBUaGUgbmFtZS92YWx1ZSBwYWlycyBmb3IgZWFjaCBzdGFuZGFyZCBwcm9wZXJ0eQorICAgLy8gYXJlIGdyb3VwZWQsIGJlZ2lubmluZyB3aXRoIGEgc3RyaW5nIGNvbnN0YW50IGRlZmluZWQgZm9yIHRoZQorICAgLy8gcHJvcGVydHkgbmFtZSwgZm9sbG93ZWQgYnkgdGhlIHZhbHVlcyB0aGUgcHJvcGVydHkgY2FuIHRha2Ugb24uCisKKyAgIGNvbnN0IHN0cmluZyBFdmVudFJlbGlhYmlsaXR5ID0gIkV2ZW50UmVsaWFiaWxpdHkiOworICAgY29uc3Qgc2hvcnQgQmVzdEVmZm9ydCA9IDA7CisgICBjb25zdCBzaG9ydCBQZXJzaXN0ZW50ID0gMTsKKworICAgY29uc3Qgc3RyaW5nIENvbm5lY3Rpb25SZWxpYWJpbGl0eSA9ICJDb25uZWN0aW9uUmVsaWFiaWxpdHkiOworICAgLy8gQ2FuIHRha2Ugb24gdGhlIHNhbWUgdmFsdWVzIGFzIEV2ZW50UmVsaWFiaWxpdHkKKworICAgY29uc3Qgc3RyaW5nIFByaW9yaXR5ID0gIlByaW9yaXR5IjsKKyAgIGNvbnN0IHNob3J0IExvd2VzdFByaW9yaXR5ID0gLTMyNzY3OworICAgY29uc3Qgc2hvcnQgSGlnaGVzdFByaW9yaXR5ID0gMzI3Njc7CisgICBjb25zdCBzaG9ydCBEZWZhdWx0UHJpb3JpdHkgPSAwOworCisgICBjb25zdCBzdHJpbmcgU3RhcnRUaW1lID0gIlN0YXJ0VGltZSI7CisgICAvLyBTdGFydFRpbWUgdGFrZXMgYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpVdGNULgorCisgICBjb25zdCBzdHJpbmcgU3RvcFRpbWUgPSAiU3RvcFRpbWUiOworICAgLy8gU3RvcFRpbWUgdGFrZXMgYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpVdGNULgorCisgICBjb25zdCBzdHJpbmcgVGltZW91dCA9ICJUaW1lb3V0IjsKKyAgIC8vIFRpbWVvdXQgdGFrZXMgb24gYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpUaW1lVAorCisgICBjb25zdCBzdHJpbmcgT3JkZXJQb2xpY3kgPSAiT3JkZXJQb2xpY3kiOworICAgY29uc3Qgc2hvcnQgQW55T3JkZXIgPSAwOworICAgY29uc3Qgc2hvcnQgRmlmb09yZGVyID0gMTsKKyAgIGNvbnN0IHNob3J0IFByaW9yaXR5T3JkZXIgPSAyOworICAgY29uc3Qgc2hvcnQgRGVhZGxpbmVPcmRlciA9IDM7CisKKyAgIGNvbnN0IHN0cmluZyBEaXNjYXJkUG9saWN5ID0gIkRpc2NhcmRQb2xpY3kiOworICAgLy8gRGlzY2FyZFBvbGljeSB0YWtlcyBvbiB0aGUgc2FtZSB2YWx1ZXMgYXMgT3JkZXJQb2xpY3ksIHBsdXMKKyAgIGNvbnN0IHNob3J0IExpZm9PcmRlciA9IDQ7CisKKyAgIGNvbnN0IHN0cmluZyBNYXhpbXVtQmF0Y2hTaXplID0gIk1heGltdW1CYXRjaFNpemUiOworICAgLy8gTWF4aW11bUJhdGNoU2l6ZSB0YWtlcyBvbiBhIHZhbHVlIG9mIHR5cGUgbG9uZworCisgICBjb25zdCBzdHJpbmcgUGFjaW5nSW50ZXJ2YWwgPSAiUGFjaW5nSW50ZXJ2YWwiOworICAgLy8gUGFjaW5nSW50ZXJ2YWwgdGFrZXMgb24gYSB2YWx1ZSBvZiB0eXBlIFRpbWVCYXNlOjpUaW1lVAorCisgICBjb25zdCBzdHJpbmcgU3RhcnRUaW1lU3VwcG9ydGVkID0gIlN0YXJ0VGltZVN1cHBvcnRlZCI7CisgICAvLyBTdGFydFRpbWVTdXBwb3J0ZWQgdGFrZXMgb24gYSBib29sZWFuIHZhbHVlCisKKyAgIGNvbnN0IHN0cmluZyBTdG9wVGltZVN1cHBvcnRlZCA9ICJTdG9wVGltZVN1cHBvcnRlZCI7CisgICAvLyBTdG9wVGltZVN1cHBvcnRlZCB0YWtlcyBvbiBhIGJvb2xlYW4gdmFsdWUKKworICAgY29uc3Qgc3RyaW5nIE1heEV2ZW50c1BlckNvbnN1bWVyID0gIk1heEV2ZW50c1BlckNvbnN1bWVyIjsKKyAgIC8vIE1heEV2ZW50c1BlckNvbnN1bWVyIHRha2VzIG9uIGEgdmFsdWUgb2YgdHlwZSBsb25nCisKKyAgIGludGVyZmFjZSBRb1NBZG1pbiB7CisKKyAgICAgIFFvU1Byb3BlcnRpZXMgZ2V0X3FvcygpOworCisgICAgICB2b2lkIHNldF9xb3MgKCBpbiBRb1NQcm9wZXJ0aWVzIHFvcykgcmFpc2VzICggVW5zdXBwb3J0ZWRRb1MgKTsKKworICAgICAgdm9pZCB2YWxpZGF0ZV9xb3MgKAorICAgICAgICAgICAgaW4gUW9TUHJvcGVydGllcyByZXF1aXJlZF9xb3MsCisgICAgICAgICAgICBvdXQgTmFtZWRQcm9wZXJ0eVJhbmdlU2VxIGF2YWlsYWJsZV9xb3MgKSByYWlzZXMgKCBVbnN1cHBvcnRlZFFvUyApOworCisgICB9OyAvLyBRb3NBZG1pbgorCisgICAvLyBBZG1pbiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGluIHNpbWlsYXIgbWFubmVyIGFzIFFvUworICAgLy8gcHJvcGVydGllcy4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZXNlIHByb3BlcnRpZXMKKyAgIC8vIGFyZSByZWxhdGVkIHRvIGNoYW5uZWwgYWRtaW5pc3RyYXRpb24gcG9saWNpZXMsIGFzIG9wcG9zZWQKKyAgIC8vIG1lc3NhZ2UgcXVhbGl0eSBvZiBzZXJ2aWNlCisKKyAgIGNvbnN0IHN0cmluZyBNYXhRdWV1ZUxlbmd0aCA9ICJNYXhRdWV1ZUxlbmd0aCI7CisgICAvLyBNYXhRdWV1ZUxlbmd0aCB0YWtlcyBvbiBhIHZhbHVlIG9mIHR5cGUgbG9uZworCisgICBjb25zdCBzdHJpbmcgTWF4Q29uc3VtZXJzID0gIk1heENvbnN1bWVycyI7CisgICAvLyBNYXhDb25zdW1lcnMgdGFrZXMgb24gYSB2YWx1ZSBvZiB0eXBlIGxvbmcKKworICAgY29uc3Qgc3RyaW5nIE1heFN1cHBsaWVycyA9ICJNYXhTdXBwbGllcnMiOworICAgLy8gTWF4U3VwcGxpZXJzIHRha2VzIG9uIGEgdmFsdWUgb2YgdHlwZSBsb25nCisKKyAgIGNvbnN0IHN0cmluZyBSZWplY3ROZXdFdmVudHMgPSAiUmVqZWN0TmV3RXZlbnRzIjsKKyAgIC8vIFJlamVjdE5ld0V2ZW50cyB0YWtlcyBvbiBhIHZhbHVlIG9mIHR5cGUgQm9vbGVhbgorCisgICBpbnRlcmZhY2UgQWRtaW5Qcm9wZXJ0aWVzQWRtaW4geworCisgICAgICBBZG1pblByb3BlcnRpZXMgZ2V0X2FkbWluKCk7CisKKyAgICAgIHZvaWQgc2V0X2FkbWluIChpbiBBZG1pblByb3BlcnRpZXMgYWRtaW4pIHJhaXNlcyAoIFVuc3VwcG9ydGVkQWRtaW4pOworCisgICB9OyAvLyBBZG1pblByb3BlcnRpZXNBZG1pbgorCit9OyAvLyBDb3NOb3RpZmljYXRpb24KKworI2VuZGlmIC8qIF9DT1NfTk9USUZJQ0FUSU9OX0lETF8gKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q2hhbm5lbEFkbWluLmlkbCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q2hhbm5lbEFkbWluLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjRkM2VhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NOb3RpZnlDaGFubmVsQWRtaW4uaWRsCkBAIC0wLDAgKzEsMzk0IEBACisvKioKKyAqIFRoaXMgbW9kdWxlIGlzIHRha2VuIGZyb20gdGhlIHN0YW5kYXJkIENPUkJBIE5vdGlmaWNhdGlvbiBTZXJ2aWNlCisgKiAxLjEsIGFzIGRlc2NyaWJlZCBpbjoKKyAqCisgKiBodHRwczovL3d3dy5vbWcub3JnL3NwZWMvTk9ULzEuMS8KKyAqCisgKiBUaGUgaWRsIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgZm9sbG93aW5nIFBERjoKKyAqIGZvcm1hbC8wNC0xMC0xMworICovCisKKyNpZm5kZWYgX0NPU19OT1RJRllfQ0hBTk5FTF9BRE1JTl9JRExfCisjZGVmaW5lIF9DT1NfTk9USUZZX0NIQU5ORUxfQURNSU5fSURMXworCisjaW5jbHVkZSAiQ29zTm90aWZpY2F0aW9uLmlkbCIKKyNpbmNsdWRlICJDb3NOb3RpZnlGaWx0ZXIuaWRsIgorI2luY2x1ZGUgIkNvc05vdGlmeUNvbW0uaWRsIgorI2luY2x1ZGUgIkNvc0V2ZW50Q2hhbm5lbEFkbWluLmlkbCIKKworI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciCisKK21vZHVsZSBDb3NOb3RpZnlDaGFubmVsQWRtaW4geworCisgICBleGNlcHRpb24gQ29ubmVjdGlvbkFscmVhZHlBY3RpdmUge307CisgICBleGNlcHRpb24gQ29ubmVjdGlvbkFscmVhZHlJbmFjdGl2ZSB7fTsKKyAgIGV4Y2VwdGlvbiBOb3RDb25uZWN0ZWQge307CisKKyAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb25zCisgICBpbnRlcmZhY2UgQ29uc3VtZXJBZG1pbjsKKyAgIGludGVyZmFjZSBTdXBwbGllckFkbWluOworICAgaW50ZXJmYWNlIEV2ZW50Q2hhbm5lbDsKKyAgIGludGVyZmFjZSBFdmVudENoYW5uZWxGYWN0b3J5OworCisgICBlbnVtIFByb3h5VHlwZSB7CisgICAgICBQVVNIX0FOWSwKKyAgICAgIFBVTExfQU5ZLAorICAgICAgUFVTSF9TVFJVQ1RVUkVELAorICAgICAgUFVMTF9TVFJVQ1RVUkVELAorICAgICAgUFVTSF9TRVFVRU5DRSwKKyAgICAgIFBVTExfU0VRVUVOQ0UsCisgICAgICBQVVNIX1RZUEVELAorICAgICAgUFVMTF9UWVBFRAorICAgfTsKKworICAgZW51bSBPYnRhaW5JbmZvTW9kZSB7CisgICAgICBBTExfTk9XX1VQREFURVNfT0ZGLAorICAgICAgQUxMX05PV19VUERBVEVTX09OLAorICAgICAgTk9ORV9OT1dfVVBEQVRFU19PRkYsCisgICAgICBOT05FX05PV19VUERBVEVTX09OCisgICB9OworCisgICBpbnRlcmZhY2UgUHJveHlDb25zdW1lciA6CisgICAgICAgICBDb3NOb3RpZmljYXRpb246OlFvU0FkbWluLAorICAgICAgICAgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJBZG1pbiB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eVR5cGUgTXlUeXBlOworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIFN1cHBsaWVyQWRtaW4gTXlBZG1pbjsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgb2J0YWluX3N1YnNjcmlwdGlvbl90eXBlcygKKyAgICAgICAgICAgIGluIE9idGFpbkluZm9Nb2RlIG1vZGUgKTsKKworICAgICAgdm9pZCB2YWxpZGF0ZV9ldmVudF9xb3MgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpRb1NQcm9wZXJ0aWVzIHJlcXVpcmVkX3FvcywKKyAgICAgICAgICAgIG91dCBDb3NOb3RpZmljYXRpb246Ok5hbWVkUHJvcGVydHlSYW5nZVNlcSBhdmFpbGFibGVfcW9zKQorICAgICAgICAgcmFpc2VzIChDb3NOb3RpZmljYXRpb246OlVuc3VwcG9ydGVkUW9TKTsKKworICAgfTsgLy8gUHJveHlDb25zdW1lcgorCisgICBpbnRlcmZhY2UgUHJveHlTdXBwbGllciA6CisgICAgICAgICBDb3NOb3RpZmljYXRpb246OlFvU0FkbWluLAorICAgICAgICAgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJBZG1pbiB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eVR5cGUgTXlUeXBlOworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIENvbnN1bWVyQWRtaW4gTXlBZG1pbjsKKworICAgICAgYXR0cmlidXRlIENvc05vdGlmeUZpbHRlcjo6TWFwcGluZ0ZpbHRlciBwcmlvcml0eV9maWx0ZXI7CisgICAgICBhdHRyaWJ1dGUgQ29zTm90aWZ5RmlsdGVyOjpNYXBwaW5nRmlsdGVyIGxpZmV0aW1lX2ZpbHRlcjsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgb2J0YWluX29mZmVyZWRfdHlwZXMoCisgICAgICAgICAgICBpbiBPYnRhaW5JbmZvTW9kZSBtb2RlICk7CisKKyAgICAgIHZvaWQgdmFsaWRhdGVfZXZlbnRfcW9zICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6UW9TUHJvcGVydGllcyByZXF1aXJlZF9xb3MsCisgICAgICAgICAgICBvdXQgQ29zTm90aWZpY2F0aW9uOjpOYW1lZFByb3BlcnR5UmFuZ2VTZXEgYXZhaWxhYmxlX3FvcykKKyAgICAgICAgIHJhaXNlcyAoQ29zTm90aWZpY2F0aW9uOjpVbnN1cHBvcnRlZFFvUyk7CisKKyAgIH07IC8vIFByb3h5U3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFByb3h5UHVzaENvbnN1bWVyIDoKKyAgICAgICAgIFByb3h5Q29uc3VtZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpQdXNoQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3RfYW55X3B1c2hfc3VwcGxpZXIgKAorICAgICAgICAgICAgaW4gQ29zRXZlbnRDb21tOjpQdXNoU3VwcGxpZXIgcHVzaF9zdXBwbGllcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCk7CisKKyAgIH07IC8vIFByb3h5UHVzaENvbnN1bWVyCisKKyAgIGludGVyZmFjZSBTdHJ1Y3R1cmVkUHJveHlQdXNoQ29uc3VtZXIgOgorICAgICAgICAgUHJveHlDb25zdW1lciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdXNoQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3Rfc3RydWN0dXJlZF9wdXNoX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdXNoU3VwcGxpZXIgcHVzaF9zdXBwbGllcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCk7CisKKyAgIH07IC8vIFN0cnVjdHVyZWRQcm94eVB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgU2VxdWVuY2VQcm94eVB1c2hDb25zdW1lciA6CisgICAgICAgICBQcm94eUNvbnN1bWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6U2VxdWVuY2VQdXNoQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3Rfc2VxdWVuY2VfcHVzaF9zdXBwbGllciAoCisgICAgICAgICAgICBpbiBDb3NOb3RpZnlDb21tOjpTZXF1ZW5jZVB1c2hTdXBwbGllciBwdXNoX3N1cHBsaWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU2VxdWVuY2VQcm94eVB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgUHJveHlQdWxsU3VwcGxpZXIgOgorICAgICAgICAgUHJveHlTdXBwbGllciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlB1bGxTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9hbnlfcHVsbF9jb25zdW1lciAoCisgICAgICAgICAgICBpbiBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciBwdWxsX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkKTsKKworICAgfTsgLy8gUHJveHlQdWxsU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFN0cnVjdHVyZWRQcm94eVB1bGxTdXBwbGllciA6CisgICAgICAgICBQcm94eVN1cHBsaWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1bGxTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1bGxDb25zdW1lciBwdWxsX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFByb3h5UHVsbFN1cHBsaWVyCisKKyAgIGludGVyZmFjZSBTZXF1ZW5jZVByb3h5UHVsbFN1cHBsaWVyIDoKKyAgICAgICAgIFByb3h5U3VwcGxpZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpTZXF1ZW5jZVB1bGxTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zZXF1ZW5jZV9wdWxsX2NvbnN1bWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlNlcXVlbmNlUHVsbENvbnN1bWVyIHB1bGxfY29uc3VtZXIpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDaGFubmVsQWRtaW46OkFscmVhZHlDb25uZWN0ZWQpOworCisgICB9OyAvLyBTZXF1ZW5jZVByb3h5UHVsbFN1cHBsaWVyCisKKyAgIGludGVyZmFjZSBQcm94eVB1bGxDb25zdW1lciA6CisgICAgICAgICBQcm94eUNvbnN1bWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6UHVsbENvbnN1bWVyIHsKKworICAgICAgdm9pZCBjb25uZWN0X2FueV9wdWxsX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc0V2ZW50Q29tbTo6UHVsbFN1cHBsaWVyIHB1bGxfc3VwcGxpZXIpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDaGFubmVsQWRtaW46OkFscmVhZHlDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgQ29zRXZlbnRDaGFubmVsQWRtaW46OlR5cGVFcnJvciApOworCisgICAgICB2b2lkIHN1c3BlbmRfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlJbmFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgICAgdm9pZCByZXN1bWVfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlBY3RpdmUsIE5vdENvbm5lY3RlZCk7CisKKyAgIH07IC8vIFByb3h5UHVsbENvbnN1bWVyCisKKyAgIGludGVyZmFjZSBTdHJ1Y3R1cmVkUHJveHlQdWxsQ29uc3VtZXIgOgorICAgICAgICAgUHJveHlDb25zdW1lciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdWxsQ29uc3VtZXIgeworCisgICAgICB2b2lkIGNvbm5lY3Rfc3RydWN0dXJlZF9wdWxsX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlN0cnVjdHVyZWRQdWxsU3VwcGxpZXIgcHVsbF9zdXBwbGllcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6VHlwZUVycm9yICk7CisKKyAgICAgIHZvaWQgc3VzcGVuZF9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUluYWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICAgICB2b2lkIHJlc3VtZV9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFByb3h5UHVsbENvbnN1bWVyCisKKyAgIGludGVyZmFjZSBTZXF1ZW5jZVByb3h5UHVsbENvbnN1bWVyIDoKKyAgICAgICAgIFByb3h5Q29uc3VtZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpTZXF1ZW5jZVB1bGxDb25zdW1lciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zZXF1ZW5jZV9wdWxsX3N1cHBsaWVyICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06OlNlcXVlbmNlUHVsbFN1cHBsaWVyIHB1bGxfc3VwcGxpZXIpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDaGFubmVsQWRtaW46OkFscmVhZHlDb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgQ29zRXZlbnRDaGFubmVsQWRtaW46OlR5cGVFcnJvciApOworCisgICAgICB2b2lkIHN1c3BlbmRfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlJbmFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgICAgdm9pZCByZXN1bWVfY29ubmVjdGlvbigpCisgICAgICAgICByYWlzZXMoQ29ubmVjdGlvbkFscmVhZHlBY3RpdmUsIE5vdENvbm5lY3RlZCk7CisKKyAgIH07IC8vIFNlcXVlbmNlUHJveHlQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFByb3h5UHVzaFN1cHBsaWVyIDoKKyAgICAgICAgIFByb3h5U3VwcGxpZXIsCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpQdXNoU3VwcGxpZXIgeworCisgICAgICB2b2lkIGNvbm5lY3RfYW55X3B1c2hfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zRXZlbnRDb21tOjpQdXNoQ29uc3VtZXIgcHVzaF9jb25zdW1lcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6VHlwZUVycm9yICk7CisKKyAgICAgIHZvaWQgc3VzcGVuZF9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUluYWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICAgICB2b2lkIHJlc3VtZV9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgfTsgLy8gUHJveHlQdXNoU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFN0cnVjdHVyZWRQcm94eVB1c2hTdXBwbGllciA6CisgICAgICAgICBQcm94eVN1cHBsaWVyLAorICAgICAgICAgQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1c2hTdXBwbGllciB7CisKKyAgICAgIHZvaWQgY29ubmVjdF9zdHJ1Y3R1cmVkX3B1c2hfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZ5Q29tbTo6U3RydWN0dXJlZFB1c2hDb25zdW1lciBwdXNoX2NvbnN1bWVyKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q2hhbm5lbEFkbWluOjpBbHJlYWR5Q29ubmVjdGVkLAorICAgICAgICAgICAgICAgIENvc0V2ZW50Q2hhbm5lbEFkbWluOjpUeXBlRXJyb3IgKTsKKworICAgICAgdm9pZCBzdXNwZW5kX2Nvbm5lY3Rpb24oKQorICAgICAgICAgcmFpc2VzKENvbm5lY3Rpb25BbHJlYWR5SW5hY3RpdmUsIE5vdENvbm5lY3RlZCk7CisKKyAgICAgIHZvaWQgcmVzdW1lX2Nvbm5lY3Rpb24oKQorICAgICAgICAgcmFpc2VzKENvbm5lY3Rpb25BbHJlYWR5QWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICB9OyAvLyBTdHJ1Y3R1cmVkUHJveHlQdXNoU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFNlcXVlbmNlUHJveHlQdXNoU3VwcGxpZXIgOgorICAgICAgICAgUHJveHlTdXBwbGllciwKKyAgICAgICAgIENvc05vdGlmeUNvbW06OlNlcXVlbmNlUHVzaFN1cHBsaWVyIHsKKworICAgICAgdm9pZCBjb25uZWN0X3NlcXVlbmNlX3B1c2hfY29uc3VtZXIgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZ5Q29tbTo6U2VxdWVuY2VQdXNoQ29uc3VtZXIgcHVzaF9jb25zdW1lcikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENoYW5uZWxBZG1pbjo6QWxyZWFkeUNvbm5lY3RlZCwKKyAgICAgICAgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6VHlwZUVycm9yICk7CisKKyAgICAgIHZvaWQgc3VzcGVuZF9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUluYWN0aXZlLCBOb3RDb25uZWN0ZWQpOworCisgICAgICB2b2lkIHJlc3VtZV9jb25uZWN0aW9uKCkKKyAgICAgICAgIHJhaXNlcyhDb25uZWN0aW9uQWxyZWFkeUFjdGl2ZSwgTm90Q29ubmVjdGVkKTsKKworICAgfTsgLy8gU2VxdWVuY2VQcm94eVB1c2hTdXBwbGllcgorCisgICB0eXBlZGVmIGxvbmcgUHJveHlJRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2UgPFByb3h5SUQ+IFByb3h5SURTZXE7CisKKyAgIGVudW0gQ2xpZW50VHlwZSB7CisgICAgICBBTllfRVZFTlQsCisgICAgICBTVFJVQ1RVUkVEX0VWRU5ULAorICAgICAgU0VRVUVOQ0VfRVZFTlQKKyAgIH07CisKKyAgIGVudW0gSW50ZXJGaWx0ZXJHcm91cE9wZXJhdG9yIHsgQU5EX09QLCBPUl9PUCB9OworCisgICB0eXBlZGVmIGxvbmcgQWRtaW5JRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2U8QWRtaW5JRD4gQWRtaW5JRFNlcTsKKworICAgZXhjZXB0aW9uIEFkbWluTm90Rm91bmQge307CisgICBleGNlcHRpb24gUHJveHlOb3RGb3VuZCB7fTsKKworICAgc3RydWN0IEFkbWluTGltaXQgeworICAgICAgQ29zTm90aWZpY2F0aW9uOjpQcm9wZXJ0eU5hbWUgbmFtZTsKKyAgICAgIENvc05vdGlmaWNhdGlvbjo6UHJvcGVydHlWYWx1ZSB2YWx1ZTsKKyAgIH07CisKKyAgIGV4Y2VwdGlvbiBBZG1pbkxpbWl0RXhjZWVkZWQgeyBBZG1pbkxpbWl0IGFkbWluX3Byb3BlcnR5X2VycjsgfTsKKworICAgaW50ZXJmYWNlIENvbnN1bWVyQWRtaW4gOgorICAgICAgICAgQ29zTm90aWZpY2F0aW9uOjpRb1NBZG1pbiwKKyAgICAgICAgIENvc05vdGlmeUNvbW06Ok5vdGlmeVN1YnNjcmliZSwKKyAgICAgICAgIENvc05vdGlmeUZpbHRlcjo6RmlsdGVyQWRtaW4sCisgICAgICAgICBDb3NFdmVudENoYW5uZWxBZG1pbjo6Q29uc3VtZXJBZG1pbiB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBZG1pbklEIE15SUQ7CisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgRXZlbnRDaGFubmVsIE15Q2hhbm5lbDsKKworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEludGVyRmlsdGVyR3JvdXBPcGVyYXRvciBNeU9wZXJhdG9yOworCisgICAgICBhdHRyaWJ1dGUgQ29zTm90aWZ5RmlsdGVyOjpNYXBwaW5nRmlsdGVyIHByaW9yaXR5X2ZpbHRlcjsKKyAgICAgIGF0dHJpYnV0ZSBDb3NOb3RpZnlGaWx0ZXI6Ok1hcHBpbmdGaWx0ZXIgbGlmZXRpbWVfZmlsdGVyOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgUHJveHlJRFNlcSBwdWxsX3N1cHBsaWVyczsKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eUlEU2VxIHB1c2hfc3VwcGxpZXJzOworCisgICAgICBQcm94eVN1cHBsaWVyIGdldF9wcm94eV9zdXBwbGllciAoIGluIFByb3h5SUQgcHJveHlfaWQgKQorICAgICAgICAgcmFpc2VzICggUHJveHlOb3RGb3VuZCApOworCisgICAgICBQcm94eVN1cHBsaWVyIG9idGFpbl9ub3RpZmljYXRpb25fcHVsbF9zdXBwbGllciAoCisgICAgICAgICAgICBpbiBDbGllbnRUeXBlIGN0eXBlLAorICAgICAgICAgICAgb3V0IFByb3h5SUQgcHJveHlfaWQpCisgICAgICAgICByYWlzZXMgKCBBZG1pbkxpbWl0RXhjZWVkZWQgKTsKKworICAgICAgUHJveHlTdXBwbGllciBvYnRhaW5fbm90aWZpY2F0aW9uX3B1c2hfc3VwcGxpZXIgKAorICAgICAgICAgICAgaW4gQ2xpZW50VHlwZSBjdHlwZSwKKyAgICAgICAgICAgIG91dCBQcm94eUlEIHByb3h5X2lkKQorICAgICAgICAgcmFpc2VzICggQWRtaW5MaW1pdEV4Y2VlZGVkICk7CisKKyAgICAgIHZvaWQgZGVzdHJveSgpOworCisgICB9OyAvLyBDb25zdW1lckFkbWluCisKKyAgIGludGVyZmFjZSBTdXBwbGllckFkbWluIDoKKyAgICAgICAgIENvc05vdGlmaWNhdGlvbjo6UW9TQWRtaW4sCisgICAgICAgICBDb3NOb3RpZnlDb21tOjpOb3RpZnlQdWJsaXNoLAorICAgICAgICAgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJBZG1pbiwKKyAgICAgICAgIENvc0V2ZW50Q2hhbm5lbEFkbWluOjpTdXBwbGllckFkbWluIHsKKworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEFkbWluSUQgTXlJRDsKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFdmVudENoYW5uZWwgTXlDaGFubmVsOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgSW50ZXJGaWx0ZXJHcm91cE9wZXJhdG9yIE15T3BlcmF0b3I7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQcm94eUlEU2VxIHB1bGxfY29uc3VtZXJzOworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIFByb3h5SURTZXEgcHVzaF9jb25zdW1lcnM7CisKKyAgICAgIFByb3h5Q29uc3VtZXIgZ2V0X3Byb3h5X2NvbnN1bWVyICggaW4gUHJveHlJRCBwcm94eV9pZCApCisgICAgICAgICByYWlzZXMgKCBQcm94eU5vdEZvdW5kICk7CisKKyAgICAgIFByb3h5Q29uc3VtZXIgb2J0YWluX25vdGlmaWNhdGlvbl9wdWxsX2NvbnN1bWVyICgKKyAgICAgICAgICAgIGluIENsaWVudFR5cGUgY3R5cGUsCisgICAgICAgICAgICBvdXQgUHJveHlJRCBwcm94eV9pZCkKKyAgICAgICAgIHJhaXNlcyAoIEFkbWluTGltaXRFeGNlZWRlZCApOworCisgICAgICBQcm94eUNvbnN1bWVyIG9idGFpbl9ub3RpZmljYXRpb25fcHVzaF9jb25zdW1lciAoCisgICAgICAgICAgICBpbiBDbGllbnRUeXBlIGN0eXBlLAorICAgICAgICAgICAgb3V0IFByb3h5SUQgcHJveHlfaWQpCisgICAgICAgICByYWlzZXMgKCBBZG1pbkxpbWl0RXhjZWVkZWQgKTsKKworICAgICAgdm9pZCBkZXN0cm95KCk7CisKKyAgIH07IC8vIFN1cHBsaWVyQWRtaW4KKworICAgaW50ZXJmYWNlIEV2ZW50Q2hhbm5lbCA6CisgICAgICBDb3NOb3RpZmljYXRpb246OlFvU0FkbWluLAorICAgICAgQ29zTm90aWZpY2F0aW9uOjpBZG1pblByb3BlcnRpZXNBZG1pbiwKKyAgICAgIENvc0V2ZW50Q2hhbm5lbEFkbWluOjpFdmVudENoYW5uZWwgeworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgRXZlbnRDaGFubmVsRmFjdG9yeSBNeUZhY3Rvcnk7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBDb25zdW1lckFkbWluIGRlZmF1bHRfY29uc3VtZXJfYWRtaW47CisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgU3VwcGxpZXJBZG1pbiBkZWZhdWx0X3N1cHBsaWVyX2FkbWluOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQ29zTm90aWZ5RmlsdGVyOjpGaWx0ZXJGYWN0b3J5CisgICAgICAgICAgICAgICAgICBkZWZhdWx0X2ZpbHRlcl9mYWN0b3J5OworCisgICAgICBDb25zdW1lckFkbWluIG5ld19mb3JfY29uc3VtZXJzKAorICAgICAgICAgICAgaW4gSW50ZXJGaWx0ZXJHcm91cE9wZXJhdG9yIG9wLAorICAgICAgICAgICAgb3V0IEFkbWluSUQgaWQgKTsKKworICAgICAgU3VwcGxpZXJBZG1pbiBuZXdfZm9yX3N1cHBsaWVycygKKyAgICAgICAgICAgIGluIEludGVyRmlsdGVyR3JvdXBPcGVyYXRvciBvcCwKKyAgICAgICAgICAgIG91dCBBZG1pbklEIGlkICk7CisKKyAgICAgIENvbnN1bWVyQWRtaW4gZ2V0X2NvbnN1bWVyYWRtaW4gKCBpbiBBZG1pbklEIGlkICkKKyAgICAgICAgIHJhaXNlcyAoQWRtaW5Ob3RGb3VuZCk7CisKKyAgICAgIFN1cHBsaWVyQWRtaW4gZ2V0X3N1cHBsaWVyYWRtaW4gKCBpbiBBZG1pbklEIGlkICkKKyAgICAgICAgIHJhaXNlcyAoQWRtaW5Ob3RGb3VuZCk7CisKKyAgICAgIEFkbWluSURTZXEgZ2V0X2FsbF9jb25zdW1lcmFkbWlucygpOworICAgICAgQWRtaW5JRFNlcSBnZXRfYWxsX3N1cHBsaWVyYWRtaW5zKCk7CisKKyAgIH07IC8vIEV2ZW50Q2hhbm5lbAorCisgICB0eXBlZGVmIGxvbmcgQ2hhbm5lbElEOworICAgdHlwZWRlZiBzZXF1ZW5jZTxDaGFubmVsSUQ+IENoYW5uZWxJRFNlcTsKKworICAgZXhjZXB0aW9uIENoYW5uZWxOb3RGb3VuZCB7fTsKKworICAgaW50ZXJmYWNlIEV2ZW50Q2hhbm5lbEZhY3RvcnkgeworCisgICAgICBFdmVudENoYW5uZWwgY3JlYXRlX2NoYW5uZWwgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpRb1NQcm9wZXJ0aWVzIGluaXRpYWxfcW9zLAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpBZG1pblByb3BlcnRpZXMgaW5pdGlhbF9hZG1pbiwKKyAgICAgICAgICAgIG91dCBDaGFubmVsSUQgaWQpCisgICAgICAgICByYWlzZXMoQ29zTm90aWZpY2F0aW9uOjpVbnN1cHBvcnRlZFFvUywKKyAgICAgICAgICAgICAgICBDb3NOb3RpZmljYXRpb246OlVuc3VwcG9ydGVkQWRtaW4gKTsKKworICAgICAgQ2hhbm5lbElEU2VxIGdldF9hbGxfY2hhbm5lbHMoKTsKKworICAgICAgRXZlbnRDaGFubmVsIGdldF9ldmVudF9jaGFubmVsICggaW4gQ2hhbm5lbElEIGlkICkKKyAgICAgICAgIHJhaXNlcyAoQ2hhbm5lbE5vdEZvdW5kKTsKKworICAgfTsgLy8gRXZlbnRDaGFubmVsRmFjdG9yeQorICAgCit9OyAvLyBDb3NOb3RpZnlDaGFubmVsQWRtaW4KKworI2VuZGlmIC8qIF9DT1NfTk9USUZZX0NIQU5ORUxfQURNSU5fSURMXyAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9Db3NOb3RpZnlDb21tLmlkbCBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q29tbS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkZjNkNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5Q29tbS5pZGwKQEAgLTAsMCArMSwxMzUgQEAKKy8qKgorICogVGhpcyBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgc3RhbmRhcmQgQ09SQkEgTm90aWZpY2F0aW9uIFNlcnZpY2UKKyAqIDEuMSwgYXMgZGVzY3JpYmVkIGluOgorICoKKyAqIGh0dHBzOi8vd3d3Lm9tZy5vcmcvc3BlYy9OT1QvMS4xLworICoKKyAqIFRoZSBpZGwgd2FzIGV4dHJhY3RlZCBmcm9tIHRoZSBmb2xsb3dpbmcgUERGOgorICogZm9ybWFsLzA0LTEwLTEzCisgKi8KKworI2lmbmRlZiBfQ09TX05PVElGWV9DT01NX0lETF8KKyNkZWZpbmUgX0NPU19OT1RJRllfQ09NTV9JRExfCisKKyNpbmNsdWRlICJDb3NOb3RpZmljYXRpb24uaWRsIgorI2luY2x1ZGUgIkNvc0V2ZW50Q29tbS5pZGwiCisKKyNwcmFnbWEgcHJlZml4ICJvbWcub3JnIgorCittb2R1bGUgQ29zTm90aWZ5Q29tbSB7CisKKyAgIGV4Y2VwdGlvbiBJbnZhbGlkRXZlbnRUeXBlIHsgQ29zTm90aWZpY2F0aW9uOjpfRXZlbnRUeXBlIHR5cGU7IH07CisKKyAgIGludGVyZmFjZSBOb3RpZnlQdWJsaXNoIHsKKworICAgICAgdm9pZCBvZmZlcl9jaGFuZ2UgKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgYWRkZWQsCisgICAgICAgICAgICBpbiBDb3NOb3RpZmljYXRpb246OkV2ZW50VHlwZVNlcSByZW1vdmVkICkKKyAgICAgICAgIHJhaXNlcyAoIEludmFsaWRFdmVudFR5cGUgKTsKKworICAgfTsgLy8gTm90aWZ5UHVibGlzaAorCisgICBpbnRlcmZhY2UgTm90aWZ5U3Vic2NyaWJlIHsKKworICAgICAgdm9pZCBzdWJzY3JpcHRpb25fY2hhbmdlKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpFdmVudFR5cGVTZXEgYWRkZWQsCisgICAgICAgICAgICBpbiBDb3NOb3RpZmljYXRpb246OkV2ZW50VHlwZVNlcSByZW1vdmVkICkKKyAgICAgICAgIHJhaXNlcyAoIEludmFsaWRFdmVudFR5cGUgKTsKKworICAgfTsgLy8gTm90aWZ5U3Vic2NyaWJlCisKKyAgIGludGVyZmFjZSBQdXNoQ29uc3VtZXIgOgorICAgICAgTm90aWZ5UHVibGlzaCwKKyAgICAgIENvc0V2ZW50Q29tbTo6UHVzaENvbnN1bWVyIHsKKyAgIH07IC8vIFB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgUHVsbENvbnN1bWVyIDoKKyAgICAgIE5vdGlmeVB1Ymxpc2gsCisgICAgICBDb3NFdmVudENvbW06OlB1bGxDb25zdW1lciB7CisgICB9OyAvLyBQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFB1bGxTdXBwbGllciA6CisgICAgICBOb3RpZnlTdWJzY3JpYmUsCisgICAgICBDb3NFdmVudENvbW06OlB1bGxTdXBwbGllciB7CisgICB9OyAvLyBQdWxsU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFB1c2hTdXBwbGllciA6CisgICAgICBOb3RpZnlTdWJzY3JpYmUsCisgICAgICBDb3NFdmVudENvbW06OlB1c2hTdXBwbGllciB7CisgICB9OworCisgICBpbnRlcmZhY2UgU3RydWN0dXJlZFB1c2hDb25zdW1lciA6IE5vdGlmeVB1Ymxpc2ggeworCisgICAgICB2b2lkIHB1c2hfc3RydWN0dXJlZF9ldmVudCgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6U3RydWN0dXJlZEV2ZW50IG5vdGlmaWNhdGlvbikKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENvbW06OkRpc2Nvbm5lY3RlZCk7CisKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1c2hfY29uc3VtZXIoKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgU3RydWN0dXJlZFB1bGxDb25zdW1lciA6IE5vdGlmeVB1Ymxpc2ggeworICAgICAgCisgICAgICB2b2lkIGRpc2Nvbm5lY3Rfc3RydWN0dXJlZF9wdWxsX2NvbnN1bWVyKCk7CisKKyAgIH07IC8vIFN0cnVjdHVyZWRQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFN0cnVjdHVyZWRQdWxsU3VwcGxpZXIgOiBOb3RpZnlTdWJzY3JpYmUgeworCisgICAgICBDb3NOb3RpZmljYXRpb246OlN0cnVjdHVyZWRFdmVudCBwdWxsX3N0cnVjdHVyZWRfZXZlbnQoKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q29tbTo6RGlzY29ubmVjdGVkKTsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpTdHJ1Y3R1cmVkRXZlbnQgdHJ5X3B1bGxfc3RydWN0dXJlZF9ldmVudCgKKyAgICAgICAgICAgIG91dCBib29sZWFuIGhhc19ldmVudCkKKyAgICAgICAgIHJhaXNlcyhDb3NFdmVudENvbW06OkRpc2Nvbm5lY3RlZCk7CisKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFB1bGxTdXBwbGllcgorCisgICBpbnRlcmZhY2UgU3RydWN0dXJlZFB1c2hTdXBwbGllciA6IE5vdGlmeVN1YnNjcmliZSB7CisgICAgICAKKyAgICAgIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1c2hfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU3RydWN0dXJlZFB1c2hTdXBwbGllcgorCisgICBpbnRlcmZhY2UgU2VxdWVuY2VQdXNoQ29uc3VtZXIgOiBOb3RpZnlQdWJsaXNoIHsKKworICAgICAgdm9pZCBwdXNoX3N0cnVjdHVyZWRfZXZlbnRzKAorICAgICAgICAgICAgaW4gQ29zTm90aWZpY2F0aW9uOjpFdmVudEJhdGNoIG5vdGlmaWNhdGlvbnMpCisgICAgICAgICByYWlzZXMoQ29zRXZlbnRDb21tOjpEaXNjb25uZWN0ZWQpOworCisgICAgICB2b2lkIGRpc2Nvbm5lY3Rfc2VxdWVuY2VfcHVzaF9jb25zdW1lcigpOworCisgICB9OyAvLyBTZXF1ZW5jZVB1c2hDb25zdW1lcgorCisgICBpbnRlcmZhY2UgU2VxdWVuY2VQdWxsQ29uc3VtZXIgOiBOb3RpZnlQdWJsaXNoIHsKKyAgICAgIAorICAgICAgdm9pZCBkaXNjb25uZWN0X3NlcXVlbmNlX3B1bGxfY29uc3VtZXIoKTsKKworICAgfTsgLy8gU2VxdWVuY2VQdWxsQ29uc3VtZXIKKworICAgaW50ZXJmYWNlIFNlcXVlbmNlUHVsbFN1cHBsaWVyIDogTm90aWZ5U3Vic2NyaWJlIHsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudEJhdGNoIHB1bGxfc3RydWN0dXJlZF9ldmVudHMoCisgICAgICAgICAgICBpbiBsb25nIG1heF9udW1iZXIgKQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q29tbTo6RGlzY29ubmVjdGVkKTsKKworICAgICAgQ29zTm90aWZpY2F0aW9uOjpFdmVudEJhdGNoIHRyeV9wdWxsX3N0cnVjdHVyZWRfZXZlbnRzKAorICAgICAgICAgICAgaW4gbG9uZyBtYXhfbnVtYmVyLAorICAgICAgICAgICAgb3V0IGJvb2xlYW4gaGFzX2V2ZW50KQorICAgICAgICAgcmFpc2VzKENvc0V2ZW50Q29tbTo6RGlzY29ubmVjdGVkKTsKKworICAgICAgdm9pZCBkaXNjb25uZWN0X3NlcXVlbmNlX3B1bGxfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU2VxdWVuY2VQdWxsU3VwcGxpZXIKKworICAgaW50ZXJmYWNlIFNlcXVlbmNlUHVzaFN1cHBsaWVyIDogTm90aWZ5U3Vic2NyaWJlIHsKKyAgICAgIAorICAgICAgdm9pZCBkaXNjb25uZWN0X3NlcXVlbmNlX3B1c2hfc3VwcGxpZXIoKTsKKworICAgfTsgLy8gU2VxdWVuY2VQdXNoU3VwcGxpZXIKKworfTsgLy8gQ29zTm90aWZ5Q29tbQorCisjZW5kaWYgLyogX0NPU19OT1RJRllfQ09NTV9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmeUZpbHRlci5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL0Nvc05vdGlmeUZpbHRlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc3Y2MzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvQ29zTm90aWZ5RmlsdGVyLmlkbApAQCAtMCwwICsxLDE4NyBAQAorLyoqCisgKiBUaGlzIG1vZHVsZSBpcyB0YWtlbiBmcm9tIHRoZSBzdGFuZGFyZCBDT1JCQSBOb3RpZmljYXRpb24gU2VydmljZQorICogMS4xLCBhcyBkZXNjcmliZWQgaW46CisgKgorICogaHR0cHM6Ly93d3cub21nLm9yZy9zcGVjL05PVC8xLjEvCisgKgorICogVGhlIGlkbCB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGZvbGxvd2luZyBQREY6CisgKiBmb3JtYWwvMDQtMTAtMTMKKyAqLworCisjaWZuZGVmIF9DT1NfTk9USUZZX0ZJTFRFUl9JRExfCisjZGVmaW5lIF9DT1NfTk9USUZZX0ZJTFRFUl9JRExfCisKKyNpbmNsdWRlICJDb3NOb3RpZnlDb21tLmlkbCIKKworI3ByYWdtYSBwcmVmaXggIm9tZy5vcmciCisKK21vZHVsZSBDb3NOb3RpZnlGaWx0ZXIgeworCisgICB0eXBlZGVmIGxvbmcgQ29uc3RyYWludElEOworCisgICBzdHJ1Y3QgQ29uc3RyYWludEV4cCB7CisgICAgICBDb3NOb3RpZmljYXRpb246OkV2ZW50VHlwZVNlcSBldmVudF90eXBlczsKKyAgICAgIHN0cmluZyBjb25zdHJhaW50X2V4cHI7CisgICB9OworCisgICB0eXBlZGVmIHNlcXVlbmNlPENvbnN0cmFpbnRJRD4gQ29uc3RyYWludElEU2VxOworICAgdHlwZWRlZiBzZXF1ZW5jZTxDb25zdHJhaW50RXhwPiBDb25zdHJhaW50RXhwU2VxOworCisgICBzdHJ1Y3QgQ29uc3RyYWludEluZm8geworICAgICAgQ29uc3RyYWludEV4cCBjb25zdHJhaW50X2V4cHJlc3Npb247CisgICAgICBDb25zdHJhaW50SUQgY29uc3RyYWludF9pZDsKKyAgIH07CisKKyAgIHR5cGVkZWYgc2VxdWVuY2U8Q29uc3RyYWludEluZm8+IENvbnN0cmFpbnRJbmZvU2VxOworCisgICBzdHJ1Y3QgTWFwcGluZ0NvbnN0cmFpbnRQYWlyIHsKKyAgICAgIENvbnN0cmFpbnRFeHAgY29uc3RyYWludF9leHByZXNzaW9uOworICAgICAgYW55IHJlc3VsdF90b19zZXQ7CisgICB9OworCisgICB0eXBlZGVmIHNlcXVlbmNlPE1hcHBpbmdDb25zdHJhaW50UGFpcj4gTWFwcGluZ0NvbnN0cmFpbnRQYWlyU2VxOworCisgICBzdHJ1Y3QgTWFwcGluZ0NvbnN0cmFpbnRJbmZvIHsKKyAgICAgIENvbnN0cmFpbnRFeHAgY29uc3RyYWludF9leHByZXNzaW9uOworICAgICAgQ29uc3RyYWludElEIGNvbnN0cmFpbnRfaWQ7CisgICAgICBhbnkgdmFsdWU7CisgICB9OworCisgICB0eXBlZGVmIHNlcXVlbmNlPE1hcHBpbmdDb25zdHJhaW50SW5mbz4gTWFwcGluZ0NvbnN0cmFpbnRJbmZvU2VxOworCisgICB0eXBlZGVmIGxvbmcgQ2FsbGJhY2tJRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2U8Q2FsbGJhY2tJRD4gQ2FsbGJhY2tJRFNlcTsKKworICAgZXhjZXB0aW9uIFVuc3VwcG9ydGVkRmlsdGVyYWJsZURhdGEge307CisgICBleGNlcHRpb24gSW52YWxpZEdyYW1tYXIge307CisgICBleGNlcHRpb24gSW52YWxpZENvbnN0cmFpbnQge0NvbnN0cmFpbnRFeHAgY29uc3RyO307CisgICBleGNlcHRpb24gRHVwbGljYXRlQ29uc3RyYWludElEIHtDb25zdHJhaW50SUQgaWQ7fTsKKyAgIGV4Y2VwdGlvbiBDb25zdHJhaW50Tm90Rm91bmQge0NvbnN0cmFpbnRJRCBpZDt9OworICAgCisgICBleGNlcHRpb24gQ2FsbGJhY2tOb3RGb3VuZCB7fTsKKworICAgZXhjZXB0aW9uIEludmFsaWRWYWx1ZSB7Q29uc3RyYWludEV4cCBjb25zdHI7IGFueSB2YWx1ZTt9OworCisgICBpbnRlcmZhY2UgRmlsdGVyIHsKKworICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIHN0cmluZyBjb25zdHJhaW50X2dyYW1tYXI7CisKKyAgICAgIENvbnN0cmFpbnRJbmZvU2VxIGFkZF9jb25zdHJhaW50cyAoCisgICAgICAgICAgICBpbiBDb25zdHJhaW50RXhwU2VxIGNvbnN0cmFpbnRfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZENvbnN0cmFpbnQpOworCisgICAgICB2b2lkIG1vZGlmeV9jb25zdHJhaW50cyAoCisgICAgICAgICAgICBpbiBDb25zdHJhaW50SURTZXEgZGVsX2xpc3QsCisgICAgICAgICAgICBpbiBDb25zdHJhaW50SW5mb1NlcSBtb2RpZnlfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZENvbnN0cmFpbnQsIENvbnN0cmFpbnROb3RGb3VuZCk7CisKKyAgICAgIENvbnN0cmFpbnRJbmZvU2VxIGdldF9jb25zdHJhaW50cygKKyAgICAgICAgICAgIGluIENvbnN0cmFpbnRJRFNlcSBpZF9saXN0KQorICAgICAgICAgcmFpc2VzIChDb25zdHJhaW50Tm90Rm91bmQpOworCisgICAgICBDb25zdHJhaW50SW5mb1NlcSBnZXRfYWxsX2NvbnN0cmFpbnRzKCk7CisKKyAgICAgIHZvaWQgcmVtb3ZlX2FsbF9jb25zdHJhaW50cygpOworCisgICAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgICAgYm9vbGVhbiBtYXRjaCAoIGluIGFueSBmaWx0ZXJhYmxlX2RhdGEgKQorICAgICAgICAgcmFpc2VzIChVbnN1cHBvcnRlZEZpbHRlcmFibGVEYXRhKTsKKworICAgICAgYm9vbGVhbiBtYXRjaF9zdHJ1Y3R1cmVkICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6U3RydWN0dXJlZEV2ZW50IGZpbHRlcmFibGVfZGF0YSApCisgICAgICAgICByYWlzZXMgKFVuc3VwcG9ydGVkRmlsdGVyYWJsZURhdGEpOworCisgICAgICBib29sZWFuIG1hdGNoX3R5cGVkICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6UHJvcGVydHlTZXEgZmlsdGVyYWJsZV9kYXRhICkKKyAgICAgICAgIHJhaXNlcyAoVW5zdXBwb3J0ZWRGaWx0ZXJhYmxlRGF0YSk7CisKKyAgICAgIENhbGxiYWNrSUQgYXR0YWNoX2NhbGxiYWNrICgKKyAgICAgICAgICAgIGluIENvc05vdGlmeUNvbW06Ok5vdGlmeVN1YnNjcmliZSBjYWxsYmFjayk7CisKKyAgICAgIHZvaWQgZGV0YWNoX2NhbGxiYWNrICggaW4gQ2FsbGJhY2tJRCBjYWxsYmFjaykKKyAgICAgICAgIHJhaXNlcyAoIENhbGxiYWNrTm90Rm91bmQgKTsKKworICAgICAgQ2FsbGJhY2tJRFNlcSBnZXRfY2FsbGJhY2tzKCk7CisKKyAgIH07IC8vIEZpbHRlcgorCisgICBpbnRlcmZhY2UgTWFwcGluZ0ZpbHRlciB7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBzdHJpbmcgY29uc3RyYWludF9ncmFtbWFyOworCisgICAgICByZWFkb25seSBhdHRyaWJ1dGUgQ09SQkE6OlR5cGVDb2RlIHZhbHVlX3R5cGU7CisKKyAgICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBhbnkgZGVmYXVsdF92YWx1ZTsKKworICAgICAgTWFwcGluZ0NvbnN0cmFpbnRJbmZvU2VxIGFkZF9tYXBwaW5nX2NvbnN0cmFpbnRzICgKKyAgICAgICAgICAgIGluIE1hcHBpbmdDb25zdHJhaW50UGFpclNlcSBwYWlyX2xpc3QpCisgICAgICAgICByYWlzZXMgKEludmFsaWRDb25zdHJhaW50LCBJbnZhbGlkVmFsdWUpOworCisgICAgICB2b2lkIG1vZGlmeV9tYXBwaW5nX2NvbnN0cmFpbnRzICgKKyAgICAgICAgICAgIGluIENvbnN0cmFpbnRJRFNlcSBkZWxfbGlzdCwKKyAgICAgICAgICAgIGluIE1hcHBpbmdDb25zdHJhaW50SW5mb1NlcSBtb2RpZnlfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZENvbnN0cmFpbnQsIEludmFsaWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnROb3RGb3VuZCk7CisKKyAgICAgIE1hcHBpbmdDb25zdHJhaW50SW5mb1NlcSBnZXRfbWFwcGluZ19jb25zdHJhaW50cyAoCisgICAgICAgICAgICBpbiBDb25zdHJhaW50SURTZXEgaWRfbGlzdCkKKyAgICAgICAgIHJhaXNlcyAoQ29uc3RyYWludE5vdEZvdW5kKTsKKworICAgICAgTWFwcGluZ0NvbnN0cmFpbnRJbmZvU2VxIGdldF9hbGxfbWFwcGluZ19jb25zdHJhaW50cygpOworCisgICAgICB2b2lkIHJlbW92ZV9hbGxfbWFwcGluZ19jb25zdHJhaW50cygpOworCisgICAgICB2b2lkIGRlc3Ryb3koKTsKKworICAgICAgYm9vbGVhbiBtYXRjaCAoCisgICAgICAgICAgICBpbiBhbnkgZmlsdGVyYWJsZV9kYXRhLAorICAgICAgICAgICAgb3V0IGFueSByZXN1bHRfdG9fc2V0ICkKKyAgICAgICAgIHJhaXNlcyAoVW5zdXBwb3J0ZWRGaWx0ZXJhYmxlRGF0YSk7CisKKyAgICAgIGJvb2xlYW4gbWF0Y2hfc3RydWN0dXJlZCAoCisgICAgICAgICAgICBpbiBDb3NOb3RpZmljYXRpb246OlN0cnVjdHVyZWRFdmVudCBmaWx0ZXJhYmxlX2RhdGEsCisgICAgICAgICAgICBvdXQgYW55IHJlc3VsdF90b19zZXQpCisgICAgICAgICByYWlzZXMgKFVuc3VwcG9ydGVkRmlsdGVyYWJsZURhdGEpOworCisgICAgICBib29sZWFuIG1hdGNoX3R5cGVkICgKKyAgICAgICAgICAgIGluIENvc05vdGlmaWNhdGlvbjo6UHJvcGVydHlTZXEgZmlsdGVyYWJsZV9kYXRhLAorICAgICAgICAgICAgb3V0IGFueSByZXN1bHRfdG9fc2V0KQorICAgICAgICAgcmFpc2VzIChVbnN1cHBvcnRlZEZpbHRlcmFibGVEYXRhKTsKKworICAgfTsgLy8gTWFwcGluZ0ZpbHRlcgorCisgICBpbnRlcmZhY2UgRmlsdGVyRmFjdG9yeSB7CisKKyAgICAgIEZpbHRlciBjcmVhdGVfZmlsdGVyICggaW4gc3RyaW5nIGNvbnN0cmFpbnRfZ3JhbW1hcikKKyAgICAgICAgIHJhaXNlcyAoSW52YWxpZEdyYW1tYXIpOworCisgICAgICBNYXBwaW5nRmlsdGVyIGNyZWF0ZV9tYXBwaW5nX2ZpbHRlciAoCisgICAgICAgICAgICBpbiBzdHJpbmcgY29uc3RyYWludF9ncmFtbWFyLAorICAgICAgICAgICAgaW4gYW55IGRlZmF1bHRfdmFsdWUpCisgICAgICAgICByYWlzZXMoSW52YWxpZEdyYW1tYXIpOworCisgICB9OyAvLyBGaWx0ZXJGYWN0b3J5CisKKyAgIHR5cGVkZWYgbG9uZyBGaWx0ZXJJRDsKKyAgIHR5cGVkZWYgc2VxdWVuY2U8RmlsdGVySUQ+IEZpbHRlcklEU2VxOworCisgICBleGNlcHRpb24gRmlsdGVyTm90Rm91bmQge307CisKKyAgIGludGVyZmFjZSBGaWx0ZXJBZG1pbiB7CisKKyAgICAgIEZpbHRlcklEIGFkZF9maWx0ZXIgKCBpbiBGaWx0ZXIgbmV3X2ZpbHRlciApOworCisgICAgICB2b2lkIHJlbW92ZV9maWx0ZXIgKCBpbiBGaWx0ZXJJRCBmaWx0ZXIgKSByYWlzZXMgKCBGaWx0ZXJOb3RGb3VuZCApOworCisgICAgICBGaWx0ZXIgZ2V0X2ZpbHRlciAoIGluIEZpbHRlcklEIGZpbHRlciApIHJhaXNlcyAoIEZpbHRlck5vdEZvdW5kICk7CisKKyAgICAgIEZpbHRlcklEU2VxIGdldF9hbGxfZmlsdGVycygpOworCisgICAgICB2b2lkIHJlbW92ZV9hbGxfZmlsdGVycygpOworCisgICB9OyAvLyBGaWx0ZXJBZG1pbgorCit9OyAvLyBDb3NOb3RpZnlGaWx0ZXIKKworI2VuZGlmIC8qIF9DT1NfTk9USUZZX0ZJTFRFUl9JRExfICovCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5YzkzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvYWJvdXQuaHRtbApAQCAtMCwwICsxLDM5IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHBzOi8vZWNsaXBzZS5vcmcvbGVnYWwvZXBsL2xvbmdhYm91dC5odG1sIC0tPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKworPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+PGVtPk9jdG9iZXIgNCwgMjAxNjwvZW0+PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKK2F0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCitGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCisJCQorCQk8aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+CisJCTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKKwkJZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCisJCWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAKKwkJdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KKwkJPHA+PGVtPgorCQk8c3Ryb25nPm9kczUzMC5pZGw8L3N0cm9uZz4gPGJyPjxicj4KKwkJVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEFTQU0gT0RTIHN0YW5kYXJkIGFuZCBpcyBub3Qgc3ViamVjdCB0byBtb2RpZmljYXRpb24uIAorCQk8L2VtPjwvcD4KKworCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9pZGwuY29uZmlnIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2lkbC9pZGwuY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNzY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL2lkbC5jb25maWcKQEAgLTAsMCArMSw2IEBACitQa2dQcmVmaXguQ29zRXZlbnRDb21tPW9yZy5vbWcNCitQa2dQcmVmaXguQ29zTm90aWZpY2F0aW9uPW9yZy5vbWcNCitQa2dQcmVmaXguQ29zTm90aWZ5Q29tbT1vcmcub21nDQorUGtnUHJlZml4LkNvc05vdGlmeUZpbHRlcj1vcmcub21nDQorUGtnUHJlZml4LkNvc0V2ZW50Q2hhbm5lbEFkbWluPW9yZy5vbWcNCitQa2dQcmVmaXguQ29zTm90aWZ5Q2hhbm5lbEFkbWluPW9yZy5vbWcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL29kczUzMC5pZGwgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vaWRsL29kczUzMC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA3MTUwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9pZGwvb2RzNTMwLmlkbApAQCAtMCwwICsxLDEwODgzIEBACisvLyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICAgICogICAgIEFTQU0gT0RTIDUuMy4wIEludGVyZmFjZSBEZWZpbml0aW9uICAgICAqCisvLyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyAgICBHZW5lcmF0ZWQ6IFR1ZSBOb3YgMjAgMDk6Mjg6MzcgQ0VUIDIwMTIKKy8vCisvLyBNb3JlIGV4cGxhbmF0aW9uIGZvciB0aGUgbWV0aG9kIGdldEluc3RhbmNlc0V4IG9mIHRoZSBpbnRlcmZhY2UKKy8vIEFwcGxFbGVtQWNjZXNzLiAgIE1vcmUgZGV0YWlscyBmb3IgdGhlIG1ldGhvZCBzZXRSZWxhdGlvblR5cGUgb2YgdGhlCisvLyBpbnRlcmZhY2UgQXBwbGljYXRpb25SZWxhdGlvbi4KKy8vCisvLyBNZXRob2QgZ2V0UmVsYXRpb25CeUJhc2VOYW1lIG9mIHRoZSBpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50IGFkZGVkLiAgCisvLyBNZXRob2QgZ2V0SW52ZXJzZVJlbGF0aW9uTmFtZSBvZiBpbnN0YW5jZSBCYXNlUmVsYXRpb24gYWRkZWQuICAgQmV0dGVyCisvLyBleHBsYW5hdGlvbiBpbiB0aGUgY29tbWVudHMuICBSZW1vdmVkIHVudXNlZCBlcnJvciBjb2RlcyBvZiB0aGUgZXhjZXB0aW9ucy4KKy8vCisvLyAyMDAzLTEyLTMxCisvLyBPRFMgVmVyc2lvbiA1LjAKKy8vCisvLyBBZGQgU2VsT3Bjb2RlIElTX05VTEwgYW5kIElTX05PVF9OVUxMLiAgQWRkIGV4Y2VwdGlvbiBBT19JTlZBTElEX0RBVEFUWVBFCisvLyB0byB0aGUgbWV0aG9kIHNldEVudW1lcmF0aW9uRGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4KKy8vICBNZXRob2QgZ2V0RW51bWVyYXRpb25EZWZpbml0aW9uIGFkZGVkIHRvIHRoZSBJbnRlcmZhY2UgQmFzZVJlbGF0aW9uLiAgQWRkCisvLyBjb21tZW50IHRvIG1ldGhvZHMgZ2V0Rm9ybXVsYSBhbmQgc2V0Rm9ybXVsYSBvZiBpbnRlcmZhY2UgQ29sdW1uLgorLy8KKy8vIEFkZCB0aGUgdmFyaWFibGUgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VEIGF0IHRoZSBtZXRob2QgbmV3U2Vzc2lvbiBhdCB0aGUKKy8vIGludGVyZmFjZSBBb0ZhY3RvcnkuICAgQWRkIHRoZSBtZXRob2RzIGNyZWF0ZUNvU2Vzc2lvbiBhbmQgZ2V0VXNlciBhdCB0aGUKKy8vIGludGVyZmFjZSBBb1Nlc3Npb24uICBBZGQgdmFsdWVzIG9mIGxvY2FsY29sdW1uIGF0IHRoZSBtZXRob2RzCisvLyBnZXRJbnN0YW5jZXMsIGdldEluc3RhbmNlc0V4dCBhbmQgdXBkYXRlSW5zdGFuY2VzIG9mIHRoZSBpbnRlcmZhY2UKKy8vIEFwcGxFbGVtQWNjZXNzLiAgQ29tbWVudCBvZiBtZXRob2Qgc2V0VmFsdWUgb2YgdGhlIGludGVyZmFjZSBWYWx1ZU1hdHJpeAorLy8gcmV3b3JrZWQuCisvLworLy8gQ29ycmVjdCB0aGUgTWV0aG9kIGdldFJlbGF0aW9uQnlCYXNlTmFtZSBvZiB0aGUgaW50ZXJmYWNlCisvLyBBcHBsaWNhdGlvbkVsZW1lbnQgdG8gdGhlIE1ldGhvZCBnZXRSZWxhdGlvbnNCeUJhc2VOYW1lLCBtaXN0YWtlIGluCisvLyBJbnRlcmZhY2UgZGVmaW5pdGlvbiB0aGVyZSBhcmUgYXQgc29tZSBlbGVtZW50cyByZWxhdGlvbnMgZGVyaXZlZCBmcm9tIHRoZQorLy8gc2FtZSBiYXNlIHJlbGF0aW9uIGFsbG93ZWQuCisvLworLy8gQWRkLCBTVU0gdG8gdGhlIEFnZ3JGdW5jLiAgQ2hhbmdlIGNvbW1lbnQgb2YgbWV0aG9kIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlCisvLyBhbmQgZ2V0QmFzZVN0cnVjdHVyZSBvZiB0aGUgaW50ZXJmYWNlIEFvU2Vzc2lvbiwgdGhlIG1ldGhvZAorLy8gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUgb2YgdGhlIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQuYW5kIHRoZSBtZXRob2QKKy8vIGdldFJlbGF0aW9uIG9mIHRoZSBpbnRlcmZhY2UgQmFzZVN0cnVjdHVyZS4gIEFkZCB2ZXJzaW9uIHN0cmluZyBkZXNjcmlwdGlvbgorLy8gYXQgbWV0aG9kIGdldEludGVyZmFjZVZlcnNpb24gb2YgaW50ZXJmYWNlIEFvRmFjdG9yeS4KKy8vCisvLyBBZGQgdGhlIEVudW1lcmF0aW9uIFZhbHVlTWF0cml4TW9kZS4gIENoYW5nZSB0aGUgY29tbWVudCBvZiB0aGUgTWV0aG9kcworLy8gMTMwMDEsIDEzMDA0LCAxMzAwNiwgMTQwMTgsIDE0MDIyLCAxNjAwMywgMjEwMDIsIDI0MDA3ICBBZGQgdGhlIGV4Y2VwdGlvbgorLy8gQU9fSU5WQUxJRF9WQUxVRU1BVFJJWF9TVFJVQ1RVUkUgZm9yIHRoZSBtZXRob2QgZ2V0VmFsdWVNYXRyaXggb2YgdGhlCisvLyBpbnRlcmZhY2UgTWVhc3VyZW1lbnQgYW5kIEFwcGxFbGVtQWNjZXNzLiAgQWRkIHRoZSBuZXcgbWV0aG9kCisvLyBnZXRWYWx1ZU1hdHJpeEluTW9kZSBvZiB0aGUgaW50ZXJmYWNlcyBNZWFzdXJlbWVudCAoMTYwMDUpLCBTdWJNYXRyaXgKKy8vICgyMTAwNCkgYW5kIEFwcGxFbGVtQWNjZXNzICAgQWRkIHRoZSBtZXRob2RzIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24KKy8vICgxMzAxMyksIHNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24gKDEzMDE0KSwgZ2V0R2VuZXJhdGlvblBhcmFtZXRlcnMKKy8vICgxMzAxNSksIHNldEdlbmVyYXRpb25QYXJhbWV0ZXJzICgxMzAxNikgYW5kIGdldFJhd0RhdGFUeXBlICgxMzAxNykgb2YgdGhlCisvLyBpbnRlcmZhY2UgQ29sdW1uLiAgQWRkIHRoZSBtZXRob2QgZ2V0TW9kZSAoMjIwMjIpIG9mIHRoZSBpbnRlcmZhY2UKKy8vIFZhbHVlTWF0cml4LiAgTGl0dGxlIGNoYW5nZXMgaW4gZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZHMsIHNwZWNpZnkgd2hpY2gKKy8vIG9iamVjdCBpcyBtb2RpZmllZCwgd2l0aCB0aGUgbnVtYmVycyA0MDA4LCA0MDA5LCA0MDEwLCA0MDExLCA0MDEyLCA0MDEzLAorLy8gNDAxNCwgNDAxOSwgNTAwMSwgNTAwMiwgNTAyMCwgNTAyMSwgNTAyMiwgNTAyMywgNjAxMCwgNjAxMSwgNjAxMiwgNjAxMywKKy8vIDYwMTQsIDYwMTUsIDYwMTYsIDYwMTgsIDcwMDIsIDcwMDMsIDcwMTQsIDcwMTUsIDEyMDAxLCAxMjAwNiwgMTIwMDcsIDEzMDA1LAorLy8gMTQwMDEsIDE0MDAyLCAxNDAxNCwgMTQwMTYsIDE0MDE3LCAyMjAxNCwgMjIwMTkuICBDb3JyZWN0IHR5cGluZyBlcnJvcnMgaW4KKy8vIG1ldGhvZCAyNDAwNQorLy8KKy8vIENvcnJlY3QgdGhlIGVudW1lcmF0aW9uIFZhbHVlTWF0cml4TW9kZS4gQ29ycmVjdCB0eXBpbmcgZXJyb3JzIGF0IG1ldGhvZAorLy8gMTMwMTQuIEV4dGVuZCBleHBsYW5hdGlvbiBhdCAxMzAxNSBhbmQgMTMwMTYKKy8vCisvLyBUeXBpbmcgY29ycmVjdGlvbnMgaW4gSURMOiAgTWV0aG9kIDI0MDA1IGNvbW1lbnQgY2hhbmdlZC4gQ2hhbmdlIHRoZSB3b3JkCisvLyAnY2FsaWJyYXRlZCcgaW50byAgICAgJ3JlY2FsY3VsYXRlZCcgaW4gbWV0aG9kIDQwMTQgc2V0VW5pdC4KKy8vCisvLyBTZXQgdGhlIG1ldGhvZHMgaGFzVmFsdWVGbGFnIGFuZCB3aXRoVmFsdWVGbGFnIG9mIHRoZSBpbnRlcmZhY2UKKy8vIEFwcGxpY2F0aW9uQXR0cmlidXRlIHRvIGRlcHJlY2F0ZWQuIENoYW5nZSBkZXNjcmlwdGlvbiBvZiBjcmVhdGVBdHRyaWJ1dGUKKy8vIG9mIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQgYW5kIEVycm9yQ29kZSBBT19NSVNTSU5HX1ZBTFVFLgorLy8KKy8vIEFkZCB0aGUgaW50ZXJmYWNlcyBPRFNEaXJlY3RvcnksIE9EU0ZpbGUgYW5kIE9EU0ZpbGVUcmFuc2ZlciBhbmQKKy8vIEVudW1lcmF0aW9uIEZpbGVPcGVuTW9kZSBmb3IgdGhlIG1hbmFnZWQgZmlsZXMuIEFkZCB0aGUgbWV0aG9kcworLy8gZ2V0T0RTRGlyZWN0b3J5IGluIHRoZSBpbnRlcmZhY2VzIEFwcGxFbGVtQWNjZXNzIGFuZCBJbnN0YW5jZUVsZW1lbnQuCisvLworLy8gQWRkIHRoZSBtZXRob2RzIGdldEVudW1lcmF0aW9uQXR0cmlidXRlcyBhbmQgZ2V0RW51bWVyYXRpb25TdHJ1Y3R1cmUgb2YgdGhlCisvLyBpbnRlcmZhY2UgQW9TZXNzaW9uIHdpdGggdGhlIHJlcXVpcmVkIHN0cnVjdHVyZXMgYW5kIHNlcXVlbmNlcy4KKy8vCisvLyBDb3JyZWN0IHR5cGluZyBlcnJvcidzLgorLy8KKy8vIEFkZCBBZ2dyRnVuYyBESVNUSU5DVCwgU2VsT3Bjb2RlIE5PVExJS0UgYW5kIENJX05PVExJS0UKKy8vCisvLyBSZW1vdmUgT0RTRGlyZWN0b3J5LCBjaGFuZ2UgdGhlIHdheSBPRFNGaWxlIGlzIGNyZWF0ZWQuIENoYW5nZQorLy8gRmlsZU9wZW5Nb2RlLgorLy8KKy8vIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZCBnZXRVbml0IG9mIHRoZSBpbnRlcmZhY2UgQ29sdW1uLiAKKy8vIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZXMgT0RTRmlsZSBhbmQKKy8vIE9EU0ZpbGVUcmFuc2Zlci4gIENoYW5nZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGVudW1lcmF0aW9ucworLy8gVmFsdWVNYXRyaXhfTW9kZSBhbmQgRmlsZU9wZW5Nb2RlLiAgQ2hhbmdlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlCisvLyBBcHBsUmVsLgorLy8KKy8vIFJlbW92ZSBJbnRlcmZhY2UgT0RTRmlsZSBhbmQgT0RTRmlsZVRyYW5zZmVyIGFuZCBFbnVtZXJhdGlvbiBGaWxlT3BuZU1vZGUKKy8vIHdpdGggdGhlIG1ldGhvZHMgd2hpY2ggY3JlYXRlcyB0aGUgT0RTRmlsZSBpbnRlcmZhY2UuCisvLworLy8gMjAwOS0wOS0yNQorLy8gQ29ycmVjdCBvZiBzb21lIGludGVyZmFjYWVzIGFuZCBtZXRob2RzIHRoZSBkZXNjcmlwdGlvbi4gICBGaW5hbGl6ZSBmb3IKKy8vIEFTQU0gT0RTIHZlcnNpb24gNS4yCisvLworLy8gQWRkIEZPUl9VU0VSIGF0IGF1dGggcGFyYW1ldGVyIG9mIG1ldGhvZCBuZXdTZXNzaW9uIG9mIGludGVyZmFjZSBBb0ZhY3RvcnkgCisvLyBEZXByZWNhdGVkLCBzb2x2ZWQgYnkgTlZIIEFwcGxpY2F0aW9uIG1vZGVsIGZvciBmb2xsb3dpbmcgbWV0aG9kczoKKy8vIGxpc3RTY2FsaW5nQ29sdW1ucywgZ2V0U2NhbGluZ0NvbHVtbnMsIGxpc3RDb2x1bW5zU2NhbGVkQnksCisvLyBnZXRDb2x1bW5zU2NhbGVkQnkgYW5kIGFkZENvbHVtblNjYWxlZEJ5IG9mIGludGVyZmFjZSBWYWx1ZU1hdHJpeCBhbmQgdGhlCisvLyBtZXRob2RzIGlzU2NhbGluZyBhbmQgc2V0U2NhbGluZyBvZiBpbnRlcmZhY2UgQ29sdW1uCisvLworLy8gQWRkIEFvU2Vzc2lvbi5nZXRJZCgpICBBZGQgQW9GYWN0b3J5Lm5ld1Nlc3Npb25OYW1lVmFsdWUoKSAgQWRkCisvLyBTZWxPcGNvZGUuQkVUV0VFTiAgQWRkIEFnZ3JGdW5jLk9SRCAgQWRkIGNvbW1lbnQgdG8KKy8vIEFwcGxFbGVtQWNjZXNzLmdldEluc3RhbmNlc0V4dCgpCisvLworLy8gQWRkIG1ldGhvZCBnZXRPRFNGaWxlIGF0IHRoZSBpbnRlcmZhY2VzIEFwcGxFbGVtQWNjZXNzIGFuZCBJbnN0YW5jZUVsZW1lbnQuCisvLyAgQWRkIHRoZSBJbnRlcmZhY2VzIE9EU0ZpbGUsIE9EU1JlYWRUcmFuc2ZlciBhbmQgT0RTV3JpdGVUcmFuc2Zlci4gIEFkZAorLy8gRXJyb3JDb2RlIEFPX0ZJTEVfTE9DS0VELiAgQWRkIEFvRmlsZSB0byB0aGUgZGVzY3JpcHRpb24gb2YKKy8vIEFPX0lOVkFMSURfQkFTRVRZUEUKKy8vCisvLyBJbmhlcml0IE9EU0ZpbGUgZnJvbSBJbnN0YW5jZUVsZW1lbnQuIFJlbmFtZSBtZXRob2QgZ2V0T2RzRmlsZSB0bworLy8gdXBjYXN0T2RzRmlsZSBhdCBpbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50LiBBZGQgbWV0aG9kcyB0YWtlVW5kZXJDb250cm9sCisvLyBhbmQgcmVtb3ZlZnJvbUNvbnRyb2wgdG8gdGhlIGludGVyZmFjZSBPRFNGaWxlLiBNZXRob2Qgc2tpcE9jdGV0cyByZXR1cm5zCisvLyB0aGUgcmVhbCBza2lwcGVkIG51bWJlciBvZiBvY3RldHMuICBSZW5hbWUgQWdnckZ1bmMuT1JEIHRvIEFnZ3JGdW5jLlBPSU5UCisvLworLy8gVXBkYXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBPRFNGaWxlIG1ldGhvZHMgYW5kIHNvbWUgZXJyb3IgY29kZXMuCisvLworLy8gQWRkIHRoZSBtZXRob2QgZ2V0UmVsYXRpb25zIGF0IHRoZSBpbnRlcmZhY2UgQmFzZVN0cnVjdHVyZS4gIE1pbm9yIGNoYW5nZXMKKy8vIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBzb21lIG1ldGhvZHMuICBBZGQgZGVzY3JpcHRpb24gZm9yIHRoZSBleGNlcHRpb25zCisvLyBBX0JBRF9QQVJBTUVURVIgYW5kIEFPX1NZU1RFTV9QUk9CTEVNIGF0IHRoZSBtZXRob2QgZ2V0T2N0ZXRTZXEgb2YgdGhlCisvLyBpbnRlcmZhY2UgT0RTUmVhZFRyYW5zZmVyLgorLy8KKy8vIDIwMTItMTEtMjAKKy8vIEZpbmFsIHJlbGVhc2UgT0RTIDUuMy4wCisvLworLy8KKyNpZm5kZWYgb2RzX2lkbAorI2RlZmluZSBvZHNfaWRsCisKK21vZHVsZSBvcmcgeworCisvKioKKyogQVNBTSBzZXJ2aWNlcy4KKyovCittb2R1bGUgYXNhbSB7CisKKy8qKgorKiBBU0FNIE9EUyBzZXJ2aWNlLgorKi8KK21vZHVsZSBvZHMgeworaW50ZXJmYWNlIEFvRmFjdG9yeTsKK2ludGVyZmFjZSBBb1Nlc3Npb247CitpbnRlcmZhY2UgQXBwbGljYXRpb25BdHRyaWJ1dGU7CitpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50OworaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb247CitpbnRlcmZhY2UgQXBwbGljYXRpb25TdHJ1Y3R1cmU7CitpbnRlcmZhY2UgQmFzZUF0dHJpYnV0ZTsKK2ludGVyZmFjZSBCYXNlRWxlbWVudDsKK2ludGVyZmFjZSBCYXNlUmVsYXRpb247CitpbnRlcmZhY2UgQmFzZVN0cnVjdHVyZTsKK2ludGVyZmFjZSBCbG9iOworaW50ZXJmYWNlIENvbHVtbjsKK2ludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQ7CitpbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3I7CitpbnRlcmZhY2UgTWVhc3VyZW1lbnQ7CitpbnRlcmZhY2UgTmFtZUl0ZXJhdG9yOworaW50ZXJmYWNlIE5hbWVWYWx1ZUl0ZXJhdG9yOworaW50ZXJmYWNlIE5hbWVWYWx1ZVVuaXRJdGVyYXRvcjsKK2ludGVyZmFjZSBTTWF0TGluazsKK2ludGVyZmFjZSBTdWJNYXRyaXg7CitpbnRlcmZhY2UgVmFsdWVNYXRyaXg7CitpbnRlcmZhY2UgTmFtZVZhbHVlVW5pdElkSXRlcmF0b3I7CitpbnRlcmZhY2UgQXBwbEVsZW1BY2Nlc3M7CitpbnRlcmZhY2UgUXVlcnlFdmFsdWF0b3I7CitpbnRlcmZhY2UgUXVlcnk7CitpbnRlcmZhY2UgTmFtZVZhbHVlVW5pdFNlcXVlbmNlSXRlcmF0b3I7CitpbnRlcmZhY2UgRW51bWVyYXRpb25EZWZpbml0aW9uOworaW50ZXJmYWNlIEVsZW1SZXN1bHRTZXRFeHRTZXFJdGVyYXRvcjsKK2ludGVyZmFjZSBPRFNGaWxlOworaW50ZXJmYWNlIE9EU1JlYWRUcmFuc2ZlcjsKK2ludGVyZmFjZSBPRFNXcml0ZVRyYW5zZmVyOworCisvKioKKyogVGhlIEFTQU0gT0RTIGVycm9yIHNldmVyaXR5IGZsYWdzLgorKi8KK2VudW0gU2V2ZXJpdHlGbGFnIHsKKyAgIFNVQ0NFU1MsICAgICAvLyBPay4KKyAgIElORk9STUFUSU9OLCAvLyBJbmZvcm1hdGlvbi4KKyAgIFdBUk5JTkcsICAgICAvLyBXYXJuaW5nLgorICAgRVJST1IgICAgICAgIC8vIEVycm9yLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyByZWxhdGlvbiB0eXBlcy4KKyovCitlbnVtIFJlbGF0aW9uVHlwZSB7CisgICBGQVRIRVJfQ0hJTEQsIC8vIEZhdGhlci1jaGlsZCByZWxhdGlvbi4KKyAgIElORk8sICAgICAgICAgLy8gSW5mbyByZWxhdGlvbi4KKyAgIElOSEVSSVRBTkNFICAgLy8gSW5oZXJpdGFuY2UgcmVsYXRpb24uCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIHJlbGF0aW9uc2hpcHMuCisqLworZW51bSBSZWxhdGlvbnNoaXAgeworICAgRkFUSEVSLCAgICAvLyBGYXRoZXIuCisgICBDSElMRCwgICAgIC8vIENoaWxkLgorICAgSU5GT19UTywgICAvLyBEaXJlY3RlZCBpbmZvcm1hdGlvbmFsIHJlbGF0aW9uc2hpcC4KKyAgIElORk9fRlJPTSwgLy8gRGlyZWN0ZWQgaW5mb3JtYXRpb25hbCByZWxhdGlvbnNoaXAuCisgICBJTkZPX1JFTCwgIC8vIEluZm9ybWF0aW9uYWwgcmVsYXRpb25zaGlwIChubyBkaXJlY3Rpb24pCisgICBTVVBFUlRZUEUsIC8vIEluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcDogc3VwZXJ0eXBlLgorICAgU1VCVFlQRSwgICAvLyBJbmhlcml0YW5jZSByZWxhdGlvbnNoaXA6IHN1YnR5cGUuCisgICBBTExfUkVMICAgIC8vIEFueSBvZiB0aGUgcmVsYXRpb25zaGlwcyBhYm92ZS4KK307CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgZGF0YSB0eXBlcy4KKyogICAgRFRfeHh4ICBCYXNpYyBkYXRhIHR5cGVzLgorKiAgICBEU194eHggIFNlcXVlbmNlIG9mIGJhc2ljIGRhdGEgdHlwZS4KKyogICAgfHwKKyogICAgfCstIFQgPT0gVHlwZSwgUyA9PSBTZXF1ZW5jZXMuCisqICAgICstLSBEID09IERhdGF0eXBlLgorKi8KK2VudW0gRGF0YVR5cGUgeworICAgRFRfVU5LTk9XTiwgICAgICAgICAgIC8vIFVua25vd24gZGF0YXR5cGUuCisgICBEVF9TVFJJTkcsICAgICAgICAgICAgLy8gU3RyaW5nLgorICAgRFRfU0hPUlQsICAgICAgICAgICAgIC8vIFNob3J0IHZhbHVlICgxNiBiaXQpLgorICAgRFRfRkxPQVQsICAgICAgICAgICAgIC8vIEZsb2F0IHZhbHVlICgzMiBiaXQpLgorICAgRFRfQk9PTEVBTiwgICAgICAgICAgIC8vIEJvb2xlYW4gdmFsdWUuCisgICBEVF9CWVRFLCAgICAgICAgICAgICAgLy8gQnl0ZSB2YWx1ZSAoOCBiaXQpLgorICAgRFRfTE9ORywgICAgICAgICAgICAgIC8vIExvbmcgdmFsdWUgKDMyIGJpdCkuCisgICBEVF9ET1VCTEUsICAgICAgICAgICAgLy8gRG91YmxlIHByZWNpc2lvbiBmbG9hdCB2YWx1ZSAoNjQgYml0KS4KKyAgIERUX0xPTkdMT05HLCAgICAgICAgICAvLyBMb25nTG9uZyB2YWx1ZSAoNjQgYml0KS4KKyAgIERUX0lELCAgICAgICAgICAgICAgICAvLyBMb25nTG9uZyB2YWx1ZSAoNjQgYml0KS4gTm90IHVzZWQuIERUX0xPTkdMT05HIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBpbnN0ZWFkLgorICAgRFRfREFURSwgICAgICAgICAgICAgIC8vIERhdGUuIE1lYW5pbmc6IFlZWVlNTUREaGhtbXNzbGxsY2Njbm5uLi4uLiAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZWVlZID0geWVhciwgcmVxdWlyZWQuICAgLSBNTSA9IG1vbnRoLCBvcHRpb25hbC4gIAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC0gREQgPSAgZGF5LCBvcHRpb25hbC4gICAtIGhoID0gIGhvdXIsIG9wdGlvbmFsLiAgCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLSBtbSA9ICBtaW51dGUsIG9wdGlvbmFsLiAgIC0gc3MgPSAgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsLiAgIC0gbGxsID0gIG1pbGxpc2VjLCBvcHRpb25hbCwgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGJ5IE9yYWNsZSB0aW1lc3RhbXAuICAgLSBjY2MgPSAgbWljcm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbCwgbm90IHN1cHBvcnRlZCBieSBPcmFjbGUgdGltZXN0YW1wLiAgIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubm4gPSAgbmFub3NlYywgb3B0aW9uYWwsIG5vdCBzdXBwb3J0ZWQgYnkgT3JhY2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGltZXN0YW1wLgorICAgRFRfQllURVNUUiwgICAgICAgICAgIC8vIEJ5dGVzdHJlYW0uCisgICBEVF9CTE9CLCAgICAgICAgICAgICAgLy8gQmxvYi4KKyAgIERUX0NPTVBMRVgsICAgICAgICAgICAvLyBDb21wbGV4IHZhbHVlICgzMiBiaXQgZWFjaCBwYXJ0KS4KKyAgIERUX0RDT01QTEVYLCAgICAgICAgICAvLyBDb21wbGV4IHZhbHVlICg2NCBiaXQgZWFjaCBwYXJ0KS4KKyAgIERTX1NUUklORywgICAgICAgICAgICAvLyBTdHJpbmcgc2VxdWVuY2UuCisgICBEU19TSE9SVCwgICAgICAgICAgICAgLy8gU2hvcnQgc2VxdWVuY2UuCisgICBEU19GTE9BVCwgICAgICAgICAgICAgLy8gRmxvYXQgc2VxdWVuY2UuCisgICBEU19CT09MRUFOLCAgICAgICAgICAgLy8gQm9vbGVhbiBzZXF1ZW5lLgorICAgRFNfQllURSwgICAgICAgICAgICAgIC8vIEJ5dGUgc2VxdWVuY2UuCisgICBEU19MT05HLCAgICAgICAgICAgICAgLy8gTG9uZyBzZXF1ZW5jZS4KKyAgIERTX0RPVUJMRSwgICAgICAgICAgICAvLyBEb3VibGUgc2VxdWVuY2UuCisgICBEU19MT05HTE9ORywgICAgICAgICAgLy8gTG9uZ2xvbmcgc2VxdWVuY2UuCisgICBEU19DT01QTEVYLCAgICAgICAgICAgLy8gQ29tcGxleCBzZXF1ZW5jZS4KKyAgIERTX0RDT01QTEVYLCAgICAgICAgICAvLyBEb3VibGUgY29tcGxleCBzZXF1ZW5jZS4KKyAgIERTX0lELCAgICAgICAgICAgICAgICAvLyBMb25nTG9uZyBzZXF1ZW5jZS4gTm90IHVzZWQuIERTX0xPTkdMT05HIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkLgorICAgRFNfREFURSwgICAgICAgICAgICAgIC8vIERhdGUgc2VxdWVuY2UuCisgICBEU19CWVRFU1RSLCAgICAgICAgICAgLy8gQnl0ZXN0cmVhbSBzZXF1ZW5jZS4KKyAgIERUX0VYVEVSTkFMUkVGRVJFTkNFLCAvLyBFeHRlcm5hbCByZWZlcmVuY2UuCisgICBEU19FWFRFUk5BTFJFRkVSRU5DRSwgLy8gU2VxdWVuY2Ugb2YgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgRFRfRU5VTSwgICAgICAgICAgICAgIC8vIFRoZSBlbnVtZXJhdGlvbiBkYXRhdHlwZS4KKyAgIERTX0VOVU0gICAgICAgICAgICAgICAvLyBUaGUgZW51bWVyYXRpb24gc2VxdWVuY2UgZGF0YXR5cGUuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIGJ1aWxkLXVwIGZ1bmN0aW9uIGNvZGVzIGZvciBtZWFzdXJlbWVudCB2aWV3cy4KKyovCitlbnVtIEJ1aWxkVXBGdW5jdGlvbiB7CisgICBCVVBfSk9JTiwgIC8vIEpvaW4gdGhlIGNvbHVtbnMKKyAgIEJVUF9NRVJHRSwgLy8gTWVyZ2UgdGhlIGNvbHVtbnMKKyAgIEJVUF9TT1JUICAgLy8gU29ydCB0aGUgY29sdW1ucworfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBhdHRyaWJ1dGUgdHlwZSBjb2Rlcy4KKyovCitlbnVtIEF0dHJUeXBlIHsKKyAgIEFQUExBVFRSX09OTFksIC8vIFJlcG9ydCBvbmx5IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMuCisgICBJTlNUQVRUUl9PTkxZLCAvLyBSZXBvcnQgb25seSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgorICAgQUxMICAgICAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIHR5cGVzIGZvciBzZXR0aW5nIHZhbHVlcy4KKyovCitlbnVtIFNldFR5cGUgeworICAgQVBQRU5ELCAvLyBBcHBlbmQgZGF0YSB0byB0aGUgdmFsdWUgbWF0cml4LgorICAgSU5TRVJULCAvLyBJbnNlcnQgZGF0YSBpbnRvIHRoZSB2YWx1ZSBtYXRyaXguCisgICBVUERBVEUsIC8vIE1vZGlmeSBleGlzdGluZyBkYXRhIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICBSRU1PVkUgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIGVycm9yIGNvZGVzLgorKi8KK2VudW0gRXJyb3JDb2RlIHsKKyAgIEFPX1VOS05PV05fRVJST1IsCisgICBBT19BQ0NFU1NfREVOSUVELAorICAgQU9fQkFEX09QRVJBVElPTiwKKyAgIEFPX0JBRF9QQVJBTUVURVIsCisgICBBT19DT05ORUNUX0ZBSUxFRCwKKyAgIEFPX0NPTk5FQ1RfUkVGVVNFRCwKKyAgIEFPX0NPTk5FQ1RJT05fTE9TVCwKKyAgIEFPX0RVUExJQ0FURV9CQVNFX0FUVFJJQlVURSwKKyAgIEFPX0RVUExJQ0FURV9OQU1FLAorICAgQU9fRFVQTElDQVRFX1ZBTFVFLAorICAgQU9fSEFTX0lOU1RBTkNFUywKKyAgIEFPX0hBU19SRUZFUkVOQ0VTLAorICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTSwKKyAgIEFPX0lOQ09NUEFUSUJMRV9VTklUUywKKyAgIEFPX0lOVkFMSURfQVNBTV9QQVRILAorICAgQU9fSU5WQUxJRF9BVFRSSUJVVEVfVFlQRSwKKyAgIEFPX0lOVkFMSURfQkFTRV9FTEVNRU5ULAorICAgQU9fSU5WQUxJRF9CQVNFVFlQRSwKKyAgIEFPX0lOVkFMSURfQlVJTERVUF9GVU5DVElPTiwKKyAgIEFPX0lOVkFMSURfQ09MVU1OLAorICAgQU9fSU5WQUxJRF9DT1VOVCwKKyAgIEFPX0lOVkFMSURfREFUQVRZUEUsCisgICBBT19JTlZBTElEX0VMRU1FTlQsCisgICBBT19JTlZBTElEX0xFTkdUSCwKKyAgIEFPX0lOVkFMSURfT1JESU5BTE5VTUJFUiwKKyAgIEFPX0lOVkFMSURfUkVMQVRJT04sCisgICBBT19JTlZBTElEX1JFTEFUSU9OX1JBTkdFLAorICAgQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFLAorICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAsCisgICBBT19JTlZBTElEX1NFVF9UWVBFLAorICAgQU9fSU5WQUxJRF9TTUFUTElOSywKKyAgIEFPX0lOVkFMSURfU1VCTUFUUklYLAorICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUsCisgICBBT19JU19CQVNFX1JFTEFUSU9OLAorICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYLAorICAgQU9fTUFUSF9FUlJPUiwKKyAgIEFPX01JU1NJTkdfQVBQTElDQVRJT05fRUxFTUVOVCwKKyAgIEFPX01JU1NJTkdfQVRUUklCVVRFLAorICAgQU9fTUlTU0lOR19SRUxBVElPTiwKKyAgIEFPX01JU1NJTkdfVkFMVUUsCisgICBBT19OT19NRU1PUlksCisgICBBT19OT19QQVRIX1RPX0VMRU1FTlQsCisgICBBT19OT1RfRk9VTkQsCisgICBBT19OT1RfSU1QTEVNRU5URUQsCisgICBBT19OT1RfVU5JUVVFLAorICAgQU9fT1BFTl9NT0RFX05PVF9TVVBQT1JURUQsCisgICBBT19TRVNTSU9OX0xJTUlUX1JFQUNIRUQsCisgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUsCisgICBBT19UUkFOU0FDVElPTl9BTFJFQURZX0FDVElWRSwKKyAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUsCisgICBBT19IQVNfQkFTRV9SRUxBVElPTiwKKyAgIEFPX0hBU19CQVNFX0FUVFJJQlVURSwKKyAgIEFPX1VOS05PV05fVU5JVCwKKyAgIEFPX05PX1NDQUxJTkdfQ09MVU1OLAorICAgQU9fUVVFUllfVFlQRV9JTlZBTElELAorICAgQU9fUVVFUllfSU5WQUxJRCwKKyAgIEFPX1FVRVJZX1BST0NFU1NJTkdfRVJST1IsCisgICBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVELAorICAgQU9fUVVFUllfSU5DT01QTEVURSwKKyAgIEFPX1FVRVJZX0lOVkFMSURfUkVTVUxUVFlQRSwKKyAgIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFLAorICAgQU9fRklMRV9MT0NLRUQsCisgICBBT19TWVNURU1fUFJPQkxFTQorfTsKKworLyoqCisqIFRoZSBzZWxlY3Rpb24gb3BlcmF0b3JzLiAgU2VsT3Bjb2RlIGdpdmVzIHF1ZXJ5IGluc3RydWN0aW9ucyBsaWtlCisqICJlcXVhbCIsICJncmVhdGVyIiBldGMuIFNvIGZhciwgdGhlc2UgYXJndW1lbnRzIHdlcmUgY2FzZSBzZW5zaXRpdmUuCisqIFRoZXJlIHdhcyBhIGRlbWFuZCB0byBhZGQgdGhlc2UgYXJndW1lbnRzIGFsc28gZm9yIGNhc2UgaW5zZW5zaXRpdmUKKyogY29tcGFyaXNvbiBvcGVyYXRpb25zLiBUaGVyZWZvcmUsIHRoZSBTZWxPcGNvZGVzIGZvciBjYXNlIGluc2Vuc2l0aXZpdHkKKyogd2VyZSBhZGRlZC4gVGhlc2UgYXJndW1lbnRzIGhhdmUgdGhlIHByZWZpeCCTQ0lflC4KKyovCitlbnVtIFNlbE9wY29kZSB7CisgICBFUSwgICAgICAgICAgLy8gRXF1YWwKKyAgIE5FUSwgICAgICAgICAvLyBOb3QgZXF1YWwKKyAgIExULCAgICAgICAgICAvLyBMZXNzIHRoZW4KKyAgIEdULCAgICAgICAgICAvLyBHcmVhdGVyIHRoZW4KKyAgIExURSwgICAgICAgICAvLyBMZXNzIHRoZW4gZXF1YWwKKyAgIEdURSwgICAgICAgICAvLyBHcmVhdGVyIHRoZW4gZXF1YWwKKyAgIElOU0VULCAgICAgICAvLyBJbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLgorICAgTk9USU5TRVQsICAgIC8vIE5vdCBpbiBzZXQsIHZhbHVlIGNhbiBiZSBhIHNlcXVlbmNlLgorICAgTElLRSwgICAgICAgIC8vIGxpa2UsIHVzZSAgcGF0dGVybiBtYXRjaGluZywgc2VlIFBhdHRlcm4gZm9yIHRoZSB3aWxkY2FyZAorICAgICAgICAgICAgICAgIC8vIGRlZmluaXRpb25zLgorICAgQ0lfRVEsICAgICAgIC8vIEVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9ORVEsICAgICAgLy8gTm90IGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9MVCwgICAgICAgLy8gTGVzcyB0aGVuLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9HVCwgICAgICAgLy8gR3JlYXRlciB0aGVuLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9MVEUsICAgICAgLy8gTGVzcyB0aGVuIGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9HVEUsICAgICAgLy8gR3JlYXRlciB0aGVuIGVxdWFsLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBDSV9JTlNFVCwgICAgLy8gSW4gc2V0LCB2YWx1ZSBjYW4gYmUgYSBzZXF1ZW5jZS4gY2FzZSBpbnNlbnNpdGl2ZSBmb3IKKyAgICAgICAgICAgICAgICAvLyBEVF9TVFJJTkcuCisgICBDSV9OT1RJTlNFVCwgLy8gTm90IGluIHNldCwgdmFsdWUgY2FuIGJlIGEgc2VxdWVuY2UuIGNhc2UgaW5zZW5zaXRpdmUgZm9yCisgICAgICAgICAgICAgICAgLy8gRFRfU1RSSU5HLgorICAgQ0lfTElLRSwgICAgIC8vIGxpa2UsIHVzZSAgcGF0dGVybiBtYXRjaGluZywgc2VlIFBhdHRlcm4gZm9yIHRoZSB3aWxkY2FyZAorICAgICAgICAgICAgICAgIC8vIGRlZmluaXRpb25zLiBjYXNlIGluc2Vuc2l0aXZlIGZvciBEVF9TVFJJTkcuCisgICBJU19OVUxMLCAgICAgLy8gVmFsdWUgaXMgTlVMTAorICAgSVNfTk9UX05VTEwsIC8vIFZhbHVlIGlzIG5vdCBOVUxMCisgICBOT1RMSUtFLCAgICAgLy8gTm90IExJS0UKKyAgIENJX05PVExJS0UsICAvLyBOb3QgTElLRSwgY2FzZSBpbnNlbnNpdGl2ZSBmb3IgRFRfU1RSSU5HLgorICAgQkVUV0VFTiAgICAgIC8vIEJldHdlZW47IHNlbGVjdHMgYWxsIGluc3RhbmNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgJ2F0dHInCisgICAgICAgICAgICAgICAgLy8gbGllcyBiZXR3ZWVuIHRoZSBmaXJzdCB0d28gdmFsdWVzIGdpdmVuIGluICd2YWx1ZScgKHdpdGgKKyAgICAgICAgICAgICAgICAvLyAnYXR0cicsICd2YWx1ZScgYmVpbmcgZWxlbWVudHMgb2YgdGhlIFNlbFZhbHVlIHN0cnVjdHVyZTsKKyAgICAgICAgICAgICAgICAvLyAndmFsdWUnIG11c3QgYmUgb2YgZGF0YSB0eXBlIFNfKikuCit9OworCisvKioKKyogT3BlcmF0b3IsIGJyYWNrZXQgb3BlbiBhbmQgY2xvc2UuCisqLworZW51bSBTZWxPcGVyYXRvciB7CisgICBBTkQsICAgLy8gQU5EIHRoZSB0d28gY29uZGl0aW9ucy4KKyAgIE9SLCAgICAvLyBPUiB0aGUgdHdvIGNvbmRpdGlvbnMuCisgICBOT1QsICAgLy8gTmVnYXRlIHRoZSBuZXh0IGNvbmRpdGlvbi4KKyAgIE9QRU4sICAvLyBPcGVuIGJyYWNrZXRzLgorICAgQ0xPU0UgIC8vIENsb3NlIGJyYWNrZXRzCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIHR5cGVzIGZvciBzZXR0aW5nIGFjY2VzcyByaWdodHMuCisqLworZW51bSBSaWdodHNTZXQgeworICAgU0VUX1JJR0hULCAgICAvLyBTZXQgdGhlIGdpdmVuIHJpZ2h0cywgb3ZlcndyaXRlIHRoZSBleGlzdGluZyByaWdodHMuCisgICBBRERfUklHSFQsICAgIC8vIEFkZCB0aGUgZ2l2ZW4gcmlnaHRzIHRvIHRoZSBleGlzdGluZyByaWdodHMuCisgICBSRU1PVkVfUklHSFQgIC8vIFJlbW92ZSB0aGUgZ2l2ZW4gcmlnaHRzIGZvcm0gdGhlIGV4aXN0aW5nIHJpZ2h0cy4KK307CisKKy8qKgorKiBTdGF0dXMgb2YgdGhlIHF1ZXJ5IGV4ZWN1dGlvbi4KKyovCitlbnVtIFF1ZXJ5U3RhdHVzIHsKKyAgIENPTVBMRVRFLCAgIC8vIFRoZSBleGVjdXRpb24gaXMgcmVhZHkuCisgICBJTkNPTVBMRVRFICAvLyBUaGUgZXhlY3V0aW9uIGlzIHN0aWxsIHJ1bm5pbmcuCit9OworCisvKioKKyogVGhlIHN1cHBvcnRlZCBhZ2dyZWdhdGUgZnVuY3Rpb25zIG9mIHRoZSBHZXRJbnN0YW5jZXNFeHQuCisqLworZW51bSBBZ2dyRnVuYyB7CisgICBOT05FLCAgICAgLy8gTm8gYWdncmVnYXRlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIGF0dHJpYnV0ZS4KKyAgIENPVU5ULCAgICAvLyBDb3VudAorICAgRENPVU5ULCAgIC8vIERpc3RpbmN0IGNvdW50CisgICBNSU4sICAgICAgLy8gTWluOyBvbmx5IGZvciBudW1lcmljYWwgdmFsdWVzCisgICBNQVgsICAgICAgLy8gTWF4OyBvbmx5IGZvciBudW1lcmljYWwgdmFsdWVzCisgICBBVkcsICAgICAgLy8gQXZlcmFnZTsgb25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcworICAgU1REREVWLCAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbjsgb25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcworICAgU1VNLCAgICAgIC8vIFN1bTsgb25seSBmb3IgbnVtZXJpY2FsIHZhbHVlcworICAgRElTVElOQ1QsIC8vIERpc3RpbmN0CisgICBQT0lOVCAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSB2YWx1ZXMsIG9ubHkgdXNlZCBieSB0aGUgYXR0cmlidXRlIHZhbHVlcyBvZgorICAgICAgICAgICAgIC8vIGVsZW1lbnQgQW9Mb2NhbENvbHVtbgorfTsKKworLyoqCisqIFRoZSBzZWxlY3Rpb24gdHlwZS4KKyovCitlbnVtIFNlbFR5cGUgeworICAgU0VMX1ZBTFVFX1RZUEUsICAgIC8vIFNlbGVjdGlvbiB2YWx1ZS4KKyAgIFNFTF9PUEVSQVRPUl9UWVBFICAvLyBTZWxlY3Rpb24gbG9naWNhbCBvcGVyYXRvci4KK307CisKKy8qKgorKiBUaGUgdHlwZSBvZiB0aGUgam9pbi4KKyovCitlbnVtIEpvaW5UeXBlIHsKKyAgIEpUREVGQVVMVCwgLy8gRm9yY2UgaW5uZXIgam9pbi4KKyAgIEpUT1VURVIgICAgLy8gRm9yY2Ugb3V0ZXIgam9pbiBvbiBkZXN0aW5hdGlvbiBBSUQuCit9OworCisvKioKKyogVGhlIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyovCitlbnVtIFZhbHVlTWF0cml4TW9kZSB7CisgICBDQUxDVUxBVEVELCAvLyBUaGUgdmFsdWUgbWF0cml4IHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWVzLiAgIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgICAgIC8vIG9mIGV4cGxpY2l0IGNvbHVtbnMgYXJlIHJldHVybmVkIGFzIHRoZXkgYXJlIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgIC8vIHBoeXNpY2FsIHN0b3JhZ2UuICAgVGhlIHZhbHVlcyBvZiBpbXBsaWNpdCBjb2x1bW5zIGFyZQorICAgICAgICAgICAgICAgLy8gZXhwYW5kZWQgYW5kIHJldHVybmVkIGV4cGxpY2l0bHkuICBUaGUgdmFsdWVzIG9mIHJhdyBjb2x1bW5zCisgICAgICAgICAgICAgICAvLyBhcmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYWxnb3JpdGhtCisgICAgICAgICAgICAgICAvLyAodXNpbmcgdGhlIGNhbGN1bGF0aW9uIGFsZ29yaXRobXMgZ2l2ZW4gYnkgdGhlIHZhbHVlcyBvZiB0aGUKKyAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgIC8vICdzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbicgYW5kICdnZW5lcmF0aW9uX3BhcmFtZXRlcnMnKSBhbmQKKyAgICAgICAgICAgICAgIC8vIHRoZSByZXN1bHRpbmcgcGh5c2ljYWwgdmFsdWVzIGFyZSByZXR1cm5lZC4gIFdyaXRpbmcgdG8gdGhlCisgICAgICAgICAgICAgICAvLyB2YWx1ZSBtYXRyaXggaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBtb2RlLgorICAgU1RPUkFHRSAgICAgLy8gVGhlIHZhbHVlIG1hdHJpeCByZXR1cm5zIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIHBoeXNpY2FsCisgICAgICAgICAgICAgICAvLyBzdG9yYWdlLiAgVGhlIHZhbHVlcyBvZiBleHBsaWNpdCBjb2x1bW5zIGFyZSByZXR1cm5lZCBhcworICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgc3RvcmVkIGluIHRoZSBwaHlzaWNhbCBzdG9yYWdlLiAgVGhlIHZhbHVlcyBvZgorICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgY29sdW1ucyBhcmUgZXhwYW5kZWQgYW5kIHJldHVybmVkIGV4cGxpY2l0bHkuICBUaGUKKyAgICAgICAgICAgICAgIC8vIHZhbHVlcyBvZiByYXcgY29sdW1ucyBhcmUgcmV0dXJuZWQgYXMgdGhleSBhcmUgc3RvcmVkCisgICAgICAgICAgICAgICAvLyAod2l0aG91dCB1c2luZyB0aGUgY2FsY3VsYXRpb24gYWxnb3JpdGhtcyBnaXZlbiBieSB0aGUKKyAgICAgICAgICAgICAgIC8vIHZhbHVlcyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlcyBkZXJpdmVkIGZyb20gdGhlIGJhc2UKKyAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMgJ3NlcXVlbmNlX3JlcHJlc2VudGF0aW9uJyBhbmQKKyAgICAgICAgICAgICAgIC8vICdnZW5lcmF0aW9uX3BhcmFtZXRlcnMnKS4gIFdyaXRpbmcgdG8gdmFsdWUgbWF0cml4IGlzCisgICAgICAgICAgICAgICAvLyBhbGxvd2VkIGluIHRoaXMgbW9kZS4KK307CisKKy8vIERhdGF0eXBlIGRlZmluaXRpb25zIChUX3h4eCkuCit0eXBlZGVmIHN0cmluZyAgICAgVF9TVFJJTkc7Cit0eXBlZGVmIGJvb2xlYW4gICAgVF9CT09MRUFOOwordHlwZWRlZiBzaG9ydCAgICAgIFRfU0hPUlQ7Cit0eXBlZGVmIGZsb2F0ICAgICAgVF9GTE9BVDsKK3R5cGVkZWYgb2N0ZXQgICAgICBUX0JZVEU7Cit0eXBlZGVmIGxvbmcgICAgICAgVF9MT05HOwordHlwZWRlZiBkb3VibGUgICAgIFRfRE9VQkxFOwordHlwZWRlZiBUX1NUUklORyAgIE5hbWU7Cit0eXBlZGVmIFRfU1RSSU5HICAgUGF0dGVybjsKK3R5cGVkZWYgVF9TVFJJTkcgICBCYXNlVHlwZTsKK3R5cGVkZWYgVF9TVFJJTkcgICBUX0RBVEU7Cit0eXBlZGVmIEJsb2IgICAgICAgVF9CTE9COworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxUX0JZVEU+IFRfQllURVNUUjsKK3R5cGVkZWYgc2VxdWVuY2U8VF9CT09MRUFOPiBTX0JPT0xFQU47Cit0eXBlZGVmIHNlcXVlbmNlPFRfQllURT4gU19CWVRFOwordHlwZWRlZiBzZXF1ZW5jZTxUX0RPVUJMRT4gU19ET1VCTEU7Cit0eXBlZGVmIHNlcXVlbmNlPFRfRkxPQVQ+IFNfRkxPQVQ7Cit0eXBlZGVmIHNlcXVlbmNlPFRfTE9ORz4gU19MT05HOwordHlwZWRlZiBzZXF1ZW5jZTxUX1NIT1JUPiBTX1NIT1JUOwordHlwZWRlZiBzZXF1ZW5jZTxUX1NUUklORz4gU19TVFJJTkc7Cit0eXBlZGVmIHNlcXVlbmNlPEJhc2VUeXBlPiBCYXNlVHlwZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxOYW1lPiBOYW1lU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPENvbHVtbj4gQ29sdW1uU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPFNNYXRMaW5rPiBTTWF0TGlua1NlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTdWJNYXRyaXg+IFN1Yk1hdHJpeFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxUX0RBVEU+IFNfREFURTsKK3R5cGVkZWYgc2VxdWVuY2U8VF9CWVRFU1RSPiBTX0JZVEVTVFI7Cit0eXBlZGVmIHNlcXVlbmNlPFNfU1RSSU5HPiBTU19TVFJJTkc7Cit0eXBlZGVmIHNlcXVlbmNlPFNfU0hPUlQ+IFNTX1NIT1JUOwordHlwZWRlZiBzZXF1ZW5jZTxTX0ZMT0FUPiBTU19GTE9BVDsKK3R5cGVkZWYgc2VxdWVuY2U8U19CT09MRUFOPiBTU19CT09MRUFOOwordHlwZWRlZiBzZXF1ZW5jZTxTX0JZVEU+IFNTX0JZVEU7Cit0eXBlZGVmIHNlcXVlbmNlPFNfTE9ORz4gU1NfTE9ORzsKK3R5cGVkZWYgc2VxdWVuY2U8U19ET1VCTEU+IFNTX0RPVUJMRTsKK3R5cGVkZWYgc2VxdWVuY2U8U19EQVRFPiBTU19EQVRFOwordHlwZWRlZiBzZXF1ZW5jZTxTX0JZVEVTVFI+IFNTX0JZVEVTVFI7Cit0eXBlZGVmIHNlcXVlbmNlPFRfQkxPQj4gU19CTE9COwordHlwZWRlZiBzZXF1ZW5jZTxBcHBsaWNhdGlvbkVsZW1lbnQ+IEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxBcHBsaWNhdGlvblJlbGF0aW9uPiBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEFwcGxpY2F0aW9uQXR0cmlidXRlPiBBcHBsaWNhdGlvbkF0dHJpYnV0ZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxCYXNlUmVsYXRpb24+IEJhc2VSZWxhdGlvblNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxCYXNlQXR0cmlidXRlPiBCYXNlQXR0cmlidXRlU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEJhc2VFbGVtZW50PiBCYXNlRWxlbWVudFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxJbnN0YW5jZUVsZW1lbnQ+IEluc3RhbmNlRWxlbWVudFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTZWxPcGVyYXRvcj4gU2VsT3BlcmF0b3JTZXF1ZW5jZTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyByZWxhdGlvbiByYW5nZSBzdHJ1Y3R1cmUuCisqLworc3RydWN0IFJlbGF0aW9uUmFuZ2UgeworICAgVF9TSE9SVCBtaW47IC8vIFRoZSBtaW5pbXVtIG51bWJlciBpbiB0aGUgcmFuZ2UuCisgICBUX1NIT1JUIG1heDsgLy8gVGhlIG1heGltdW0gbnVtYmVyIGluIHRoZSByYW5nZS4gLTEgbWVhbnMgTUFOWSB3aXRob3V0IGEKKyAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgbWF4aW11bSBudW1iZXIuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIDY0IGJpdCBpbnRlZ2VyIHN0cnVjdHVyZS4gIFRoaXMgdHlwZSBpcyByZXByZXNlbnRlZCBpbiB0aGUKKyogZGF0YXR5cGUgZW51bWVyYXRpb24gYnkgRFRfTE9OR0xPTkcuCisqLworc3RydWN0IFRfTE9OR0xPTkcgeworICAgVF9MT05HIGhpZ2g7IC8vIFRoZSBtb3N0IHNpZ25pZmljYW50IDMyIGJpdHMgb2YgdGhlIDY0IGJpdCB2YWx1ZS4KKyAgIFRfTE9ORyBsb3c7ICAvLyBUaGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzIgYml0cyBvZiB0aGUgNjQgYml0IHZhbHVlLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBjb21wbGV4IGRhdGEgc3RydWN0dXJlLiAgVGhpcyB0eXBlIGlzIHJlcHJlc2VudGVkIGluIHRoZQorKiBkYXRhdHlwZSBlbnVtZXJhdGlvbiBieSBEVF9DT01QTEVYLgorKi8KK3N0cnVjdCBUX0NPTVBMRVggeworICAgVF9GTE9BVCByOyAvLyBUaGUgcmVhbCBwYXJ0IG9mIHRoZSBjb21wbGV4IG51bWJlci4KKyAgIFRfRkxPQVQgaTsgLy8gVGhlIGltYWdpbmFyeSBwYXJ0IG9mIHRoZSBjb21wbGV4IG51bWJlci4KK307CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgZG91YmxlLXByZWNpc2lvbiBjb21wbGV4IGRhdGEgc3RydWN0dXJlLiBUaGlzIHR5cGUgaXMKKyogcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGF0eXBlIGVudW1lcmF0aW9uIGJ5IERUX0RDT01QTEVYLgorKi8KK3N0cnVjdCBUX0RDT01QTEVYIHsKKyAgIFRfRE9VQkxFIHI7IC8vIFRoZSByZWFsIHBhcnQgb2YgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29tcGxleCBudW1iZXIuCisgICBUX0RPVUJMRSBpOyAvLyBUaGUgaW1hZ2luYXJ5IHBhcnQgb2YgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29tcGxleCBudW1iZXIuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIG5hbWUtdW5pdCB0dXBsZSBzdHJ1Y3R1cmUuCisqLworc3RydWN0IE5hbWVVbml0IHsKKyAgIE5hbWUgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUX1NUUklORyB1bml0OyAgICAvLyBDb2x1bW4gdW5pdCBhcyBzdHJpbmcuCit9OworCisvKioKKyogVGhlIGRlc2NyaXB0aW9uIG9mIGFuIHJlZmVyZW5jZSBvYmplY3QsIHRoZSByZWZlcmVuY2Ugb2JqZWN0IGNhbiBiZSBhbgorKiBpbnRlcm5hbCBBU0FNIE9EUyBvYmplY3Qgb3IgYW4gZXh0ZXJuYWwgb2JqZWN0LiBUaGlzIHR5cGUgaXMKKyogcmVwcmVzZW50ZWQgaW4gdGhlIGRhdGF0eXBlIGVudW1lcmF0aW9uIGJ5IERUX0VYVEVSTkFMUkVGRVJFTkNFLgorKi8KK3N0cnVjdCBUX0V4dGVybmFsUmVmZXJlbmNlIHsKKyAgIFRfU1RSSU5HIGRlc2NyaXB0aW9uOyAvLyBEZXNjcmlwdGlvbiBvZiB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgVF9TVFJJTkcgbWltZVR5cGU7ICAgIC8vIE1JTUUtdHlwZSBvZiB0aGUgZXh0ZXJuYWwgb2JqZWN0LgorICAgVF9TVFJJTkcgbG9jYXRpb247ICAgIC8vIExvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuIChhc2FtIHBhdGggb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVUkwpCit9OworCisvKioKKyogVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpbmZvcm1hdGlvbiAobWV0YWRhdGEpIGRlZmluaXRpb24uIFRoZSBzYW1lCisqIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQXR0cmlidXRlCisqLworc3RydWN0IEFwcGxBdHRyIHsKKyAgIE5hbWUgICAgICAgYWFOYW1lOyAgICAgICAvLyBUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG5hbWUuIFRoZSBzYW1lIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZXR1cm5lZCBieSB0aGUgbWV0aG9kIGdldE5hbWUoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvbkF0dHJpYnV0ZSBpbnRlcmZhY2UuICAgICBBdCB0aGUgUlBDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhQU5hbWUgb2YgdGhlIHN0cnVjdHVyZSBBdHRyU2VxIGFuZCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPUF9HZXRBdHRyLgorICAgTmFtZSAgICAgICBiYU5hbWU7ICAgICAgIC8vIFRoZSBuYW1lIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZSwgZW1wdHkgKCIiKSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaXMgbm90IGRlcml2ZWQgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhdHRyaWJ1dGUuIFRoZSBzYW1lIG5hbWUgaXMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kcyBnZXROYW1lKCkgb2YgdGhlIEJhc2VBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UuIFRoZSBiYXNlIGF0dHJpYnV0ZSBpcyBnaXZlbiBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kIGdldEJhc2VBdHRyaWJ1dGUoKSBvZiB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25BdHRyaWJ1dGUuICAgICBBdCB0aGUgUlBDIEFQSSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGQgYUJOYW1lIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN0cnVjdHVyZSBBdHRyU2VxIGFuZCB0aGUgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPUF9HZXRBdHRyLgorICAgRGF0YVR5cGUgICBkVHlwZTsgICAgICAgIC8vIFRoZSBhdHRyaWJ1dGUgZGF0YSB0eXBlLiBUaGUgc2FtZSBkYXRhIHR5cGUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlbiBieSB0aGUgbWV0aG9kIGdldERhdGFUeXBlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBBcHBsaWNhdGlvbkF0dHJpYnV0ZS4gICAgIEF0IHRoZSBSUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFEYXRhVHlwZSBvZiB0aGUgc3RydWN0dXJlIEF0dHJTZXEgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgQU9QX0dldEF0dHIuCisgICBUX0xPTkcgICAgIGxlbmd0aDsgICAgICAgLy8gVGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoIG9mIHZhbHVlcy4gVGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZW5ndGggaXMgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZCBnZXRMZW5ndGgoKSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnRlcmZhY2UgQXBwbGljYXRpb25BdHRyaWJ1dGUuCisgICBUX0JPT0xFQU4gIGlzT2JsaWdhdG9yeTsgLy8gVGhlIGluZGljYXRvciBmb3IgbWFuZGF0b3J5IGF0dHJpYnV0ZXMsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdE51bGwgaW5kaWNhdG9yIGlzIHNldCBhdCB0aGUgY29sdW1uIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGluIHRoZSBwaHlzaWNhbCBzdG9yYWdlLiAgVGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib29sZWFuIGlzIHJldHVybmVkIGF0IHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc09ibGlnYXRvcnkoKSBvZiB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25BdHRyaWJ1dGUuCisgICBUX0JPT0xFQU4gIGlzVW5pcXVlOyAgICAgLy8gVGhlIGluZGljYXRvciBmb3IgdW5pcXVlIGF0dHJpYnV0ZXMuIFRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm9vbGVhbiBpcyByZXR1cm5lZCBieSB0aGUgbWV0aG9kIGlzVW5pcXVlKCkgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uQXR0cmlidXRlLgorICAgVF9MT05HTE9ORyB1bml0SWQ7ICAgICAgIC8vIElkIG9mIHRoZSB1bml0IGlmIGdsb2JhbCBkZWZpbmVkLiBUaGUgc2FtZSBJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHJldHVybmVkIGJ5IHRoZSBtZXRob2QgZ2V0VW5pdCgpIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBBcHBsaWNhdGlvbkF0dHJpYnV0ZS4gICAgIEF0IHRoZSBSUEMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFVbml0IG9mIHRoZSBzdHJ1Y3R1cmUgQXR0clNlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT1BfR2V0QXR0ci4KK307CisKKy8qKgorKiBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24gaW5mbyBzdHJ1Y3R1cmUuIFRoZSBzYW1lIGluZm9ybWF0aW9uIGlzCisqIGF2YWlsYWJsZSBhdCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uIAorKiAKKyogQSByZWxhdGlvbiBpcyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIHR3byBBU0FNIE9EUyBlbGVtZW50czsgaXQgbWF5IGJlCisqIG5hdmlnYXRlZCBpbiBib3RoCisqIGRpcmVjdGlvbnMuIFRoZSBnZXQtIGFuZCBzZXQtIG1ldGhvZHMgYXJlIGRlZmluZWQgZnJvbSB0aGUgZmlyc3QKKyogZWxlbWVudCwgdGhlIGdldEludmVyc2UtIGFuZAorKiBzZXRJbnZlcnNlLSBtZXRob2RzIHdvcmsgZnJvbSB0aGUgc2Vjb25kIGVsZW1lbnQuCisqLworc3RydWN0IEFwcGxSZWwgeworICAgVF9MT05HTE9ORyAgICBlbGVtMTsgICAgICAgICAgICAvLyBUaGUgc291cmNlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnaXZlbiBJZCBpcyB0aGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgcmV0dXJuZWQgZnJvbSB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldEVsZW0xKCkgb2YgdGhlIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvblJlbGF0aW9uLiAgICAgQXQgdGhlIFJQQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhckFpZDEgb2YgdGhlIHN0cnVjdHVyZSBBcHBsUmVsU2VxIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBBT1BfR2V0QXBwbEluZi4KKyAgIFRfTE9OR0xPTkcgICAgZWxlbTI7ICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBhcHBsaWNhdGlvbiBlbGVtZW50IElkLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZW4gSWQgaXMgdGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHJldHVybmVkIGZyb20gdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXRFbGVtMigpIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25SZWxhdGlvbi4gICAgIEF0IHRoZSBSUEMgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJBaWQyIG9mIHRoZSBzdHJ1Y3R1cmUgQXBwbFJlbFNlcSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgQU9QX0dldEFwcGxJbmYuCisgICBOYW1lICAgICAgICAgIGFyTmFtZTsgICAgICAgICAgIC8vIFRoZSByZWxhdGlvbiBuYW1lLiBUaGUgbmFtZSBpcyByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgbWV0aG9kIGdldE5hbWUoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uICAgICBBdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIGZpZWxkIGFyTmFtZSBvZiB0aGUgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcGxSZWxTZXEgYW5kIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFPUF9HZXRBcHBsSW5mLgorICAgTmFtZSAgICAgICAgICBpbnZOYW1lOyAgICAgICAgICAvLyBOYW1lIG9mIHRoZSBpbnZlcnNlIHJlbGF0aW9uLiBUaGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyByZXR1cm4gd2l0aCB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldEludmVyc2VOYW1lKCkgb2YgdGhlIGludGVyZmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBsaWNhdGlvblJlbGF0aW9uLiBUaGUgaW52TmFtZSBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGluIHRoZSBwaHlzaWNhbCBzdG9yYWdlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbiBkYXRhYmFzZXMuCisgICBOYW1lICAgICAgICAgIGJyTmFtZTsgICAgICAgICAgIC8vIE5hbWUgb2YgdGhlIGJhc2UgcmVsYXRpb24gZnJvbSB0aGUgZWxlbTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIGVsZW0yLiBUaGUgYmFzZSByZWxhdGlvbiBpcyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBzdG9yZWQgaW4gdGhlIHBoeXNpY2FsIHN0b3JhZ2UuCisgICBOYW1lICAgICAgICAgIGludkJyTmFtZTsgICAgICAgIC8vIE5hbWUgb2YgdGhlIGludmVyc2UgYmFzZSByZWxhdGlvbiBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtMiB0byB0aGUgZWxlbTEuIFRoZSBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uIGlzIGFsc28gbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGh5c2ljYWwgc3RvcmFnZS4KKyAgIFJlbGF0aW9uVHlwZSAgYXJSZWxhdGlvblR5cGU7ICAgLy8gVGhlIHR5cGUgb2YgdGhlIHJlbGF0aW9uLiBUeXBlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbiBpcyBub3Qgc3RvcmVkIGluIHRoZSBwaHlzaWNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLiBUaGUgcmVsYXRpb24gdHlwZSBpcyByZXR1cm4gYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCBnZXRSZWxhdGlvblR5cGUoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uCisgICBSZWxhdGlvblJhbmdlIGFyUmVsYXRpb25SYW5nZTsgIC8vIFRoZSByYW5nZSBvZiB0aGUgcmVsYXRpb24uIFJhbmdlIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxhdGlvbiBpcyBub3Qgc3RvcmVkIGluIHRoZSBwaHlzaWNhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLiBUaGUgcmVsYXRpb24gcmFuZ2UgaXMgcmV0dXJuIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtZXRob2QgZ2V0UmVsYXRpb25SYW5nZSgpIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UgQXBwbGljYXRpb25SZWxhdGlvbi4KKyAgIFJlbGF0aW9uUmFuZ2UgaW52UmVsYXRpb25SYW5nZTsgLy8gVGhlIGludmVyc2UgcmFuZ2Ugb2YgdGhlIHJlbGF0aW9uLiBSYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcmVsYXRpb24gaXMgbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGh5c2ljYWwgc3RvcmFnZS4gVGhlIGludmVyc2UgcmVsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmFuZ2UgaXMgcmV0dXJuIGF0IHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0SW52ZXJzZVJlbGF0aW9uUmFuZ2UoKSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uUmVsYXRpb24uCit9OworCisvKioKKyogQUlEIC0gTmFtZSBwYWlyLgorKi8KK3N0cnVjdCBBSUROYW1lIHsKKyAgIFRfTE9OR0xPTkcgYWlkOyAgICAvLyBUaGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICBOYW1lICAgICAgIGFhTmFtZTsgLy8gVGhlIGF0dHJpYnV0ZSwgb3IgbWVhc3VyZWQgcXVhbnRpdHkgbmFtZS4KK307CisKKy8qKgorKiBJbnN0YW5jZSBlbGVtZW50IElkLiBUaGUgdW5pcXVlIGRlc2NyaXB0aW9uIG9mIGFuIGluc3RhbmNlIGVsZW1lbnQuCisqLworc3RydWN0IEVsZW1JZCB7CisgICBUX0xPTkdMT05HIGFpZDsgLy8gVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgVF9MT05HTE9ORyBpaWQ7IC8vIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KK307CisKKy8qKgorKiBBSUQgLSBOYW1lIC0gVW5pdElkIHR1cGxlLgorKi8KK3N0cnVjdCBBSUROYW1lVW5pdElkIHsKKyAgIEFJRE5hbWUgICAgYXR0cjsgICAvLyBUaGUgYXR0cmlidXRlICBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCAoYWlkLAorICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUpLgorICAgVF9MT05HTE9ORyB1bml0SWQ7IC8vIFRoZSB1bml0IG9mIHRoZSBhdHRyaWJ1dGUgb3IgdGhlIGNvbHVtbi4gVGhlIHVuaXRJZAorICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBJZCBvZiBpbnN0YW5jZSBlbGVtZW50IHdpdGggdGhlIGJhc2V0eXBlCisgICAgICAgICAgICAgICAgICAgICAgLy8gQW9Vbml0LgorfTsKKworLyoqCisqIE9yZGVyIGNyaXRlcmlhLgorKi8KK3N0cnVjdCBTZWxPcmRlciB7CisgICBBSUROYW1lICAgYXR0cjsgICAgICAvLyBBdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbi4KKyAgIFRfQk9PTEVBTiBhc2NlbmRpbmc7IC8vIGFzY2VuZGluZyBvcmRlciwgRkFMU0UgbWVhbnMgZGVzY2VuZGluZy4KK307CisKKy8qKgorKiBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyeS4KKyovCitzdHJ1Y3QgQUNMIHsKKyAgIFRfTE9OR0xPTkcgdXNlcmdyb3VwSWQ7IC8vIFRoZSB1c2VyZ3JvdXAgSWQuCisgICBUX0xPTkcgICAgIHJpZ2h0czsgICAgICAvLyBUaGUgYWNjZXNzIHJpZ2h0cyBvZiB0aGUgcmVxdWVzdGVkIG9iamVjdC4KK307CisKKy8qKgorKiBBbiBpbml0aWFsIHJpZ2h0LgorKi8KK3N0cnVjdCBJbml0aWFsUmlnaHQgeworICAgVF9MT05HICAgICByaWdodHM7ICAgICAgLy8gVGhlIGluaXRpYWwgYWNjZXNzIHJpZ2h0cyBvZiB0aGUgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3QuCisgICBUX0xPTkdMT05HIHVzZXJncm91cElkOyAvLyBUaGUgdXNlcmdyb3VwIElkIG9mIHRoZSBJbml0aWFsIHJpZ2h0IGxpc3QuCisgICBUX0xPTkdMT05HIHJlZkFpZDsgICAgICAvLyBUaGUgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gZWxlbWVudC4KK307CisKKy8qKgorKiBpdJJzIHF1aXRlIHRoZSBzYW1lIHNlcXVlbmNlIGFzIGluIHRoZSBRdWVyeVN0cnVjdHVyZSBvZiBHZXRJbnN0YW5jZXMKKyogd2l0aCBvbmUgZXhjZXB0aW9uLiBJdCBoYXMgb25lIG5ldyBhdHRyaWJ1dGUgY2FsbGVkIGZ1bmN0aW9uLCB3aGljaCBpcworKiBvZiB0aGUgdHlwZSBBZ2dyRnVuYy4gVGhlcmVieSAgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIGFnZ3JlZ2F0ZQorKiBmdW5jdGlvbnMgb24gYXR0cmlidXRlIGxldmVsLCB3aXRob3V0IHRoZSBuZWVkIHRvIHBhcnNlIHRoZSBhdHRyaWJ1dGUKKyogbmFtZSBmb3IgYSBrbm93biBhZ2dyZWdhdGUgZnVuY3Rpb24gbmFtZS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhhdAorKiBhdHRyaWJ1dGUgZnVuY3Rpb24gaXMgTk9ORSwgaXQgc3ltYm9saXplcyB0aGF0IG5vIGFnZ3JlZ2F0ZSBmdW5jdGlvbgorKiBzaG91bGQgYmUgYXBwbGllZCBvbiB0aGF0IGF0dHJpYnV0ZS5JZiBhbiBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgdXNlZCwKKyogaXQgaXMgYWxzbyByZXF1aXJlZCB0byBkZWZpbmUgYSBHcm91cFNlcXVlbmNlLkl0IGlzIGFsc28gZGVmaW5lZCB0aGF0IGEKKyogkSqSIGFzIGF0dHJpYnV0ZSBuYW1lLCBkZWxpdmVycyBhbGwgYXR0cmlidXRlcyBvZiBhbiBlbGVtZW50LgorKi8KK3N0cnVjdCBTZWxBSUROYW1lVW5pdElkIHsKKyAgIEFJRE5hbWUgICAgYXR0cjsgICAgICAvLyBUaGUgYXR0cmlidXRlICBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCAoYWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUpLgorICAgVF9MT05HTE9ORyB1bml0SWQ7ICAgIC8vIFRoZSB1bml0IG9mIHRoZSBhdHRyaWJ1dGUgb3QgdGhlIGNvbHVtbi4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdElkIGlzIHRoZSBJZCBvZiBpbnN0YW5jZSBlbGVtZW50IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFzZXR5cGUgQW9Vbml0LgorICAgQWdnckZ1bmMgICBhZ2dyZWdhdGU7IC8vIFRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24uCit9OworCisvKioKKyogQmFzaWNhbGx5LCBqb2lucyBjYW4gb25seSBiZSByZWFsaXplZCBiZXR3ZWVuIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHRoYXQKKyogYXJlIGxpbmtlZCB2aWEgYSByZWZlcmVuY2UgZGVmaW5lZCBpbiB0aGUgbW9kZWwuRnJvbSB0aGUgZGVmaW5pdGlvbiBvZgorKiBhdHRyaWJ1dGVzIG9yIGFwcGxpY2F0aW9uIGVsZW1lbnRzLCB0aGUgcmVmZXJlbmNlcyBmb3IgdGhlIGpvaW5zIGFyZQorKiBkZXRlcm1pbmVkLiBJdCBpcyBhbHNvIHRha2VuIGludG8gYWNjb3VudCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cworKiBpbnZvbHZlZCBhcmUgbm90IGxpbmtlZCBkaXJlY3RseS4gSG93ZXZlciwgdGhlcmUgbXVzdCBiZSBhbiB1bmFtYmlndW91cworKiBwYXRoIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnRzLiBUaGUgcGF0aCBtYXkgYWxzbyBpbmNsdWRlIG46bQorKiByZWxhdGlvbnMuIFRoZSB1bmFtYmlndW91c25lc3Mgb2YgcmVsYXRpb25zIGJldHdlZW4gdHdvIGFwcGxpY2F0aW9uCisqIGVsZW1lbnRzIG5vIGxvbmdlciBleGlzdHMgaWYgbW9yZSB0aGFuIG9uZSByZWZlcmVuY2UgaGFzIGJlZW4gZGVmaW5lZAorKiBiZXR3ZWVuIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cy4gSW4gdGhpcyBjYXNlLCB0aGVzZSByZWZlcmVuY2VzIG11c3QKKyogaGF2ZSBuYW1lcyBhbmQgbXVzdCBiZSBpbmRpY2F0ZWQgZXhwbGljaXRseSBpbiB0aGUgcmVxdWVzdC5Gb3IgdGhpcworKiBwdXJwb3NlLCB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBzZXF1ZW5jZSBvZiByZWxhdGlvbgorKiBkZWZpbml0aW9ucyAoSm9pbkRlZlNlcXVlbmNlKS4gVGhlIHNlcXVlbmNlIGluIHdoaWNoIHRoZSBhcHBsaWNhdGlvbgorKiBlbGVtZW50cyBhcmUgYWRkcmVzc2VkIGluIHRoZSByZXF1ZXN0IGFsc28gZGV0ZXJtaW5lcyB0aGUgc2VxdWVuY2UgaW4KKyogd2hpY2ggdGhlIHJlZmVyZW5jZXMgYmV0d2VlbiBhcHBsaWNhdGlvbiBlbGVtZW50cyBhcmUgc2VhcmNoZWQuIFRodXMsCisqIGZvciBldmVyeSBuZXcgYXBwbGljYXRpb24gZWxlbWVudCwgdGhlIHNlcnZlciBiZWdpbnMgd2l0aCB0aGUgZmlyc3QKKyogYXBwbGljYXRpb24gZWxlbWVudCBhZGRyZXNzZWQgaW4gdGhlIHJlcXVlc3QgYW5kIHRyaWVzIHRvIGZpbmQgYQorKiByZWxhdGlvbiBmcm9tIHRoZXJlLiBJZiBubyByZWZlcmVuY2UgdG8gdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGVsZW1lbnQKKyogY2FuIGJlIGZvdW5kLCB0aGUgc2VhcmNoIGNvbnRpbnVlcyB3aXRoIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHRoYXQKKyogY29tZXMgbmV4dCBpbiB0aGUgcmVxdWVzdC4gRnVydGhlcm1vcmUsIHRoZSBleHBsaWNpdCByZWxhdGlvbgorKiBkZWZpbml0aW9ucyAoSm9pbkRlZlNlcXVlbmNlKSBlbmFibGUgYW4gT1VURVIgam9pbiwgaS5lLiB0aGUgcmVzdWx0CisqIGFsc28gaW5jbHVkZXMgdGhvc2UgcmVjb3JkcyBmb3Igd2hpY2ggdGhlIGpvaW4gY291bGQgbm90IGJlCisqIGVzdGFibGlzaGVkLgorKi8KK3N0cnVjdCBKb2luRGVmIHsKKyAgIFRfTE9OR0xPTkcgZnJvbUFJRDsKKyAgIFRfTE9OR0xPTkcgdG9BSUQ7CisgICBOYW1lICAgICAgIHJlZk5hbWU7CisgICBKb2luVHlwZSAgIGpvaW5pbmdUeXBlOworfTsKKworLyoqCisqIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiB3aXRoIHRoZSBpbnN0YW5jZXMgdG8gY3JlYXRlIHRoZSByZWxhdGlvbiB3aXRoCisqIG5ldyBpbnN0YW5jZXMuCisqLworc3RydWN0IEFwcGxpY2F0aW9uUmVsYXRpb25JbnN0YW5jZUVsZW1lbnRTZXEgeworICAgQXBwbGljYXRpb25SZWxhdGlvbiAgICAgYXBwbFJlbDsgICAvLyBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICBJbnN0YW5jZUVsZW1lbnRTZXF1ZW5jZSBpbnN0YW5jZXM7IC8vIFRoZSBsaXN0IHdpdGggaW5zdGFuY2VzLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBsaXN0IG11c3QgbWF0Y2ggb25lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBlbGVtZW50cyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gcmVsYXRpb24uIEFsbCBpbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGxpc3QgbXVzdCBoYXZlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGVsZW1lbnQuCit9OworCisvKioKKyogVGhlIHN0cnVjdHVyZSB3aXRoIHRoZSBhdHRyaWJ1dGUgYW5kIHRoZSBuYW1lIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyovCitzdHJ1Y3QgRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmUgeworICAgVF9MT05HTE9ORyBhaWQ7ICAgICAgLy8gVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICBUX1NUUklORyAgIGFhTmFtZTsgICAvLyBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCisgICBUX1NUUklORyAgIGVudW1OYW1lOyAvLyBUaGUgbmFtZSBvZiB0aGUgZW51bWVyYXRpb24KK307CisKKy8qKgorKiBUaGUgc3RydWN0dXJlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyovCitzdHJ1Y3QgRW51bWVyYXRpb25JdGVtU3RydWN0dXJlIHsKKyAgIFRfTE9ORyAgIGluZGV4OyAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGVudWVtcmF0aW9uIGl0ZW0uCisgICBUX1NUUklORyBpdGVtTmFtZTsgLy8gVGhlIG5hbWUgb2YgdGhlIGl0ZW0uCit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxFbnVtZXJhdGlvbkF0dHJpYnV0ZVN0cnVjdHVyZT4gRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmVTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8RW51bWVyYXRpb25JdGVtU3RydWN0dXJlPiBFbnVtZXJhdGlvbkl0ZW1TdHJ1Y3R1cmVTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8VF9DT01QTEVYPiBTX0NPTVBMRVg7Cit0eXBlZGVmIHNlcXVlbmNlPFRfRENPTVBMRVg+IFNfRENPTVBMRVg7Cit0eXBlZGVmIHNlcXVlbmNlPFRfTE9OR0xPTkc+IFNfTE9OR0xPTkc7Cit0eXBlZGVmIHNlcXVlbmNlPFNfTE9OR0xPTkc+IFNTX0xPTkdMT05HOwordHlwZWRlZiBzZXF1ZW5jZTxTX0NPTVBMRVg+IFNTX0NPTVBMRVg7Cit0eXBlZGVmIHNlcXVlbmNlPFNfRENPTVBMRVg+IFNTX0RDT01QTEVYOwordHlwZWRlZiBzZXF1ZW5jZTxUX0V4dGVybmFsUmVmZXJlbmNlPiBTX0V4dGVybmFsUmVmZXJlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTX0V4dGVybmFsUmVmZXJlbmNlPiBTU19FeHRlcm5hbFJlZmVyZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QXBwbEF0dHI+IEFwcGxBdHRyU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEFwcGxSZWw+IEFwcGxSZWxTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QUlETmFtZT4gQUlETmFtZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxBSUROYW1lVW5pdElkPiBBSUROYW1lVW5pdElkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEVsZW1JZD4gRWxlbUlkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPFNlbE9yZGVyPiBTZWxPcmRlclNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxBQ0w+IEFDTFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxJbml0aWFsUmlnaHQ+IEluaXRpYWxSaWdodFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTZWxBSUROYW1lVW5pdElkPiBTZWxBSUROYW1lVW5pdElkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEpvaW5EZWY+IEpvaW5EZWZTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QXBwbGljYXRpb25SZWxhdGlvbkluc3RhbmNlRWxlbWVudFNlcT4gQXBwbGljYXRpb25SZWxhdGlvbkluc3RhbmNlRWxlbWVudFNlcVNlcXVlbmNlOworCisvKioKKyogVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgZGVmaW5pdGlvbi4gVGhlIHNhbWUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlCisqIGF0IHRoZSBpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50LgorKi8KK3N0cnVjdCBBcHBsRWxlbSB7CisgICBUX0xPTkdMT05HICAgICAgIGFpZDsgICAgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLiBUaGUgaWQgaXMgZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyB3aXRoIHRoZSBtZXRob2QgZ2V0SWQoKSBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4gICAgIEF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgYWlBSWQgb2YgdGhlIHN0cnVjdHVyZSBBcHBsSW5mU2VxIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBBT1BfR2V0QXBwbEluZi4KKyAgIE5hbWUgICAgICAgICAgICAgYmVOYW1lOyAgICAgLy8gVGhlIGJhc2UgZWxlbWVudCBuYW1lLCBhbGwgZWxlbWVudHMgaGF2ZSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJhc2ljIGVsZW1lbnQuIFRoZSBzYW1lIG5hbWUgaXMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1ldGhvZHMgZ2V0VHlwZSgpIG9mIHRoZSBCYXNlRWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcmZhY2UuIFRoZSBiYXNlIGVsZW1lbnQgaXMgZ2l2ZW4gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWV0aG9kIGdldEJhc2VFbGVtZW50KCkgYXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBBcHBsaWNhdGlvbkVsZW1lbnQuICAgICBBdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBub3QgZGVsaXZlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgY29ycmVzcG9uZGluZyBJZCBvZiB0aGUgYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHdhcyBzdG9yZWQgaW4gdGhlIGZpZWxkIGFpQklkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJ1Y3R1cmUgQXBwbEluZlNlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU9QX0dldEFwcGxJbmYuCisgICBOYW1lICAgICAgICAgICAgIGFlTmFtZTsgICAgIC8vIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuIFRoZSBuYW1lIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVuIGFsc28gd2l0aCB0aGUgbWV0aG9kIGdldE5hbWUoKSBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4gICAgIEF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGQgYWlOYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgQXBwbEluZlNlcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIHJlcXVlc3QgQU9QX0dldEFwcGxJbmYuCisgICBBcHBsQXR0clNlcXVlbmNlIGF0dHJpYnV0ZXM7IC8vIFRoZSBhdHRyaWJ1dGVzIG9mIGFwcGxpY2F0aW9uIGVsZW1lbnQuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIGFyZSBnaXZlbiB3aXRoIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0QXR0cmlidXRlcygpIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbGljYXRpb25FbGVtZW50LiBUaGVyZSBhcmUgbm8gcmVsYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpdmVuIGluIHRoZSB0aGlzIHNlcXVlbmNlLgorfTsKKworLyoqCisqIFRoZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW51bWVyYXRpb24gYW5kIHRoZXJlIGl0ZW1zLgorKi8KK3N0cnVjdCBFbnVtZXJhdGlvblN0cnVjdHVyZSB7CisgICBUX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtTmFtZTsgLy8gVGhlIG5hbWUgb2YgdGhlIGVudWVyYXRpb24uCisgICBFbnVtZXJhdGlvbkl0ZW1TdHJ1Y3R1cmVTZXF1ZW5jZSBpdGVtczsgICAgLy8gVGhlIGl0ZW1zIG9mIHRoZSBlbnVtZXJhdGlvbi4KK307CisKKy8qKgorKiBUaGUgdW5pb24gZGVmaW5pdGlvbiBmb3IgYWxsIGRhdGF0eXBlcy4KKyovCit1bmlvbiBUU19VbmlvbiBzd2l0Y2ggKERhdGFUeXBlKSB7CisgICBjYXNlIERUX1NUUklORzogICAgICAgICAgICAgICAgICAgICAgVF9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1ZhbDsKKyAgIGNhc2UgRFRfU0hPUlQ6ICAgICAgICAgICAgICAgICAgICAgICBUX1NIT1JUICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRWYWw7CisgICBjYXNlIERUX0ZMT0FUOiAgICAgICAgICAgICAgICAgICAgICAgVF9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0VmFsOworICAgY2FzZSBEVF9CWVRFOiAgICAgICAgICAgICAgICAgICAgICAgIFRfQllURSAgICAgICAgICAgICAgICAgICAgICAgICBieXRlVmFsOworICAgY2FzZSBEVF9CT09MRUFOOiAgICAgICAgICAgICAgICAgICAgIFRfQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBib29sZWFuVmFsOworICAgY2FzZSBEVF9MT05HOiAgICAgICAgICAgICAgICAgICAgICAgIFRfTE9ORyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nVmFsOworICAgY2FzZSBEVF9ET1VCTEU6ICAgICAgICAgICAgICAgICAgICAgIFRfRE9VQkxFICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVWYWw7CisgICBjYXNlIERUX0xPTkdMT05HOiAgICAgICAgICAgICAgICAgICAgVF9MT05HTE9ORyAgICAgICAgICAgICAgICAgICAgIGxvbmdsb25nVmFsOworICAgY2FzZSBEVF9DT01QTEVYOiAgICAgICAgICAgICAgICAgICAgIFRfQ09NUExFWCAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4VmFsOworICAgY2FzZSBEVF9EQ09NUExFWDogICAgICAgICAgICAgICAgICAgIFRfRENPTVBMRVggICAgICAgICAgICAgICAgICAgICBkY29tcGxleFZhbDsKKyAgIGNhc2UgRFRfREFURTogICAgICAgICAgICAgICAgICAgICAgICBUX0RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVZhbDsKKyAgIGNhc2UgRFRfQllURVNUUjogICAgICAgICAgICAgICAgICAgICBUX0JZVEVTVFIgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0clZhbDsKKyAgIGNhc2UgRFRfQkxPQjogICAgICAgICAgICAgICAgICAgICAgICBUX0JMT0IgICAgICAgICAgICAgICAgICAgICAgICAgYmxvYlZhbDsKKyAgIGNhc2UgRFNfU1RSSU5HOiAgICAgICAgICAgICAgICAgICAgICBTX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nU2VxOworICAgY2FzZSBEU19TSE9SVDogICAgICAgICAgICAgICAgICAgICAgIFNfU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFNlcTsKKyAgIGNhc2UgRFNfRkxPQVQ6ICAgICAgICAgICAgICAgICAgICAgICBTX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRTZXE7CisgICBjYXNlIERTX0JZVEU6ICAgICAgICAgICAgICAgICAgICAgICAgU19CWVRFICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTZXE7CisgICBjYXNlIERTX0JPT0xFQU46ICAgICAgICAgICAgICAgICAgICAgU19CT09MRUFOICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5TZXE7CisgICBjYXNlIERTX0xPTkc6ICAgICAgICAgICAgICAgICAgICAgICAgU19MT05HICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdTZXE7CisgICBjYXNlIERTX0RPVUJMRTogICAgICAgICAgICAgICAgICAgICAgU19ET1VCTEUgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZVNlcTsKKyAgIGNhc2UgRFNfTE9OR0xPTkc6ICAgICAgICAgICAgICAgICAgICBTX0xPTkdMT05HICAgICAgICAgICAgICAgICAgICAgbG9uZ2xvbmdTZXE7CisgICBjYXNlIERTX0NPTVBMRVg6ICAgICAgICAgICAgICAgICAgICAgU19DT01QTEVYICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXhTZXE7CisgICBjYXNlIERTX0RDT01QTEVYOiAgICAgICAgICAgICAgICAgICAgU19EQ09NUExFWCAgICAgICAgICAgICAgICAgICAgIGRjb21wbGV4U2VxOworICAgY2FzZSBEU19EQVRFOiAgICAgICAgICAgICAgICAgICAgICAgIFNfREFURSAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU2VxOworICAgY2FzZSBEU19CWVRFU1RSOiAgICAgICAgICAgICAgICAgICAgIFNfQllURVNUUiAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyU2VxOworICAgY2FzZSBEVF9FWFRFUk5BTFJFRkVSRU5DRTogICAgICAgICAgIFRfRXh0ZXJuYWxSZWZlcmVuY2UgICAgICAgICAgICBleHRSZWZWYWw7CisgICBjYXNlIERTX0VYVEVSTkFMUkVGRVJFTkNFOiAgICAgICAgICAgU19FeHRlcm5hbFJlZmVyZW5jZSAgICAgICAgICAgIGV4dFJlZlNlcTsKKyAgIGNhc2UgRFRfRU5VTTogICAgICAgICAgICAgICAgICAgICAgICBUX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZhbDsKKyAgIGNhc2UgRFNfRU5VTTogICAgICAgICAgICAgICAgICAgICAgICBTX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVNlcTsKK307CisKKy8qKgorKiBEZWZpbmUgYSB1bmlvbiB3aXRoIHNlcXVlbmNlcyBvZiBhIGNlcnRhaW4gdHlwZS4gVXNpbmcgdGhpcyB1bmlvbgorKiBpbnN0ZWFkIG9mIHNlcXVlbmNlIDxUU19Vbmlvbj4gZ2l2ZXMgbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisqLwordW5pb24gVFNfVW5pb25TZXEgc3dpdGNoIChEYXRhVHlwZSkgeworICAgY2FzZSBEVF9TVFJJTkc6ICAgICAgICAgICAgICAgICAgICAgIFNfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWw7CisgICBjYXNlIERUX1NIT1JUOiAgICAgICAgICAgICAgICAgICAgICAgU19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0VmFsOworICAgY2FzZSBEVF9GTE9BVDogICAgICAgICAgICAgICAgICAgICAgIFNfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdFZhbDsKKyAgIGNhc2UgRFRfQllURTogICAgICAgICAgICAgICAgICAgICAgICBTX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVZhbDsKKyAgIGNhc2UgRFRfQk9PTEVBTjogICAgICAgICAgICAgICAgICAgICBTX0JPT0xFQU4gICAgICAgICAgICAgICAgICAgICAgYm9vbGVhblZhbDsKKyAgIGNhc2UgRFRfTE9ORzogICAgICAgICAgICAgICAgICAgICAgICBTX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1ZhbDsKKyAgIGNhc2UgRFRfRE9VQkxFOiAgICAgICAgICAgICAgICAgICAgICBTX0RPVUJMRSAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlVmFsOworICAgY2FzZSBEVF9MT05HTE9ORzogICAgICAgICAgICAgICAgICAgIFNfTE9OR0xPTkcgICAgICAgICAgICAgICAgICAgICBsb25nbG9uZ1ZhbDsKKyAgIGNhc2UgRFRfQ09NUExFWDogICAgICAgICAgICAgICAgICAgICBTX0NPTVBMRVggICAgICAgICAgICAgICAgICAgICAgY29tcGxleFZhbDsKKyAgIGNhc2UgRFRfRENPTVBMRVg6ICAgICAgICAgICAgICAgICAgICBTX0RDT01QTEVYICAgICAgICAgICAgICAgICAgICAgZGNvbXBsZXhWYWw7CisgICBjYXNlIERUX0RBVEU6ICAgICAgICAgICAgICAgICAgICAgICAgU19EQVRFICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVWYWw7CisgICBjYXNlIERUX0JZVEVTVFI6ICAgICAgICAgICAgICAgICAgICAgU19CWVRFU1RSICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJWYWw7CisgICBjYXNlIERUX0JMT0I6ICAgICAgICAgICAgICAgICAgICAgICAgU19CTE9CICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2JWYWw7CisgICBjYXNlIERTX1NUUklORzogICAgICAgICAgICAgICAgICAgICAgU1NfU1RSSU5HICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1NlcTsKKyAgIGNhc2UgRFNfU0hPUlQ6ICAgICAgICAgICAgICAgICAgICAgICBTU19TSE9SVCAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRTZXE7CisgICBjYXNlIERTX0ZMT0FUOiAgICAgICAgICAgICAgICAgICAgICAgU1NfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0U2VxOworICAgY2FzZSBEU19CWVRFOiAgICAgICAgICAgICAgICAgICAgICAgIFNTX0JZVEUgICAgICAgICAgICAgICAgICAgICAgICBieXRlU2VxOworICAgY2FzZSBEU19CT09MRUFOOiAgICAgICAgICAgICAgICAgICAgIFNTX0JPT0xFQU4gICAgICAgICAgICAgICAgICAgICBib29sZWFuU2VxOworICAgY2FzZSBEU19MT05HOiAgICAgICAgICAgICAgICAgICAgICAgIFNTX0xPTkcgICAgICAgICAgICAgICAgICAgICAgICBsb25nU2VxOworICAgY2FzZSBEU19ET1VCTEU6ICAgICAgICAgICAgICAgICAgICAgIFNTX0RPVUJMRSAgICAgICAgICAgICAgICAgICAgICBkb3VibGVTZXE7CisgICBjYXNlIERTX0xPTkdMT05HOiAgICAgICAgICAgICAgICAgICAgU1NfTE9OR0xPTkcgICAgICAgICAgICAgICAgICAgIGxvbmdsb25nU2VxOworICAgY2FzZSBEU19DT01QTEVYOiAgICAgICAgICAgICAgICAgICAgIFNTX0NPTVBMRVggICAgICAgICAgICAgICAgICAgICBjb21wbGV4U2VxOworICAgY2FzZSBEU19EQ09NUExFWDogICAgICAgICAgICAgICAgICAgIFNTX0RDT01QTEVYICAgICAgICAgICAgICAgICAgICBkY29tcGxleFNlcTsKKyAgIGNhc2UgRFNfREFURTogICAgICAgICAgICAgICAgICAgICAgICBTU19EQVRFICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVNlcTsKKyAgIGNhc2UgRFNfQllURVNUUjogICAgICAgICAgICAgICAgICAgICBTU19CWVRFU1RSICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0clNlcTsKKyAgIGNhc2UgRFRfRVhURVJOQUxSRUZFUkVOQ0U6ICAgICAgICAgICBTX0V4dGVybmFsUmVmZXJlbmNlICAgICAgICAgICAgZXh0UmVmVmFsOworICAgY2FzZSBEU19FWFRFUk5BTFJFRkVSRU5DRTogICAgICAgICAgIFNTX0V4dGVybmFsUmVmZXJlbmNlICAgICAgICAgICBleHRSZWZTZXE7CisgICBjYXNlIERUX0VOVU06ICAgICAgICAgICAgICAgICAgICAgICAgU19MT05HICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWw7CisgICBjYXNlIERTX0VOVU06ICAgICAgICAgICAgICAgICAgICAgICAgU1NfTE9ORyAgICAgICAgICAgICAgICAgICAgICAgIGVudW1TZXE7Cit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxFbnVtZXJhdGlvblN0cnVjdHVyZT4gRW51bWVyYXRpb25TdHJ1Y3R1cmVTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8QXBwbEVsZW0+IEFwcGxFbGVtU2VxdWVuY2U7CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgdmFsdWUgc3RydWN0dXJlLiAgVGhlcmUgaXMgb25lIGZsYWcgZm9yIGVhY2ggdmFsdWUuIElmIHRoZQorKiB1bmlvbiAodSkgY29udGFpbnMgYSBzZXF1ZW5jZSwgdGhlIGZsYWcgaXMgdmFsaWQgZm9yIGFsbCB2YWx1ZXMgaW4gdGhhdAorKiBzZXF1ZW5jZS4KKyogCisqIE1lYW5pbmcgb2YgZmxhZ3M6CisqICAgIEFPX1ZGX1ZBTElEKDB4MDEpICAgICAgVGhlIHZhbHVlIGlzIHZhbGlkLgorKiAgICBBT19WRl9WSVNJQkxFKDB4MDIpICAgIFRoZSB2YWx1ZSBoYXMgdG8gYmUKKyogICAgICAgICAgICAgICAgICAgICAgICAgICB2aXN1YWxpemVkLgorKiAgICBBT19WRl9VTk1PRElGSUVEKDB4MDQpIFRoZSB2YWx1ZSBoYXMgbm90IGJlZW4KKyogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZC4KKyogICAgQU9fVkZfREVGSU5FRCgweDA4KSAgICBUaGUgdmFsdWUgaXMgZGVmaW5lZC4gSWYKKyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgaW4gYSB2YWx1ZSBtYXRyaXgKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlIHRoaXMgYml0CisqICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHNldC4KKyogICBUaGUgbm9ybWFsIHZhbHVlIG9mIHRoZSBmbGFnIGlzIDE1LgorKi8KK3N0cnVjdCBUU19WYWx1ZSB7CisgICBUU19VbmlvbiB1OyAgICAvLyBUaGUgdmFsdWUgdW5pb24gZm9yIHZhbHVlcyBvZiBhbGwga25vd24gZGF0YXR5cGVzLgorICAgVF9TSE9SVCAgZmxhZzsgLy8gVGhlIHZhbHVlIGZsYWdzLgorfTsKKworLyoqCisqIEEgc3RydWN0dXJlIHdpdGggc2VxdWVuY2VzIG9mIGEgY2VydGFpbiB0eXBlLiBVc2luZyB0aGlzIHVuaW9uIGluc3RlYWQKKyogb2Ygc2VxdWVuY2UgPFRTX1ZhbHVlPiBnaXZlcyBtdWNoIGJldHRlciBwZXJmb3JtYW5jZS4KKyovCitzdHJ1Y3QgVFNfVmFsdWVTZXEgeworICAgVFNfVW5pb25TZXEgdTsgICAgLy8gVGhlIHZhbHVlIHVuaW9uIGZvciB2YWx1ZXMgb2YgYWxsIGtub3duIGRhdGF0eXBlcy4KKyAgIFNfU0hPUlQgICAgIGZsYWc7IC8vIFNlZSBUU19WYWx1ZSBmbGFnLgorfTsKKworLyoqCisqIEFwcGxpY2F0aW9uIHN0cnVjdHVyZSB2YWx1ZXMuIEFsbCB2YWx1ZXMgb2YgdGhlIGVudGlyZSBhcHBsaWNhdGlvbgorKiBzdHJ1Y3R1cmUgYXJlIHN0b3JlZCBpbiB0aGlzIHN0cnVjdHVyZSBhbmQgbG9hZGVkIHRvIHRoZSBDbGllbnQgb24KKyogcmVxdWVzdC4gCisqIAorKiBBdCB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIGRlbGl2ZXJlZCBieSB0aGUgcmVxdWVzdCBBT1BfR2V0QXBwbEluZgorKiBhbmQgQU9QX0dldEF0dHIgZm9yIGVhY2ggYXBwbGljYXRpb24gZWxlbWVudC4KKyovCitzdHJ1Y3QgQXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZSB7CisgICBBcHBsRWxlbVNlcXVlbmNlIGFwcGxFbGVtczsgLy8gVGhlIGxpc3Qgb2YgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICBBcHBsUmVsU2VxdWVuY2UgIGFwcGxSZWxzOyAgLy8gVGhlIGxpc3Qgb2YgcmVsYXRpb25zIGluIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZS4gVGhlIGxpc3Qgb2YgQXBwbFJlbCdzIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzdGluY3QgZW50cmllcyBmb3IgcmVsYXRpb25zIGFuZCB0aGVpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmVyc2VzLiBUaGUgZmllbGQgaW52TmFtZSBjb250YWlucyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJ0bmVyIHJlbGF0aW9uLiAgQm90aCByZWxhdGlvbiwgdGhlIG5vcm1hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgaW52ZXJzZSByZWxhdGlvbiBhcmUgZ2l2ZW4gaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UuCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIG5hbWUtdmFsdWUtdW5pdCB0dXBsZSBzdHJ1Y3R1cmUgd2l0aCBhIHNlcXVlbmNlIG9mIHZhbHVlcy4KKyovCitzdHJ1Y3QgTmFtZVZhbHVlU2VxVW5pdCB7CisgICBOYW1lICAgICAgICB2YWxOYW1lOyAvLyBDb2x1bW4gbmFtZSBvciBtZWFzdXJlZCBxdWFudGl0eSBuYW1lLgorICAgVFNfVmFsdWVTZXEgdmFsdWU7ICAgLy8gQ29sdW1uIHZhbHVlICh2ZWN0b3IpLgorICAgVF9TVFJJTkcgICAgdW5pdDsgICAgLy8gQ29sdW1uIHVuaXQgYXMgc3RyaW5nLgorfTsKKworLyoqCisqIEFJRCAtIE5hbWUgLSBWYWx1ZSAtIFVuaXRJZCBxdWFydGV0LgorKi8KK3N0cnVjdCBBSUROYW1lVmFsdWVVbml0SWQgeworICAgQUlETmFtZSAgICBhdHRyOyAgIC8vIFRoZSBhdHRyaWJ1dGUgIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IChhaWQsCisgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZSkuCisgICBUX0xPTkdMT05HIHVuaXRJZDsgLy8gVGhlIHVuaXQgb2YgdGhlIGF0dHJpYnV0ZSBvdCB0aGUgY29sdW1uLiBUaGUgdW5pdElkCisgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIElkIG9mIGluc3RhbmNlIGVsZW1lbnQgd2l0aCB0aGUgYmFzZXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBBb1VuaXQuCisgICBUU19WYWx1ZSAgIHZhbHVlczsgLy8gVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgd2l0aCB2YWx1ZSBmbGFncy4KK307CisKKy8qKgorKiBBSUQgLSBOYW1lIC0gVmFsdWUgLSBVbml0SWQgcXVhcnRldC4gTXVsdGlwbGUgdmFsdWVzIGZvciBvbiBhdHRyaWJ1dGUuCisqLworc3RydWN0IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZCB7CisgICBBSUROYW1lICAgICBhdHRyOyAgIC8vIFRoZSBhdHRyaWJ1dGUgIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IChhaWQsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUpLgorICAgVF9MT05HTE9ORyAgdW5pdElkOyAvLyBUaGUgdW5pdCBvZiB0aGUgYXR0cmlidXRlIG90IHRoZSBjb2x1bW4uIFRoZSB1bml0SWQKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhlIElkIG9mIGluc3RhbmNlIGVsZW1lbnQgd2l0aCB0aGUgYmFzZXR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gQW9Vbml0LgorICAgVFNfVmFsdWVTZXEgdmFsdWVzOyAvLyBUaGUgY29sdW1uIHZhbHVlcyB3aXRoIHZhbHVlIGZsYWdzLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXRJZCB0dXBsZSBzdHJ1Y3R1cmUgd2l0aCBhIHNlcXVlbmNlIG9mCisqIHZhbHVlcy4KKyovCitzdHJ1Y3QgTmFtZVZhbHVlU2VxVW5pdElkIHsKKyAgIE5hbWUgICAgICAgIHZhbE5hbWU7IC8vIENvbHVtbiBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZVNlcSB2YWx1ZTsgICAvLyBDb2x1bW4gdmFsdWUgKHZlY3RvcikuCisgICBUX0xPTkdMT05HICB1bml0SWQ7ICAvLyBDb2x1bW4gdW5pdCBhcyBJZC4KK307CisKKy8qKgorKiAgU3RydWN0dXJlIGZvciBuYW1lIHZhbHVlIHF1ZXJ5IG9yIGF0dHJpYnV0ZSBzZWFyY2ggY29uZGl0aW9ucy4KKyovCitzdHJ1Y3QgU2VsVmFsdWUgeworICAgQUlETmFtZVZhbHVlVW5pdElkIGF0dHI7ICAvLyBUaGUgYXR0cmlidXRlIHNwZWNpZmljYXRpb24gd2l0aCB1bml0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZS4KKyAgIFNlbE9wY29kZSAgICAgICAgICBvcGVyOyAgLy8gVGhlIGNvbXBhcmUgb3BlcmF0b3IgYmV0d2VlbiB0aGUgYXR0cmlidXRlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZS4KKyAgIFRTX1ZhbHVlICAgICAgICAgICB2YWx1ZTsgLy8gVmFsdWUgZm9yIHRoZSBjb25kaXRpb24uCit9OworCisvKioKKyogVGhlIEFTQU0gT0RTIG5hbWUtdmFsdWUtdW5pdGlkIHR1cGxlIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgaXMKKyogaWRlbnRpY2FsIHdpdGggdGhlIE5hbWVWYWx1ZVVuaXQsIGV4Y2VwdCB0aGUgdW5pdCBpcyBnaXZlbiBhcyBhbiBJZAorKiBpbnNlYWQgb2YgYSBzdHJpbmcuCisqLworc3RydWN0IE5hbWVWYWx1ZVVuaXRJZCB7CisgICBOYW1lICAgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZSAgIHZhbHVlOyAgIC8vIEF0dHJpYnV0ZSB2YWx1ZSBvciBjb2x1bW4gdmFsdWUgKHZlY3RvcikuCisgICBUX0xPTkdMT05HIHVuaXRJZDsgIC8vIElkIG9mIGF0dHJpYnV0ZSBvciBjb2x1bW4gdW5pdC4KK307CisKKy8qKgorKiBUaGUgYXR0cmlidXRlIHNlbGVjdGlvbiBzdHJ1Y3R1cmUuCisqLworc3RydWN0IFNlbFZhbHVlRXh0IHsKKyAgIEFJRE5hbWVVbml0SWQgYXR0cjsgIC8vIFRoZSBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbiB3aXRoIHVuaXQgSWQuCisgICBTZWxPcGNvZGUgICAgIG9wZXI7ICAvLyBUaGUgY29tcGFyZSBvcGVyYXRvciBiZXR3ZWVuIHRoZSBhdHRyaWJ1dGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZS4KKyAgIFRTX1ZhbHVlICAgICAgdmFsdWU7IC8vIFZhbHVlIGZvciB0aGUgY29uZGl0aW9uLgorfTsKKworLyoqCisqIERlZmluZXMgdGhlIHNlcXVlbmNlIG9mIHNlbGVjdGlvbiBhdHRyaWJ1dGVzIHdpdGggdGhlaXIgbG9naWNhbAorKiBvcGVyYXRvcnMuIFRoZSBJZGVhIGlzIHRvIGhhdmUgdGhlIGxvZ2ljYWwgb3BlcmF0b3JzIGFuZCB0aGUgc2VsZWN0aW9uCisqIHZhbHVlcyBpbiBvbmUgc2VxdWVuY2UuIFRoZXJlZm9yZSBubyBpbXBsaWNpdCBydWxlcyBhcmUgbmVjZXNzYXJ5IGhvdworKiBsb2dpY2FsIG9wZXJhdG9ycyBoYXZlIHRvIGJlIGludGVycHJldGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHNlbGVjdGlvbgorKiB2YWx1ZS4KKyovCit1bmlvbiBTZWxJdGVtIHN3aXRjaCAoU2VsVHlwZSkgeworICAgY2FzZSBTRUxfVkFMVUVfVFlQRTogICAgICAgICAgICAgICAgIFNlbFZhbHVlRXh0ICAgICAgICAgICAgICAgICAgICB2YWx1ZTsKKyAgIGNhc2UgU0VMX09QRVJBVE9SX1RZUEU6ICAgICAgICAgICAgICBTZWxPcGVyYXRvciAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3I7Cit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWVTZXFVbml0PiBOYW1lVmFsdWVTZXFVbml0U2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEFJRE5hbWVWYWx1ZVNlcVVuaXRJZD4gQUlETmFtZVZhbHVlU2VxVW5pdElkU2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPFNlbFZhbHVlPiBTZWxWYWx1ZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWVTZXFVbml0SWQ+IE5hbWVWYWx1ZVNlcVVuaXRJZFNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxTZWxJdGVtPiBTZWxJdGVtU2VxdWVuY2U7CisKKy8qKgorKiBUaGUgQVNBTSBPRFMgbmFtZS12YWx1ZSBwYWlyIHN0cnVjdHVyZS4KKyovCitzdHJ1Y3QgTmFtZVZhbHVlIHsKKyAgIE5hbWUgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZSB2YWx1ZTsgICAvLyBBdHRyaWJ1dGUgdmFsdWUgb3IgY29sdW1uIHZhbHVlICh2ZWN0b3IpLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXQgdHVwbGUgc3RydWN0dXJlLiBUaGlzIHN0cnVjdHVyZSBpcworKiBpZGVudGljYWwgd2l0aCB0aGUgTmFtZVZhbHVlVW5pdElkLCBleGNlcHQgdGhlIHVuaXQgaXMgZ2l2ZW4gYXMgYQorKiBzdHJpbmcgaW5zZWFkIG9mIGFuIElkLgorKi8KK3N0cnVjdCBOYW1lVmFsdWVVbml0IHsKKyAgIE5hbWUgICAgIHZhbE5hbWU7IC8vIEF0dHJpYnV0ZSBuYW1lIG9yIG1lYXN1cmVkIHF1YW50aXR5IG5hbWUuCisgICBUU19WYWx1ZSB2YWx1ZTsgICAvLyBBdHRyaWJ1dGUgdmFsdWUgb3IgY29sdW1uIHZhbHVlICh2ZWN0b3IpLgorICAgVF9TVFJJTkcgdW5pdDsgICAgLy8gQXR0cmlidXRlIG9yIGNvbHVtbiB1bml0IGFzIHN0cmluZy4KK307CisKKy8qKgorKiBUaGUgcmVzdWx0cyBmb3Igb25lIGF0dHJpYnV0ZS4gVGhlIHJlc3VsdCBzZXQgZm9yIGFsbCBhdHRyaWJ1dGVzIGFyZQorKiBnaXZlbiBpbiB0aGUgc2VxdWVuY2Ugb2YgdGhlIHJlc3VsdCBzZXQuCisqLworc3RydWN0IEF0dHJSZXN1bHRTZXQgeworICAgTmFtZVZhbHVlU2VxVW5pdElkICAgICAgYXR0clZhbHVlczsgLy8gVGhlIGF0dHJpYnV0ZSByZXN1bHQgc2V0IG9mIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudC4gQWxsIHZhbHVlcyBoYXZlIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgKEFJRE5hbWUpIGFuZCB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5pdCAoVW5pdElkKS4gT25seSB0aGUgZmlyc3QgcGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHBvc3NpYmxlIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgaW4gdGhpcyByZXN1bHQgc2V0LiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIHBhcnQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAnaG93X21hbnknIG9mIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdnZXRJbnN0YW5jZXMnIG9mIHRoZSBpbnRlcmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdBcHBsRWxlbUFjY2VzcycuCisgICBOYW1lVmFsdWVVbml0SWRJdGVyYXRvciByZXN0OyAgICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgcmVzdWx0cy4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRvciBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zZWNjdXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hbWVWYWx1ZVNlcVVuaXRJZC1wYWNrYWdlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBzZXQuCit9OworCisvKioKKyogVGhlIHF1ZXJ5IHN0cnVjdHVyZS4KKyogCisqIEhvdyB0byBidWlsZCBhIHF1ZXJ5LgorKiAKKyogQSBxdWVyeSBpcyBhIHNlYXJjaCBjb25kaXRpb24gZm9yIGluc3RhbmNlcy4gVGhlIGluc3RhbmNlcyBhcmUKKyogc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMuIFRoZSBzZWFyY2ggY29uZGl0aW9uCisqIHJlcHJlc2VudHMgYW4gYXR0cmlidXRlIHZhbHVlIGNvbmRpdGlvbi4gVGhpcyBtZWFucyB0aGUgYXR0cmlidXRlIHZhbHVlCisqIHNwZWNpZmllcyB0aGUgc2VsZWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBvciBpbnN0YW5jZSBhdHRyaWJ1dGUuIEFuCisqIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgYW5kIHRoZSBuYW1lIG9mIHRoZQorKiBhdHRyaWJ1dGUgKEFJRE5hbWUpLiBUaGUgY29uZGl0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgZW51bWVyYXRpb24KKyogU2VsT1BDb2RlLiBUaGUgdmFsdWVzIGFyZSBnaXZlbiBpbiB0aGUgVFNfVmFsdWUgb3IgVFNfVW5pb24gc3RydWN0dXJlLgorKiBJZiB3ZSBsaWtlIGFuIFVuaXQgaW5kZXBlZGVudCBjb25kaXRpb24gd2UgbmVlZGVkIHRvIGRlZmluZSB0aGUgVW5pdCBhdAorKiB0aGUgYXR0cmlidXRlLCB1c2UgQUlETmFtZVVuaXRJZCBpbnN0ZWFkIG9mIEFJRE5hbWUsIHRoZSBzZXJ2ZXIgaGFzIHRvCisqIGNvbnZlcnQgdGhlIHZhbHVlIHRvIHRoZSBwcm9wZXIgYXR0cmlidXRlIHZhbHVlLiBUaGUgYXR0cmlidXRlIHNlYXJjaAorKiBjb25kaXRpb24gY2FuIGJlIGNvbWJpbmVkIGJ5IG9wZXJhdGlvbnMgZGVmaW5lZCBpbiB0aGUgZW51bWVyYXRpb24KKyogU2VsT3BlcmF0b3IuIEEgcXVlcnkgY2FuIGJlIGJ1aWx0IHdpdGggYSBzZXF1ZW5jZSBTZWxWYWx1ZSBhbmQKKyogU2VsT3BlcmF0b3IuCisqIAorKiBIb3cgdG8gcmVhZC93cml0ZSB0aGUgcXVlcnk6CisqIAorKiBlLmcuICBTZWxWYWx1ZTEgQU5EIFNlbFZhbHVlMgorKiAgIAorKiAgICAgICAgICBzZWxWYWx1ZVNlcSAgICA9IFNlbFZhbHVlMSwgU2VsVmFsdWUyCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gQU5EICAKKyogCisqIGUuZy4gIChTZWxWYWx1ZTEgQU5EIFNlbFZhbHVlMikgT1IgU2VsVmFsdWUzIAorKiAgICAKKyogICAgICAgICAgc2VsVmFsdWVTZXEgICAgPSBTZWxWYWx1ZTEsIFNlbFZhbHVlMiwgU2VsVmFsdWUzCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gT1BFTiwgQU5ELCBDTE9TRSwgT1IKKyogICAgCisqIGUuZy4gIE5PVChTZWxWYWx1ZTEgQU5EIFNlbFZhbHVlMikgT1IgU2VsVmFsdWUzIAorKiAgICAKKyogICAgICAgICAgc2VsVmFsdWVTZXEgICAgPSBTZWxWYWx1ZTEsIFNlbFZhbHVlMiwgU2VsVmFsdWUzCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gTk9ULCBPUEVOLCBBTkQsIENMT1NFLCBPUgorKiAgICAKKyogIGUuZy4gIE5PVChTZWxWYWx1ZTEpIEFORCBTZWxWYWx1ZTIgT1IgU2VsVmFsdWUzIAorKiAgICAKKyogICAgICAgICAgc2VsVmFsdWVTZXEgICAgPSBTZWxWYWx1ZTEsIFNlbFZhbHVlMiwgU2VsVmFsdWUzCisqICAgICAgICAgIHNlbE9QZXJhdG9yU2VxID0gTk9ULCBBTkQsIE9SCisqIAorKiBUaGVyZSBpcyBubyBzZWxlY3Rpb24gYWJvdXQgdGhlIE46TSByZWxhdGlvbnMuCisqICAKKyogVGhlcmUgYXJlIG5vIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgKE1BWCwgTUlOLCBDT1VOVCBldGMuKSBkZWZpbmVkIHNvIHdlCisqIG5lZWQgbm8gImdyb3VwIGJ5IiBhbmQgImhhdmluZyIgQ2xhdXNlLiBBbGwgdGhlIHBhcnRzIGRlZmluZWQgaW4gdGhlCisqICJoYXZpbmciLWNsYXVzZSBjYW4gYmUgZGVmaW5lZCBpbiB0aGUgc2VsZWN0IHBhcnQuCisqLworc3RydWN0IFF1ZXJ5U3RydWN0dXJlIHsKKyAgIEFJRE5hbWVVbml0SWRTZXF1ZW5jZSBhbnVTZXE7ICAvLyBUaGUgc2VxdWVuY2Ugb2YgYXR0cmlidXRlcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkLiBBIHBhdHRlcm4gaXMgYWNjZXB0ZWQgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBuYW1lLiAgICBBdCB0aGUgUlBDIEFQSSB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUgZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbElkIGFuZCBudVNlcSBvZiB0aGUgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0VmFsUmVxIGFuZCB0aGUgcmVxdWVzdCBBT1BfR2V0VmFsLiBBdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBSUEMgQVBJIG9ubHkgb25lIGFwcGxpY2F0aW9uIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VsZCBiZSBzZWxlY3RlZC4KKyAgIFNlbFZhbHVlU2VxdWVuY2UgICAgICBjb25kU2VxOyAvLyBUaGUgcXVlcnkgY29uZGl0aW9uIHNlcXVlbmNlLiAgICAgQXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmllbGQgbnNTZXEgb2YgdGhlIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldFZhbFJlcSBhbmQgdGhlIHJlcXVlc3QgQU9QX0dldFZhbC4KKyAgIFNlbE9wZXJhdG9yU2VxdWVuY2UgICBvcGVyU2VxOyAvLyBUaGUgcXVlcnkgY29uZGl0aW9uIG9wZXJhdG9yIHNlcXVlbmNlLiAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBBdCB0aGUgUlBDIEFQSSB3YXMgdGhlIG9wZXJhdG9yIGFsd2F5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdBTkQnLgorICAgRWxlbUlkICAgICAgICAgICAgICAgIHJlbEluc3Q7IC8vIFRoZSByZWxhdGVkIGluc3RhbmNlLiAoYWlkID09IDAgJiYgaWlkID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCkgbWVhbnMgbm8gcmVsYXRlZCBpbnN0YW5jZSBzcGVjaWZpZWQuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YXMgc3RvcmVkIGluIHRoZSBmaWVsZCBlbGVtSWQgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIEdldFZhbFJlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT1BfR2V0VmFsLgorICAgTmFtZSAgICAgICAgICAgICAgICAgIHJlbE5hbWU7IC8vIE5hbWUgb2YgdGhlIHJlbGF0aW9uLiAgICAgQXQgdGhlIFJQQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlIGZpZWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVmTmFtZSBvZiB0aGUgc3RydWN0dXJlIEdldFZhbFJlcSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBBT1BfR2V0VmFsLgorICAgU2VsT3JkZXJTZXF1ZW5jZSAgICAgIG9yZGVyQnk7IC8vIFRoZSBvcmRlciBieSBzZXF1ZW5jZS4gVGhlIG9yZGVyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdCBzZXQuICAgICBBdCB0aGUgUlBDIEFQSSBpdCB3YXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2lhYmxlIHRvIHNldCB0aGUgb3JkZXIuCit9OworCisvKioKKyogUmVzdHVsdCBzZXQgb2Ygb25lIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisqLworc3RydWN0IEVsZW1SZXN1bHRTZXRFeHQgeworICAgVF9MT05HTE9ORyAgICAgICAgICAgICAgICAgYWlkOyAgICAvLyBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBJZC4KKyAgIE5hbWVWYWx1ZVNlcVVuaXRJZFNlcXVlbmNlIHZhbHVlczsgLy8gVGhlIGF0dHJpYnV0ZSB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gZWxlbWVudC4KK307CisKKy8qKgorKiBUaGUgZXh0ZW5kZWQgcXVlcnkgc3RydWN0dXJlLgorKi8KK3N0cnVjdCBRdWVyeVN0cnVjdHVyZUV4dCB7CisgICBTZWxBSUROYW1lVW5pdElkU2VxdWVuY2UgYW51U2VxOyAgLy8gVGhlIHNlcXVlbmNlIG9mIGF0dHJpYnV0ZXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnRlZC4gQSBwYXR0ZXJuIGlzIGFjY2VwdGVkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhdHRyaWJ1dGUgbmFtZS4gICAgQXQgdGhlIFJQQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmllbGRzIGFwcGxJZCBhbmQgbnVTZXEgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0dXJlIEdldFZhbFJlcSBhbmQgdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBT1BfR2V0VmFsLiBBdCB0aGUgUlBDIEFQSSBvbmx5IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uIGVsZW1lbnQgY291bGQgYmUgc2VsZWN0ZWQuCisgICBTZWxJdGVtU2VxdWVuY2UgICAgICAgICAgY29uZFNlcTsgLy8gVGhlIHF1ZXJ5IGNvbmRpdGlvbiBzZXF1ZW5jZS4gICAgIEF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFJQQyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZWQgaW4gdGhlIGZpZWxkIG5zU2VxIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZSBHZXRWYWxSZXEgYW5kIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQU9QX0dldFZhbC4KKyAgIEpvaW5EZWZTZXF1ZW5jZSAgICAgICAgICBqb2luU2VxOyAvLyBEZWZpbmVkIHRoZSBqb2luIGJldHdlZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gZWxlbWVudHMuCisgICBTZWxPcmRlclNlcXVlbmNlICAgICAgICAgb3JkZXJCeTsgLy8gVGhlIG9yZGVyIGJ5IHNlcXVlbmNlLiBUaGUgb3JkZXIgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdWx0IHNldC4gICAgIEF0IHRoZSBSUEMgQVBJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZXJmYWNlIGl0IHdhcyBub3QgcG9zc2lhYmxlIHRvIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlci4KKyAgIEFJRE5hbWVTZXF1ZW5jZSAgICAgICAgICBncm91cEJ5OyAvLyBEZWZpbmVzIHRoZSBncm91cGluZyBhdHRyaWJ1dGVzIGZvciBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCwgbmVjZXNzYXJ5IGlmIGFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWxBSUROYW1lVW5pdElkU2VxdWVuY2UuCit9OworCisvLyBTZXF1ZW5jZSBkZWZpbml0aW9ucyAoU194eHgpLgordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWU+IE5hbWVWYWx1ZVNlcXVlbmNlOwordHlwZWRlZiBzZXF1ZW5jZTxOYW1lVmFsdWVVbml0PiBOYW1lVmFsdWVVbml0U2VxdWVuY2U7Cit0eXBlZGVmIHNlcXVlbmNlPEF0dHJSZXN1bHRTZXQ+IEF0dHJSZXN1bHRTZXRTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8RWxlbVJlc3VsdFNldEV4dD4gRWxlbVJlc3VsdFNldEV4dFNlcXVlbmNlOworCisvKioKKyogVGhlIHJlc3VsdCBzZXQgZm9yIG9uZSBlbGVtZW50LiBUaGUgcmVzdWx0IHNldCBmb3IgYWxsIGVsZW1lbnRzIGFyZQorKiBnaXZlbiBpbiB0aGUgc2VxdWVuY2Ugb2YgdGhlIHJlc3VsdCBzZXQuCisqLworc3RydWN0IEVsZW1SZXN1bHRTZXQgeworICAgVF9MT05HTE9ORyAgICAgICAgICAgIGFpZDsgICAgICAgIC8vIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgIEF0dHJSZXN1bHRTZXRTZXF1ZW5jZSBhdHRyVmFsdWVzOyAvLyBUaGUgc2VsZWN0ZWQgYXR0cmlidXRlcyBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50LiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpbiBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0clJlc3VsdFNldCBhcmUgaWRlbnRpY2FsLCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRyaWJ1dGVzIG9mIG9uZSBlbGVtZW50IGhhcyBhbHdheXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcG9zaXRpb24gaW4gdGhlIEF0dHJSZXN1bHRTZXQuCit9OworCisvKioKKyogVGhlIFJlc3VsdCBzZXQgb2YgdGhlIGV4dGVuZGVkIHF1ZXJ5LiBUaGUgaXRlcmF0b3IgaXMgZm9yIGluc3RhbmNlCisqIG9yaWVudGVkIGFjY2Vzcy4KKyovCitzdHJ1Y3QgUmVzdWx0U2V0RXh0IHsKKyAgIEVsZW1SZXN1bHRTZXRFeHRTZXF1ZW5jZSAgICBmaXJzdEVsZW1zOyAvLyBUaGUgc2VxdWVuY2Ugb2YgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG93X21hbnkgcmVzdWx0IGVsZW1lbnRzLgorICAgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yIHJlc3RFbGVtczsgIC8vIHRoZSBpdGVyYXRvciwgd2hpY2ggYWxsb3dzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBhYm92ZSB0aGUgcmVzdWx0IHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYXR0cmlidXRlcyBvZiBvbmUgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIGl0ZXJhdGlvbi4KK307CisKKy8vIFNlcXVlbmNlIGRlZmluaXRpb25zIChTX3h4eCkuCit0eXBlZGVmIHNlcXVlbmNlPEVsZW1SZXN1bHRTZXQ+IEVsZW1SZXN1bHRTZXRTZXF1ZW5jZTsKK3R5cGVkZWYgc2VxdWVuY2U8UmVzdWx0U2V0RXh0PiBSZXN1bHRTZXRFeHRTZXF1ZW5jZTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBxdWVyeSByZXN1bHQgdHlwZXMuCisqLworaW50ZXJmYWNlIFJlc3VsdFR5cGUgeworICAgY29uc3QgVF9TSE9SVCBJTlNURUxFTV9JVEVSQVRPUl9BU19SRVNVTFQgPSAwOyAvLyBJdGVyYXRvciBvZiBpbnN0YW5jZSBlbGVtZW50cyBhcyByZXN1bHQgb2YgdGhlIHF1ZXJ5ICh0aGUgZGVmYXVsdCkuCisgICBjb25zdCBUX1NIT1JUIFRBQkxFX0lURVJBVE9SX0FTX1JFU1VMVCA9IDE7ICAgIC8vIEl0ZXJhdG9yIGZvciB0YWJsZSBhY2Nlc3MgYXMgcmVzdWx0IHR5cGUgb2YgdGhlIHF1ZXJ5LgorICAgY29uc3QgVF9TSE9SVCBUQUJMRV9BU19SRVNVTFQgPSAyOyAgICAgICAgICAgICAvLyBUYWJsZSBhcyByZXN1bHQgdHlwZSBvZiB0aGUgcXVlcnkuCit9OworCisvKioKKyogVGhlIGxvY2sgbW9kZSBvZiB0aGUgc2VydmVyLiBUaGUgbG9jayBtb2RlIHRlbGxzIHRoZSB3YXkgdGhlIHNlcnZlcgorKiB3aWxsIGxvY2sgdGhlIG9iamVjdHMgYXMgc29vbiBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgc2VydmVyIHdpbGwgYmUKKyogZG9uZS4KKyovCitpbnRlcmZhY2UgTG9ja01vZGUgeworICAgY29uc3QgVF9TSE9SVCBMT0NLX0lOU1RBTkNFRUxFTUVOVCA9IDA7ICAgIC8vIExvY2sgdGhlIGluc3RhbmNlIGVsZW1lbnQuIChEZWZhdWx0IExvY2tNb2RlKQorICAgY29uc3QgVF9TSE9SVCBMT0NLX0FQUExJQ0FUSU9ORUxFTUVOVCA9IDE7IC8vIExvY2sgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQsIGFsbCBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgYXJlIGxvY2tlZC4KKyAgIGNvbnN0IFRfU0hPUlQgTE9DS19DSElMRFJFTiA9IDI7ICAgICAgICAgICAvLyBMb2NrIHRoZSBjaGlsZHJlbiBvZiB0aGUgbG9ja2VkIG9iamVjdC4gVGhpcyBtb2RlIGNhbiBiZSBjb21iaW5lZCB3aXRoIG9uZSBvZiB0aGUgdXBwZXIgdHdvIG1vZGkuCit9OworCisvKioKKyogVGhlIGJpdHMgb2YgdGhlIHNlY3VyaXR5IHJpZ2h0cy4KKyovCitpbnRlcmZhY2UgU2VjdXJpdHlSaWdodHMgeworICAgY29uc3QgVF9MT05HIFNFQ19SRUFEID0gMTsgICAvLyBSZWFkIGFjY2VzcyBpcyBhbGxvd2VkLgorICAgY29uc3QgVF9MT05HIFNFQ19VUERBVEUgPSAyOyAvLyBVcGRhdGUgYWNjZXNzIHRvIGFuIGV4aXN0aW5nIG9iamVjdCBpcyBhbGxvd2VkLgorICAgY29uc3QgVF9MT05HIFNFQ19JTlNFUlQgPSA0OyAvLyBDcmVhdGluZyBuZXcgaW5zdGFuY2VzIGlzIGFsbG93ZWQuCisgICBjb25zdCBUX0xPTkcgU0VDX0RFTEVURSA9IDg7IC8vIERlbGV0ZSBvZiB0aGUgb2JqZWN0IGlzIGFsbG93ZWQuCisgICBjb25zdCBUX0xPTkcgU0VDX0dSQU5UID0gMTY7ICAvLyBBY2Nlc3MgcmlnaHRzIG1heSBiZSBwYXNzZWQgb24uCit9OworCisvKioKKyogVGhlIHNlY3VyaXR5IGxldmVsIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisqLworaW50ZXJmYWNlIFNlY3VyaXR5TGV2ZWwgeworICAgY29uc3QgVF9MT05HIE5PX1NFQ1VSSVRZID0gMDsgICAgICAgIC8vIE5vIHNlY3VyaXR5IGRlZmluZWQuCisgICBjb25zdCBUX0xPTkcgRUxFTUVOVF9TRUNVUklUWSA9IDE7ICAgLy8gU2VjdXJpdHkgc2NhbGVkIGZvciB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgIGNvbnN0IFRfTE9ORyBJTlNUQU5DRV9TRUNVUklUWSA9IDI7ICAvLyBTZWN1cml0eSBzY2FsZWQgZm9yIGluc3RhbmNlIGVsZW1lbnRzLgorICAgY29uc3QgVF9MT05HIEFUVFJJQlVURV9TRUNVUklUWSA9IDQ7IC8vIFNlY3VyaXR5IHNjYWxlZCBmb3IgYXBwbGlhdGlvbiBhdHRyaWJ1dGVzLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBxdWVyeSBjb25zdGFudHMuCisqLworaW50ZXJmYWNlIFF1ZXJ5Q29uc3RhbnRzIHsKKyAgIGNvbnN0IFRfTE9ORyBNYXhEdXJhdGlvbkRFRkFVTFQgPSAwOyAgICAgLy8gRGVmYXVsdCB2YWx1ZSBvZiBtYXggZHVyYXRpb24gcGFyYW1ldGVyIG9mIHRoZSBxdWVyeSAgKG5vIGxpbWl0YXRpb25zKS4KKyAgIGNvbnN0IFRfU1RSSU5HIE1heER1cmF0aW9uID0gIk1heER1cmF0aW9uIjsgICAgICAgICAgICAvLyBUaGUgQVNBTSBPRFMgbWF4IGR1cmF0aW9uIHBhcmFtZXRlciBvZiB0aGUgcXVlcnkuCisgICBjb25zdCBUX1NUUklORyBRdWVyeVJlc3VsdFR5cGUgPSAiUXVlcnlSZXN1bHRUeXBlIjsgICAgICAgIC8vIFRoZSBBU0FNIE9EUyBxdWVyeSByZXN1bHQgdHlwZSBwYXJhbWV0ZXIuCisgICBjb25zdCBUX0xPTkcgUXVlcnlSZXN1bHRUeXBlREVGQVVMVCA9IFJlc3VsdFR5cGU6OklOU1RFTEVNX0lURVJBVE9SX0FTX1JFU1VMVDsgLy8gRGVmYXVsdCB2YWx1ZSBvZiB0aGUgQVNBTSBPRFMgcXVlcnkgcmVzdWx0IHR5cGUgcGFyYW1ldGVyLgorfTsKKworLyoqCisqIFRoZSBBU0FNIE9EUyBleGNlcHRpb24gc3RydWN0dXJlLgorKi8KK2V4Y2VwdGlvbiBBb0V4Y2VwdGlvbiB7CisgICBFcnJvckNvZGUgICAgZXJyQ29kZTsKKyAgIFNldmVyaXR5RmxhZyBzZXZGbGFnOworICAgVF9MT05HICAgICAgIG1pbm9yQ29kZTsKKyAgIFRfU1RSSU5HICAgICByZWFzb247Cit9OworCisvKioKKyogVGhlIEFTQU0gZmFjdG9yeSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEFvRmFjdG9yeSB7CisKKyAgIC8qKiAoMjAwMSkKKyAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4gSWYgdGhlIGRlc2NyaXB0aW9uIGlzCisgICAqIG5vdCBhdmFpbGFibGUgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCBubyBleGNlcHRpb24gaXMKKyAgICogdGhyb3duLiBUaGUgc2VydmVyIGxvYWRzIHRoZSBkZXNjcmlwdGlvbiBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZQorICAgKiAiZGVzY3JpcHRpb24iIG9mIHRoZSBpbnN0YW5jZSBvZiBBb0Vudmlyb25tZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4KKyAgICovCisgICBUX1NUUklORyBnZXREZXNjcmlwdGlvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMDAyKQorICAgKiBHZXQgdGhlIGludGVyZmFjZSB2ZXJzaW9uIG9mIHRoZSBBU0FNIE9EUyBmYWN0b3J5LiBUaGUgaW50ZXJmYWNlCisgICAqIHZlcnNpb24gaXMgZm9yIGVhY2ggT0RTIHZlcnNpb24gYSBmaXhlZCBzdHJpbmcuIFRoZSBzdHJpbmcgaXMgdGhlCisgICAqIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSBpbXBsZW1lbnRlZCBhdCB0aGUgc2VydmVyLiAKKyAgICogCisgICAqIFRoZSBmb3JtYXQgb2YgdGhlIHN0cmluZyBpczoKKyAgICogVjxNYWpvciBWZXJzaW9uIE5yPi48TWlub3IgVmVyc2lvbiBOcj4uPFJldmlzaW9uIE5yPgorICAgKiAgIC0gTWFqb3IgVmVyc2lvbiBOciAobnVtZXJpYzogWzAtOV0rKQorICAgKiAgIC0gTWlub3IgVmVyc2lvbiBOciAobnVtZXJpYzogWzAtOV0rKQorICAgKiAgIC0gUmV2aXNpb24gTnIgKG51bWVyaWM6IFswLTldKykKKyAgICogRXhhbXBsZSBvZiB0aGUgdmVyc2lvbiBzcGVjaWZpY2F0aW9uIGlzICdWNS4xLjAnLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4KKyAgICovCisgICBUX1NUUklORyBnZXRJbnRlcmZhY2VWZXJzaW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDMpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4gSWYgdGhlIG5hbWUgaXMgbm90IGF2YWlsYWJsZQorICAgKiBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIEFTQU0gT0RTIGZhY3RvcnkuCisgICAqLworICAgVF9TVFJJTkcgZ2V0TmFtZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMDA0KQorICAgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIEFTQU0gT0RTIGZhY3RvcnkuIElmIHRoZSB0eXBlIGlzIG5vdCBhdmFpbGFibGUKKyAgICogYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLiBUaGUgc2VydmVyCisgICAqIGxvYWRzIHRoZSB0eXBlIGZyb20gdGhlIGJhc2UgYXR0cmlidXRlICJBcHBsaWNhdGlvbl9tb2RlbF90eXBlIiBvZgorICAgKiB0aGUgaW5zdGFuY2Ugb2YgQW9FbnZpcm9ubWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdHlwZSBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4KKyAgICovCisgICBUX1NUUklORyBnZXRUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDUpCisgICAqIEVzdGFibGlzaCBhIG5ldyBzZXNzaW9uIHRvIGFuIEFTQU0gT0RTIHNlcnZlci4gVGhlIHNlcnZlciBub3JtYWxseQorICAgKiBjaGVja3MgdGhlIGFjdGl2aXR5IG9mIHRoZSBzZXNzaW9uIGFuZCB3aWxsIGNsb3NlIHRoZSBzZXNzaW9uIGFmdGVyCisgICAqIGEgdGltZSBwZXJpb2Qgb2YgaW5hY3Rpdml0eS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RfRkFJTEVECisgICAqICAgIEFPX0NPTk5FQ1RfUkVGVVNFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX09QRU5fTU9ERV9OT1RfU1VQUE9SVEVECisgICAqICAgIEFPX1NFU1NJT05fTElNSVRfUkVBQ0hFRAorICAgKgorICAgKiBAcGFyYW0gIGF1dGggIEEgc3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uCisgICAqICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgICAqICAgICAgICAgICAgICAgICAgVVNFUgorICAgKiAgICAgICAgICAgICAgICAgIFBBU1NXT1JECisgICAqICAgICAgICAgICAgICAgICAgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VECisgICAqICAgICAgICAgICAgICAgICAgRk9SX1VTRVIKKyAgICogICAgICAgICAgICAgICAgVGhlIHZhbHVlcyBtYXkgYmUgc3BlY2lmaWVkIGluIGFueSBvcmRlciBhbmQgaGF2ZSB0bworICAgKiAgICAgICAgICAgICAgIGJlIHNlcGFyYXRlZCBieSBjb21tYS4KKyAgICogICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VECisgICAqICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAoRFRfU1RSSU5HKSBUUlVFIG9yIEZBTFNFCisgICAqICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGZvciBDUkVBVEVfQ09TRVNTSU9OX0FMTE9XRUQgPQorICAgKiAgICAgICAgICAgICAgIEZBTFNFLgorICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFyaWFibGUgQ1JFQVRFX0NPU0VTU0lPTl9BTExPV0VEIGlzIGEKKyAgICogICAgICAgICAgICAgICByZWFkLW9ubHkgdmFyaWFibGUgaW4gdGhlIHNlc3Npb24uCisgICAqICAgICAgICAgICAgICAgVGhlIHZhcmlhYmxlIEZPUl9VU0VSIGlzIHRoZSBuYW1lIG9mIHRoZSB1c2VyIGZvcgorICAgKiAgICAgICAgICAgICAgIHdoaWNoIHRoaXMgc2Vzc2lvbiBzaGFsbCBiZSBjcmVhdGVkLiBJZiB0aGlzIHZhbHVlIGlzCisgICAqICAgICAgICAgICAgICAgZ2l2ZW4sIFVTRVIgbXVzdCBiZSBhIHN1cGVydXNlci4gT3RoZXJ3aXNlIHRoZQorICAgKiAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBBT19DT05ORUNUX1JFRlVTRUQgd2lsbCBiZSB0aHJvd24uCisgICAqICAgICAgICAgICAgICAgRXhhbXBsZToKKyAgICogICAgICAgICAgICAgICAiVVNFUj1oYW5zLCBQQVNTV09SRD1zZWNyZXQsIENSRUFURV9DT1NFU1NJT05fQUxMT1dFRAorICAgKiAgICAgICAgICAgICAgID0gVFJVRSIKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5ldyBjcmVhdGVkIEFTQU0gT0RTIHNlc3Npb24uCisgICAqLworICAgQW9TZXNzaW9uIG5ld1Nlc3Npb24oCisgICAgICBpbiBUX1NUUklORyBhdXRoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwNikKKyAgICogRXN0YWJsaXNoIGEgbmV3IHNlc3Npb24gdG8gYW4gQVNBTSBPRFMgc2VydmVyLiBUaGUgc2VydmVyIG5vcm1hbGx5CisgICAqIGNoZWNrcyB0aGUgYWN0aXZpdHkgb2YgdGhlIHNlc3Npb24gYW5kIHdpbGwgY2xvc2UgdGhlIHNlc3Npb24gYWZ0ZXIKKyAgICogYSB0aW1lIHBlcmlvZCBvZiBpbmFjdGl2aXR5LiBUaGUgYXV0aGVudGljYXRpb24gaXMgYSBsaXN0IG9mCisgICAqIE5hbWVWYWx1ZSB3aGljaCBpcyBhbiBhcmd1bWVudCBvZiB0aGUgbWV0aG9kLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVF9GQUlMRUQKKyAgICogICAgQU9fQ09OTkVDVF9SRUZVU0VECisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fT1BFTl9NT0RFX05PVF9TVVBQT1JURUQKKyAgICogICAgQU9fU0VTU0lPTl9MSU1JVF9SRUFDSEVECisgICAqCisgICAqIEBwYXJhbSAgYXV0aCAgQSBsaXN0IG9mIE5hbWVWYWx1ZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUKKyAgICogICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiwgdGhlIHBhcmFtZXRlciBpcyBzdG9yZWQgaW4gdGhlIE5hbWUgb2YKKyAgICogICAgICAgICAgICAgICB0aGUgTmFtZVZhbHVlIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGFwcmFtZXRlciBpcyBzdG9yZWQKKyAgICogICAgICAgICAgICAgICBpbiB0aGUgVmFsdWUuIEVhY2ggZW50cnkgaW4gdGhlIGxpc3QgcmVwcmVzZW50IGV4YWN0CisgICAqICAgICAgICAgICAgICAgb25lIHBhcmFtZXRlci4gV2l0aCB0aGlzIGFyZ3VtZW50IHRoZSB2YWx1ZXMgb2YgdGhlCisgICAqICAgICAgICAgICAgICAgcGFyYW1ldGVycyBjYW4gY29udGFpbiBhbHNvIGNvbW1hIGJlY2F1c2UgdGhlc2UgYXJlCisgICAqICAgICAgICAgICAgICAgbm90IHVzZWQgYXMgc2VwYXJhdGVyLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGNyZWF0ZWQgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICovCisgICBBb1Nlc3Npb24gbmV3U2Vzc2lvbk5hbWVWYWx1ZSgKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIGF1dGgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEFvRmFjdG9yeS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBzZXNzaW9uIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQW9TZXNzaW9uIHsKKworICAgLyoqICgzMDAxKQorICAgKiBBYm9ydCAocm9sbGJhY2spIGEgdHJhbnNhY3Rpb24uIFRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRyYW5zYWN0aW9uCisgICAqIGFyZSBsb3N0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBhYm9ydFRyYW5zYWN0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDIpCisgICAqIENsb3NlIHNlc3Npb24gdG8gYW4gQVNBTSBPRFMgc2VydmVyLiBBY3RpdmUgdHJhbnNhY3Rpb25zIGFyZQorICAgKiBjb21taXR0ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgY2xvc2UoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwMykKKyAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uIFRoZSBjaGFuZ2VzIG1hZGUgaW4gdGhlIHRyYW5zYWN0aW9uIGJlY29tZQorICAgKiBwZXJtYW5lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGNvbW1pdFRyYW5zYWN0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDQpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gbW9kZWwgZnJvbSB0aGUgY3VycmVudCBzZXNzaW9uIGJ5IHJldHVybmluZyBhbgorICAgKiBvYmplY3Qgd2l0aCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RydWN0dXJlLiBUaGUgY29tcGxldGUKKyAgICogaW5mb3JtYXRpb24gb24gdGhlIGFwcGxpY2F0aW9uIG1vZGVsIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoYXQKKyAgICogaW50ZXJmYWNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXBwbGljYXRpb24gc3RydWN0dXJlLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uU3RydWN0dXJlIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDUpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gbW9kZWwgYXMgdmFsdWVzIGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIHN0cnVjdHVyZSBhcyB2YWx1ZS4KKyAgICovCisgICBBcHBsaWNhdGlvblN0cnVjdHVyZVZhbHVlIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlVmFsdWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwNikKKyAgICogR2V0IHRoZSBBU0FNIE9EUyBiYXNlIG1vZGVsIGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbiBieSByZXR1cm5pbmcgYW4KKyAgICogb2JqZWN0IHdpdGggdGhlIGludGVyZmFjZSBCYXNlU3RydWN0dXJlLiBUaGUgY29tcGxldGUgaW5mb3JtYXRpb24gb24KKyAgICogdGhlIGJhc2UgbW9kZWwgaXMgYXZhaWxhYmxlIHRocm91Z2ggdGhhdCBpbnRlcmZhY2U7IGl0IGluY2x1ZGVzIGFsbAorICAgKiBwb3NzaWJsZSBiYXNlIGVsZW1lbnRzIHdpdGggYWxsIHBvc3NpYmxlIGJhc2UgYXR0cmlidXRlcyBhcworICAgKiBzcGVjaWZpZWQgYnkgQVNBTSBPRFMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSBzdHJ1Y3R1cmUuCisgICAqLworICAgQmFzZVN0cnVjdHVyZSBnZXRCYXNlU3RydWN0dXJlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDcpCisgICAqIEdldCBjb250ZXh0IHZhcmlhYmxlcyBmcm9tIHRoZSBzZXNzaW9uLiBBIHBhdHRlcm4gc3RyaW5nIGNhbiBiZQorICAgKiBzcGVjaWZpZWQgdG8gc2VsZWN0IGdyb3VwcyBvZiB2YXJpYWJsZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhclBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIGNvbnRleHQKKyAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZShzKS4KKyAgICoKKyAgICogQHJldHVybiAgQSBsaXN0IG9mIGNvbnRleHQgdmFyaWFibGVzLgorICAgKi8KKyAgIE5hbWVWYWx1ZUl0ZXJhdG9yIGdldENvbnRleHQoCisgICAgICBpbiBQYXR0ZXJuIHZhclBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDA4KQorICAgKiBHZXQgYSBjb250ZXh0IHZhcmlhYmxlIGJ5IGl0cyBuYW1lIGZyb20gdGhlIHNlc3Npb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhck5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgY29udGV4dCB2YXJpYWJsZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBjb250ZXh0IHZhcmlhYmxlLgorICAgKi8KKyAgIE5hbWVWYWx1ZSBnZXRDb250ZXh0QnlOYW1lKAorICAgICAgaW4gTmFtZSB2YXJOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwOSkKKyAgICogTGlzdCB0aGUgbmFtZXMgb2YgY29udGV4dCB2YXJpYWJsZXMgZnJvbSB0aGUgc2Vzc2lvbi4gQSBwYXR0ZXJuCisgICAqIHN0cmluZyBjYW4gYmUgc3BlY2lmaWVkIHRvIHNlbGVjdCBncm91cHMgb2YgdmFyaWFibGVzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB2YXJQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBjb250ZXh0CisgICAqICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUocykuCisgICAqCisgICAqIEByZXR1cm4gIEEgbGlzdCBvZiBjb250ZXh0IHZhcmlhYmxlIG5hbWVzLgorICAgKi8KKyAgIE5hbWVJdGVyYXRvciBsaXN0Q29udGV4dCgKKyAgICAgIGluIFBhdHRlcm4gdmFyUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTApCisgICAqIFJlbW92ZSBjb250ZXh0IHZhcmlhYmxlcyBmcm9tIHRoZSBzZXNzaW9uLiBBIHBhdHRlcm4gc3RyaW5nIGNhbiBiZQorICAgKiBzcGVjaWZpZWQgdG8gcmVtb3ZlIGdyb3VwcyBvZiB2YXJpYWJsZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhclBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIGNvbnRleHQKKyAgICogICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZShzKSB0byBiZSByZW1vdmVkLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlQ29udGV4dCgKKyAgICAgIGluIFBhdHRlcm4gdmFyUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTEpCisgICAqIFNldC9tb2RpZnkgYSBrbm93biBjb250ZXh0IHZhcmlhYmxlIG9yIGFkZCBhIG5ldyBjb250ZXh0IHZhcmlhYmxlIHRvCisgICAqIHRoZSBzZXNzaW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbnRleHRWYXJpYWJsZSAgVGhlIGNvbnRleHQgdmFyaWFibGUuCisgICAqLworICAgdm9pZCBzZXRDb250ZXh0KAorICAgICAgaW4gTmFtZVZhbHVlIGNvbnRleHRWYXJpYWJsZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTIpCisgICAqIFNldC9tb2RpZnkgYSBrbm93biBjb250ZXh0IHZhcmlhYmxlIG9yIGFkZCBhIG5ldyBjb250ZXh0IHZhcmlhYmxlIHRvCisgICAqIHRoZSBzZXNzaW9uLiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciB0aGUgZnJlcXVlbnRseSB1c2VkCisgICAqIHN0cmluZyB2YXJpYWJsZSB0eXBlLiBJdCB1c2VzIHNldENvbnRleHQgIGludGVybmFsbHkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdmFyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgdmFyaWFibGUuCisgICAqCisgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZSBvZiB0aGUgY29udGV4dCB2YXJpYWJsZS4KKyAgICovCisgICB2b2lkIHNldENvbnRleHRTdHJpbmcoCisgICAgICBpbiBOYW1lIHZhck5hbWUsCisgICAgICBpbiBUX1NUUklORyB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTMpCisgICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24gb24gdGhlIHBoeXNpY2FsIHN0b3JhZ2Ugc3lzdGVtIChlLmcuIGRhdGFiYXNlCisgICAqIHN5c3RlbSkuIE9ubHkgd2hlbiBhIHRyYW5zYWN0aW9uIGlzIHN0YXJ0ZWQgaXQgaXMgYWxsb3dlZCB0byBjcmVhdGUKKyAgICogb3IgbW9kaWZ5IGluc3RhbmNlcyBvciBtZWFzdXJlbWVudCBkYXRhLiBUaGUgY2hhbmdlcyBnZXQgcGVybWFuZW50CisgICAqIHdpdGggYSBjb21taXQgb2YgdGhlIHRyYW5zYWN0aW9uIG9yIHdpbGwgYmUgbG9zdCB3aXRoIGFuIGFib3J0IG9mCisgICAqIHRoZSB0cmFuc2FjdGlvbi4gSWYgdGhlIHNlc3Npb24gaXMgY2xvc2VkIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlCisgICAqIGNvbW1pdHRlZCBhdXRvbWF0aWNhbGx5LiBJZiBhIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgYWN0aXZlIGFuCisgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX0FMUkVBRFlfQUNUSVZFCisgICAqLworICAgdm9pZCBzdGFydFRyYW5zYWN0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTQpCisgICAqIE1ha2UgdGhlIGNoYW5nZXMgcGVybWFuZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBmbHVzaCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDE1KQorICAgKiBFdmVyeSBuZXcgY3JlYXRlZCBpbnN0YW5jZSB3aWxsIHNldCBpdHMgaW5pdGlhbCByaWdodHMgdG8gPGFjbD4gLgorICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIGRlZmF1bHQtbWV0aG9kcyBmb3IgYXBwbHlpbmcgaW5pdGlhbAorICAgKiByaWdodHMuIFRoZSBpbml0aWFsIHJpZ2h0cyBhcmUgb25seSB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaXJsRW50cmllcyAgVGhlIGN1cnJlbnQgaW5pdGlhbCByaWdodHMuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBTZXQgKDEpIG9yIHJlbW92ZSAoMCkgdGhlIGN1cnJlbnQgaW5pdGlhbCByaWdodHMuIFRoZQorICAgKiAgICAgICAgICAgICAgcHJldmlvdXMgaW5pdGlhbCByaWdodHMgZ2V0IGxvc3QuIElmIHRoZSBwYXJhbWV0ZXIgc2V0CisgICAqICAgICAgICAgICAgICBpcyAwIChyZW1vdmUpIHRoZSBwYXJhbWV0ZXIgaXJsRW50cmllcyB3aWxsIGJlIGlnbm9yZWQuCisgICAqLworICAgdm9pZCBzZXRDdXJyZW50SW5pdGlhbFJpZ2h0cygKKyAgICAgIGluIEluaXRpYWxSaWdodFNlcXVlbmNlIGlybEVudHJpZXMsCisgICAgICBpbiBUX0JPT0xFQU4gc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAxNikKKyAgICogR2V0IHRoZSBjdXJyZW50IGxvY2sgbW9kZS4gVGhlIGxvY2sgbW9kZSB0ZWxscyB0aGUgc2VydmVyIHdoaWNoCisgICAqIG9iamVjdHMgdG8gbG9jayBmb3IgdXBjb21pbmcgY2hhbmdlcy4gQXBwbGljYXRpb24gZWxlbWVudHMsIGluc3RhbmNlCisgICAqIGVsZW1lbnRzIG9yIGNoaWxkcmVuIG9mIGVsZW1lbnRzIGNhbiBiZSBsb2NrZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgbG9jayBtb2RlLiBUaGUgbG9jayBtb2RlIGNvbnN0YW50cyBhcmUgZGVmaW5lZAorICAgKiAgICAgICAgICBpbiB0aGUgaW50ZXJmYWNlIExvY2tNb2RlLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24KKyAgICogICAgICAgICAgbGFuZ3VhZ2UgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mCisgICAqICAgICAgICAgIGVudW1lcmF0aW9ucyB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8gYmUgZG9uZQorICAgKiAgICAgICAgICBpbiBhbiBpbnRlcmZhY2UuCisgICAqLworICAgVF9TSE9SVCBnZXRMb2NrTW9kZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDE3KQorICAgKiBTZXQgdGhlIG5ldyBsb2NrIG1vZGUuIFRoZSBsb2NrIG1vZGUgdGVsbHMgdGhlIHNlcnZlciB3aGljaCBvYmplY3RzCisgICAqIHRvIGxvY2sgZm9yIHVwY29taW5nIGNoYW5nZXMuIEFwcGxpY2F0aW9uIGVsZW1lbnRzLCBpbnN0YW5jZQorICAgKiBlbGVtZW50cyBvciBjaGlsZHJlbiBvZiBlbGVtZW50cyBjYW4gYmUgbG9ja2VkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBsb2NrTW9kZSAgVGhlIG5ldyBsb2NrIG1vZGUuIFRoZSBsb2NrIG1vZGUgY29uc3RhbnRzIGFyZQorICAgKiAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UgTG9ja01vZGUuIFRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBsYW5ndWFnZSBJREwgZG9lcyBub3QgYWxsb3cgdG8gc2V0IHRoZQorICAgKiAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgZW51bWVyYXRpb25zIHRodXMgdGhlIGNvbnN0YW50CisgICAqICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuIGludGVyZmFjZS4KKyAgICovCisgICB2b2lkIHNldExvY2tNb2RlKAorICAgICAgaW4gVF9TSE9SVCBsb2NrTW9kZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMTgpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBhY2Nlc3Mgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgYWNjZXNzIG9iamVjdC4KKyAgICovCisgICBBcHBsRWxlbUFjY2VzcyBnZXRBcHBsRWxlbUFjY2VzcygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDE5KQorICAgKiBDaGFuZ2UgdGhlIHBhc3N3b3JkIGZvciB1c2VyIGRlZmluZWQgYnkgPHVzZXJuYW1lPiB0byA8bmV3UGFzc3dvcmQ+LgorICAgKiBBIG5vcm1hbCB1c2VyIG11c3Qgc3VwcGx5IGhpcyBjdXJyZW50IHBhc3N3b3JkIDxvbGRQYXNzd29yZD4uIFRoZQorICAgKiBzdXBlciB1c2VyIGNhbiBjaGFuZ2UgdGhlIHBhc3N3b3JkIHdpdGhvdXQgc3VwcGx5aW5nIHRoZSBjdXJyZW50CisgICAqIHBhc3N3b3JkIDxvbGRQYXNzd29yZD4uIElmIG5vIHVzZXJuYW1lIGlzIGdpdmVuIHRoZSBwYXNzd29yZCBvZiB0aGUKKyAgICogdXNlciBvZiB0aGUgY3VycmVudCBzZXNzaW9uIHdpbGwgYmUgY2hhbmdlZC4gVGhlIHBhc3N3b3JkIGlzCisgICAqIG5vcm1hbGx5IGVuY3J5cHRlZCBpbiB0aGUgYXR0cmlidXRlIG9mIHRoZSB1c2VyIGluc3RhbmNlIGVsZW1lbnQuCisgICAqIENyZWF0aW5nIGEgbmV3IHVzZXIgY2FuIGJlIGRvbmUgYnkgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2UsCisgICAqIGFmdGVyd2FyZHMgdGhlIHBhc3N3b3JkIG11c3QgYmUgc2V0IGJ5IHRoZSBzdXBlciB1c2VyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fV1JPTkdfUEFTU1dPUkQKKyAgICoKKyAgICogQHBhcmFtICB1c2VybmFtZSAgVGhlIG5hbWUgb2YgdGhlIHVzZXIgZm9yIHdoaWNoIHRoZSBwYXNzd29yZCB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgIGJlIGNoYW5nZWQuIElmIG5vIHVzZXJuYW1lIGlzIGdpdmVuIHRoZSBwYXNzd29yZAorICAgKiAgICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCB1c2VyIHdpbGwgYmUgY2hhbmdlZC4gSWYgdGhlCisgICAqICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCB1c2VyIHRoZSBjdXJyZW50CisgICAqICAgICAgICAgICAgICAgICAgIHVzZXIgbXVzdCBiZSBhIHN1cGVyIHVzZXIuCisgICAqCisgICAqIEBwYXJhbSAgb2xkUGFzc3dvcmQgIFRoZSBjdXJyZW50IHBhc3N3b3JkIG9mIHRoZSB1c2VyLiBBIG5vcm1hbCB1c2VyCisgICAqICAgICAgICAgICAgICAgICAgICAgIG11c3Qgc3VwcGx5IGhpcyBjdXJyZW50IHBhc3N3b3JkLiBUaGUgc3VwZXIKKyAgICogICAgICAgICAgICAgICAgICAgICAgdXNlciBjYW4gY2hhbmdlIHRoZSBwYXNzd29yZCB3aXRob3V0IHN1cHBseWluZworICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBwYXNzd29yZC4KKyAgICoKKyAgICogQHBhcmFtICBuZXdQYXNzd29yZCAgVGhlIG5ldyBwYXNzd29yZCBvZiB0aGUgdXNlci4KKyAgICovCisgICB2b2lkIHNldFBhc3N3b3JkKAorICAgICAgaW4gVF9TVFJJTkcgdXNlcm5hbWUsCisgICAgICBpbiBUX1NUUklORyBvbGRQYXNzd29yZCwKKyAgICAgIGluIFRfU1RSSU5HIG5ld1Bhc3N3b3JkKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyMCkKKyAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgKiBzZXNzaW9uIGlzIGlkZW50aWNhbCB3aXRoIGRlc2NyaXB0aW9uIG9mIHRoZSBBU0FNIE9EUyBmYWN0b3J5LiBJZgorICAgKiB0aGUgZGVzY3JpcHRpb24gaXMgbm90IGF2YWlsYWJsZSBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgYW5kIG5vCisgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBzZXJ2ZXIgbG9hZHMgdGhlIGRlc2NyaXB0aW9uIGZyb20gdGhlIGJhc2UKKyAgICogYXR0cmlidXRlICJkZXNjcmlwdGlvbiIgb2YgdGhlIGluc3RhbmNlIG9mIEFvRW52aXJvbm1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAqLworICAgVF9TVFJJTkcgZ2V0RGVzY3JpcHRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyMSkKKyAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBBU0FNIE9EUyBzZXNzaW9uLiBUaGUgbmFtZSBvZiB0aGUgc2Vzc2lvbiBpcworICAgKiBpZGVudGljYWwgd2l0aCB0aGUgbmFtZSBvZiB0aGUgQVNBTSBPRFMgZmFjdG9yeS4gSWYgdGhlIG5hbWUgaXMgbm90CisgICAqIGF2YWlsYWJsZSBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqIFRoZSBzZXJ2ZXIgbG9hZHMgdGhlIG5hbWUgZnJvbSB0aGUgYmFzZSBhdHRyaWJ1dGUgIm5hbWUiIG9mIHRoZQorICAgKiBpbnN0YW5jZSBvZiBBb0Vudmlyb25tZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAqLworICAgTmFtZSBnZXROYW1lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMjIpCisgICAqIEdldCB0aGUgdHlwZSBvZiB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4gVGhlIHR5cGUgb2YgdGhlIHNlc3Npb24gaXMKKyAgICogaWRlbnRpY2FsIHdpdGggdGhlIHR5cGUgb2YgdGhlIEFTQU0gT0RTIGZhY3RvcnkuIElmIHRoZSB0eXBlIGlzIG5vdAorICAgKiBhdmFpbGFibGUgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGFuZCBubyBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKiBUaGUgc2VydmVyIGxvYWRzIHRoZSB0eXBlIGZyb20gdGhlIGJhc2UgYXR0cmlidXRlCisgICAqICJBcHBsaWNhdGlvbl9tb2RlbF90eXBlIiBvZiB0aGUgaW5zdGFuY2Ugb2YgQW9FbnZpcm9ubWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB0eXBlIG9mIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgKi8KKyAgIFRfU1RSSU5HIGdldFR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyMykKKyAgICogQ3JlYXRlIGEgUXVlcnlFdmFsdWF0b3Igb2JqZWN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXcgY3JlYXRlZCBxdWVyeSBldmFsdWF0b3Igb2JqZWN0CisgICAqLworICAgUXVlcnlFdmFsdWF0b3IgY3JlYXRlUXVlcnlFdmFsdWF0b3IoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyNCkKKyAgICogQ3JlYXRlIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBJbnRlcmZhY2UgQmxvYiBvbiB0aGUgc2VydmVyLiBUaGlzCisgICAqIG9iamVjdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkYXRhIHR5cGUKKyAgICogRFRfQkxPQi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlZmVyZW5jZSBvZiB0aGUgYmxvYiBvYmplY3Qgd2hpY2ggaXMgZ2VuZXJhdGVkIGF0IHRoZQorICAgKiAgICAgICAgICBzZXJ2ZXIuCisgICAqLworICAgQmxvYiBjcmVhdGVCbG9iKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMjUpCisgICAqIENyZWF0ZSBhIGNvIHNlc3Npb24uIFRoZSBjbyBzZXNzaW9uIHNlc3Npb24gaXMgdGhlIHNhbWUgc2Vzc2lvbiBhcworICAgKiB0aGUgb3JpZ2luYWwgc2Vzc2lvbiB3YXMgYXQgbG9naW4gdGltZS4KKyAgICogVGhlIGNvIHNlc3Npb24gaGFzIG5vIHJlbGF0aW9uIHRvIHRoZSBvcmlnaW5hbCBzZXNzaW9uIGV4Y2VwdCB0aGF0CisgICAqIHRoZSBzYW1lIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQuCisgICAqIEEgY2xpZW50IGFwcGxpY2F0aW9uIHdpdGggY29tcG9uZW50cyBjYW4gZ2l2ZSBhbGwgY29tcG9uZW50cyBoaXMgb3duCisgICAqIHNlc3Npb24gdG8gdGhlIEFTQU0gT0RTIFNlcnZlci4gU28gdGhlIGNvbXBvbmVudCBjYW4gY2xvc2UgdGhlCisgICAqIHNlc3Npb24gd2hlbiBpdCBpcyByZWFkeSwgdGhlIGNvbXBvbmVudCBjYW4gc3RhcnQgaGlzIG93bgorICAgKiB0cmFuc2FjdGlvbiB3aXRob3V0IGFueSBjb25mbGljdCB3aXRoIG90aGVyIGNvbXBvbmVudHMuIAorICAgKiBPbmx5IHdoZW4gdGhlIHZhcmlhYmxlIENSRUFURV9DT1NFU1NJT05fQUxMT1dFRD1UUlVFIGlzIGdpdmVuIGluIHRoZQorICAgKiAnYXV0aCcgcGFyYW1ldGVyIG9mIHRoZSBtZXRob2QgbmV3U2Vzc2lvbiBhdCB0aGUgaW50ZXJmYWNlIEFvRmFjdG9yeQorICAgKiBhbiBuZXcgc2Vzc2lvbiB3aWxsIGJlIGNyZWF0ZWQgb3RoZXJ3aXNlIHRoZSBleGNlcHRpb24KKyAgICogQU9fQUNDRVNTX0RFTklFRCBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvIHNlc3Npb24uCisgICAqLworICAgQW9TZXNzaW9uIGNyZWF0ZUNvU2Vzc2lvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDI2KQorICAgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBlbGVtZW50IG9mIHRoZSB1c2VyIGxvZ2dlZCBpbiwgdGhpcyBpcyB0aGUKKyAgICogaW5zdGFuY2UgZWxlbWVudCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGRlcml2ZWQgZnJvbSBBb1VzZXIsCisgICAqIHdpdGggdGhlIG5hbWUgZ2l2ZW4gaW4gcyBnaXZlbiBpbiB0aGUgJ2F1dGgnIHBhcmFtZXRlciBvZiB0aGUgbWV0aG9kCisgICAqIG5ld1Nlc3Npb24gYXQgdGhlIGludGVyZmFjZSBBb0ZhY3RvcnkgKHZhcmlhYmxlIFVTRVIpLiAKKyAgICogCisgICAqIFdoZW4gdGhlIGNsaWVudCBzZXR0aW5ncyBvZiB0aGUgdXNlciBhcmUgc3RvcmVkIGluIHRoZSBBU0FNIE9EUworICAgKiBhcHBsaWNhdGlvbiBtb2RlbCwgdGhpcyBtZXRob2RzIGhlbHBzIHRoZSBjbGllbnQgIHRvIGdldCBoaXMKKyAgICogc2V0dGluZ3MuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBlbGVtZW50IG9mIHRoZSBsb2dnZWQgaW4gdXNlci4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgZ2V0VXNlcigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDI3KQorICAgKiBHZXQgdGhlIGxpc3Qgd2l0aCB0aGUgYXR0cmlidXRlcyBvZiBhbGwgZWxlbWVudHMgYW5kIHRoZSBlbnVtZXJhdGlvbgorICAgKiBuYW1lIHdoaWNoIGhhcyBhbiBlbnVtZXJhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbGlzdCB3aXRoIGF0dHJpYnV0ZSBhbmQgdGhlcmUgZW51bWVyYXRpb24uCisgICAqLworICAgRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmVTZXF1ZW5jZSBnZXRFbnVtZXJhdGlvbkF0dHJpYnV0ZXMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAyOCkKKyAgICogR2V0IGFsbCBlbnVtZXJhdGlvbnMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24gbW9kZWwuIFRoZSBlbnVtZXJhdGlvbnMKKyAgICogYW5kIGFsbCBpdGVtcyBvZiB0aGUgZW51bWVyYXRpb25zIGFyZSByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGVudW1lcmF0aW9uIHdpdGggdGhlcmUgSXRlbXMuCisgICAqLworICAgRW51bWVyYXRpb25TdHJ1Y3R1cmVTZXF1ZW5jZSBnZXRFbnVtZXJhdGlvblN0cnVjdHVyZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDI5KQorICAgKiBSZXR1cm5zIHRoZSBJZCBvZiB0aGUgc2Vzc2lvbiwgdGhlIE9EUyBzZXJ2ZXIgd2lsbCBnaXZlIGVhY2ggc2Vzc2lvbgorICAgKiBhbiB1bmlxdWUgSWQuIFRoZSBPRFMgc2VydmVyIHJldHVybnMgdGhpcyBJZCB0byB0aGUgY2xpZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgSWQgb2YgdGhlIHNlc3Npb24uCisgICAqLworICAgVF9MT05HIGdldElkKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgQW9TZXNzaW9uLgorCisvKioKKyogVGhlIEFTQU0gT0RTIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEFwcGxpY2F0aW9uQXR0cmlidXRlIHsKKworICAgLyoqICg0MDAxKQorICAgKiBHZXQgdGhlIGJhc2UgYXR0cmlidXRlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSBhdHRyaWJ1dGUgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4gQSAnbnVsbCcKKyAgICogICAgICAgICAgaXMgcmV0dXJuZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBoYXMgbm8gYmFzZQorICAgKiAgICAgICAgICBhdHRyaWJ1dGUuCisgICAqLworICAgQmFzZUF0dHJpYnV0ZSBnZXRCYXNlQXR0cmlidXRlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMDIpCisgICAqIEdldCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZGF0YSB0eXBlIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAwMykKKyAgICogR2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG1heGltdW0gYWxsb3dlZCBsZW5ndGggb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBUX0xPTkcgZ2V0TGVuZ3RoKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMDQpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAwNSkKKyAgICogR2V0IHRoZSB1bml0IElkIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuIFRoZSB1bml0IElkIGlzIG9ubHkKKyAgICogdmFsaWQgZm9yIHRoZSBjdXJyZW50IHNlcnZlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB1bml0IElkIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgVF9MT05HTE9ORyBnZXRVbml0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMDYpCisgICAqIEdldCB0aGUgb2JsaWdhdG9yeSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgb2JsaWdhdG9yeSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgVF9CT09MRUFOIGlzT2JsaWdhdG9yeSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg0MDA3KQorICAgKiBHZXQgdGhlIHVuaXF1ZSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdW5pcXVlIGZsYWcgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBUX0JPT0xFQU4gaXNVbmlxdWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAwOCkKKyAgICogU2V0IHRoZSBiYXNlIGF0dHJpYnV0ZSBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiBUaGlzIGFsbG93cyB0aGUKKyAgICogY2xpZW50IHRvIGRlY2xhcmUgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSAobmV3IG9yIGV4aXN0aW5nKQorICAgKiBhZGRpdGlvbmFsIHRvIGEgYmFzZSBhdHRyaWJ1dGUuIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbAorICAgKiBiZWNvbWUgdGhlIGRlcml2ZWQgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBiYXNlIGF0dHJpYnV0ZS4KKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIGJhc2UgYXR0cmlidXRlIG11c3QgYmUgdW5pcXVlIHdpdGhpbiB0aGUgYXBwbGljYXRpb24gZWxlbWVudAorICAgKiBvdGhlcndpc2UgdGhlIGV4Y2VwdGlvbiBBT19EVVBMSUNBVEVfQkFTRV9BVFRSSUJVVEUgaXMgdGhyb3duLgorICAgKiAKKyAgICogRm9yIHBlcmZvcm1hbmNlIGFuZCBmbGV4aWJpbGl0eSByZWFzb25zIHRoaXMgc2V0LW1ldGhvZCBzaG91bGQgYmUKKyAgICogdXNlZCBiZWZvcmUgdGhlIG5ldyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaXMgY29tbWl0dGVkIHRoZSBmaXJzdAorICAgKiB0aW1lLgorICAgKiAKKyAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QgY29tbWl0IGl0IHdpbGwgbm90IHRocm93CisgICAqIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKiAgICBBT19NSVNTSU5HX1ZBTFVFCisgICAqICAgIEFPX05PVF9VTklRVUUuCisgICAqIAorICAgKiBBZnRlciB0aGUgZmlyc3QgY29tbWl0LCB0aGVyZSBtYXkgYmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBhdHRyaWJ1dGUuIFRoZXNlIGluc3RhbmNlcyBtYXkgY2F1c2UgdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKKyAgICogCisgICAqIEFPX0lOVkFMSURfREFUQVRZUEU6IFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIG5vdCB0aGUKKyAgICogc2FtZSBhcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQgYXR0cmlidXRlcy4KKyAgICogCisgICAqIEFPX01JU1NJTkdfVkFMVUU6IFRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIHNldAorICAgKiBidXQgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGVtcHR5IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2VzLgorICAgKiAKKyAgICogQU9fTk9UX1VOSVFVRTogVGhlIHVuaXF1ZSBmbGFnIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZSBpcyBzZXQgYnV0IHRoZQorICAgKiB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlcyBhcmUgbm90IHVuaXF1ZS4KKyAgICogCisgICAqIFRoZSBsZW5ndGgsIHRoZSBuYW1lIGFuZCB0aGUgdW5pdCBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGFyZQorICAgKiBub3QgYWZmZWN0ZWQgYnkgdGhpcyBjYWxsLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fRFVQTElDQVRFX0JBU0VfQVRUUklCVVRFCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKiAgICBBT19NSVNTSU5HX1ZBTFVFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT1RfVU5JUVVFCisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBiYXNlQXR0ciAgVGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIHZvaWQgc2V0QmFzZUF0dHJpYnV0ZSgKKyAgICAgIGluIEJhc2VBdHRyaWJ1dGUgYmFzZUF0dHIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg0MDA5KQorICAgKiBTZXQgdGhlIGRhdGEgdHlwZSBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSBkYXRhIHR5cGUgb2YgYXBwbGljYXRpb24gYXR0cmlidXRlcworICAgKiB0aGF0IHJlcHJlc2VudCBiYXNlIGF0dHJpYnV0ZXMuIEFuIGF0dGVtcHQgdG8gc2V0IHRoZSBkYXRhIHR5cGUgb2YKKyAgICogc3VjaCBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gdGhlIGV4Y2VwdGlvbgorICAgKiBBT19JU19CQVNFX0FUVFJJQlVURS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKiAKKyAgICogQWZ0ZXIgdGhlIGZpcnN0IGNvbW1pdCwgdGhlcmUgbWF5IGJlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlLiBUaGVzZSBpbnN0YW5jZXMgbWF5IGNhdXNlIHRoZSBmb2xsb3dpbmcgcHJvYmxlbToKKyAgICogCisgICAqIEFPX0lOVkFMSURfREFUQVRZUEU6IFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIG5vdCB0aGUKKyAgICogc2FtZSBhcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbnN0YW50aWF0ZWQgYXR0cmlidXRlcy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0hBU19CQVNFX0FUVFJJQlVURQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfREFUQVRZUEUKKyAgICogICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYURhdGFUeXBlICBUaGUgZGF0YSB0eXBlLgorICAgKi8KKyAgIHZvaWQgc2V0RGF0YVR5cGUoCisgICAgICBpbiBEYXRhVHlwZSBhYURhdGFUeXBlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxMCkKKyAgICogU2V0IHRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlcworICAgKiB0aGF0IHJlcHJlc2VudCBiYXNlIGF0dHJpYnV0ZXMuIEFuIGF0dGVtcHQgdG8gc2V0IHRoZSBvYmxpZ2F0b3J5CisgICAqIGZsYWcgb2Ygc3VjaCBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gdGhlIGV4Y2VwdGlvbgorICAgKiBBT19JU19CQVNFX0FUVFJJQlVURS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAKKyAgICogQWZ0ZXIgdGhlIGZpcnN0IGNvbW1pdCwgdGhlcmUgbWF5IGJlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlLiBUaGVzZSBpbnN0YW5jZXMgbWF5IGNhdXNlIHRoZSBmb2xsb3dpbmcgcHJvYmxlbToKKyAgICogCisgICAqIEFPX01JU1NJTkdfVkFMVUU6IFRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIHNldAorICAgKiBidXQgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGVtcHR5IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2VzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0JBU0VfQVRUUklCVVRFCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFhSXNPYmxpZ2F0b3J5ICBUaGUgb2JsaWdhdG9yeSBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SXNPYmxpZ2F0b3J5KAorICAgICAgaW4gVF9CT09MRUFOIGFhSXNPYmxpZ2F0b3J5KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxMSkKKyAgICogU2V0IHRoZSB1bmlxdWUgZmxhZyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIHNlcnZlciB3aWxsIGNoZWNrIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXJlCisgICAqIHVuaXF1ZS4gSWYgdGhpcyBmbGFnIGlzIHNldCBhbmQgdGhlIHZhbHVlcyBvZiBhbiBhdHRyaWJ1dGUgYXJlIG5vdAorICAgKiB1bmlxdWUgd2hlbiB1c2luZyB0aGUgbWV0aG9kIHNldFZhbHVlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCisgICAqIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBhbHJlYWR5IGV4aXN0IHRoYXQgY29udGFpbgorICAgKiBub24tdW5pcXVlIHZhbHVlcyBhbmQgdGhlIGZsYWcgc2hhbGwgYmUgc2V0IHRoaXMgbWV0aG9kIHRocm93cyBhbgorICAgKiBleGNlcHRpb24uCisgICAqIAorICAgKiBJdCBpcyBub3QgYWxsb3dlZCB0byBzZXQgdGhlIHVuaXF1ZSBmbGFnIG9mIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMKKyAgICogdGhhdCByZXByZXNlbnQgYmFzZSBhdHRyaWJ1dGVzLiBBbiBhdHRlbXB0IHRvIHNldCB0aGUgdW5pcXVlIGZsYWcgb2YKKyAgICogc3VjaCBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgd2lsbCByZXN1bHQgaW4gdGhlIGV4Y2VwdGlvbgorICAgKiBBT19JU19CQVNFX0FUVFJJQlVURS4KKyAgICogCisgICAqIElmIHRoZSB1bmlxdWUgZmxhZyBpcyBzZXQgdG8gVFJVRSB0aGUgb2JsaWdhdG9yeSBmbGFnIGlzIGFsc28gc2V0IHRvCisgICAqIFRSVUUuIFRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYm90aCBmbGFnIGRvIG5vdCBtYXR0ZXIgaW4gdGhpcyBjYXNlLgorICAgKiBTZXR0aW5nIHRoZSB1bmlxdWUgZmxhZyB0byBGQUxTRSBkb2VzIG5vdCBhZmZlY3QgdGhlIG9ibGlnYXRvcnkKKyAgICogZmxhZy4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjoKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAgICBBT19OT1RfVU5JUVVFCisgICAqIAorICAgKiBBZnRlciB0aGUgZmlyc3QgY29tbWl0LCB0aGVyZSBtYXkgYmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBhdHRyaWJ1dGUuIFRoZXNlIGluc3RhbmNlcyBtYXkgY2F1c2UgdGhlIGZvbGxvd2luZyBwcm9ibGVtOgorICAgKiAKKyAgICogQU9fTUlTU0lOR19WQUxVRTogVGhlIG9ibGlnYXRvcnkgZmxhZyBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUgaXMgc2V0CisgICAqIGJ1dCB0aGVyZSBhcmUgb25lIG9yIG1vcmUgZW1wdHkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZXMuCisgICAqIAorICAgKiBBT19OT1RfVU5JUVVFOiBUaGUgdW5pcXVlIGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlIGlzIHNldCBidXQgdGhlCisgICAqIHZhbHVlcyBvZiB0aGUgaW5zdGFuY2VzIGFyZSBub3QgdW5pcXVlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0JBU0VfQVRUUklCVVRFCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fTUlTU0lOR19WQUxVRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9UX1VOSVFVRQorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWFJc1VuaXF1ZSAgVGhlIHVuaXF1ZSBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SXNVbmlxdWUoCisgICAgICBpbiBUX0JPT0xFQU4gYWFJc1VuaXF1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTIpCisgICAqIFNldCB0aGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLiBUaGUKKyAgICogbWF4aW11bSB2YWx1ZSAgYWNjZXB0ZWQgYnkgdGhlIEFTQU0gT0RTIHNlcnZlciBmb3IgdGhpcyBsZW5ndGgKKyAgICogaW5mb3JtYXRpb24gZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBzdG9yYWdlLiBGb3IgdGhlCisgICAqIHBoeXNpY2FsIHN0b3JhZ2Ugc3BlY2lmaWVkIGluIGNoYXB0ZXIgMyB0aGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aAorICAgKiB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgQUZMRU4gdmFsdWUgaW4gU1ZDQVRUUiwgYW5kIGl0IGlzIHJlc3RyaWN0ZWQKKyAgICogYnkgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHN0cmluZyB0eXBlIGRhdGFiYXNlIGZpZWxkcy4gSWYgYSBsZW5ndGggaXMKKyAgICogc3BlY2lmaWVkIHRoYXQgZXhjZWVkcyB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsCisgICAqIHN0b3JhZ2UgdGhlIHNlcnZlciB3aWxsIHRocm93IHRoZSBleGNlcHRpb24gQU9fSU5WQUxJRF9MRU5HVEguIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uIAorICAgKiAKKyAgICogVGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBPRFMgZGF0YWJhc2UgZGVzaWduIHRvb2xzLiBOZWdhdGl2ZSBsZW5ndGgKKyAgICogdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIG9ubHkgYSBoaW50IHRvIGEgZGF0YWJhc2Ugc2VydmVyIGluIHRoZSBkZXNpZ24KKyAgICogcGhhc2Ugd2hpY2ggc2l6ZSB0aGUgZGF0YSBlbnRyaWVzIG1heSBoYXZlLiBUaGUgbGVuZ3RoIGlzIG9ubHkKKyAgICogcmVsZXZhbnQgZm9yIGlzIGlnbm9yZWQgZm9yIGFsbCBhdHRyaWJ1dGUgdmFsdWVzIHdpdGggdGhlIGRhdGEgdHlwZQorICAgKiBvdGhlciBkYXRhdHlwZXMgdGhhbiBEVF9TVFJJTkcsIERTX1NUUklORywgRFRfREFURSwgRFNfREFURSwgYWxsCisgICAqIGNvbXBvbmVudHMgb2YgRFRfRVhURVJOQUxSRUZFUkVOQ0UgYW5kIG9mIERTX0VYVEVSTkFMUkVGRVJFTkNFLCBhbmQKKyAgICogdGhlIGhlYWRlciBwb3J0aW9uIG9mIERUX0JMT0IuCisgICAqIAorICAgKiBGb3IgcGVyZm9ybWFuY2UgYW5kIGZsZXhpYmlsaXR5IHJlYXNvbnMgdGhpcyBzZXQtbWV0aG9kIHNob3VsZCBiZQorICAgKiB1c2VkIGJlZm9yZSB0aGUgbmV3IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpcyBjb21taXR0ZWQgdGhlIGZpcnN0CisgICAqIHRpbWUuCisgICAqIAorICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjb21taXQgaXQgd2lsbCBub3QgdGhyb3cKKyAgICogdGhlIGZvbGxvd2luZyBleGNlcHRpb246CisgICAqICAgIEFPX0hBU19JTlNUQU5DRVMKKyAgICogCisgICAqIEFmdGVyIHRoZSBmaXJzdCBjb21taXQsIHRoZXJlIG1heSBiZSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqIGF0dHJpYnV0ZS4gVGhlc2UgaW5zdGFuY2VzIG1heSBjYXVzZSB0aGUgZXhjZXB0aW9uIEFPX0hBU19JTlNUQU5DRVMKKyAgICogaWYgdGhlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGFyZSBub3QgZW1wdHkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfSU5TVEFOQ0VTCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9MRU5HVEgKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYUxlbmd0aCAgVGhlIG1heGltdW0gYXR0cmlidXRlIGxlbmd0aC4KKyAgICovCisgICB2b2lkIHNldExlbmd0aCgKKyAgICAgIGluIFRfTE9ORyBhYUxlbmd0aCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTMpCisgICAqIFNldCB0aGUgbmFtZSBvZiBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgbmFtZSBtdXN0IGJlIHVuaXF1ZS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0KKyAgICogbmFtZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIKKyAgICogaW1wbGVtZW50YXRpb25zIHR5cGljYWxseSByZXN0cmljdCBpdCB0byAzMCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fRFVQTElDQVRFX05BTUUKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFhTmFtZSAgVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBuYW1lLgorICAgKi8KKyAgIHZvaWQgc2V0TmFtZSgKKyAgICAgIGluIE5hbWUgYWFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxNCkKKyAgICogU2V0IHRoZSB1bml0IElkIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSB1bml0IElkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHNlcnZlci4gSWYgaW5zdGFuY2VzIG9mCisgICAqIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgZXhpc3QsIHRoZSByZXNwZWN0aXZlIHZhbHVlcyBhcmUKKyAgICogYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB1bml0LiBJZiB0aGVyZSBpcyBubyBrbm93bgorICAgKiBjb252ZXJzaW9uIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqIAorICAgKiBUaGUgYXV0b21hdGljIGNvbnZlcnNpb24gY2FuIGJlIGF2b2lkZWQgaWYgdGhlIHVuaXQgaXMgc2V0IHRvIHplcm8uCisgICAqIEFmdGVyIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG11c3QgYmUgY29tbWl0dGVkLiBJbiB0aGUgbmV4dCBzdGVwIHRoZQorICAgKiBuZXcgdW5pdCBtYXkgYmUgc2V0IGluIGFub3RoZXIgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgYXV0b21hdGljIGNvbnZlcnNpb24gaXMgZG9uZSBvbmx5IGZvciB0aGUgZm9sbG93aW5nIGRhdGEKKyAgICogdHlwZXM6CisgICAqICAgIERUX0JZVEUKKyAgICogICAgRFRfQ09NUExFWAorICAgKiAgICBEVF9EQ09NUExFWAorICAgKiAgICBEVF9ET1VCTEUKKyAgICogICAgRFRfRkxPQVQKKyAgICogICAgRFRfTE9ORworICAgKiAgICBEVF9MT05HTE9ORworICAgKiAgICBEVF9TSE9SVAorICAgKiBhcyB3ZWxsIGFzIGZvciB0aGUgY29ycmVzcG9uZGluZyBzZXF1ZW5jZSBkYXRhIHR5cGVzLiBGb3IgY29tcGxleAorICAgKiBkYXRhIHR5cGVzIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydCBhcmUgY29udmVydGVkIHNlcGFyYXRlbHkuCisgICAqIAorICAgKiBJZiB0aGUgdW5pdCBvZiBhbiBhdHRyaWJ1dGUgaXMgc2V0IHRoZSB1bml0IGlzIGNvbnN0YW50LiBJZiB0aGUKKyAgICogdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBoYXMgYW5vdGhlciB1bml0IHRoZSB2YWx1ZSBpcyByZWNhbGN1bGF0ZWQgdG8KKyAgICogdGhlIHVuaXQgb2YgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4gSWYgdGhlcmUgaXMgbm8gdW5pdCBhdCB0aGUKKyAgICogYXBwbGljYXRpb24gYXR0cmlidXRlIHRoZSB1bml0IGF0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgc3RvcmVkIGFuZAorICAgKiByZXBvcnRlZCBvbiByZXF1ZXN0IGF0IHRoZSBpbnN0YW5jZS4KKyAgICogCisgICAqIEZvciBwZXJmb3JtYW5jZSBhbmQgZmxleGliaWxpdHkgcmVhc29ucyB0aGlzIHNldC1tZXRob2Qgc2hvdWxkIGJlCisgICAqIHVzZWQgYmVmb3JlIHRoZSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGNvbW1pdHRlZCB0aGUgZmlyc3QKKyAgICogdGltZS4KKyAgICogCisgICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCBpdCB3aWxsIG5vdCB0aHJvdworICAgKiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisgICAqICAgIEFPX0lOQ09NUEFUSUJMRV9VTklUUworICAgKiAgICBBT19NQVRIX0VSUk9SCisgICAqIAorICAgKiBBZnRlciB0aGUgZmlyc3QgY29tbWl0LCB0aGVyZSBtYXkgYmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBhdHRyaWJ1dGUuIFRoZXNlIGluc3RhbmNlcyBtYXkgY2F1c2UgdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKKyAgICogCisgICAqIEFPX0lOQ09NUEFUSUJMRV9VTklUUzogTm8gY29udmVyc2lvbiBydWxlcyBpcyBrbm93biB0byBjb252ZXJ0IHRoZQorICAgKiB1bml0LgorICAgKiAKKyAgICogQU9fTUFUSF9FUlJPUjogQ29udmVydGluZyB0aGUgdmFsdWVzIHRvIHRoZSBuZXcgdW5pdCByZXN1bHRzIGluIGRhdGEKKyAgICogb3ZlcmZsb3cgb3IgdW5kZXJmbG93IG9yIGEgZGl2aXNpb24gYnkgemVybyBpcyBkZXRlY3RlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5DT01QQVRJQkxFX1VOSVRTCisgICAqICAgIEFPX01BVEhfRVJST1IKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVU5LTk9XTl9VTklUCisgICAqCisgICAqIEBwYXJhbSAgYWFVbml0ICBUaGUgdW5pdCBJZC4KKyAgICovCisgICB2b2lkIHNldFVuaXQoCisgICAgICBpbiBUX0xPTkdMT05HIGFhVW5pdCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTUpCisgICAqIFRoZSBnaXZlbiB1c2VyIGdyb3VwIHRoZSByaWdodHMgc2hvdWxkIGJlIHNldCBmb3IuIDxyaWdodHM+IGRlZmluZXMKKyAgICogdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvCisgICAqICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsIG90aGVycyBhcmUgY2xlYXJlZC4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIGFkZGVkIHRvCisgICAqIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdyZW1vdmUnLCB0aGUKKyAgICogcmlnaHRzIGluIDxyaWdodHM+IGFyZSByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHJpZ2h0cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cCAgVGhlIHVzZXIgZ3JvdXAgZm9yIHdoaWNoIHRoZSByaWdodHMgd2lsbCBiZQorICAgKiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4gVGhlIHJpZ2h0cworICAgKiAgICAgICAgICAgICAgICAgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgIFNlY3VyaXR5UmlnaHRzLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgIElETCBkb2VzIG5vdCBhbGxvdyB0byBzZXQgdGhlIHZhbHVlcyBvZiBlbnVtZXJhdGlvbnMKKyAgICogICAgICAgICAgICAgICAgIHRodXMgdGhlIGNvbnN0YW50IGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuCisgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyByaWdodC4KKyAgICovCisgICB2b2lkIHNldFJpZ2h0cygKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCB1c2VyZ3JvdXAsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTYpCisgICAqIFJldHJpZXZlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gb2YgdGhlIGdpdmVuIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFjY2VzcyBjb250cm9sIGxpc3QgZW50cmllcyBvZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogICAgICAgICAgZWxlbWVudC4KKyAgICovCisgICBBQ0xTZXF1ZW5jZSBnZXRSaWdodHMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAxNykKKyAgICogUmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnQgZ2V0QXBwbGljYXRpb25FbGVtZW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMTgpCisgICAqIEdldCB0aGUgYXV0byBnZW5lcmF0ZSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXV0byBnZW5lcmF0ZSBmbGFnIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgVF9CT09MRUFOIGlzQXV0b2dlbmVyYXRlZCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg0MDE5KQorICAgKiBTZXQgdGhlIGF1dG8gZ2VuZXJhdGUgZmxhZyBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlLgorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBGb3IgcGVyZm9ybWFuY2UgYW5kIGZsZXhpYmlsaXR5IHJlYXNvbnMgdGhpcyBzZXQtbWV0aG9kIHNob3VsZCBiZQorICAgKiB1c2VkIGJlZm9yZSB0aGUgbmV3IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpcyBjb21taXR0ZWQgdGhlIGZpcnN0CisgICAqIHRpbWUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfQkFTRV9BVFRSSUJVVEUKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JU19CQVNFX0FUVFJJQlVURQorICAgKiAgICBBT19NSVNTSU5HX1ZBTFVFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaXNBdXRvZ2VuZXJhdGVkICBUaGUgYXV0byBnZW5lcmF0ZSBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SXNBdXRvZ2VuZXJhdGVkKAorICAgICAgaW4gVF9CT09MRUFOIGlzQXV0b2dlbmVyYXRlZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMjApCisgICAqIEdldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bWVyYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBBU0FNIE9EUyBlbnVtZXJhdGlvbi4KKyAgICovCisgICBFbnVtZXJhdGlvbkRlZmluaXRpb24gZ2V0RW51bWVyYXRpb25EZWZpbml0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMjEpCisgICAqIFNldCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bWVyYXRpb24uIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZQorICAgKiBhcHBsaWNhdGlvbiBtb2RlbCwgb25seSB0aGUgc3VwZXIgdXNlciBjYW4gdXNlIHRoaXMgbWV0aG9kLgorICAgKiAKKyAgICogVGhlIEFvRXhjZXB0aW9uIEFPX0lOVkFMSURfREFUQVRZUEUgaXMgdGhyb3duIHdoZW4gdGhlIGRhdGEgdHlwZSBvZgorICAgKiB0aGUgYXR0cmlidXRlIGlzIG5vdCBEVF9FTlVNLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fSU5WQUxJRF9EQVRBVFlQRQorICAgKgorICAgKiBAcGFyYW0gIGVudW1EZWYgIFRoZSBuZXcgZW51bWVyYXRpb24gZGVmaW5pdGlvbi4KKyAgICovCisgICB2b2lkIHNldEVudW1lcmF0aW9uRGVmaW5pdGlvbigKKyAgICAgIGluIEVudW1lcmF0aW9uRGVmaW5pdGlvbiBlbnVtRGVmKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAyMikKKyAgICogSGFzIHRoZSBhdHRyaWJ1dGUgYW4gdW5pdC4gSWYgdGhpcyBmbGFnIGlzIHNldCwgYWxsIHRoZSBhdHRyaWJ1dGVzCisgICAqIG9mIHRoZSBpbnN0YW5jZXMgZGVyaXZlZCBmcm9tIHRoaXMgYXR0cmlidXRlIHdpbGwgaGFzIGFuIHVuaXQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBmbGFnIGlmIHRoZSBhdHRyaWJ1dGUgaGFzIGFuIHVuaXQuCisgICAqLworICAgVF9CT09MRUFOIGhhc1VuaXQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAyMykKKyAgICogU2V0IHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGFuIHVuaXQgb3Igbm90LiBBIGNhbGwgdG8gdGhlCisgICAqIG1ldGhvZCBzZXRVbml0KCkgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgd2l0aFVuaXQoVFJVRSkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB3aXRoVW5pdCAgVGhlIGZsYWcgaWYgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGFuIHVuaXQuCisgICAqLworICAgdm9pZCB3aXRoVW5pdCgKKyAgICAgIGluIFRfQk9PTEVBTiB3aXRoVW5pdCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDQwMjQpCisgICAqIERlcHJlY2F0ZWQsIG5vdCB1c2VkIGFueSBtb3JlIHNpbmNlIEFTQU0gT0RTIDUuMi4gCisgICAqIEhhcyB0aGUgYXR0cmlidXRlIGEgdmFsdWUgZmxhZy4gSWYgdGhpcyBmbGFnIGlzIHNldCwgYWxsIHRoZQorICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZXMgZGVyaXZlZCBmcm9tIHRoaXMgYXR0cmlidXRlIHdpbGwgaGFzIGEKKyAgICogdmFsdWUgZmxhZy4gSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQgdGhlIGZsYWcgaW4gdGhlIFRTX1ZhbHVlCisgICAqIHN0cnVjdHVyZSBjYW4gYmUgaWdub3JlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGZsYWcgaWYgdGhlIGF0dHJpYnV0ZSBoYXMgYSB2YWx1ZSBmbGFnLgorICAgKi8KKyAgIFRfQk9PTEVBTiBoYXNWYWx1ZUZsYWcoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNDAyNSkKKyAgICogRGVwcmVjYXRlZCwgbm90IHVzZWQgYW55IG1vcmUgc2luY2UgQVNBTSBPRFMgNS4yLiAKKyAgICogU2V0IHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGEgdmFsdWUgZmxhZyBvciBub3QuIElmIHRoaXMgZmxhZworICAgKiBpc24ndCBzZXQgdGhlIGZsYWcgb2YgdGhlIFRTX1ZhbHVlIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgc2VydmVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgd2l0aFZhbHVlRmxhZyAgVGhlIGZsYWcgaWYgdGhlIGF0dHJpYnV0ZSBiZWNvbWVzIGEgdmFsdWUKKyAgICogICAgICAgICAgICAgICAgICAgICAgICBmbGFnLgorICAgKi8KKyAgIHZvaWQgd2l0aFZhbHVlRmxhZygKKyAgICAgIGluIFRfQk9PTEVBTiB3aXRoVmFsdWVGbGFnKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsaWNhdGlvbkF0dHJpYnV0ZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBhcHBsaWNhdGlvbiBlbGVtZW50IGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQXBwbGljYXRpb25FbGVtZW50IHsKKworICAgLyoqICg1MDAxKQorICAgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gYXR0cmlidXRlIG9uIHRoZSBzZXJ2ZXIuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIHByb3BlcnRpZXMgb2YgdGhlIG5ldyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbWF5IGJlIGNoYW5nZWQgdmlhCisgICAqIHRoZSBzZXQtbWV0aG9kcyBvZiB0aGUgQXBwbGljYXRpb25BdHRyaWJ1dGUgaW50ZXJmYWNlLgorICAgKiAKKyAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgaXQgaXMgcmVjb21tZW5kZWQgdG8gc2V0IGFsbCByZXF1aXJlZAorICAgKiBwcm9wZXJ0aWVzIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBiZWZvcmUgaXQgaXMgY29tbWl0dGVkIHRoZQorICAgKiBmaXJzdCB0aW1lLiBUaGlzIGF2b2lkcyBkYXRhYmFzZSBjcm9zcy1jaGVja3MgZm9yIGVhY2ggYXR0cmlidXRlLgorICAgKiAKKyAgICogVGhlIGRlZmF1bHQgcHJvcGVydGllcyBvZiBhIG5ldyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgYXJlOgorICAgKiAgICBCYXNlQXR0cmlidXRlICAgTlVMTAorICAgKiAgICBEYXRhVHlwZSAgICAgICAgRFRfVU5LTk9XTgorICAgKiAgICBJc09ibGlnYXRvcnkgICAgMAorICAgKiAgICBJc1VuaXF1ZSAgICAgICAgMAorICAgKiAgICBMZW5ndGggICAgICAgICAgMAorICAgKiAgICBOYW1lICAgICAgICAgICAgIkFVVE9HRU4iCisgICAqICAgIFVuaXQgICAgICAgICAgICBOVUxMCisgICAqIAorICAgKiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgdGhlIHZhbHVlcworICAgKiBvZiB0aGUgZXhpc3RpbmcgaW5zdGFuY2VzIG9mIHRoZSBuZXcgYXR0cmlidXRlIGFyZSBzZXQgdG8KKyAgICogdW5kZWZpbmVkLgorICAgKiAKKyAgICogVGhlIGV4Y2VwdGlvbiBBT19EVVBMSUNBVEVfTkFNRSBuYW1lIG9jY3VycyBpZiB0aGVyZSBpcyBhbHJlYWR5CisgICAqIGFub3RoZXIgYXBwbGljYXRpb24gYXR0cmlidXRlIHdpdGggdGhlIG5hbWUgIkFVVE9HRU4iLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9OQU1FCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGFwcGxpY2F0aW9uIGF0dHJpYnV0ZS4KKyAgICovCisgICBBcHBsaWNhdGlvbkF0dHJpYnV0ZSBjcmVhdGVBdHRyaWJ1dGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAwMikKKyAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG91dHNpZGUgYSB0cmFuc2FjdGlvbiBidXQgaXQgaXMKKyAgICogcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBpbnN0YW5jZSBnZXRzIHBlcm1hbmVudCB3aGVuIHRoZSAgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLiAgQWxsCisgICAqIGF0dHJpYnV0ZXMgY29ubmVjdGVkIHRvIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGFyZSBhdXRvbWF0aWNhbGx5CisgICAqIGNyZWF0ZWQgYW5kIGNvbm5lY3RlZCB0byB0aGUgaW5zdGFuY2UuIFRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMKKyAgICogY2FuIGJlIHNldCBieSB0aGUgbWV0aG9kIHNldFZhbHVlIG9mIHRoZSBpbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWVOYW1lICBUaGUgaW5zdGFuY2UgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5ldyBpbnN0YW5jZS4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgY3JlYXRlSW5zdGFuY2UoCisgICAgICBpbiBOYW1lIGllTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDUwMDMpCisgICAqIEdldCBhIGxpc3Qgb2YgYWxsIHJlbGF0ZWQgYXBwbGljYXRpb24gZWxlbWVudHMgY29ubmVjdGVkIHRvIHRoaXMKKyAgICogYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldEFsbFJlbGF0ZWRFbGVtZW50cygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA0KQorICAgKiBHZXQgYSBsaXN0IG9mIGFsbCBhcHBsaWNhdGlvbiByZWxhdGlvbnMgY29ubmVjdGVkIHRvIHRoaXMKKyAgICogYXBwbGljYXRpb24gZWxlbWVudC4gVGhlIGludmVyc2UgcmVsYXRpb24gb2YgcmVsYXRpb25zIGNvbm5lY3RlZCB0bworICAgKiBvdGhlciBhcHBsaWNhdGlvbiBlbGVtZW50cyBwb2ludGluZyB0byB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogZWxlbWVudHMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbnMgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25SZWxhdGlvblNlcXVlbmNlIGdldEFsbFJlbGF0aW9ucygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA1KQorICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50IHdoaWNoIGlzCisgICAqIGluaGVyaXRlZCBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgYmFzZSBuYW1lCisgICAqIGlzIGNhc2UgaW5zZW5zaXRpdmUgYW5kIG1heSBub3QgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLiAKKyAgICogCisgICAqIE5vdGU6IFRoZSBiYXNlIG1vZGVsIGlzIGNhc2UgYmxpbmQsICBlLmcuIElkLCBJRCBhbmQgaWQgaXMgYWxsIHRoZQorICAgKiBzYW1lIGJhc2UgYXR0cmlidXRlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhTmFtZSAgVGhlIGJhc2UgYXR0cmlidXRlIG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUuCisgICAqLworICAgQXBwbGljYXRpb25BdHRyaWJ1dGUgZ2V0QXR0cmlidXRlQnlCYXNlTmFtZSgKKyAgICAgIGluIE5hbWUgYmFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAwNikKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCB3aGljaCBoYXMKKyAgICogdGhlIGdpdmVuIG5hbWUuIFRoZSBuYW1lIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgbm90IGNvbnRhaW4KKyAgICogd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICogCisgICAqIE5vdGU6IFRoZSBhcHBsaWNhdGlvbiBtb2RlbCBpcyBjYXNlIHNlbnNpdGl2ZSwgZS5nLiBJZCBhbmQgSUQgYXJlCisgICAqIGRpZmZlcmVudCBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzLCBkb24ndCB1c2UgdGhpcyBtaXNsZWFkaW5nCisgICAqIGF0dHJpYnV0ZSBuYW1lLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFhTmFtZSAgVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBuYW1lLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uQXR0cmlidXRlIGdldEF0dHJpYnV0ZUJ5TmFtZSgKKyAgICAgIGluIE5hbWUgYWFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAwNykKKyAgICogR2V0IGEgbGlzdCBvZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlcyBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKiBUaGUgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMuCisgICAqLworICAgQXBwbGljYXRpb25BdHRyaWJ1dGVTZXF1ZW5jZSBnZXRBdHRyaWJ1dGVzKAorICAgICAgaW4gUGF0dGVybiBhYVBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA4KQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudCBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBCYXNlRWxlbWVudCBnZXRCYXNlRWxlbWVudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDA5KQorICAgKiBHZXQgdGhlIElkIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgVF9MT05HTE9ORyBnZXRJZCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDEwKQorICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBJZC4gSWYgdGhlIElkIG9mIHRoZQorICAgKiBpbnN0YW5jZSBpcyBub3QgdW5pcXVlIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWVJZCAgVGhlIGluc3RhbmNlIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudCBnZXRJbnN0YW5jZUJ5SWQoCisgICAgICBpbiBUX0xPTkdMT05HIGllSWQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDExKQorICAgKiBHZXQgdGhlIGluc3RhbmNlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBuYW1lLiBJZiB0aGUgbmFtZSBvZgorICAgKiB0aGUgaW5zdGFuY2UgaXMgbm90IHVuaXF1ZSBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgKiAKKyAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgaW5zdGFuY2UgZWxlbWVudHMgd2l0aCB1bmlxdWUKKyAgICogbmFtZXMuIElmIHRoZXJlIGFyZSBkdXBsaWNhdGUgbmFtZXMgZm9yIGluc3RhbmNlIHVzZSB0aGUgbWV0aG9kCisgICAqIGdldEluc3RhbmNlcyBpbnN0ZWFkIGFuZCBzcGVjaWZ5IHRoZSByZXF1ZXN0ZWQgbmFtZSBhcyBwYXR0ZXJuCisgICAqIHBhcmFtZXRlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9OQU1FCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBpZU5hbWUgIFRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudCBnZXRJbnN0YW5jZUJ5TmFtZSgKKyAgICAgIGluIE5hbWUgaWVOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxMikKKyAgICogR2V0IHRoZSBpbnN0YW5jZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZSBwYXR0ZXJuIGlzIGNhc2UKKyAgICogc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgaW5zdGFuY2UKKyAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGluc3RhbmNlIGVsZW1lbnRzLgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudEl0ZXJhdG9yIGdldEluc3RhbmNlcygKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxMykKKyAgICogR2V0IHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxNCkKKyAgICogR2V0IHJlbGF0ZWQgYXBwbGljYXRpb24gZWxlbWVudHMgY29ubmVjdGVkIHZpYSB0aGUgc3BlY2lmaWVkCisgICAqIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZVJlbGF0aW9uc2hpcCAgVGhlIHJlcXVlc3RlZCByZWxhdGlvbnNoaXAuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldFJlbGF0ZWRFbGVtZW50c0J5UmVsYXRpb25zaGlwKAorICAgICAgaW4gUmVsYXRpb25zaGlwIGFlUmVsYXRpb25zaGlwKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxNSkKKyAgICogR2V0IGFwcGxpY2F0aW9uIHJlbGF0aW9ucyBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgY29ubmVjdGVkIGZyb20gdGhpcworICAgKiBhcHBsaWNhdGlvbiBlbGVtZW50LiBUaGUgaW52ZXJzZSByZWxhdGlvbnMgYXJlIG5vdCByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWVSZWxhdGlvblR5cGUgIFRoZSByZXF1ZXN0ZWQgcmVsYXRpb24gdHlwZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9ucy4KKyAgICovCisgICBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zQnlUeXBlKAorICAgICAgaW4gUmVsYXRpb25UeXBlIGFlUmVsYXRpb25UeXBlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxNikKKyAgICogR2V0IHRoZSBuYW1lcyBvZiBhbGwgcmVsYXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgcmVsYXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEFsbFJlbGF0ZWRFbGVtZW50cygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDE3KQorICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICogVGhlcmUgYXJlIG5vIGF0dHJpYnV0ZSBuYW1lcyByZXR1cm5lZCBpbiB0aGUgcmVzdWx0IGxpc3QgdGhhdAorICAgKiBjb250YWluIGEgcmVmZXJlbmNlIHRvIGFub3RoZXIgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzLgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0QXR0cmlidXRlcygKKyAgICAgIGluIFBhdHRlcm4gYWFQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAxOCkKKyAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgaW5zdGFuY2VzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwYXR0ZXJuLiBUaGUKKyAgICogcGF0dGVybiBpcyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSBpbnN0YW5jZXMuCisgICAqLworICAgTmFtZUl0ZXJhdG9yIGxpc3RJbnN0YW5jZXMoCisgICAgICBpbiBQYXR0ZXJuIGFhUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDUwMTkpCisgICAqIEdldCB0aGUgbmFtZXMgb2YgcmVsYXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cyBjb25uZWN0ZWQgdmlhIHRoZQorICAgKiBzcGVjaWZpZWQgcmVsYXRpb25zaGlwLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OU0hJUAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlUmVsYXRpb25zaGlwICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSByZWxhdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0UmVsYXRlZEVsZW1lbnRzQnlSZWxhdGlvbnNoaXAoCisgICAgICBpbiBSZWxhdGlvbnNoaXAgYWVSZWxhdGlvbnNoaXApCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDIwKQorICAgKiBSZW1vdmUgYW4gYXBwbGljYXRpb24gYXR0cmlidXRlIGZyb20gYW4gYXBwbGljYXRpb24gZWxlbWVudC4gSWYKKyAgICogdGhlcmUgYXJlIGluc3RhbmNlcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudCB0aGUgYXR0cmlidXRlIG9mIHRoZQorICAgKiBleGlzdGluZyBpbnN0YW5jZXMgY2hhbmdlIGZyb20gYXBwbGljYXRpb24gdG8gaW5zdGFuY2UgYXR0cmlidXRlcy4KKyAgICogCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXBwbEF0dHIgIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgdG8gcmVtb3ZlLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKAorICAgICAgaW4gQXBwbGljYXRpb25BdHRyaWJ1dGUgYXBwbEF0dHIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDIxKQorICAgKiBSZW1vdmUgYW4gaW5zdGFuY2UgZnJvbSB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIHJlbW92ZSBhbiBpbnN0YW5jZSBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzZXJ2ZXIgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMKKyAgICogY29tbWl0dGVkLiBJZiB0aGUgcmVjdXJzaXZlIGZsYWcgaXMgc2V0IGFsbCBjaGlsZHJlbiBvZiB0aGUgaW5zdGFuY2UKKyAgICogYXJlIGFsc28gZGVsZXRlZC4gUmVtb3ZpbmcgaW5zdGFuY2VzIGlzIGFsbG93ZWQgb25seSBpZiB0aGVyZSBhcmUgbm8KKyAgICogcmVmZXJlbmNlcyhyZWxhdGlvbnMpIHRvIHRoaXMgaW5zdGFuY2UuIElmIHRoZSByZWN1cnNpdmUgZmxhZyBpcyBzZXQKKyAgICogYSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZSBjaGlsZHJlbiBpcyBub3QgYWxsb3dlZCBhbmQgd2lsbCBjYXVzZSBhbgorICAgKiBleGNlcHRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfUkVGRVJFTkNFUworICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWVJZCAgVGhlIGluc3RhbmNlIElkLgorICAgKgorICAgKiBAcGFyYW0gIHJlY3Vyc2l2ZSAgVGhlIHJlY3Vyc2l2ZSBmbGFnLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlSW5zdGFuY2UoCisgICAgICBpbiBUX0xPTkdMT05HIGllSWQsCisgICAgICBpbiBUX0JPT0xFQU4gcmVjdXJzaXZlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyMikKKyAgICogU2V0IHRoZSBiYXNlIGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIGFzc2lnbm1lbnQgdG8gdGhlIGN1cnJlbnQgYmFzZSBlbGVtZW50IGlzIG92ZXJ3cml0dGVuLiBJZiB0aGVyZQorICAgKiBhcmUgaW5zdGFuY2VzIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9yIHJlZmVyZW5jZXMgdG8gdGhlCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0hBU19JTlNUQU5DRVMKKyAgICogICAgQU9fSEFTX1JFRkVSRU5DRVMKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmFzZUVsZW0gIFRoZSBiYXNlIGVsZW1lbnQuCisgICAqLworICAgdm9pZCBzZXRCYXNlRWxlbWVudCgKKyAgICAgIGluIEJhc2VFbGVtZW50IGJhc2VFbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyMykKKyAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKiAgCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG11c3QgYmUgdW5pcXVlLgorICAgKiAKKyAgICogVGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZQorICAgKiBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIKKyAgICogaW1wbGVtZW50YXRpb25zIHJlc3RyaWN0IGl0IHRvIDMwIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19EVVBMSUNBVEVfTkFNRQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZU5hbWUgIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAqLworICAgdm9pZCBzZXROYW1lKAorICAgICAgaW4gTmFtZSBhZU5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDI0KQorICAgKiBUaGUgZ2l2ZW4gdXNlciBncm91cCB0aGUgcmlnaHRzIHNob3VsZCBiZSBzZXQgZm9yLiA8cmlnaHRzPiBkZWZpbmVzCisgICAqIHRoZSByaWdodHMgdG8gc2V0IG9yIHRvIGNsZWFyLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0bworICAgKiAnc2V0JywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgc2V0IGFsbCBvdGhlcnMgYXJlIGNsZWFyZWQuIElmIHRoZQorICAgKiBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdhZGQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBhZGRlZCB0bworICAgKiB0aGUgZXhpc3RpbmcgcmlnaHRzLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0byAncmVtb3ZlJywgdGhlCisgICAqIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBleGlzdGluZyByaWdodHMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXAgIFRoZSB1c2VyIGdyb3VwIGZvciB3aGljaCB0aGUgcmlnaHRzIHdpbGwgYmUKKyAgICogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyByaWdodCBmb3IgdGhlIHVzZXIgZ3JvdXAuIFRoZSByaWdodHMKKyAgICogICAgICAgICAgICAgICAgIGNvbnN0YW50cyBhcmUgZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlCisgICAqICAgICAgICAgICAgICAgICBTZWN1cml0eVJpZ2h0cy4gVGhlIGludGVyZmFjZSBkZWZpbml0aW9uIGxhbmd1YWdlCisgICAqICAgICAgICAgICAgICAgICBJREwgZG9lcyBub3QgYWxsb3cgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgZW51bWVyYXRpb25zCisgICAqICAgICAgICAgICAgICAgICB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8gYmUgZG9uZSBpbiBhbgorICAgKiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgV2hhdCB0byBkbyB3aXRoIHRoZSBuZXcgcmlnaHQuCisgICAqLworICAgdm9pZCBzZXRSaWdodHMoCisgICAgICBpbiBJbnN0YW5jZUVsZW1lbnQgdXNlcmdyb3VwLAorICAgICAgaW4gVF9MT05HIHJpZ2h0cywKKyAgICAgIGluIFJpZ2h0c1NldCBzZXQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDI1KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgIGVsZW1lbnQuCisgICAqLworICAgQUNMU2VxdWVuY2UgZ2V0UmlnaHRzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDUwMjYpCisgICAqIFJldHJpZXZlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gZm9yIHRoZSBpbml0aWFsIHJpZ2h0cyBvZgorICAgKiB0aGUgZ2l2ZW4gb2JqZWN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyaWVzIHdpdGggdGhlIGluaXRpYWwgcmlnaHRzIG9mCisgICAqICAgICAgICAgIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKi8KKyAgIEluaXRpYWxSaWdodFNlcXVlbmNlIGdldEluaXRpYWxSaWdodHMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyNykKKyAgICogVGhlIGdpdmVuIHVzZXIgZ3JvdXAgdGhlIGluaXRpYWwgcmlnaHRzIHNob3VsZCBiZSBzZXQgZm9yLiA8cmlnaHRzPgorICAgKiBkZWZpbmVzIHRoZSByaWdodHMgdG8gc2V0IG9yIHRvIGNsZWFyLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldAorICAgKiB0byAnc2V0JywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgc2V0IGFsbCBvdGhlcnMgYXJlIGNsZWFyZWQuIElmCisgICAqIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdhZGQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZQorICAgKiBhZGRlZCB0byB0aGUgZXhpc3RpbmcgcmlnaHRzLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0bworICAgKiAncmVtb3ZlJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBleGlzdGluZworICAgKiByaWdodHMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXAgIFRoZSB1c2VyIGdyb3VwIGZvciB3aGljaCB0aGUgaW5pdGlhbCByaWdodHMgd2lsbAorICAgKiAgICAgICAgICAgICAgICAgICAgYmUgbW9kaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IGluaXRpYWwgcmlnaHRzIGZvciB0aGUgdXNlciBncm91cC4gVGhlCisgICAqICAgICAgICAgICAgICAgICByaWdodHMgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgIFNlY3VyaXR5UmlnaHRzLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgIElETCBkb2VzIG5vdCBhbGxvdyB0byBzZXQgdGhlIHZhbHVlcyBvZiBlbnVtZXJhdGlvbnMKKyAgICogICAgICAgICAgICAgICAgIHRodXMgdGhlIGNvbnN0YW50IGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuCisgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgcmVmQWlkICBUaGUgSWQgb2YgcmVmZXJlbmNpbmcgYXBwbGljYXRpb24gZWxlbWVudCBmb3Igd2hpY2gKKyAgICogICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIHJpZ2h0cyB3aWxsIGJlIHVzZWQuIElmIG5vIHJlZkFpZCBpcyBzZXQKKyAgICogICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIHJpZ2h0cyB3aWxsIGJlIHVzZWQgZm9yIGVhY2ggbmV3CisgICAqICAgICAgICAgICAgICAgICBpbnN0YW5jZSBlbGVtZW50IGluZGVwZW5kZW50IG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiAgICAgICAgICAgICAgICAgZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgbmV3IGluaXRpYWwgcmlnaHRzLgorICAgKi8KKyAgIHZvaWQgc2V0SW5pdGlhbFJpZ2h0cygKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCB1c2VyZ3JvdXAsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gVF9MT05HTE9ORyByZWZBaWQsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyOCkKKyAgICogU2V0IGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gZWxlbWVudCwgd2hpY2ggcmVsYXRpb24gd2lsbCBiZSB1c2VkCisgICAqIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCByaWdodHMgZm9yIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsUmVsICBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvCisgICAqICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5lIHRoZSBpbml0aWFsIHJpZ2h0cy4gVGhlIHJlbGF0aW9uIHJhbmdlIG9mCisgICAqICAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG11c3QgYmUgWzE6MV0gb3RoZXJ3aXNlCisgICAqICAgICAgICAgICAgICAgICAgdGhlIHNlcnZlciBjYW4gbm90IGZpbmQgYW4gdW5pcXVlIGluc3RhbmNlIGVsZW1lbnQKKyAgICogICAgICAgICAgICAgICAgICB0byByZXRyaWV2ZSB0aGUgaW5pdGlhbCByaWdodHMuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBTZXQgb3IgcmVtb3ZlIHRoZSByZWxhdGlvbiBmb3IgdGhlIGluaXRpYWwgcmlnaHRzLiBJZgorICAgKiAgICAgICAgICAgICAgdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSB0aGUgcmVsYXRpb24gd2lsbCBiZSBzZXQKKyAgICogICAgICAgICAgICAgIG90aGVyd2lzZSByZW1vdmVkLgorICAgKi8KKyAgIHZvaWQgc2V0SW5pdGlhbFJpZ2h0UmVsYXRpb24oCisgICAgICBpbiBBcHBsaWNhdGlvblJlbGF0aW9uIGFwcGxSZWwsCisgICAgICBpbiBUX0JPT0xFQU4gc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAyOSkKKyAgICogR2V0IGFsbCByZWxhdGlvbnMgd2hpY2ggYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGluc3RhbmNlcyB0byBjcmVhdGUKKyAgICogdGhlIGluaXRpYWwgcmlnaHRzIG9mIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZSBlbGVtZW50LiBJZiB0aGVyZSBhcmUKKyAgICogbW9yZSB0aGVuIG9uZSBhcHBsaWNhdGlvbiByZWxhdGlvbiB0aGUgaW5pdGlhbCByaWdodHMgb2YgZWFjaAorICAgKiByZWxhdGVkIGluc3RhbmNlIGFyZSAnb3JlZCcgdG8gdGhlIGxpc3Qgb2YgdGhlIGluaXRpYWwgcmlnaHRzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2Ugd2l0aCB0aGUgYXBwbGljYXRpb24gcmVsYXRpb25zIHdoaWNoIHdpbGwgYmUKKyAgICogICAgICAgICAgdXNlZCB0byBjcmVhdGUgdGhlIGluaXRpYWwgcmlnaHRzIG9mIHRoZSBuZXcgY3JlYXRlZAorICAgKiAgICAgICAgICBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIEFwcGxpY2F0aW9uUmVsYXRpb25TZXF1ZW5jZSBnZXRJbml0aWFsUmlnaHRSZWxhdGlvbnMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzMCkKKyAgICogR2V0IHRoZSBzZWN1cml0eSBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4gVGhlIHNlY3VyaXR5CisgICAqIGxldmVsIHRlbGxzIGlmIHRoZXJlIGlzIGEgc2VjdXJpdHkgY2hlY2sgZm9yIGJvdGggYXBwbGljYXRpb24KKyAgICogZWxlbWVudCBhbmQgaW5zdGFuY2UgZWxlbWVudHMgb3Igb25seSBmb3IgdGhlIGFwcGxpY2F0aW9uCisgICAqIGF0dHJpYnV0ZXMsIHRoZSBpbnN0YW5jZSBlbGVtZW50cyBvciBub25lIGF0IGFsbC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgc2VjdXJpdHkgbGV2ZWwuIFRoZSBzZWN1cml0eSBsZXZlbCBjb25zdGFudHMKKyAgICogICAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSBTZWN1cml0eUxldmVsLiBUaGUgaW50ZXJmYWNlCisgICAqICAgICAgICAgIGRlZmluaXRpb24gbGFuZ3VhZ2UgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mCisgICAqICAgICAgICAgIGVudW1lcmF0aW9ucyB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8gYmUgZG9uZQorICAgKiAgICAgICAgICBpbiBhbiBpbnRlcmZhY2UuCisgICAqLworICAgVF9MT05HIGdldFNlY3VyaXR5TGV2ZWwoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzMSkKKyAgICogU2V0IHRoZSBzZWN1cml0eSBsZXZlbCBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGVsZW1lbnQuIElmIHRoZQorICAgKiBzZWN1cml0eSBsZXZlbCBpcyBhZGRlZCB0aGUgY2xpZW50IGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgYWNjZXNzCisgICAqIGNvbnRyb2wgbGlzdCBlbnRyaWVzIG9mIHRoZSBleGlzdGluZyBvYmplY3RzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgc2VjTGV2ZWwgIFRoZSBuZXcgc2VjdXJpdHkgbGV2ZWwuIFRoZSBzZWN1cml0eSBsZXZlbAorICAgKiAgICAgICAgICAgICAgICAgICBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgICBTZWN1cml0eUxldmVsLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mCisgICAqICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9ucyB0aHVzIHRoZSBjb25zdGFudCBkZWZpbml0aW9ucyBoYWQgdG8KKyAgICogICAgICAgICAgICAgICAgICAgYmUgZG9uZSBpbiBhbiBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyBzZWN1cml0eSBsZXZlbC4KKyAgICovCisgICB2b2lkIHNldFNlY3VyaXR5TGV2ZWwoCisgICAgICBpbiBUX0xPTkcgc2VjTGV2ZWwsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzMikKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBtb2RlbCB0byB3aGljaCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBiZWxvbmdzCisgICAqIGJ5IHJldHVybmluZyBhbiBvYmplY3Qgd2l0aCB0aGUgaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RydWN0dXJlLiBUaGUKKyAgICogYXBwbGljYXRpb24gbW9kZWwgcHJvdmlkZWQgaXMgdGhlIHNhbWUgYXMgdGhhdCBwcm92aWRlZCBmcm9tIHRoZQorICAgKiBtZXRob2QgZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUgb2YgdGhlIEludGVyZmFjZSBBb1Nlc3Npb24uIFRoaXMKKyAgICogbWV0aG9kIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2xpZW50IHNvZnR3YXJlIGlzIGFibGUgdG8gcmV0dXJuIHRvIHRoZQorICAgKiBzZXNzaW9uIGluIGNhc2UgdGhlIHNlc3Npb24gb2JqZWN0IGlzIG5vdCBhdmFpbGFibGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiBzdHJ1Y3R1cmUgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQKKyAgICogICAgICAgICAgYmVsb25ncy4KKyAgICovCisgICBBcHBsaWNhdGlvblN0cnVjdHVyZSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg1MDMzKQorICAgKiBDcmVhdGUgYSBsaXN0IHdpdGggaW5zdGFuY2VzLiBUaGUgYXR0cmlidXRlIGFyZSBnaXZlbiB3aXRoIHRoZSBuYW1lCisgICAqIG9mIHRoZSBzZXF1ZW5jZS4gVGhlIHZhbHVlcyBvZiB0aGUgYXR0cmlidXRlcyBhcmUgZ2l2ZW4gaW4gdGhlIHZhbHVlCisgICAqIHNlcXVlbmNlLiBUaGUgaW5kZXggaW4gdGhlIGRpZmZlcmVudCB2YWx1ZSBzZXF1ZW5jZXMgbWF0Y2ggZm9yIG9uZQorICAgKiBpbnN0YW5jZSBlbGVtZW50LiBUaGUgaW5kZXggaW4gdGhlIGluc3RhbmNlIGVsZW1lbnQgc2VxdWVuY2Ugb2YgdGhlCisgICAqIHJlbGF0ZWQgaW5zdGFuY2VzIG1hdGNoIGZvciB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBpbmRleCBpbiB0aGUKKyAgICogdmFsdWUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fSU5WQUxJRF9SRVFVRVNUCisgICAqCisgICAqIEBwYXJhbSAgYXR0cmlidXRlcyAgVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIG5ldyBjcmVhdGVkIGluc3RhbmNlcy4KKyAgICoKKyAgICogQHBhcmFtICByZWxhdGVkSW5zdGFuY2VzICBUaGUgbGlzdCB3aXRoIHJlbGF0ZWQgaW5zdGFuY2VzIGZvcgorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBhcHBsaWNhdGlvbiByZWxhdGlvbnMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBsaXN0IHdpdGggdGhlIG5ldyBjcmVhdGVkIGluc3RhbmNlcy4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnRTZXF1ZW5jZSBjcmVhdGVJbnN0YW5jZXMoCisgICAgICBpbiBOYW1lVmFsdWVTZXFVbml0U2VxdWVuY2UgYXR0cmlidXRlcywKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb25JbnN0YW5jZUVsZW1lbnRTZXFTZXF1ZW5jZSByZWxhdGVkSW5zdGFuY2VzKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNTAzNCkKKyAgICogUmV0dXJuIHRoZSBiYXNpYyBhcHBsaWNhdGlvbiByZWxhdGlvbnMgZGVyaXZlZCBmcm9tIHRoZSBiYXNlCisgICAqIHJlbGF0aW9uIHdpdGggdGhlIGdpdmVuIHJlbGF0aW9uIG5hbWUuCisgICAqIFRha2UgY2FyZSBhdCBtb3N0IGVsZW1lbnRzIG9ubHkgb25lIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGNhbiBiZQorICAgKiBkZXJpdmVkIGZyb20gYSBiYXNlIHJlbGF0aW9uLCB0aGVyZSBhcmUgc29tZSB3ZWxsIGRlZmluZWQKKyAgICogZXhjZXB0aW9ucywgc28gdGhlIG1ldGhvZCBjYW4gcmV0dXJuIG1vcmUgdGhlbiBvbmUgYXBwbGljYXRpb24KKyAgICogcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhc2VSZWxOYW1lICBUaGUgbmFtZSBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIHNlcXVlbmNlLCBpZiBubyByZWxhdGlvbiBpcyBmb3VuZAorICAgKiAgICAgICAgICBhbiBlbXB0eSBzZXF1ZW5jZSBpcyByZXR1cm5lZC4KKyAgICovCisgICBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zQnlCYXNlTmFtZSgKKyAgICAgIGluIE5hbWUgYmFzZVJlbE5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEFwcGxpY2F0aW9uRWxlbWVudC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBhcHBsaWNhdGlvbiByZWxhdGlvbiBpbnRlcmZhY2UuCisqIAorKiBBIHJlbGF0aW9uIGlzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdHdvIEFTQU0gT0RTIGVsZW1lbnRzOyBpdCBtYXkgYmUKKyogbmF2aWdhdGVkIGluIGJvdGgKKyogZGlyZWN0aW9ucy4gVGhlIGdldC0gYW5kIHNldC0gbWV0aG9kcyBhcmUgZGVmaW5lZCBmcm9tIHRoZSBmaXJzdAorKiBlbGVtZW50LCB0aGUgZ2V0SW52ZXJzZS0gYW5kCisqIHNldEludmVyc2UtIG1ldGhvZHMgd29yayBmcm9tIHRoZSBzZWNvbmQgZWxlbWVudC4KKyovCitpbnRlcmZhY2UgQXBwbGljYXRpb25SZWxhdGlvbiB7CisKKyAgIC8qKiAoNjAwMSkKKyAgICogR2V0IHRoZSBiYXNlIHJlbGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBiYXNlIHJlbGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4gQSAnbnVsbCcgaXMKKyAgICogICAgICAgICAgcmV0dXJuZWQgaWYgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGhhcyBubyBiYXNlIHJlbGF0aW9uLgorICAgKi8KKyAgIEJhc2VSZWxhdGlvbiBnZXRCYXNlUmVsYXRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwMikKKyAgICogR2V0IHRoZSBmaXJzdCBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnQgZ2V0RWxlbTEoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwMykKKyAgICogR2V0IHRoZSBzZWNvbmQgYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2Vjb25kIGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudCBnZXRFbGVtMigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDA0KQorICAgKiBHZXQgdGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIFJlbGF0aW9uUmFuZ2UgZ2V0SW52ZXJzZVJlbGF0aW9uUmFuZ2UoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwNSkKKyAgICogR2V0IHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW52ZXJzZSByZWxhdGlvbnNoaXAgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIFJlbGF0aW9uc2hpcCBnZXRJbnZlcnNlUmVsYXRpb25zaGlwKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDYwMDYpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqLworICAgTmFtZSBnZXRSZWxhdGlvbk5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAwNykKKyAgICogR2V0IHRoZSByZWxhdGlvbiByYW5nZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIFJlbGF0aW9uUmFuZ2UgZ2V0UmVsYXRpb25SYW5nZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDA4KQorICAgKiBHZXQgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb25zaGlwIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICovCisgICBSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDYwMDkpCisgICAqIEdldCB0aGUgcmVsYXRpb24gdHlwZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb24gdHlwZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25UeXBlIGdldFJlbGF0aW9uVHlwZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDEwKQorICAgKiBTZXQgdGhlIGJhc2UgcmVsYXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgcmVsYXRpb24gdHlwZSBhbmQgcmVsYXRpb24gcmFuZ2UgaXMgY29waWVkIGZyb20gdGhlIGJhc2UKKyAgICogcmVsYXRpb24uIFRoZSBwcmV2aW91cyB2YWx1ZXMgZ2V0IGxvc3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT04KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhc2VSZWwgIFRoZSBiYXNlIHJlbGF0aW9uLgorICAgKi8KKyAgIHZvaWQgc2V0QmFzZVJlbGF0aW9uKAorICAgICAgaW4gQmFzZVJlbGF0aW9uIGJhc2VSZWwpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDExKQorICAgKiBTZXQgdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfRUxFTUVOVAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXBwbEVsZW0gIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKi8KKyAgIHZvaWQgc2V0RWxlbTEoCisgICAgICBpbiBBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbEVsZW0pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDEyKQorICAgKiBTZXQgdGhlIHNlY29uZCBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24gb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0VMRU1FTlQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFwcGxFbGVtICBUaGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICovCisgICB2b2lkIHNldEVsZW0yKAorICAgICAgaW4gQXBwbGljYXRpb25FbGVtZW50IGFwcGxFbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAxMykKKyAgICogU2V0IHRoZSByZWxhdGlvbiByYW5nZSBvZiBhbiBhcHBsaWNhdGlvbiByZWxhdGlvbi4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24gb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogSXQgaXMgb25seSBhbGxvd2VkIHRvIHNldCB0aGUgcmVsYXRpb24gdHlwZSBpZiBubyBiYXNlIHJlbGF0aW9uIGlzCisgICAqIGRlZmluZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfQkFTRV9SRUxBVElPTgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT05fUkFOR0UKKyAgICogICAgQU9fSVNfQkFTRV9SRUxBVElPTgorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFyUmVsYXRpb25SYW5nZSAgVGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2UuCisgICAqLworICAgdm9pZCBzZXRJbnZlcnNlUmVsYXRpb25SYW5nZSgKKyAgICAgIGluIFJlbGF0aW9uUmFuZ2UgYXJSZWxhdGlvblJhbmdlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAxNCkKKyAgICogU2V0IHRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIGFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0KKyAgICogbmFtZSBsZW5ndGggb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIKKyAgICogdHlwaWNhbGx5IGltcGxlbWVudGF0aW9ucyByZXN0cmljdCBpdCB0byAzMCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFyTmFtZSAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG5hbWUuCisgICAqLworICAgdm9pZCBzZXRSZWxhdGlvbk5hbWUoCisgICAgICBpbiBOYW1lIGFyTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDYwMTUpCisgICAqIFNldCB0aGUgcmVsYXRpb24gcmFuZ2Ugb2YgYW4gYXBwbGljYXRpb24gcmVsYXRpb24uIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIG91dHNpZGUgYQorICAgKiB0cmFuc2FjdGlvbiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIEl0IGlzIG9ubHkgYWxsb3dlZCB0byBzZXQgdGhlIHJlbGF0aW9uIHR5cGUgaWYgbm8gYmFzZSByZWxhdGlvbiBpcworICAgKiBkZWZpbmVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0JBU0VfUkVMQVRJT04KKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OX1JBTkdFCisgICAqICAgIEFPX0lTX0JBU0VfUkVMQVRJT04KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFyUmVsYXRpb25SYW5nZSAgVGhlIHJlbGF0aW9uIHJhbmdlLgorICAgKi8KKyAgIHZvaWQgc2V0UmVsYXRpb25SYW5nZSgKKyAgICAgIGluIFJlbGF0aW9uUmFuZ2UgYXJSZWxhdGlvblJhbmdlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNjAxNikKKyAgICogU2V0IHRoZSByZWxhdGlvbiB0eXBlIG9mIGFuIGFwcGxpY2F0aW9uIHJlbGF0aW9uLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgcmVsYXRpb25zaGlwIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdGhlIHJlbGF0aW9uIHR5cGUgaXMgc2V0LgorICAgKiBJdCBpcyBvbmx5IGFsbG93ZWQgdG8gc2V0IHRoZSByZWxhdGlvbiB0eXBlIGlmIG5vIGJhc2UgcmVsYXRpb24gaXMKKyAgICogZGVmaW5lZC4KKyAgICogCisgICAqIEl0IGlzIG9ubHkgYWxsb3dlZCB0byBtb2RpZnkgYSByZWxhdGlvbiB0eXBlIHdoZW4gbm8gYmFzZSByZWxhdGlvbgorICAgKiBpcyBnaXZlbiwgb3RoZXJ3aXNlIHRoZSBleGNlcHRpb24gQU9fSEFTX0JBU0VfUkVMQVRJT04gaXMgdGhyb3duLgorICAgKiAKKyAgICogSXQgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHRoZSByZWxhdGlvbiB0eXBlIEZBVEhFUl9DSElMRCwgdGhlc2UKKyAgICogcmVsYXRpb24gdHlwZSBpcyByZXNlcnZlZCBmb3IgdGhlIGJhc2UgbW9kZWwuIFRoZSB0d28gcmVsYXRpb24gdHlwZXMKKyAgICogd2hpY2ggY2FuIGJlIHNldCBhcmUgIElORk8gb3IgSU5IRVJJVEFOQ0UuIAorICAgKiAKKyAgICogVGhlIHJlbGF0aW9uc2hpcCBpcyBzZXQgYXV0b21hdGljIHdoZW4gdGhlIHJlbGF0aW9uIHR5cGUgaXMgc2V0LCB0aGUKKyAgICogbWF4aW11bSBvZiB0aGUgcmVsYXRpb24gcmFuZ2UgZGV0ZXJtaW5lcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4KKyAgICogdGhlIGVsZW1lbnRzIG9mIHRoZSByZWxhdGlvbi4KKyAgICogCisgICAqIFIuVHlwZSAgICAgIHwgbWF4IFIuUmFuZ2UgfCBtYXggaW52LiBSLlJhbmdlIHwgUmVsYXRpb25zaGlwICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgCisgICAqIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAqICAgICAgICAgICAgICAKKyAgICogSU5GTyAgICAgICAgfCAxICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgfCBleGNlcHRpb24sCisgICAqIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRSAKKyAgICogLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgICogICAgICAgIAorICAgKiBJTkZPICAgICAgICB8IDEgICAgICAgICAgIHwgTUFOWSAgICAgICAgICAgICB8IElORk9fVE8gICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgIAorICAgKiAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgCisgICAqIElORk8gICAgICAgIHwgTUFOWSAgICAgICAgfCAxICAgICAgICAgICAgICAgIHwgSU5GT19GUk9NICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgCisgICAqIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAqICAgICAgICAgICAgICAKKyAgICogSU5GTyAgICAgICAgfCBNQU5ZICAgICAgICB8IE1BTlkgICAgICAgICAgICAgfCBJTkZPICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAKKyAgICogLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgICogICAgICAgICAgICAgIAorICAgKiBJTkhFUklUQU5DRSB8IDEgICAgICAgICAgIHwgMSAgICAgICAgICAgICAgICB8IGV4Y2VwdGlvbiwKKyAgICogQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFIAorICAgKiAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgCisgICAqIElOSEVSSVRBTkNFIHwgMSAgICAgICAgICAgfCBNQU5ZICAgICAgICAgICAgIHwgU1VQRVJUWVBFICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgCisgICAqIC0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tICAgICAgICAgCisgICAqICAgICAgICAgICAgICAKKyAgICogSU5IRVJJVEFOQ0UgfCBNQU5ZICAgICAgICB8IDEgICAgICAgICAgICAgICAgfCBTVUJUWVBFICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAKKyAgICogLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0gICAgICAgICAKKyAgICogICAgICAgICAgICAgIAorICAgKiBJTkhFUklUQU5DRSB8IE1BTlkgICAgICAgIHwgTUFOWSAgICAgICAgICAgICB8IGV4Y2VwdGlvbiwKKyAgICogQU9fSU5WQUxJRF9SRUxBVElPTl9UWVBFCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfQkFTRV9SRUxBVElPTgorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRQorICAgKiAgICBBT19JU19CQVNFX1JFTEFUSU9OCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhclJlbGF0aW9uVHlwZSAgVGhlIHJlbGF0aW9uIHR5cGUuCisgICAqLworICAgdm9pZCBzZXRSZWxhdGlvblR5cGUoCisgICAgICBpbiBSZWxhdGlvblR5cGUgYXJSZWxhdGlvblR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDE3KQorICAgKiBHZXQgdGhlIGludmVyc2UgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24uIFRoZSBpbnZlcnNlIG5hbWUKKyAgICogb2YgYW4gYXBwbGljYXRpb24gcmVsYXRpb24gaXMgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHNlZW4gZnJvbSB0aGUKKyAgICogb3RoZXIgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnZlcnNlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIE5hbWUgZ2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg2MDE4KQorICAgKiBTZXQgdGhlIG5hbWUgb2YgYW4gYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gcmVsYXRpb24gb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXJJbnZOYW1lICBUaGUgaW52ZXJzZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBuYW1lLgorICAgKi8KKyAgIHZvaWQgc2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgKKyAgICAgIGluIE5hbWUgYXJJbnZOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsaWNhdGlvblJlbGF0aW9uLgorCisvKioKKyogVGhlIEFTQU0gT0RTIGFwcGxpY2F0aW9uIHN0cnVjdHVyZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEFwcGxpY2F0aW9uU3RydWN0dXJlIHsKKworICAgLyoqICg3MDAxKQorICAgKiBDaGVjayB0aGUgYXBwbGljYXRpb24gbW9kZWwgZm9yIEFTQU0gT0RTIGNvbmZvcm1pdHkuIFRoZSBmaXJzdCBlcnJvcgorICAgKiBmb3VuZCBpcyByZXBvcnRlZCBieSBhbiBleGNlcHRpb24uIFRoZSBmb2xsb3dpbmcgY2hlY2tzIGFyZQorICAgKiBwZXJmb3JtZWQ6CisgICAqIAorICAgKiAgLSBFYWNoIGFwcGxpY2F0aW9uIGVsZW1lbnQgbXVzdCBiZSBkZXJpdmVkIGZyb20gYSB2YWxpZCBiYXNlCisgICAqIGVsZW1lbnQuCisgICAqICAtIEFuIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBpcyBkZXJpdmVkIGZyb20gb25lIGJhc2UgYXR0cmlidXRlLiBJdAorICAgKiBpcyBub3QgYWxsb3dlZCB0byBkZXJpdmUgbW9yZSB0aGUgb25lIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBmcm9tIHRoZQorICAgKiBzYW1lIGJhc2UgYXR0cmlidXRlLiBJdCBpcyBhbGxvd2VkIHRoYXQgYXBwbGljYXRpb24gYXR0cmlidXRlcyBhcmUKKyAgICogbm90IGRlcml2ZWQgZnJvbSBhbnkgYmFzZSBhdHRyaWJ1dGUuCisgICAqICAtIEFsbCBhcHBsaWNhdGlvbiBlbGVtZW50cyBtdXN0IGhhdmUgYXQgbGVhc3QgdGhlIG1hbmRhdG9yeQorICAgKiBhdHRyaWJ1dGVzLgorICAgKiAgLSBFYWNoIGFwcGxpY2F0aW9uIGVsZW1lbnRzIG11c3QgYmUgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBBc2FtCisgICAqIHBhdGguIE5vICJmbG9hdGluZyIgYXBwbGljYXRpb24gZWxlbWVudHMgYXJlIGFsbG93ZWQuCisgICAqICAtIEFsbCByZWxhdGlvbnMgcmVxdWlyZWQgYnkgdGhlIGJhc2UgbW9kZWwgbXVzdCBiZSBwcmVzZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9CQVNFX0FUVFJJQlVURQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT04KKyAgICogICAgQU9fTUlTU0lOR19BVFRSSUJVVEUKKyAgICogICAgQU9fTUlTU0lOR19SRUxBVElPTgorICAgKiAgICBBT19NSVNTSU5HX0FQUExJQ0FUSU9OX0VMRU1FTlQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX1BBVEhfVE9fRUxFTUVOVAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBjaGVjaygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDAyKQorICAgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gZWxlbWVudCBpbiB0aGUgYXBwbGljYXRpb24gbW9kZWwuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBpbmZvcm1hdGlvbiB3aGV0aGVyIG9yIG5vdCB0aGUgbmV3IGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYSB0b3AKKyAgICogbGV2ZWwgZWxlbWVudCBpcyB0YWtlbiBmcm9tIHRoZSBzcGVjaWZpZWQgYmFzZSBlbGVtZW50LiBUaGUgSWQgb2YKKyAgICogdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgc2V0IGF1dG9tYXRpY2FsbHkuIFRoZSBtYW5kYXRvcnkgYmFzZQorICAgKiBhdHRyaWJ1dGVzIGFyZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkuIE9wdGlvbmFsIGF0dHJpYnV0ZXMgaGF2ZSB0byBiZQorICAgKiBjcmVhdGVkIGJ5IHRoZSBjYWxsaW5nIHByb2dyYW0uIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaW50ZXJmYWNlCisgICAqIG1ldGhvZHMgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBhdHRyaWJ1dGVzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmFzZUVsZW0gIFRoZSBiYXNlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgYXBwbGljYXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBkZXJpdmVkLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25FbGVtZW50IGNyZWF0ZUVsZW1lbnQoCisgICAgICBpbiBCYXNlRWxlbWVudCBiYXNlRWxlbSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDMpCisgICAqIENyZWF0ZSBhIG5ldyByZWxhdGlvbi4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXBwbGljYXRpb24gbW9kZWwgb3V0c2lkZSBhIHRyYW5zYWN0aW9uCisgICAqIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIHJlbGF0aW9uIGlzIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIG1vZGVsLiBUaGUgYXBwbGljYXRpb24KKyAgICogcmVsYXRpb24gaW50ZXJmYWNlIG1ldGhvZHMgbWF5IGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSByZWxhdGlvbi4KKyAgICogCisgICAqIFRoZSBkZWZhdWx0IHByb3BlcnRpZXMgb2YgYSBuZXcgYXBwbGljYXRpb24gcmVsYXRpb24gYXJlOgorICAgKiAgICBCYXNlUmVsYXRpb24gICBOVUxMCisgICAqICAgIEVsZW1lbnQxICAgICAgIE5VTEwKKyAgICogICAgRWxlbWVudDIgICAgICAgTlVMTAorICAgKiAgICBSYW5nZSAgICAgICAgICAtMiwgLTIKKyAgICogICAgTmFtZSAgICAgICAgICAgTlVMTAorICAgKiAgICBUeXBlICAgICAgICAgICBJTkZPCisgICAqIFdoZW4gZWxlbWVudCAxIG9yIGVsZW1lbnQgMiBpcyBzZXQgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbgorICAgKiBpcyBzcGVjaWZpZWQsIHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBpcyBzZXQgdG8KKyAgICogIkFVVE9HRU4iLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGFwcGxpY2F0aW9uIHJlbGF0aW9uLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAwNCkKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHdpdGggdGhlIHJlcXVlc3RlZCBJZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZUlkICBUaGUgSWQgb2YgdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeUlkKAorICAgICAgaW4gVF9MT05HTE9ORyBhZUlkKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAwNSkKKyAgICogR2V0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IHdpdGggdGhlIHJlcXVlc3RlZCBuYW1lLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlTmFtZSAgVGhlIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqLworICAgQXBwbGljYXRpb25FbGVtZW50IGdldEVsZW1lbnRCeU5hbWUoCisgICAgICBpbiBOYW1lIGFlTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDYpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHBhdHRlcm4uIFRoZQorICAgKiBwYXR0ZXJuIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnRTZXF1ZW5jZSBnZXRFbGVtZW50cygKKyAgICAgIGluIFBhdHRlcm4gYWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAwNykKKyAgICogR2V0IHRoZSBuYW1lcyBvZiBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGF0IGFyZSBkZXJpdmVkIGZyb20gdGhlCisgICAqIHNwZWNpZmllZCBiYXNlIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZVR5cGUgIFRoZSByZXF1ZXN0ZWQgYmFzZSBlbGVtZW50IHR5cGUuIFRoZSBiYXNlIGVsZW1lbnQKKyAgICogICAgICAgICAgICAgICAgIHR5cGUgY2FuIGJlIGEgcGF0dGVybi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWVzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldEVsZW1lbnRzQnlCYXNlVHlwZSgKKyAgICAgIGluIEJhc2VUeXBlIGFlVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDgpCisgICAqIEdldCB0aGUgaW5zdGFuY2UgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIEFTQU0gcGF0aC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9BU0FNX1BBVEgKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhc2FtUGF0aCAgVGhlIEFTQU0gcGF0aCBvZiB0aGUgcmVxdWVzdGVkIGluc3RhbmNlIGVsZW1lbnQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgZ2V0SW5zdGFuY2VCeUFzYW1QYXRoKAorICAgICAgaW4gTmFtZSBhc2FtUGF0aCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMDkpCisgICAqIFJldHVybnMgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHR3byBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsRWxlbTEgIFRoZSBmaXJzdCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIGFwcGxFbGVtMiAgVGhlIHNlY29uZCBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb25zIGJldHdlZW4gdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBlbGVtZW50cy4KKyAgICovCisgICBBcHBsaWNhdGlvblJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zKAorICAgICAgaW4gQXBwbGljYXRpb25FbGVtZW50IGFwcGxFbGVtMSwKKyAgICAgIGluIEFwcGxpY2F0aW9uRWxlbWVudCBhcHBsRWxlbTIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDEwKQorICAgKiBHZXQgdGhlIHRvcCBsZXZlbCBhcHBsaWNhdGlvbiBlbGVtZW50cyB3aGljaCBhcmUgaW5oZXJpdGVkIGZyb20gdGhlCisgICAqIGJhc2UgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIGJhc2UgdHlwZS4gSWYgdGhlIGdpdmVuIGJhc2UgdHlwZSBpcworICAgKiBubyB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEEgdG9wIGxldmVsCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYW4gYXBwbGljYXRpb24gZWxlbWVudCB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWVUeXBlICBUaGUgcmVxdWVzdGVkIGJhc2UgdHlwZS4gVGhlIGJhc2UgZWxlbWVudCB0eXBlIGNhbgorICAgKiAgICAgICAgICAgICAgICAgYmUgYSBwYXR0ZXJuLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdG9wIGxldmVsIGFwcGxpY2F0aW9uIGVsZW1lbnRzLgorICAgKi8KKyAgIEFwcGxpY2F0aW9uRWxlbWVudFNlcXVlbmNlIGdldFRvcExldmVsRWxlbWVudHMoCisgICAgICBpbiBCYXNlVHlwZSBhZVR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDExKQorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGF0ICBtYXRjaCB0aGUgcGF0dGVybi4KKyAgICogVGhlIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGJhc2UgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RFbGVtZW50cygKKyAgICAgIGluIFBhdHRlcm4gYWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAxMikKKyAgICogR2V0IHRoZSBuYW1lcyBvZiBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGF0IGFyZSAgZGVyaXZlZCBmcm9tIHRoZQorICAgKiBnaXZlbiBiYXNlIHR5cGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhZVR5cGUgIFRoZSByZXF1ZXN0ZWQgYmFzZSB0eXBlLiBUaGUgYmFzZSBlbGVtZW50IHR5cGUgY2FuCisgICAqICAgICAgICAgICAgICAgICBiZSBhIHBhdHRlcm4uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RFbGVtZW50c0J5QmFzZVR5cGUoCisgICAgICBpbiBCYXNlVHlwZSBhZVR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDEzKQorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSB0b3AgbGV2ZWwgYXBwbGljYXRpb24gZWxlbWVudHMgdGhhdCBhcmUgZGVyaXZlZAorICAgKiBmcm9tIHRoZSBnaXZlbiBiYXNlIHR5cGUuIElmIHRoZSBnaXZlbiBiYXNlIHR5cGUgaXMgbm90IGEgdG9wIGxldmVsCisgICAqIGJhc2UgZWxlbWVudCBhbiBleGNlcHRpb24gaXMgdGhyb3duLiBBIHRvcCBsZXZlbCBhcHBsaWNhdGlvbiBlbGVtZW50CisgICAqIGlzIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQgd2l0aG91dCBhIGZhdGhlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9CQVNFVFlQRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFlVHlwZSAgVGhlIHJlcXVlc3RlZCBiYXNlIHR5cGUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RUb3BMZXZlbEVsZW1lbnRzKAorICAgICAgaW4gQmFzZVR5cGUgYWVUeXBlKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAxNCkKKyAgICogUmVtb3ZlIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQgZnJvbSB0aGUgYXBwbGljYXRpb24gbW9kZWwuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqICAgLSBPbmx5IGFsbG93ZWQ6CisgICAqICAgICAgIC0gaWYgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgZW1wdHkKKyAgICogICAgICAgICAoaGFzIG5vIGluc3RhbmNlcykuCisgICAqICAgICAgIC0gbm8gcmVsYXRpb25zIHdpdGggb3RoZXIgYXBwbGljYXRpb24gZWxlbWVudHMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19IQVNfSU5TVEFOQ0VTCisgICAqICAgIEFPX0hBU19SRUZFUkVOQ0VTCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsRWxlbSAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICovCisgICB2b2lkIHJlbW92ZUVsZW1lbnQoCisgICAgICBpbiBBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbEVsZW0pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDE1KQorICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFuIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGZyb20gdGhlIG1vZGVsLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBvdXRzaWRlIGEgdHJhbnNhY3Rpb24KKyAgICogYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZWxlbWVudHMgb2YgdGhlIHJlbGF0aW9uIGFyZSBzdGlsbCBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbgorICAgKiBtb2RlbC4gSWYgdGhlcmUgYXJlIGluc3RhbmNlcyBvZiB0aGUgcmVsYXRpb24gdGhleSBhcmUgYWxzbyByZW1vdmVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSEFTX0lOU1RBTkNFUworICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXBwbFJlbCAgVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIHRvIGJlIHJlbW92ZWQuCisgICAqLworICAgdm9pZCByZW1vdmVSZWxhdGlvbigKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMTYpCisgICAqIEdldCB0aGUgaW5zdGFuY2UgZWxlbWVudHMgc3BlY2lmaWVkIGJ5IHRoZSBlbGVtZW50IGlkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0FTQU1fUEFUSAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllSWRzICBUaGUgc2VxdWVuY2Ugd2l0aCB0aGUgZWxlbWVudCBpZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBpbnN0YW5jZSBlbGVtZW50IHNlcXVlbmNlLgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudFNlcXVlbmNlIGdldEluc3RhbmNlc0J5SWQoCisgICAgICBpbiBFbGVtSWRTZXF1ZW5jZSBpZUlkcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMTcpCisgICAqIEdldCB0aGUgY3VycmVudCBjbGllbnQgc2Vzc2lvbiBpbiB3aGljaCB0aGUgYXBwbGljYXRpb24gbW9kZWwgaXMKKyAgICogY3JlYXRlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgY2xpZW50IHNlc3Npb24uCisgICAqLworICAgQW9TZXNzaW9uIGdldFNlc3Npb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAxOCkKKyAgICogQ3JlYXRlIGEgbmV3IGVudW1lcmF0aW9uIGRlZmluaXRpb24uIFRoaXMgbWV0aG9kIG1vZGlmaWVzIHRoZQorICAgKiBhcHBsaWNhdGlvbiBtb2RlbCBhbmQgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgc3VwZXIgdXNlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqCisgICAqIEBwYXJhbSAgZW51bU5hbWUgIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXcgY3JlYXRlZCBlbnVtZXJhdGlvbgorICAgKi8KKyAgIEVudW1lcmF0aW9uRGVmaW5pdGlvbiBjcmVhdGVFbnVtZXJhdGlvbkRlZmluaXRpb24oCisgICAgICBpbiBUX1NUUklORyBlbnVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMTkpCisgICAqIFJlbW92ZSB0aGUgZW51bWVyYXRpb24gZGVmaW5pdGlvbi4gVGhlIHNlcnZlciBjaGVja3MgaWYgdGhlCisgICAqIGVudW1lcmF0aW9uIGlzIHN0aWxsIGluIHVzZSBieSBvbmUgb2YgdGhlIGF0dHJpYnV0ZXMuIFRoaXMgbWV0aG9kCisgICAqIG1vZGlmaWVzIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBhbmQgaXMgb25seSBhbGxvd2VkIGZvciB0aGUgc3VwZXIKKyAgICogdXNlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqCisgICAqIEBwYXJhbSAgZW51bU5hbWUgIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uIHRvIHJlbW92ZS4KKyAgICovCisgICB2b2lkIHJlbW92ZUVudW1lcmF0aW9uRGVmaW5pdGlvbigKKyAgICAgIGluIFRfU1RSSU5HIGVudW1OYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoNzAyMCkKKyAgICogR2V0IHRoZSBsaXN0IG9mIGFsbCBlbnVtZXJhdGlvbiBuYW1lcy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgTGlzdCB3aXRoIGFsbCBlbnVtZXJhdGlvbiBuYW1lcy4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEVudW1lcmF0aW9ucygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg3MDIxKQorICAgKiBHZXQgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbiBkZWZpbml0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGVudW1OYW1lICBOYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZW51bWVyYXRpb24uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBlbnVtZXJhdGlvbiBkZWZpbml0aW9uLgorICAgKi8KKyAgIEVudW1lcmF0aW9uRGVmaW5pdGlvbiBnZXRFbnVtZXJhdGlvbkRlZmluaXRpb24oCisgICAgICBpbiBUX1NUUklORyBlbnVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDcwMjIpCisgICAqIENyZWF0ZSB0aGUgcmVsYXRpb24gYmV0d2VlbiBhIGxpc3Qgb2YgaW5zdGFuY2VzLiBUaGUgbnVtYmVyIG9mCisgICAqIGluc3RhbmNlcyBpbiBib3RoIGxpc3QgbXVzdCBiZSBpZGVudGljYWwuIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mCisgICAqIHRoZSBpbnN0YW5jZXMgaW4gZWFjaCBsaXN0IG11c3QgYmUgaWRlbnRpY2FsLiBUaGUgYXBwbGljYXRpb24KKyAgICogZWxlbWVudHMgbXVzdCBtYXRjaCB0aGUgYXBwbGljYXRpb24gZWxlbWVudHMgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqIHJlbGF0aW9uLiBUaGUgaW5kZXggaW4gdGhlIGxpc3Qgb2YgdGhlIGluc3RhbmNlcyBkZWZpbmVzIHJlbGF0ZWQKKyAgICogaW5zdGFuY2VzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfUkVRVUVTVAorICAgKgorICAgKiBAcGFyYW0gIGFwcGxSZWwgIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBlbGVtTGlzdDEgIFRoZSBsaXN0IHdpdGggdGhlIGluc3RhbmNlcyBvZiBvbmUgYXBwbGljYXRpb24KKyAgICogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgZm9yIHdoaWNoIHRoZSByZWxhdGlvbiB3aWxsIGJlIGNyZWF0ZWQuCisgICAqCisgICAqIEBwYXJhbSAgZWxlbUxpc3QyICBUaGUgbGlzdCB3aXRoIHRoZSByZWxhdGVkIGluc3RhbmNlcy4KKyAgICovCisgICB2b2lkIGNyZWF0ZUluc3RhbmNlUmVsYXRpb25zKAorICAgICAgaW4gQXBwbGljYXRpb25SZWxhdGlvbiBhcHBsUmVsLAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50U2VxdWVuY2UgZWxlbUxpc3QxLAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50U2VxdWVuY2UgZWxlbUxpc3QyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsaWNhdGlvblN0cnVjdHVyZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIGF0dHJpYnV0ZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEJhc2VBdHRyaWJ1dGUgeworCisgICAvKiogKDgwMDEpCisgICAqIEdldCB0aGUgZGF0YSB0eXBlIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBkYXRhIHR5cGUgb2YgdGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIERhdGFUeXBlIGdldERhdGFUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDgwMDIpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqLworICAgTmFtZSBnZXROYW1lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDgwMDMpCisgICAqIEdldCB0aGUgb2JsaWdhdG9yeSBmbGFnIG9mIHRoZSBiYXNlIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBvYmxpZ2F0b3J5IGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc09ibGlnYXRvcnkoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoODAwNCkKKyAgICogR2V0IHRoZSB1bmlxdWUgZmxhZyBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdW5pcXVlIGZsYWcgb2YgdGhlIGJhc2UgYXR0cmlidXRlLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc1VuaXF1ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg4MDA1KQorICAgKiBSZXR1cm4gdGhlIGJhc2UgZWxlbWVudCB0byB3aGljaCB0aGUgYXR0cmlidXRlIGJlbG9uZ3MuLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSBlbGVtZW50IG9mIHRoZSBhdHRyaWJ1dGUuCisgICAqLworICAgQmFzZUVsZW1lbnQgZ2V0QmFzZUVsZW1lbnQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoODAwNikKKyAgICogR2V0IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlbnVtZXJhdGlvbiBvZiB0aGUgYmFzZSBhdHRyaWJ1dGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBBU0FNIE9EUyBlbnVtZXJhdGlvbi4KKyAgICovCisgICBFbnVtZXJhdGlvbkRlZmluaXRpb24gZ2V0RW51bWVyYXRpb25EZWZpbml0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgQmFzZUF0dHJpYnV0ZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIGVsZW1lbnQgaW50ZXJmYWNlLgorKi8KK2ludGVyZmFjZSBCYXNlRWxlbWVudCB7CisKKyAgIC8qKiAoOTAwMSkKKyAgICogR2V0IGFsbCBrbm93biByZWxhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIEFsbCBrbm93biByZWxhdGlvbnMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBCYXNlUmVsYXRpb25TZXF1ZW5jZSBnZXRBbGxSZWxhdGlvbnMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwMikKKyAgICogR2V0IGF0dHJpYnV0ZXMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBiYVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlcXVlc3RlZAorICAgKiAgICAgICAgICAgICAgICAgICAgYmFzZSBhdHRyaWJ1dGVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBCYXNlQXR0cmlidXRlU2VxdWVuY2UgZ2V0QXR0cmlidXRlcygKKyAgICAgIGluIFBhdHRlcm4gYmFQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwMykKKyAgICogR2V0IHRoZSByZWxhdGVkIGVsZW1lbnRzIG9mIGEgYmFzZSBlbGVtZW50IGRlZmluZWQgYnkgdGhlCisgICAqIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBiclJlbGF0aW9uc2hpcCAgVGhlIHJlcXVlc3RlZCByZWxhdGlvbnNoaXAuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGVkIGVsZW1lbnRzIG9mIGEgYmFzZSBlbGVtZW50LgorICAgKi8KKyAgIEJhc2VFbGVtZW50U2VxdWVuY2UgZ2V0UmVsYXRlZEVsZW1lbnRzQnlSZWxhdGlvbnNoaXAoCisgICAgICBpbiBSZWxhdGlvbnNoaXAgYnJSZWxhdGlvbnNoaXApCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICg5MDA0KQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudCdzIHJlbGF0aW9ucyBvZiB0aGUgcmVxdWVzdGVkIHJlbGF0aW9uIHR5cGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJyUmVsYXRpb25UeXBlICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uIHR5cGUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBiYXNlIGVsZW1lbnQncyByZWxhdGlvbnMgb2YgdGhlIHJlcXVlc3RlZCB0eXBlLgorICAgKi8KKyAgIEJhc2VSZWxhdGlvblNlcXVlbmNlIGdldFJlbGF0aW9uc0J5VHlwZSgKKyAgICAgIGluIFJlbGF0aW9uVHlwZSBiclJlbGF0aW9uVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDkwMDUpCisgICAqIEdldCB0aGUgdHlwZSBvZiB0aGUgYmFzZSBlbGVtZW50LiBUaGUgdHlwZSBvZiB0aGUgYmFzZSBlbGVtZW50IGlzCisgICAqIGlkZW50aWNhbCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBiYXNlIGVsZW1lbnQuIFRoZSB0eXBlIG9mIHRoZSBiYXNlCisgICAqIGVsZW1lbnQgaXMgYSBzdHJpbmcuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdHlwZSBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKi8KKyAgIEJhc2VUeXBlIGdldFR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwNikKKyAgICogR2V0IHdoZXRoZXIgb3Igbm90IHRoZSBiYXNlIGVsZW1lbnQgaXMgYSB0b3AgbGV2ZWwgZWxlbWVudC4gVG9wCisgICAqIGxldmVsIGVsZW1lbnRzIGFyZSBlbGVtZW50cyB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgQm9vbGVhbiB3aGV0aGVyIG9yIG5vdCB0aGUgYmFzZSBlbGVtZW50IGlzIGEgdG9wIGxldmVsCisgICAqICAgICAgICAgIGVsZW1lbnQuCisgICAqLworICAgVF9CT09MRUFOIGlzVG9wTGV2ZWwoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoOTAwNykKKyAgICogR2V0IGF0dHJpYnV0ZSBuYW1lcyBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJhUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICBiYXNlIGF0dHJpYnV0ZSBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgbmFtZXMgb2YgdGhlIGJhc2UgZWxlbWVudC4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEF0dHJpYnV0ZXMoCisgICAgICBpbiBQYXR0ZXJuIGJhUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDkwMDgpCisgICAqIEdldCB0aGUgcmVsYXRlZCBlbGVtZW50IG5hbWVzIG9mIHRoZSBiYXNlIGVsZW1lbnQgZGVmaW5lZCBieSB0aGUKKyAgICogcmVsYXRpb25zaGlwLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OU0hJUAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJyUmVsYXRpb25zaGlwICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlbGF0ZWQgZWxlbWVudCBuYW1lcyBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKi8KKyAgIEJhc2VUeXBlU2VxdWVuY2UgbGlzdFJlbGF0ZWRFbGVtZW50c0J5UmVsYXRpb25zaGlwKAorICAgICAgaW4gUmVsYXRpb25zaGlwIGJyUmVsYXRpb25zaGlwKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBCYXNlRWxlbWVudC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIHJlbGF0aW9uIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQmFzZVJlbGF0aW9uIHsKKworICAgLyoqICgxMDAwMSkKKyAgICogR2V0IHRoZSBmaXJzdCBiYXNlIGVsZW1lbnQgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZmlyc3QgYmFzZSBlbGVtZW50IG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKi8KKyAgIEJhc2VFbGVtZW50IGdldEVsZW0xKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEwMDAyKQorICAgKiBHZXQgdGhlIHNlY29uZCBiYXNlIGVsZW1lbnQgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2Vjb25kIGJhc2UgZWxlbWVudCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICovCisgICBCYXNlRWxlbWVudCBnZXRFbGVtMigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwMykKKyAgICogR2V0IHRoZSBpbnZlcnNlIHJlbGF0aW9uIHJhbmdlIG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGludmVyc2UgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25SYW5nZSBnZXRJbnZlcnNlUmVsYXRpb25SYW5nZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwNCkKKyAgICogR2V0IHRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICovCisgICBSZWxhdGlvbnNoaXAgZ2V0SW52ZXJzZVJlbGF0aW9uc2hpcCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwNSkKKyAgICogR2V0IHRoZSByZWxhdGlvbiBuYW1lIG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlbGF0aW9uIG5hbWUgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgTmFtZSBnZXRSZWxhdGlvbk5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTAwMDYpCisgICAqIEdldCB0aGUgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRpb24gcmFuZ2Ugb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25SYW5nZSBnZXRSZWxhdGlvblJhbmdlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEwMDA3KQorICAgKiBHZXQgdGhlIHJlbGF0aW9uc2hpcCBvZiB0aGUgYmFzZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwOCkKKyAgICogR2V0IHRoZSByZWxhdGlvbiB0eXBlIG9mIHRoZSBiYXNlIHJlbGF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlbGF0aW9uIHR5cGUgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqLworICAgUmVsYXRpb25UeXBlIGdldFJlbGF0aW9uVHlwZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMDAwOSkKKyAgICogUmV0dXJuIHRoZSBpbnZlcnNlIG5hbWUgb2YgdGhlIGJhc2UgcmVsYXRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lIG9mIHRoZSBpbnZlcnNlIHJlbGF0aW9uLgorICAgKi8KKyAgIE5hbWUgZ2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEJhc2VSZWxhdGlvbi4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBiYXNlIHN0cnVjdHVyZSBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEJhc2VTdHJ1Y3R1cmUgeworCisgICAvKiogKDExMDAxKQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHJlcXVlc3RlZCB0eXBlLiBUaGUgdHlwZSBvZiBhCisgICAqIGJhc2UgZWxlbWVudCBpcyBpZGVudGljYWwgd2l0aCB0aGUgbmFtZSBvZiB0aGUgYmFzZSBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmVUeXBlICBUaGUgbmFtZSBvZiB0aGUgcmVxdWVzdGVkIGJhc2UgZWxlbWVudC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBiYXNlIGVsZW1lbnQuCisgICAqLworICAgQmFzZUVsZW1lbnQgZ2V0RWxlbWVudEJ5VHlwZSgKKyAgICAgIGluIEJhc2VUeXBlIGJlVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDExMDAyKQorICAgKiBHZXQgdGhlIGJhc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIHBhdHRlcm4gaXMgY2FzZQorICAgKiBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGJhc2UgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgYmFzZSBlbGVtZW50cy4KKyAgICovCisgICBCYXNlRWxlbWVudFNlcXVlbmNlIGdldEVsZW1lbnRzKAorICAgICAgaW4gUGF0dGVybiBiZVBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMTAwMykKKyAgICogR2V0IHRoZSBiYXNlIHJlbGF0aW9uIGJldHdlZW4gdHdvIGJhc2UgZWxlbWVudHMuIFRoZSBiYXNlIHJlbGF0aW9uCisgICAqIGlzIGdpdmVuIGZyb20gdGhlIGZpcnN0IGVsZW1lbnQgKHBhcmFtZXRlciBlbGVtMSkgdG8gdGhlIHNlY29uZAorICAgKiBlbGVtZW50IChwYXJhbWV0ZXIgZWxlbTIpLCB0aGUgaW52ZXJzZSByZWxhdGlvbiBpcyBub3QgZ2l2ZW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKgorICAgKiBAcGFyYW0gIGVsZW0xICBUaGUgYmFzZSBlbGVtZW50IGZyb20gd2hpY2ggdGhlIHJlbGF0aW9uIHN0YXJ0cy4KKyAgICoKKyAgICogQHBhcmFtICBlbGVtMiAgVGhlIGJhc2UgZWxlbWVudCB0byB3aGljaCB0aGUgcmVsYXRpb24gcG9pbnRzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmFzZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gYmFzZSBlbGVtZW50cy4KKyAgICovCisgICBCYXNlUmVsYXRpb24gZ2V0UmVsYXRpb24oCisgICAgICBpbiBCYXNlRWxlbWVudCBlbGVtMSwKKyAgICAgIGluIEJhc2VFbGVtZW50IGVsZW0yKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTEwMDQpCisgICAqIEdldCB0aGUgdG9wIGxldmVsIGJhc2UgZWxlbWVudHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIHBhdHRlcm4KKyAgICogaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuIEEgdG9wIGxldmVsCisgICAqIGJhc2UgZWxlbWVudCBpcyBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJlUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50cy4KKyAgICovCisgICBCYXNlRWxlbWVudFNlcXVlbmNlIGdldFRvcExldmVsRWxlbWVudHMoCisgICAgICBpbiBQYXR0ZXJuIGJlUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDExMDA1KQorICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIGJhc2UgbW9kZWwuIFRoZSB2ZXJzaW9uIG9mIHRoZSBiYXNlIG1vZGVsIGlzCisgICAqIHRoZSB2ZXJzaW9uIG9mIHRoZSBBU0FNIE9EUyBiYXNlIG1vZGVsLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZlcnNpb24gb2YgdGhlIEFTQU0gT0RTIGJhc2UgbW9kZWwuCisgICAqLworICAgVF9TVFJJTkcgZ2V0VmVyc2lvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMTAwNikKKyAgICogR2V0IHRoZSBiYXNlIGVsZW1lbnQgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlIHBhdHRlcm4gaXMKKyAgICogY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGJhc2UgZWxlbWVudCBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlcXVlc3RlZCBiYXNlIGVsZW1lbnQgbmFtZXMuCisgICAqLworICAgQmFzZVR5cGVTZXF1ZW5jZSBsaXN0RWxlbWVudHMoCisgICAgICBpbiBQYXR0ZXJuIGJlUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDExMDA3KQorICAgKiBHZXQgdGhlIHRvcCBsZXZlbCBiYXNlIGVsZW1lbnQgbmFtZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gVGhlCisgICAqIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuIEEgdG9wCisgICAqIGxldmVsIGJhc2UgZWxlbWVudCBpcyBhIGJhc2UgZWxlbWVudCB3aXRob3V0IGEgZmF0aGVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGJlUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdGVkCisgICAqICAgICAgICAgICAgICAgICAgICB0b3AgbGV2ZWwgYmFzZSBlbGVtZW50IG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVxdWVzdGVkIHRvcCBsZXZlbCBiYXNlIGVsZW1lbnQgbmFtZXMuCisgICAqLworICAgQmFzZVR5cGVTZXF1ZW5jZSBsaXN0VG9wTGV2ZWxFbGVtZW50cygKKyAgICAgIGluIFBhdHRlcm4gYmVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTEwMDgpCisgICAqIEdldCB0aGUgYmFzZSByZWxhdGlvbnMgYmV0d2VlbiB0d28gYmFzZSBlbGVtZW50cy4gVGhlIGJhc2UgcmVsYXRpb24KKyAgICogaXMgZ2l2ZW4gZnJvbSB0aGUgZmlyc3QgZWxlbWVudCAocGFyYW1ldGVyIGVsZW0xKSB0byB0aGUgc2Vjb25kCisgICAqIGVsZW1lbnQgKHBhcmFtZXRlciBlbGVtMiksIHRoZSBpbnZlcnNlIHJlbGF0aW9uIGlzIG5vdCBnaXZlbi4KKyAgICogV2hlbiB0aGVyZSBhcmUgbm8gYmFzZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSB0d28gZWxlbWVudHMgdGhlIHNlcnZlcgorICAgKiB3aWxsIHRocm93IHRoZSBleGNlcHRpb24gQU9fTk9UX0ZPVU5ECisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICoKKyAgICogQHBhcmFtICBlbGVtMSAgVGhlIGJhc2UgZWxlbWVudCBmcm9tIHdoaWNoIHRoZSByZWxhdGlvbiBzdGFydHMuCisgICAqCisgICAqIEBwYXJhbSAgZWxlbTIgIFRoZSBiYXNlIGVsZW1lbnQgdG8gd2hpY2ggdGhlIHJlbGF0aW9uIHBvaW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGxpc3Qgd2l0aCBiYXNlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSB0d28gZWxlbWVudHMuCisgICAqLworICAgQmFzZVJlbGF0aW9uU2VxdWVuY2UgZ2V0UmVsYXRpb25zKAorICAgICAgaW4gQmFzZUVsZW1lbnQgZWxlbTEsCisgICAgICBpbiBCYXNlRWxlbWVudCBlbGVtMikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgQmFzZVN0cnVjdHVyZS4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBibG9iIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgQmxvYiB7CisKKyAgIC8qKiAoMTIwMDEpCisgICAqIEFwcGVuZCBhIGJ5dGUgc2VxdWVuY2UgdG8gdGhlIGJpbmFyeSBsYXJnZSBvYmplY3QuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3Qgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgYnl0ZSBzZXF1ZW5jZS4KKyAgICovCisgICB2b2lkIGFwcGVuZCgKKyAgICAgIGluIFNfQllURSB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEyMDAyKQorICAgKiBDb21wYXJlcyB0aGUgY29udGVudCBvZiB0aGUgYmluYXJ5IGxhcmdlIG9iamVjdC4gVGhlIGhlYWRlcnMgYXJlIG5vdAorICAgKiBjb21wYXJlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhQmxvYiAgVGhlIGJsb2IgdG8gY29tcGFyZS4KKyAgICoKKyAgICogQHJldHVybiAgQSBmbGFnIHdoZXRoZXIgb3Igbm90IHRoZSBjb21wYXJlZCBibG9icyBhcmUgZXF1YWwuCisgICAqLworICAgVF9CT09MRUFOIGNvbXBhcmUoCisgICAgICBpbiBUX0JMT0IgYUJsb2IpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMjAwMykKKyAgICogR2V0IGEgcGFydCBvZiB0aGUgYmluYXJ5IGxhcmdlIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBvZmZzZXQgIFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgZGF0YSBpbiB0aGUgYmxvYi4KKyAgICoKKyAgICogQHBhcmFtICBsZW5ndGggIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkIGZyb20gdGhlIGJsb2IuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0IHBhcnQgb2YgdGhlIGJsb2IgZGF0YS4KKyAgICovCisgICBTX0JZVEUgZ2V0KAorICAgICAgaW4gVF9MT05HIG9mZnNldCwKKyAgICAgIGluIFRfTE9ORyBsZW5ndGgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMjAwNCkKKyAgICogR2V0IHRoZSBoZWFkZXIgb2YgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmxvYiBoZWFkZXIuCisgICAqLworICAgVF9TVFJJTkcgZ2V0SGVhZGVyKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEyMDA1KQorICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgYmluYXJ5IGxhcmdlIG9iamVjdCB3aXRob3V0IGxvYWRpbmcgaXQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYmxvYiBsZW5ndGguCisgICAqLworICAgVF9MT05HIGdldExlbmd0aCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMjAwNikKKyAgICogQ2xlYXIgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3QgYW5kIHNldCB0aGUgbmV3IGRhdGEuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3Qgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgbmV3IGJsb2IgZGF0YS4KKyAgICovCisgICB2b2lkIHNldCgKKyAgICAgIGluIFNfQllURSB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEyMDA3KQorICAgKiBTZXQgdGhlIGhlYWRlciBvZiBhIGJpbmFyeSBsYXJnZSBvYmplY3QuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJpbmFyeSBsYXJnZSBvYmplY3Qgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGhlYWRlciAgVGhlIGJsb2IgaGVhZGVyLgorICAgKi8KKyAgIHZvaWQgc2V0SGVhZGVyKAorICAgICAgaW4gVF9TVFJJTkcgaGVhZGVyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTIwMDgpCisgICAqIERlc3Ryb3kgdGhlIG9iamVjdCBvbiB0aGUgc2VydmVyLiBUaGUgZGVzdHJ1Y3RvciBvZiB0aGUgY2xpZW50LCBzbworICAgKiB0aGUgc2VydmVyIGtub3dzIHRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUgYnkgdGhlIGNsaWVudC4KKyAgICogQWNjZXNzIHRvIHRoaXMgb2JqZWN0IGFmdGVyIHRoZSBkZXN0cm95IG1ldGhvZCB3aWxsIGxlYWQgdG8gYW4KKyAgICogZXhjZXB0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEJsb2IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgY29sdW1uIGludGVyZmFjZS4gSXQgaXMgbm90IGluaGVyaXRlZCBmcm9tCisqIEluc3RhbmNlRWxlbWVudC4gVmlhIHRoZSBtZXRob2QgZ2V0Q29sdW1uIG9mIHRoZSBpbnRlcmZhY2UgU3ViTWF0cml4CisqIHRoZSBjb2x1bW4gaXMgYWNjZXNzZWQuIFRoZSBjb2x1bW4gaXMgb25seSB1c2VkIGZvciByZWFkIGFjY2Vzcy4gV2l0aAorKiB0aGUgY3JlYXRpb24gb2YgaW5zdGFuY2VzIGF0IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHR5cGUKKyogQW9Mb2NhbENvbHVtbiBhbmQgdGhlIHJlbGF0aW9uIHRvIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGFwcGxpY2F0aW9uCisqIGVsZW1lbnQgb2YgdHlwZSBBb1N1Yk1hdHJpeCBhIGxvY2FsIGNvbHVtbiBjYW4gYmUgY3JlYXRlZC4gVGhlIGNvbHVtbgorKiBuYW1lIGlzIHVzZWQgZm9yIHRoZSBTTWF0TGluayBhbmQgdGhlIGNvbHVtbiBpcyB1c2VkIHRvIHN0b3JlIGEgZm9ybXVsYQorKiBmb3IgdGhlIGNhbGN1bGF0aW9uIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4gVGhlcmUgaXMgbm8gZGVmaW5pdGlvbgorKiBvZiB0aGUgZm9ybXVsYSBsYW5ndWFnZSBhdCB0aGUgbW9tZW50LgorKi8KK2ludGVyZmFjZSBDb2x1bW4geworCisgICAvKiogKDEzMDAxKQorICAgKiBHZXQgdGhlIGZvcm11bGEgb2YgdGhlIGNvbHVtbi4KKyAgICogCisgICAqIFRoZXJlIGlzIG5vIGZvcm11bGEgZGVmaW5lZCBpbiBBU0FNIE9EUywgc28gdGhlcmUgaXMgbm90aGluZyB0bworICAgKiByZXR1cm4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZm9ybXVsYSBvZiB0aGUgY29sdW1uLgorICAgKi8KKyAgIFRfU1RSSU5HIGdldEZvcm11bGEoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDIpCisgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWUgb2YgdGhlIGNvbHVtbi4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDMpCisgICAqIEdldCB0aGUgc291cmNlIG1lYXN1cmVtZW50IHF1YW50aXR5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHNvdXJjZSBtZWFzdXJlbWVudCBxdWFudGl0eS4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnQgZ2V0U291cmNlTVEoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDQpCisgICAqIEdldCB0aGUgdW5pdCBvZiB0aGUgY29sdW1uLgorICAgKiAKKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSB1bml0IG9mIHRoZSB2YWx1ZXMgYWNjb3JkaW5nIHRoZSBjdXJyZW50CisgICAqIHNldHRpbmcuIEluaXRpYWxseSB3aXRoaW4gYSBzZXNzaW9uIHRoaXMgaXMgdGhlIHVuaXQgYXMgZ2l2ZW4gaW4gdGhlCisgICAqIHN0b3JhZ2UuIEFmdGVyIHNldFVuaXQoKSBpcyBjYWxsZWQsIHRoZSB1bml0IGFzIHNwZWNpZmllZCBieQorICAgKiBzZXRVbml0KCkgd2lsbCBiZQorICAgKiByZXR1cm5lZCBmb3IgdGhlIHBhcnRpY3VsYXIgY29sdW1uLiBUaHVzIHRoZSB1bml0IHJldHVybmVkIHdpbGwgYmUKKyAgICogcmV0cmlldmVkIGJ5IHRoZSBPRFMgc2VydmVyIGFjY29yZGluZyB0byBmb2xsb3dpbmcgc3RyYXRlZ3k6CisgICAqIDEpIGlmIGEgdW5pdCBoYXMgYWxyZWFkeSBiZWVuIHNldCBmb3IgdGhlIHBhcmljdWxhciBjb2x1bW4gYnkKKyAgICogc2V0VW5pdCguLikgcHJpb3I7IHRoYXQgdW5pdCBpcyByZXR1cm5lZCwgZWxzZQorICAgKiAyKSBpZiB0aGUgcmVsYXRlZCBtZWFzdXJlbWVudCBxdWFudGl0eSBoYXMgYSB1bml0IChpLmUuIGl0IGhhcyBhCisgICAqIHJlbGF0aW9uIGRlcml2ZWQgZnJvbSB0aGUgYmFzZSByZWxhdGlvbiAndW5pdCcgcmVmZXJlbmNpbmcgYW4KKyAgICogaW5zdGFuY2Ugb2YgYmFzZSB0eXBlIEFvVW5pdCksIHRoYXQgdW5pdCdzIG5hbWUgaXMgcmV0dXJuZWQsIGVsc2UKKyAgICogMykgaWYgdGhlIHJlbGF0ZWQgbWVhc3VyZW1lbnQgcXVhbnRpdHkgaGFzIGEgcmVsYXRpb24gdG8gYSBxdWFudGl0eQorICAgKiAoaS5lLiBpdHMgcmVsYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBiYXNlIHJlbGF0aW9uICdxdWFudGl0eScgaXMKKyAgICogcmVmZXJlbmNpbmcgYW4gaW5zdGFuY2Ugb2YgYmFzZSB0eXBlIEFvUXVhbnRpdHkpLCBhbmQgdGhpcyBxdWFudGl0eQorICAgKiBoYXMKKyAgICogYSBkZWZhdWx0IHVuaXQgKGkuZS4gaXQgaGFzIGEgcmVsYXRpb24gZGVyaXZlZCBmcm9tIHRoZSBiYXNlCisgICAqIHJlbGF0aW9uICdkZWZhdWx0X3VuaXQnIHJlZmVyZW5jaW5nIGFuIGluc3RhbmNlIG9mIGJhc2UgdHlwZQorICAgKiBBb1VuaXQpLCB0aGF0IHVuaXQncyBuYW1lIGlzIHJldHVybmVkLCBlbHNlCisgICAqIDQpIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB1bml0IG9mIHRoZSBjb2x1bW4uCisgICAqLworICAgVF9TVFJJTkcgZ2V0VW5pdCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAwNSkKKyAgICogU2V0IHRoZSBmb3JtdWxhIG9mIHRoZSBjb2x1bW4uIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGNvbHVtbiBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGVyZSBpcyBubyBmb3JtdWxhIGluIEFTQU0gT0RTIHNvIGRvbid0IHRyeSB0byBzZXQgdGhlIGZvcm11bGEuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgZm9ybXVsYSAgVGhlIGZvcm11bGEuCisgICAqLworICAgdm9pZCBzZXRGb3JtdWxhKAorICAgICAgaW4gVF9TVFJJTkcgZm9ybXVsYSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDA2KQorICAgKiBTZXQgdGhlIHVuaXQgb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyBvbmx5IGEgdGVtcG9yYXJ5IHVuaXQgZm9yCisgICAqIGdldHRpbmcgdGhlIHZhbHVlcyBvZiBhIGNvbHVtbi4gVGhpcyB1bml0IGlzIG5vdCBzdG9yZWQgaW4gdGhlCisgICAqIHN0b3JhZ2UuIAorICAgKiBXaGVuIGFuIGVtcHR5IHN0cmluZyBpcyBnaXZlbiB0aGUgdW5pdCBpcyByZXR1cm5lZCB0byB0aGUgb3JpZ2luYWwKKyAgICogc2V0dGluZy4KKyAgICogV2hlbiB0aGUgdmFsdWUgbWF0cml4IHdoZXJlIHRoZSBjb2x1bW4gYmVsb25ncyB0byBpcyBpbiB0aGUgU1RPUkFHRQorICAgKiBtb2RlIHRoaXMgbWV0aG9kIGhhdmUgbm8gaW5mbHVlbmNlIG9uIHRoZSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSB0aGUKKyAgICogdmFsdWUgbWF0cml4LgorICAgKiBUbyBjaGFuZ2UgdGhlIHVuaXQgcGVybWFuZW50IGluIHRoZSBzdG9yYWdlIHRoZSByZWxhdGlvbiBhdCB0aGUKKyAgICogbWVhc3VyZW1lbnQgcXVhbnRpdHkgbXVzdCBiZSBjaGFuZ2VkIGJ5IHRoZSBjbGllbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdW5pdCAgVGhlIHBoeXNpY2FsIHVuaXQuCisgICAqLworICAgdm9pZCBzZXRVbml0KAorICAgICAgaW4gVF9TVFJJTkcgdW5pdCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDA3KQorICAgKiBJcyB0aGUgY29sdW1uIGFuIGluZGVwZW5kZW50IGNvbHVtbgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW5kZXBlbmRlbnQgZmxhZyBvZiB0aGUgY29sdW1uLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc0luZGVwZW5kZW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDA4KQorICAgKiBEZXByZWNhdGVkLCBzb2x2ZWQgYnkgTlZIIEFwcGxpY2F0aW9uIG1vZGVsLgorICAgKiAKKyAgICogSXMgdGhlIGNvbHVtbiBhbiBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGVsbHMgaWYgdGhlIGNvbHVtbiBpcyBhIHNjYWxpbmcgY29sdW1uLgorICAgKi8KKyAgIFRfQk9PTEVBTiBpc1NjYWxpbmcoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMDkpCisgICAqIFNldCB0aGUgY29sdW1uIGFzIGFuIGluZGVwZW5kZW50IGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGluZGVwZW5kZW50ICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBpbmRlcGVuZGVudCBmbGFnLgorICAgKi8KKyAgIHZvaWQgc2V0SW5kZXBlbmRlbnQoCisgICAgICBpbiBUX0JPT0xFQU4gaW5kZXBlbmRlbnQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxMCkKKyAgICogRGVwcmVjYXRlZCwgc29sdmVkIGJ5IE5WSCBBcHBsaWNhdGlvbiBtb2RlbC4KKyAgICogCisgICAqIFNldCB0aGUgY29sdW1uIHRvIGEgc2NhbGluZyBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBzY2FsaW5nICBUaGUgbmV3IHZhbHVlIG9mIHRoZSBzY2FsaW5nIGZsYWcuCisgICAqLworICAgdm9pZCBzZXRTY2FsaW5nKAorICAgICAgaW4gVF9CT09MRUFOIHNjYWxpbmcpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxMSkKKyAgICogR2V0IHRoZSBkYXRhIHR5cGUgb2YgdGhlIGNvbHVtbi4KKyAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgbWVhc3VyZW1lbnQgcXVhbnRpdHkgaXMgYWx3YXlzIHJldHVybmVkLAorICAgKiBpbmRlcGVuZGVudCBvZiB0aGUgbW9kZSBvZiB0aGUgdmFsdWVzIG1hdHJpeCB3aGVyZSB0aGUgY29sdW1uCisgICAqIGJlbG9uZ3MgdG8gbmVpdGhlciB0aGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbHVtbi4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIGFsd2F5cyByZXR1cm5zIHRoZSBkYXRhIHR5cGUgb2YgdGhlIG1lYXN1cmVtZW50IHF1YW50aXR5CisgICAqIHRvIHdoaWNoIHRoaXMgbG9jYWwgY29sdW1uIGJlbG9uZ3MsIGluZGVwZW5kZW50IG9mIAorICAgKiAtIHRoZSB2YWx1ZSBtYXRyaXggbW9kZSBvZiB0aGUgdmFsdWUgbWF0cmljZXMgdGhpcyBsb2NhbCBjb2x1bW4KKyAgICogYmVsb25ncyB0bworICAgKiAtIHRoZSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGxvY2FsIGNvbHVtbgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLgorICAgKi8KKyAgIERhdGFUeXBlIGdldERhdGFUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDEzMDEyKQorICAgKiBEZXN0cm95IHRoZSBvYmplY3Qgb24gdGhlIHNlcnZlci4gVGhlIGRlc3RydWN0b3Igb2YgdGhlIGNsaWVudCBzbworICAgKiB0aGUgc2VydmVyIGtub3dzIHRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUgYnkgdGhlIGNsaWVudC4KKyAgICogQWNjZXNzIHRvIHRoaXMgb2JqZWN0IGFmdGVyIHRoZSBkZXN0cm95IG1ldGhvZCB3aWxsIGxlYWQgdG8gYW4KKyAgICogZXhjZXB0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxMykKKyAgICogR2V0IHRoZSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sdW1uLiAKKyAgICogCisgICAqIFdoZW4gdGhlIHZhbHVlIG1hdHJpeCB0byB3aGljaCB0aGUgY29sdW1uIGJlbG9uZ3MgaXMgaW4gQ0FMQ1VMQVRFRAorICAgKiBtb2RlIHRoZSBzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbiBpcyBhbHdheXMgZXhwbGljaXQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbHVtbi4gVGhpcyBpcyB0aGUKKyAgICogICAgICAgICAgaW50ZWdlciB2YWx1ZSBhY2NvcmRpbmcgdGhlIGVudW1lcmF0aW9uIHNlcV9yZXBfZW51bSBvZiB0aGUKKyAgICogICAgICAgICAgYmFzZSBtb2RlbC4KKyAgICovCisgICBUX0xPTkcgZ2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxNCkKKyAgICogU2V0IHRoZSBzZXF1ZW5jZSByZXByZXNlbnRhdGlvbiBvZiBhIG5ldyBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RWSUUKKyAgICoKKyAgICogQHBhcmFtICBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uICBUaGUgc2VxdWVuY2UgcmVwcmVzZW50YXRpb24uICBUaGlzCisgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIGludGVnZXIgdmFsdWUgYWNjb3JkaW5nIHRoZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uIHNlcV9yZXBfZW51bSBvZiB0aGUgYmFzZQorICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLgorICAgKi8KKyAgIHZvaWQgc2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigKKyAgICAgIGluIFRfTE9ORyBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMTUpCisgICAqIEdldCB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBDb2x1bW4uIAorICAgKiAKKyAgICogSWYgbm8gZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzIGV4aXN0IGFuIGVtcHR5IHNlcXVlbmNlIGlzIHJldHVybmVkLCBpdHMKKyAgICogdHlwZSBpcyBkb3VibGUsIGl0cyBsZW5ndGggaXMgMC4KKyAgICogV2hlbiB0aGUgdmFsdWUgbWF0cml4IHRvIHdoaWNoIHRoZSBjb2x1bW4gYmVsb25ncyBpcyBpbiBDQUxDVUxBVEVECisgICAqIG1vZGUgYW4gZW1wdHkgc2VxdWVuY2UgaXMgcmV0dXJuZWQsIGl0cyB0eXBlIGlzIGRvdWJsZSwgaXRzIGxlbmd0aAorICAgKiBpcyAwLgorICAgKiAKKyAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBpbXBsaWNpdCBjb2x1bW5zCisgICAqIGlzIHRoZSBkYXRhIHR5cGUgZ2l2ZW4gYXQgdGhlIG1lYXN1cmVtZW50IHF1YW50aXR5LiBUaGUgZGF0YSB0eXBlIG9mCisgICAqIHRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgZm9yIHJhdyBkYXRhIGlzIGFsd2F5cyBUX0RPVUJMRS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBnZW5lcmF0aW9uIHBhcmFtZXRlcnMuCisgICAqLworICAgVFNfVW5pb24gZ2V0R2VuZXJhdGlvblBhcmFtZXRlcnMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTMwMTYpCisgICAqIFNldCB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXJzLgorICAgKiAKKyAgICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgZ2VuZXJhdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBpbXBsaWNpdCBjb2x1bW5zCisgICAqIG11c3QgYmUgdGhlIGRhdGEgdHlwZSBnaXZlbiBhdCB0aGUgbWVhc3VyZW1lbnQgcXVhbnRpdHkuIFRoZSBkYXRhCisgICAqIHR5cGUgb2YgdGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycyBmb3IgcmF3IGRhdGEgbXVzdCBiZSBhbHdheXMKKyAgICogVF9ET1VCTEUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RWSUUKKyAgICoKKyAgICogQHBhcmFtICBnZW5lcmF0aW9uUGFyYW1ldGVycyAgVGhlIGdlbmVyYXRpb24gcGFyYW1ldGVycy4KKyAgICovCisgICB2b2lkIHNldEdlbmVyYXRpb25QYXJhbWV0ZXJzKAorICAgICAgaW4gVFNfVW5pb24gZ2VuZXJhdGlvblBhcmFtZXRlcnMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxMzAxNykKKyAgICogR2V0IHRoZSBkYXRhIHR5cGUgb2YgdGhlIHJhdyB2YWx1ZXMuCisgICAqIAorICAgKiBXaGVuIHRoZSBjb2x1bW4gaGFzIG5vIHJhdyB2YWx1ZXMgdGhlIGRhdGEgdHlwZSBvZiB0aGUgbWVhc3VyZW1lbnQKKyAgICogcXVhbnRpdHkgaXMgcmV0dXJuZWQuIAorICAgKiBXaGVuIHRoZSB2YWx1ZSBtYXRyaXggdG8gd2hpY2ggdGhlIGNvbHVtbiBiZWxvbmdzIGlzIGluIENBTENVTEFURUQKKyAgICogbW9kZSB0aGUgZGF0YSB0eXBlIG9mIHRoZSBtZWFzdXJlbWVudCBxdWFudGl0eSByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBkYXRhIHR5cGUgb2YgdGhlIHJhdyB2YWx1ZXMuCisgICAqLworICAgRGF0YVR5cGUgZ2V0UmF3RGF0YVR5cGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBDb2x1bW4uCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgaW5zdGFuY2UgZWxlbWVudCBpbnRlcmZhY2UuIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZQorKiBpbnN0YW5jZXMgb3V0c2lkZSBhIHRyYW5zYWN0aW9uIGJ1dCByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhCisqIHRyYW5zYWN0aW9uIGJlZm9yZSB0aGUgaW5zdGFuY2VzIGFyZSBtb2RpZmllZC4gVGhlIG1vZGlmaWNhdGlvbnMgdG8KKyogaW5zdGFuY2VzIGdldCBwZXJtYW5lbnQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLgorKi8KK2ludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQgeworCisgICAvKiogKDE0MDAxKQorICAgKiBBZGQgYW4gaW5zdGFuY2UgYXR0cmlidXRlIHRvIHRoZSBpbnN0YW5jZS4gVGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBpcworICAgKiBidWlsdCBhcyBhIE5hbWUvVmFsdWUvVW5pdCB0dXBsZSBvbiB0aGUgY2xpZW50LiBUaGlzIG1ldGhvZCBoYXMgdG8KKyAgICogY29weSB0aGUgZGF0YSBmcm9tIHRoZSBjbGllbnQgdG8gdGhlIHNlcnZlci4gVGhlIG5hbWUgb2YgdGhlCisgICAqIGF0dHJpYnV0ZSBtdXN0IGJlIHVuaXF1ZS4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIGFkZCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3V0c2lkZSBhIHRyYW5zYWN0aW9uIGJ1dAorICAgKiBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGluc3RBdHRyICBUaGUgaW5zdGFuY2UgYXR0cmlidXRlIHRvIGJlIGFkZGVkLgorICAgKi8KKyAgIHZvaWQgYWRkSW5zdGFuY2VBdHRyaWJ1dGUoCisgICAgICBpbiBOYW1lVmFsdWVVbml0IGluc3RBdHRyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDIpCisgICAqIENyZWF0ZSBhIHJlbGF0aW9uIGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBnaXZlbiBpbnN0YW5jZS4gQ2hlY2sKKyAgICogaWYgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnRzIG9mIHRoZSByZWxhdGlvbiBtYXRjaGVzIHRoZSBhcHBsaWNhdGlvbgorICAgKiBlbGVtZW50cyBvZiB0aGUgaW5zdGFuY2VzLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBpbnN0YW5jZSBlbGVtZW50IG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTgorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHJlbGF0aW9uICBUaGUgYXBwbGljYXRpb24gcmVsYXRpb24uCisgICAqCisgICAqIEBwYXJhbSAgaW5zdEVsZW0gIFRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKi8KKyAgIHZvaWQgY3JlYXRlUmVsYXRpb24oCisgICAgICBpbiBBcHBsaWNhdGlvblJlbGF0aW9uIHJlbGF0aW9uLAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50IGluc3RFbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDMpCisgICAqIEdldCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGZyb20gd2hpY2ggdGhlIGluc3RhbmNlIGVsZW1lbnQgaXMKKyAgICogICAgICAgICAgZGVyaXZlZC4KKyAgICovCisgICBBcHBsaWNhdGlvbkVsZW1lbnQgZ2V0QXBwbGljYXRpb25FbGVtZW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDA0KQorICAgKiBHZXQgdGhlIEFTQU0tUGF0aCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBBU0FNIHBhdGggdG8gdGhlIGluc3RhbmNlIGVsZW1lbnQuCisgICAqLworICAgTmFtZSBnZXRBc2FtUGF0aCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAwNSkKKyAgICogR2V0IHRoZSBJZCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICBUX0xPTkdMT05HIGdldElkKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDA2KQorICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICBOYW1lIGdldE5hbWUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDcpCisgICAqIEdldCB0aGUgcmVsYXRlZCBpbnN0YW5jZXMuIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBhbmQgdGhlIG5hbWUgb2YKKyAgICogdGhlIHJlbGF0ZWQgIGluc3RhbmNlcyBzcGVjaWZ5IHRoZSBsaXN0ZWQgaW5zdGFuY2VzLiBUaGUgcGF0dGVybiBpcworICAgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTgorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFwcGxSZWwgIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBpZVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IgZ2V0UmVsYXRlZEluc3RhbmNlcygKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCwKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMDgpCisgICAqIEdldCB0aGUgbGlzdCBvZiByZWxhdGVkIGluc3RhbmNlcy4gVGhlIHJlbGF0aW9uc2hpcCBhbmQgdGhlIG5hbWUgb2YKKyAgICogdGhlIHJlbGF0ZWQgaW5zdGFuY2VzIHNwZWNpZnkgdGhlIGxpc3RlZCBpbnN0YW5jZXMuIFRoZSBwYXR0ZXJuIGlzCisgICAqIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1JFTEFUSU9OU0hJUAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllUmVsYXRpb25zaGlwICBUaGUgcmVxdWVzdGVkIHJlbGF0aW9uc2hpcC4KKyAgICoKKyAgICogQHBhcmFtICBpZVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVsYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IgZ2V0UmVsYXRlZEluc3RhbmNlc0J5UmVsYXRpb25zaGlwKAorICAgICAgaW4gUmVsYXRpb25zaGlwIGllUmVsYXRpb25zaGlwLAorICAgICAgaW4gUGF0dGVybiBpZVBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAwOSkKKyAgICogR2V0IHRoZSBhdHRyaWJ1dGUgdmFsdWUgKG5hbWUsIHZhbHVlIGFuZCB1bml0KSBvZiB0aGUgZ2l2ZW4KKyAgICogYXR0cmlidXRlIG9mIHRoZSBpbnN0YW5jZSBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIG5vdCByZXR1cm4gdGhlCisgICAqIHZhbHVlIG9mIHJlbGF0aW9uIGF0dHJpYnV0ZXMsIHVzZSB0aGUgbWV0aG9kIGdldFJlbGF0ZWRJbnN0YW5jZXMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYXR0ck5hbWUgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXR0cmlidXRlIHZhbHVlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVVuaXQgZ2V0VmFsdWUoCisgICAgICBpbiBOYW1lIGF0dHJOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTApCisgICAqIEdldCB0aGUgYXR0cmlidXRlIHZhbHVlICh2YWx1ZSBhbmQgdW5pdCkgb2YgdGhlIGF0dHJpYnV0ZSBpbmhlcml0ZWQKKyAgICogZnJvbSB0aGUgZ2l2ZW4gYmFzZSBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQuIFRoZSBiYXNlIG5hbWUKKyAgICogaXMgY2FzZSBpbnNlbnNpdGl2ZSBhbmQgbWF5IG5vdCBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYmFzZUF0dHJOYW1lICBUaGUgYmFzZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYXR0cmlidXRlIHZhbHVlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVVuaXQgZ2V0VmFsdWVCeUJhc2VOYW1lKAorICAgICAgaW4gTmFtZSBiYXNlQXR0ck5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAxMSkKKyAgICogR2V0IHRoZSBhdHRyaWJ1dGUgbmFtZXMgZnJvbSB0aGUgaW5zdGFuY2UgZWxlbWVudC4gVGhlICBhdHRyaWJ1dGVzCisgICAqIHJlc2VydmVkIGZvciBhIHJlbGF0aW9uIGFyZSBub3QgbGlzdGVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX0FUVFJJQlVURV9UWVBFCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaWFQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBhdHRyaWJ1dGUKKyAgICogICAgICAgICAgICAgICAgICAgIG5hbWVzLgorICAgKgorICAgKiBAcGFyYW0gIGFUeXBlICBUaGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSB0eXBlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZXMuCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RBdHRyaWJ1dGVzKAorICAgICAgaW4gUGF0dGVybiBpYVBhdHRlcm4sCisgICAgICBpbiBBdHRyVHlwZSBhVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDEyKQorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSByZWxhdGVkIGluc3RhbmNlcy4gVGhlIGFwcGxpY2F0aW9uIHJlbGF0aW9uIGFuZAorICAgKiB0aGUgbmFtZSBvZiB0aGUgcmVsYXRlZCBpbnN0YW5jZXMgc3BlY2lmaWVzIHRoZSBsaXN0ZWQgbmFtZXMuIFRoZQorICAgKiBwYXR0ZXJuIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGllUmVsYXRpb24gIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBpZVBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLgorICAgKi8KKyAgIE5hbWVJdGVyYXRvciBsaXN0UmVsYXRlZEluc3RhbmNlcygKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gaWVSZWxhdGlvbiwKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTMpCisgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLiBUaGUgcmVsYXRpb25zaGlwIGFuZCB0aGUKKyAgICogbmFtZSBvZiB0aGUgcmVsYXRlZCBpbnN0YW5jZXMgc3BlY2lmeSB0aGUgbGlzdGVkIG5hbWVzLiBUaGUgcGF0dGVybgorICAgKiBpcyBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBpZVJlbGF0aW9uc2hpcCAgVGhlIHJlcXVlc3RlZCByZWxhdGlvbnNoaXAuCisgICAqCisgICAqIEBwYXJhbSAgaWVQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSByZWxhdGVkCisgICAqICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSByZWxhdGVkIGluc3RhbmNlcy4KKyAgICovCisgICBOYW1lSXRlcmF0b3IgbGlzdFJlbGF0ZWRJbnN0YW5jZXNCeVJlbGF0aW9uc2hpcCgKKyAgICAgIGluIFJlbGF0aW9uc2hpcCBpZVJlbGF0aW9uc2hpcCwKKyAgICAgIGluIFBhdHRlcm4gaWVQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTQpCisgICAqIFJlbW92ZSBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUuCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIHJlbW92ZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGNhbid0IGJlIHJlbW92ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9GT1VORAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHJlbW92ZWQuCisgICAqLworICAgdm9pZCByZW1vdmVJbnN0YW5jZUF0dHJpYnV0ZSgKKyAgICAgIGluIE5hbWUgYXR0ck5hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAxNSkKKyAgICogUmVtb3ZlIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHRoZSBjdXJyZW50IGluc3RhbmNlIGFuZCB0aGUgZ2l2ZW4KKyAgICogaW5zdGFuY2UuIEl0IGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IHRoZSBpbnN0YW5jZSBlbGVtZW50IGluIGNhc2Ugb2YKKyAgICogbjptIHJlbGF0aW9ucyBpZiBub3QgYWxsIHJlbGF0aW9ucyBzaGFsbCBiZSBkZWxldGVkLiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSBpbnN0YW5jZSBlbGVtZW50IG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9SRUxBVElPTgorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhcHBsUmVsICBUaGUgcmVsYXRpb24gdG8gYmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHBhcmFtICBpbnN0RWxlbV9ubSAgVGhlIGluc3RhbmNlIGVsZW1lbnQgZm9yIHNwZWNpZmljIGRlbGV0ZSBmcm9tCisgICAqICAgICAgICAgICAgICAgICAgICAgIG46bSByZWxhdGlvbnMuCisgICAqLworICAgdm9pZCByZW1vdmVSZWxhdGlvbigKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCwKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCBpbnN0RWxlbV9ubSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDE2KQorICAgKiBSZW5hbWUgdGhlIGluc3RhbmNlIGF0dHJpYnV0ZS4gVGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgY2FuJ3QgYmUKKyAgICogcmVuYW1lZC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIHJlbmFtZSB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9OQU1FCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgb2xkTmFtZSAgVGhlIG9sZCBpbnN0YW5jZSBhdHRyaWJ1dGUgbmFtZS4KKyAgICoKKyAgICogQHBhcmFtICBuZXdOYW1lICBUaGUgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBuYW1lLgorICAgKi8KKyAgIHZvaWQgcmVuYW1lSW5zdGFuY2VBdHRyaWJ1dGUoCisgICAgICBpbiBOYW1lIG9sZE5hbWUsCisgICAgICBpbiBOYW1lIG5ld05hbWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAxNykKKyAgICogU2V0IHRoZSBuYW1lIG9mIGFuIGluc3RhbmNlIGVsZW1lbnQuIAorICAgKiAKKyAgICogSXQgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGlhTmFtZSAgVGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBuYW1lLgorICAgKi8KKyAgIHZvaWQgc2V0TmFtZSgKKyAgICAgIGluIE5hbWUgaWFOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMTgpCisgICAqIFNldCB0aGUgdmFsdWUgb2YgYW4gYXBwbGljYXRpb24gYXR0cmlidXRlIG9yIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlCisgICAqIGF0dHJpYnV0ZSwgYnV0IGlzIGRvZXNuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZTsgZm9yIHRoaXMKKyAgICogcHVycG9zZSB1c2UgdGhlIG1ldGhvZCBhZGRJbnN0YW5jZXNBdHRyaWJ1dGUgb2YgdGhpcyBpbnRlcmZhY2UuCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYXR0cmlidXRlIHZhbHVlIG91dHNpZGUgYSB0cmFuc2FjdGlvbgorICAgKiBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWN0aXZhdGUgYSB0cmFuc2FjdGlvbi4KKyAgICogCisgICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkIGJ5IHRoZSBuYW1lIG9mIHRoZQorICAgKiBOYW1lVmFsdWVVbml0IHR1cGxlLiBJZiB0aGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGZsYWcgdW5pcXVlIGlzCisgICAqIHNldCwgdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIG5ldyB2YWx1ZSBpcyBjaGVja2VkLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgYSByZWxhdGlvbgorICAgKiBhdHRyaWJ1dGUsIHVzZSB0aGUgbWV0aG9kIGNyZWF0ZVJlbGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0RVUExJQ0FURV9WQUxVRQorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlIHRvIGJlIHNldCBpbiB0aGUgaW5zdGFuY2UgZWxlbWVudC4KKyAgICovCisgICB2b2lkIHNldFZhbHVlKAorICAgICAgaW4gTmFtZVZhbHVlVW5pdCB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDE5KQorICAgKiBDYXN0IGFuIGluc3RhbmNlIGVsZW1lbnQgdG8gYSBtZWFzdXJlbWVudC4gVGhlcmUgYXJlIHNvbWUKKyAgICogb2JqZWN0LW9yaWVudGVkIGxhbmd1YWdlcyB3aGljaCBkbyBub3QgYWxsb3cgdGhpcyBjYXN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fSU5WQUxJRF9CQVNFVFlQRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW5zdGFuY2Ugb2YgdHlwZSBtZWFzdXJlbWVudC4KKyAgICovCisgICBNZWFzdXJlbWVudCB1cGNhc3RNZWFzdXJlbWVudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAyMCkKKyAgICogQ2FzdCBhbiBpbnN0YW5jZSBlbGVtZW50IHRvIGEgc3VibWF0cml4LiBUaGVyZSBhcmUgc29tZQorICAgKiBvYmplY3Qtb3JpZW50ZWQgbGFuZ3VhZ2VzIHdoaWNoIGRvIG5vdCBhbGxvdyB0aGlzIGNhc3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBpbnN0YW5jZSBvZiB0eXBlIHN1Ym1hdHJpeC4KKyAgICovCisgICBTdWJNYXRyaXggdXBjYXN0U3ViTWF0cml4KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDIxKQorICAgKiBHZXQgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAobmFtZSwgdmFsdWUgYW5kIHVuaXQpIG9mIHRoZSBnaXZlbgorICAgKiBhdHRyaWJ1dGUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTkNPTVBBVElCTEVfVU5JVFMKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGF0dHIgIFRoZSBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlIGFuZCB0aGUgdW5pdCBvZgorICAgKiAgICAgICAgICAgICAgIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhdHRyaWJ1dGUgdmFsdWUsIHZhbHVlIGNvbnZlcnRlZCB0byB0aGUgcmVxdWVzdGVkIHVuaXQuCisgICAqLworICAgTmFtZVZhbHVlVW5pdCBnZXRWYWx1ZUluVW5pdCgKKyAgICAgIGluIE5hbWVVbml0IGF0dHIpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAyMikKKyAgICogU2V0IGEgc2VxdWVuY2VzIG9mIHZhbHVlcyBvZiBhbiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGJ1dCBubworICAgKiBpbnN0YW5jZXMgYXR0cmlidXRlcy4KKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlCisgICAqIE5hbWVWYWx1ZVVuaXQgdHVwbGUuIElmIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgZmxhZyB1bmlxdWUgaXMKKyAgICogc2V0LCB0aGUgdW5pcXVlbmVzcyBvZiB0aGUgbmV3IHZhbHVlIGlzIGNoZWNrZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19EVVBMSUNBVEVfVkFMVUUKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdmFsdWVzICBUaGUgc2VxdWVuY2Ugb2YgdGhlIHZhbHVlcyB0byBiZSBzZXQgYXQgdGhlIGluc3RhbmNlCisgICAqICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgKi8KKyAgIHZvaWQgc2V0VmFsdWVTZXEoCisgICAgICBpbiBOYW1lVmFsdWVVbml0U2VxdWVuY2UgdmFsdWVzKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMjMpCisgICAqIFRoZSBnaXZlbiB1c2VyIGdyb3VwIHRoZSByaWdodHMgc2hvdWxkIGJlIHNldCBmb3IuIDxyaWdodHM+IGRlZmluZXMKKyAgICogdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvCisgICAqICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsIG90aGVycyBhcmUgY2xlYXJlZC4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIGFkZGVkIHRvCisgICAqIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdyZW1vdmUnLCB0aGUKKyAgICogcmlnaHRzIGluIDxyaWdodHM+IGFyZSByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHJpZ2h0cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cCAgVGhlIHVzZXIgZ3JvdXAgZm9yIHdoaWNoIHRoZSByaWdodHMgd2lsbCBiZQorICAgKiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4gVGhlIHJpZ2h0cworICAgKiAgICAgICAgICAgICAgICAgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UKKyAgICogICAgICAgICAgICAgICAgIFNlY3VyaXR5UmlnaHRzLiBUaGUgaW50ZXJmYWNlIGRlZmluaXRpb24gbGFuZ3VhZ2UKKyAgICogICAgICAgICAgICAgICAgIElETCBkb2VzIG5vdCBhbGxvdyB0byBzZXQgdGhlIHZhbHVlcyBvZiBlbnVtZXJhdGlvbnMKKyAgICogICAgICAgICAgICAgICAgIHRodXMgdGhlIGNvbnN0YW50IGRlZmluaXRpb25zIGhhZCB0byBiZSBkb25lIGluIGFuCisgICAqICAgICAgICAgICAgICAgICBpbnRlcmZhY2UuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyByaWdodC4KKyAgICovCisgICB2b2lkIHNldFJpZ2h0cygKKyAgICAgIGluIEluc3RhbmNlRWxlbWVudCB1c2VyZ3JvdXAsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI0KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBnaXZlbiBvYmplY3QuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgIGVsZW1lbnQuCisgICAqLworICAgQUNMU2VxdWVuY2UgZ2V0UmlnaHRzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI1KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIGZvciB0aGUgaW5pdGlhbCByaWdodHMgb2YKKyAgICogdGhlIGdpdmVuIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFjY2VzcyBjb250cm9sIGxpc3QgZW50cmllcyB3aXRoIHRoZSBpbml0aWFsIHJpZ2h0cyBvZgorICAgKiAgICAgICAgICB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICovCisgICBJbml0aWFsUmlnaHRTZXF1ZW5jZSBnZXRJbml0aWFsUmlnaHRzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI2KQorICAgKiBUaGUgZ2l2ZW4gdXNlciBncm91cCB0aGUgaW5pdGlhbCByaWdodHMgc2hvdWxkIGJlIHNldCBmb3IuIDxyaWdodHM+CisgICAqIGRlZmluZXMgdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0CisgICAqIHRvICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsIG90aGVycyBhcmUgY2xlYXJlZC4gSWYKKyAgICogdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlCisgICAqIGFkZGVkIHRvIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvCisgICAqICdyZW1vdmUnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nCisgICAqIHJpZ2h0cy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cCAgVGhlIHVzZXIgZ3JvdXAgZm9yIHdoaWNoIHRoZSBpbml0aWFsIHJpZ2h0cyB3aWxsCisgICAqICAgICAgICAgICAgICAgICAgICBiZSBtb2RpZmllZC4KKyAgICoKKyAgICogQHBhcmFtICByaWdodHMgIFRoZSBuZXcgaW5pdGlhbCByaWdodHMgZm9yIHRoZSB1c2VyIGdyb3VwLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIHJpZ2h0cyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlSaWdodHMuIFRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZQorICAgKiAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mIGVudW1lcmF0aW9ucworICAgKiAgICAgICAgICAgICAgICAgdGh1cyB0aGUgY29uc3RhbnQgZGVmaW5pdGlvbnMgaGF2ZSB0byBiZSBkb25lIGluIHRoZQorICAgKiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgKgorICAgKiBAcGFyYW0gIHJlZkFpZCAgVGhlIElkIG9mIHJlZmVyZW5jaW5nIGFwcGxpY2F0aW9uIGVsZW1lbnQgZm9yIHdoaWNoCisgICAqICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCByaWdodHMgd2lsbCBiZSB1c2VkLiBJZiBubyByZWZBaWQgaXMgc2V0CisgICAqICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCByaWdodHMgd2lsbCBiZSB1c2VkIGZvciBlYWNoIG5ldworICAgKiAgICAgICAgICAgICAgICAgaW5zdGFuY2UgZWxlbWVudCBpbmRlcGVuZGVudCBvZiB0aGUgYXBwbGljYXRpb24KKyAgICogICAgICAgICAgICAgICAgIGVsZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyBpbml0aWFsIHJpZ2h0cy4KKyAgICovCisgICB2b2lkIHNldEluaXRpYWxSaWdodHMoCisgICAgICBpbiBJbnN0YW5jZUVsZW1lbnQgdXNlcmdyb3VwLAorICAgICAgaW4gVF9MT05HIHJpZ2h0cywKKyAgICAgIGluIFRfTE9OR0xPTkcgcmVmQWlkLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDI3KQorICAgKiBQcm92aWRlcyBhbiBlYXN5LXRvLXVzZSBhbmQgZWZmZWN0aXZlIGNvcHkgbWVjaGFuaXNtIGZvciBpbnN0YW5jZQorICAgKiBlbGVtZW50cyBpbnNpZGUgdGhlIHNlcnZlci4gVGhlIG5ldyBpbnN0YW5jZSBlbGVtZW50cyBnZXRzIGEgY29weSBvZgorICAgKiBhbGwgYXR0cmlidXRlIHZhbHVlcyBhbmQgaW5mb3JtYXRpb25hbCByZWxhdGlvbnMgdGhhdCBhcmUgYXZhaWxhYmxlCisgICAqIGluIHRoZSBvcmlnaW5hbCBpbnN0YW5jZSBlbGVtZW50LiBUaGUgbmV3IGluc3RhbmNlIGVsZW1lbnQgaGFzIHRoZQorICAgKiBzYW1lIHBhcmVudCBhcyB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgZWxlbWVudCBidXQgaXQgZG9lcyBub3QgaGF2ZQorICAgKiByZWZlcmVuY2VzIHRvIGFueSBjaGlsZHJlbiBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIG5ld05hbWUgIFRoZSBuYW1lIG9mIHRoZSBuZXcgaW5zdGFuY2UgZWxlbWVudC4gSWYgYSBuZXcKKyAgICogICAgICAgICAgICAgICAgICB2ZXJzaW9uIHNoYWxsIGJlIGNyZWF0ZWQgdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwKKyAgICogICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgdGhlIGNvcHkuIEluIHRoaXMgY2FzZSBhCisgICAqICAgICAgICAgICAgICAgICAgbmV3IHZlcnNpb24gbXVzdCBiZSBwcm92aWRlZC4KKyAgICoKKyAgICogQHBhcmFtICBuZXdWZXJzaW9uICBUaGUgdmVyc2lvbiBvZiB0aGUgbmV3IGluc3RhbmNlIGVsZW1lbnQuIFRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwgaWYgYSBuZXcgbmFtZSBpcyBwcm92aWRlZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlZmVyZW5jZSB0byB0aGUgY29waWVkIGluc3RhbmNlIGVsZW1lbnQuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50IHNoYWxsb3dDb3B5KAorICAgICAgaW4gVF9TVFJJTkcgbmV3TmFtZSwKKyAgICAgIGluIFRfU1RSSU5HIG5ld1ZlcnNpb24pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAyOCkKKyAgICogUHJvdmlkZXMgYW4gZWFzeS10by11c2UgYW5kIGVmZmVjdGl2ZSBjb3B5IG1lY2hhbmlzbSBmb3IgaW5zdGFuY2UKKyAgICogZWxlbWVudCBoaWVyYXJjaGllcyBpbnNpZGUgdGhlIHNlcnZlciAoZS5nLiBjb3B5IGEgcHJvamVjdCB3aXRoIGFsbAorICAgKiB0ZXN0cyBvciBjb3B5IGEgdGVzdCB3aXRoIGFsbCBtZWFzdXJlbWVudHMpLiBUaGUgZGVlcCBjb3B5IGZvbGxvd3MKKyAgICogb25seSB0aGUgY2hpbGQgcmVmZXJlbmNlcyBidXQgbm90IHRoZSBpbmZvcm1hdGlvbmFsIHJlZmVyZW5jZXMuCisgICAqIEV4YW1wbGU6IENvcHlpbmcgZWxlbWVudHMgb2YgdHlwZSBBb01lYXN1cmVtZW50IGRvZXMgbm90IGluY2x1ZGUKKyAgICogY29weWluZyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50cyBvZiB0eXBlIEFvTWVhc3VyZW1lbnRRdWFudGl0eS4gVGhlCisgICAqIGNvcGllZCBpbnN0YW5jZSBlbGVtZW50cyBvZiB0eXBlIEFvTWVhc3VyZW1lbnQgd2lsbCByZWZlcmVuY2UgdGhlCisgICAqIHNhbWUgbWVhc3VyZW1lbnQgcXVhbnRpdGllcyBhcyB0aGUgb3JpZ2luYWwuIEFuIGFwcGxpY2F0aW9uIHRoYXQKKyAgICogd2FudHMgdG8gY29weSB0aGUgbWVhc3VyZW1lbnQgcXVhbnRpdHkgYWxzbyBtdXN0IGRvIHRoaXMgKGluY2x1ZGluZworICAgKiBzZXR0aW5nIHRoZSBwcm9wZXIgcmVmZXJlbmNlcykgYnkgaXRzZWxmIGUuZy4gd2l0aCBhbm90aGVyIGNhbGwgdG8KKyAgICogc2hhbGxvd0NvcHk7IGRlZXBDb3B5IGlzIG5vdCBuZWNlc3NhcnkgaW4gdGhpcyBjYXNlIGJlY2F1c2UKKyAgICogQW9NZWFzdXJlbWVudFF1YW50aXR5IGhhcyBubyBjaGlsZHJlbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIG5ld05hbWUgIFRoZSBuYW1lIG9mIHRoZSBuZXcgaW5zdGFuY2UgZWxlbWVudC4gSWYgYSBuZXcKKyAgICogICAgICAgICAgICAgICAgICB2ZXJzaW9uIHNoYWxsIGJlIGNyZWF0ZWQgdGhpcyBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwKKyAgICogICAgICAgICAgICAgICAgICB0byB1c2UgdGhlIHNhbWUgbmFtZSBmb3IgdGhlIGNvcHkuIEluIHRoaXMgY2FzZSBhCisgICAqICAgICAgICAgICAgICAgICAgbmV3IHZlcnNpb24gbXVzdCBiZSBwcm92aWRlZC4KKyAgICoKKyAgICogQHBhcmFtICBuZXdWZXJzaW9uICBUaGUgdmVyc2lvbiBvZiB0aGUgbmV3IGluc3RhbmNlIGVsZW1lbnQuIFRoaXMKKyAgICogICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwgaWYgYSBuZXcgbmFtZSBpcyBwcm92aWRlZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlZmVyZW5jZSB0byB0aGUgY29waWVkIGluc3RhbmNlIGVsZW1lbnQgaGllcmFyY2h5LgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudCBkZWVwQ29weSgKKyAgICAgIGluIFRfU1RSSU5HIG5ld05hbWUsCisgICAgICBpbiBUX1NUUklORyBuZXdWZXJzaW9uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTQwMjkpCisgICAqIEdldCB0aGUgc2VxdWVuY2Ugb2YgdGhlIHZhbHVlcyBvZiB0aGUgYXBwbGljYXRpb24gb3IgaW5zdGFuY2UKKyAgICogYXR0cmlidXRlcywgc3BlY2lmaWVkIGJ5IHRoZWlyIG5hbWVzLiAgVGhlIG5hbWUgc2VxdWVuY2UgY2FuIHVzZSBhCisgICAqIHBhdHRlcm4gKCopIGZvciBhbGwgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudC4gVGhpcyBtZWFucworICAgKiB0aGF0IGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgICBpbnN0YW5jZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVsaXZlcmVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGF0dHJOYW1lcyAgVGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHJlcG9ydGVkLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2Ugb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAqLworICAgTmFtZVZhbHVlVW5pdFNlcXVlbmNlIGdldFZhbHVlU2VxKAorICAgICAgaW4gTmFtZVNlcXVlbmNlIGF0dHJOYW1lcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDMwKQorICAgKiBEZXN0cm95IHRoZSBvYmplY3Qgb24gdGhlIHNlcnZlci4gVGhlIGRlc3RydWN0b3Igb2YgdGhlIGNsaWVudCBzbworICAgKiB0aGUgc2VydmVyIGtub3dzIHRoaXMgb2JqZWN0IGlzIG5vdCB1c2VkIGFueW1vcmUgYnkgdGhlIGNsaWVudC4KKyAgICogQWNjZXNzIHRvIHRoaXMgb2JqZWN0IGFmdGVyIHRoZSBkZXN0cm95IG1ldGhvZCB3aWxsIGxlYWQgdG8gYW4KKyAgICogZXhjZXB0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAzMSkKKyAgICogQ29tcGFyZSB0d28gaW5zdGFuY2UgZWxlbWVudHMuIFRoZSBJZCdzIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50cworICAgKiBhbmQgdGhlIElkJ3Mgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnRzIGFyZSBjb21wYXJlZC4gVGhlIElkJ3Mgb2YgdGhlCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHdpbGwgYmUgY29tcGFyZSBmaXJzdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb21wSWVPYmogIFRoZSBpbnN0YW5jZSBlbGVtZW50IHRvIGNvbXBhcmUgd2l0aC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGRpZmZlcmVuY2Ugb2YgdGhlIElkJ3MuIE1lYW5pbmc6CisgICAqICAgICAgICAgIGRpZmYgPCAwIEVsZW1JZCBvZiBpbnN0YW5jZSBpcyBzbWFsbGVyIHRoZW4gaW5zdGFuY2UgdG8KKyAgICogICAgICAgICAgY29tcGFyZSB3aXRoLgorICAgKiAgICAgICAgICBkaWZmID09IDAgRWxlbUlkIGlzIGlkZW50aWNhbC4KKyAgICogICAgICAgICAgZGlmZiA+IDAgRWxlbUlkIG9mIGluc3RhbmNlIGlzIGdyZWF0ZXIgdGhlbiBpbnN0YW5jZSB0bworICAgKiAgICAgICAgICBjb21wYXJlIHdpdGguCisgICAqLworICAgVF9MT05HTE9ORyBjb21wYXJlKAorICAgICAgaW4gSW5zdGFuY2VFbGVtZW50IGNvbXBJZU9iaikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE0MDMyKQorICAgKiBDcmVhdGUgYSBsaXN0IHdpdGggaW5zdGFuY2VzIHdoaWNoIGFyZSByZWxhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICogaW5zdGFuY2UgZWxlbWVudC4gVGhlIGF0dHJpYnV0ZSBhcmUgZ2l2ZW4gd2l0aCB0aGUgbmFtZSBvZiB0aGUKKyAgICogc2VxdWVuY2UuIFRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMgYXJlIGdpdmVuIGluIHRoZSB2YWx1ZQorICAgKiBzZXF1ZW5jZS4gVGhlIGluZGV4IGluIHRoZSBkaWZmZXJlbnQgdmFsdWUgc2VxdWVuY2VzIG1hdGNoIGZvciBvbmUKKyAgICogaW5zdGFuY2UgZWxlbWVudC4gVGhlIGluZGV4IGluIHRoZSBpbnN0YW5jZSBlbGVtZW50IHNlcXVlbmNlIG9mIHRoZQorICAgKiByZWxhdGVkIGluc3RhbmNlcyBtYXRjaCBmb3IgdGhlIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgaW5kZXggaW4gdGhlCisgICAqIHZhbHVlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfUkVRVUVTVAorICAgKgorICAgKiBAcGFyYW0gIGFwcGxSZWwgIFRoZSBhcHBsaWNhdGlvbiByZWxhdGlvbiBmb3Igd2l0Y2ggdGhlIHJlbGF0ZWQKKyAgICogICAgICAgICAgICAgICAgICBpbnN0YW5jZXMgd2lsbCBiZSBjcmVhdGVkLgorICAgKgorICAgKiBAcGFyYW0gIGF0dHJpYnV0ZXMgIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqCisgICAqIEBwYXJhbSAgcmVsYXRlZEluc3RhbmNlcyAgVGhlIGxpc3Qgd2l0aCByZWxhdGVkIGluc3RhbmNlcyBmb3IKKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgYXBwbGljYXRpb24gcmVsYXRpb25zLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbGlzdCB3aXRoIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50U2VxdWVuY2UgY3JlYXRlUmVsYXRlZEluc3RhbmNlcygKKyAgICAgIGluIEFwcGxpY2F0aW9uUmVsYXRpb24gYXBwbFJlbCwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcVVuaXRTZXF1ZW5jZSBhdHRyaWJ1dGVzLAorICAgICAgaW4gQXBwbGljYXRpb25SZWxhdGlvbkluc3RhbmNlRWxlbWVudFNlcVNlcXVlbmNlIHJlbGF0ZWRJbnN0YW5jZXMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNDAzMykKKyAgICogVXBjYXN0IHRoZSBJbnN0YW5jZUVsZW1lbnQgb2JqZWN0IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EU0ZpbGUKKyAgICogaW50ZXJmYWNlIGZvciBhbiBpbnN0YW5jZS4gCisgICAqIAorICAgKiBUaGlzIG1ldGhvZCBtYXkgb25seSBiZSBpbnZva2VkIGZvciBpbnN0YW5jZXMgb2YgYW4gYXBwbGljYXRpb24KKyAgICogZWxlbWVudCBkZXJpdmVkIGZyb20KKyAgICogdGhlIGJhc2UgZWxlbWVudCBBb0ZpbGUgYW5kIHJldHVybnMgYW4gT0RTRmlsZSBpbnRlcmZhY2UuCisgICAqIAorICAgKiBBbiBleGNlcHRpb24gd2l0aCB0aGUgZXJyb3IgY29kZSBBT19JTlZBTElEX0JBU0VUWVBFIGlzIHRocm93biB3aGVuCisgICAqIHRoZSBpbnN0YW5jZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCBkZXJpdmVkCisgICAqIGZyb20gdGhlIGJhc2UgZWxlbWVudCBBb0ZpbGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBPRFNGaWxlIGludGVyZmFjZSB0byBhY2Nlc3MgdGhlIGRlc2lyZWQgZmlsZS4KKyAgICovCisgICBPRFNGaWxlIHVwY2FzdE9EU0ZpbGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgaW5zdGFuY2UgZWxlbWVudCBpdGVyYXRvciBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIEluc3RhbmNlRWxlbWVudEl0ZXJhdG9yIHsKKworICAgLyoqICgxNTAwMSkKKyAgICogRGVzdHJveSB0aGUgaXRlcmF0b3IgYW5kIGZyZWUgdGhlIGFzc29jaWF0ZWQgbWVtb3J5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGRlc3Ryb3koKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTUwMDIpCisgICAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjY2Vzc2libGUgYnkgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICovCisgICBUX0xPTkcgZ2V0Q291bnQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTUwMDMpCisgICAqIEdldCB0aGUgbmV4dCBuIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGhvd19tYW55ICBUaGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbiBpbnN0YW5jZSBlbGVtZW50cyBmcm9tIHRoZSBpbnN0YW5jZSBzZXF1ZW5jZS4KKyAgICovCisgICBJbnN0YW5jZUVsZW1lbnRTZXF1ZW5jZSBuZXh0TigKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE1MDA0KQorICAgKiBHZXQgdGhlIG5leHQgZWxlbWVudCBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IGluc3RhbmNlIGVsZW1lbnQgZnJvbSB0aGUgaW5zdGFuY2Ugc2VxdWVuY2UuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTUwMDUpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IHNlcXVlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgbWVhc3VyZW1lbnQgaW50ZXJmYWNlLlRoZSBpbnRlcmZhY2UgTWVhc3VyZW1lbnQgZXh0ZW5kcworKiB0aGUgaW50ZXJmYWNlIEluc3RhbmNlRWxlbWVudC4gVGh1cyBhbGxsIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZQorKiBJbnN0YW5jZUVsZW1lbnQgZG8gYWxzbyB3b3JrIGhlcmUuCisqLworaW50ZXJmYWNlIE1lYXN1cmVtZW50IDogSW5zdGFuY2VFbGVtZW50IHsKKworICAgLyoqICgxNjAwMSkKKyAgICogQ3JlYXRlIGEgc3VibWF0cml4IGxpbmsuIFRoZSBzdWJtYXRyaXggbGluayBpcyBvbmx5IHZhbGlkIGluIHRoZQorICAgKiBjdXJyZW50IHNlc3Npb24uIFdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkIHRoZSBzdWJtYXRyaXggbGluayB3aWxsCisgICAqIGJlIGRlc3Ryb3llZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXcgc3VibWF0cml4IGxpbmsuCisgICAqLworICAgU01hdExpbmsgY3JlYXRlU01hdExpbmsoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTYwMDIpCisgICAqIEdldCB0aGUgbGlzdCBvZiB0aGUgc3VibWF0cml4IGxpbmtzIC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhdmFpbGFibGUgc3VibWF0cml4IGxpbmtzLgorICAgKi8KKyAgIFNNYXRMaW5rU2VxdWVuY2UgZ2V0U01hdExpbmtzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE2MDAzKQorICAgKiBHZXQgdGhlIHZhbHVlIG1hdHJpeCBvZiBhIG1lYXN1cmVtZW50LiAKKyAgICogQnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIHZhbHVlIG1hdHJpeCBtb2RlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgKiBtYXRyaXggd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjb250ZXh0IHZhcmlhYmxlICdWQUxVRU1BVFJJWF9NT0RFJy4KKyAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gZXNwZWNpYWxseSBvbiBkaWZmZXJlbnQgbW9kZXMgb2YgdGhlIHZhbHVlCisgICAqIG1hdHJpeCwgc2VlIGRlc2NyaXB0aW9uIGF0IHRoZSBtZXRob2QgZ2V0VmFsdWVNYXRyaXhJbk1vZGUoKSBvZiB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSB2YWx1ZSBtYXRyaXguCisgICAqLworICAgVmFsdWVNYXRyaXggZ2V0VmFsdWVNYXRyaXgoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTYwMDQpCisgICAqIFJlbW92ZSBhIHN1Ym1hdHJpeCBsaW5rLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBzbUxpbmsgIFRoZSBzdWIgbWF0cml4IGxpbmsgdG8gYmUgcmVtb3ZlZC4KKyAgICovCisgICB2b2lkIHJlbW92ZVNNYXRMaW5rKAorICAgICAgaW4gU01hdExpbmsgc21MaW5rKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTYwMDUpCisgICAqIEdldCB0aGUgdmFsdWUgbWF0cml4IG9mIGEgbWVhc3VyZW1lbnQgaW4gdGhlIHJlcXVlc3RlZCBtb2RlLgorICAgKiAKKyAgICogVGhlIHNlcnZlciBjaGVja3MgdGhlIGluZGVwZW5kZW50IGNvbHVtbiwgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorICAgKiBzdWJtYXRyaXggYXQgdGhlIG1lYXN1cmVtZW50IHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgaW5kZXBlbmRlbnQKKyAgICogY29sdW1uIHdpdGggdGhlIHNhbWUgbWVhc3VyZW1lbnQgcXVhbnRpdHkgaW4gZWFjaCBzdWJtYXRyaXgsCisgICAqIG90aGVyd2lzZSB0aGUgZXhjZXB0aW9uIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFIGlzCisgICAqIHRocm93bi4KKyAgICogCisgICAqIFRoZSBzZXJ2ZXIgdGhyb3dzIHRoZSBleGNlcHRpb24gQU9fSU5WQUxJRF9WQUxVRU1BVFJJWF9TVFJVQ1RVUkUKKyAgICogd2hlbiBpdCBpcyB1bmFibGUgdG8gY3JlYXRlIHRoZSB2YWx1ZSBtYXRyaXggZHVlIHRvIHRoZSBkYXRhIG9mIHRoZQorICAgKiBtZWFzdXJlbWVudAorICAgKiAtIGlmIHRoZXJlIGFyZSBubyBpbmRlcGVuZGVudCBjb2x1bW4KKyAgICogLSBpZiB0aGVyZSBhcmUgZGlmZmVyZW50IGluZGVwZW5kZW50IGNvbHVtbnMKKyAgICogLSBpZiB0aGVyZSBhcmUgc3ViIG1hdHJpY2VzIHdpdGggbW9yZSB0aGFuIG9uZSBpbmRlcGVuZGVudCBjb2x1bW4uCisgICAqIAorICAgKiBUaGUgc2VydmVyIG9yZGVycyB0aGUgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgdmFsdWVzIG9mIHRoZQorICAgKiBpbmRlcGVuZGVudCBsb2NhbGNvbHVtbi4gKGluIGFzY2VuZGluZyBvcmRlcikgSXQgaXMgdXAgdG8gdGhlIHNlcnZlcgorICAgKiB3aGF0IHZhbHVlIGlzIHJldHVybmVkIHdoZW4gYSBtZWFzdXJlbWVudCBxdWFudGl0eSBoYXMgdHdvIGRpZmZlcmVudAorICAgKiB2YWx1ZXMgYXQgdGhlIHNhbWUgaW5kZXBlbmRlbnQgcG9pbnQuIFRoZSBnYXBzIGFyZSBtYXJrZWQgd2l0aCBGbGFncworICAgKiBpbiBUU19WYWx1ZVNlcSAoZmxhZ3ZhbHVlID0gMCkuCisgICAqIAorICAgKiBJbiB0aGUgQ0FMQ1VMQVRFRCBtb2RlIHRoZSBzZXJ2ZXIgcmV0dXJucyB0aGUgY2FsY3VsYXRlZCB2YWx1ZXMgZm9yCisgICAqIGltcGxpY2l0IGFuZCByYXcgdmFsdWVzLiBUaGUgc2VydmVyIHJldHVybnMgYXQgZWFjaCBtZWFzdXJlbWVudAorICAgKiBwb2ludCB0aGUgZXhwbGljaXQgdmFsdWUgYXMgdGhlIHZhbHVlIGZvciB0aGUgaW1wbGljaXQgY2hhbm5lbHMuIFRoZQorICAgKiByYXcgdmFsdWVzIGFyZSBjYWxjdWxhdGVkIHRvIHRoZSBleHBsaWNpdCB2YWx1ZXMuCisgICAqIAorICAgKiBJbiB0aGUgU1RPUkFHRSBtb2RlIHRoZSBzZXJ2ZXIgaGFuZGxlcyB0aGUgdmFsdWVzIG9mIHRoZSBsb2NhbGNvbHVtbgorICAgKiBhcyB0aGV5IGFyZSBpbiB0aGUgc3RvcmFnZS4gV3JpdGUgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlIHZhbHVlCisgICAqIG1hdHJpeCBpcyBpbiB0aGUgU1RST0FHRSBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fSU5WQUxJRF9WQUxVRU1BVFJJWF9TVFJVQ1RVUkUKKyAgICoKKyAgICogQHBhcmFtICB2bU1vZGUgIFRoZSByZXF1ZXN0ZWQgbW9kZSBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIFZhbHVlTWF0cml4IGdldFZhbHVlTWF0cml4SW5Nb2RlKAorICAgICAgaW4gVmFsdWVNYXRyaXhNb2RlIHZtTW9kZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgTWVhc3VyZW1lbnQuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgbmFtZSBpdGVyYXRvciBpbnRlcmZhY2UuCisqLworaW50ZXJmYWNlIE5hbWVJdGVyYXRvciB7CisKKyAgIC8qKiAoMTcwMDEpCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE3MDAyKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE3MDAzKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IG4gbmFtZXMgZnJvbSB0aGUgbmFtZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbmV4dE4oCisgICAgICBpbiBUX0xPTkcgaG93X21hbnkpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxNzAwNCkKKyAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuYW1lIGZyb20gdGhlIG5hbWUgc2VxdWVuY2UuCisgICAqLworICAgTmFtZSBuZXh0T25lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE3MDA1KQorICAgKiBSZXNldCB0aGUgcG9pbnRlciBpbiB0aGUgZWxlbWVudCBzZXF1ZW5jZSB0byB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCByZXNldCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIE5hbWVJdGVyYXRvci4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlIGl0ZXJhdG9yIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgTmFtZVZhbHVlSXRlcmF0b3IgeworCisgICAvKiogKDE4MDAxKQorICAgKiBEZXN0cm95IHRoZSBpdGVyYXRvciBhbmQgZnJlZSB0aGUgYXNzb2NpYXRlZCBtZW1vcnkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgZGVzdHJveSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxODAwMikKKyAgICogR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFjY2Vzc2libGUgYnkgdGhlIGl0ZXJhdG9yLgorICAgKi8KKyAgIFRfTE9ORyBnZXRDb3VudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxODAwMykKKyAgICogR2V0IHRoZSBuZXh0IG4gZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaG93X21hbnkgIFRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGVsZW1lbnRzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuIG5hbWUtdmFsdWUgcGFpcnMgZnJvbSB0aGUgbmFtZS12YWx1ZSBwYWlyCisgICAqICAgICAgICAgIHNlcXVlbmNlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVNlcXVlbmNlIG5leHROKAorICAgICAgaW4gVF9MT05HIGhvd19tYW55KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTgwMDQpCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbmFtZS12YWx1ZSBwYWlyIGZyb20gdGhlIG5hbWUtdmFsdWUgcGFpciBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWUgbmV4dE9uZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgxODAwNSkKKyAgICogUmVzZXQgdGhlIHBvaW50ZXIgaW4gdGhlIGVsZW1lbnQgc2VxdWVuY2UgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgcmVzZXQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBOYW1lVmFsdWVJdGVyYXRvci4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXQgaXRlcmF0b3IgaW50ZXJmYWNlLiBUaGlzIGludGVyZmFjZSBpcworKiBpZGVudGljYWwgd2l0aCB0aGUgTmFtZVZhbHVlVW5pdElkSXRlcmF0b3IsIGV4Y2VwdCB0aGUgdW5pdCBpcyBnaXZlbiBhcworKiBhIHN0cmluZyBpbnNlYWQgb2YgYW4gSWQuCisqLworaW50ZXJmYWNlIE5hbWVWYWx1ZVVuaXRJdGVyYXRvciB7CisKKyAgIC8qKiAoMTkwMDEpCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE5MDAyKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDE5MDAzKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IG4gbmFtZS12YWx1ZS11bml0IHR1cGxlcyBmcm9tIHRoZSBuYW1lLXZhbHVlLXVuaXQKKyAgICogICAgICAgICAgdHVwbGUgc2VxdWVuY2UuCisgICAqLworICAgTmFtZVZhbHVlVW5pdFNlcXVlbmNlIG5leHROKAorICAgICAgaW4gVF9MT05HIGhvd19tYW55KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTkwMDQpCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbmFtZS12YWx1ZS11bml0IHR1cGxlIGZyb20gdGhlIG5hbWUtdmFsdWUtdW5pdAorICAgKiAgICAgICAgICB0dXBsZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMTkwMDUpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IHNlcXVlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgTmFtZVZhbHVlVW5pdEl0ZXJhdG9yLgorCisvKioKKyogVGhlIEFTQU0gT0RTIHN1Ym1hdHJpeCBsaW5rIGludGVyZmFjZS4KKyovCitpbnRlcmZhY2UgU01hdExpbmsgeworCisgICAvKiogKDIwMDAxKQorICAgKiBHZXQgdGhlIGxpbmsgb3IgYnVpbGQgdHlwZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBsaW5rIHR5cGUuCisgICAqLworICAgQnVpbGRVcEZ1bmN0aW9uIGdldExpbmtUeXBlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDAyKQorICAgKiBHZXQgdGhlIG9yZGluYWwgb3Igc2VxdWVuY2UgbnVtYmVyCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2VxdWVuY2UgbnVtYmVyLgorICAgKi8KKyAgIFRfTE9ORyBnZXRPcmRpbmFsTnVtYmVyKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDAzKQorICAgKiBHZXQgdGhlIGZpcnN0IHN1Ym1hdHJpeCBvZiB0aGUgbGluay4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBmaXJzdCBzdWJtYXRyaXggb2YgdGhlIGxpbmsuCisgICAqLworICAgU3ViTWF0cml4IGdldFNNYXQxKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA0KQorICAgKiBHZXQgdGhlIGJpbmQgY29sdW1ucyBvZiB0aGUgZmlyc3Qgc3VibWF0cml4IHVzZWQgaW4gdGhlIGxpbmsgKGUuZy4KKyAgICogVGltZSkuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgY29sdW1ucyBvZiB0aGUgZmlyc3Qgc3VibWF0cml4LgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldFNNYXQxQ29sdW1ucygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMDAwNSkKKyAgICogR2V0IHRoZSBzZWNvbmQgc3VibWF0cml4IG9mIHRoZSBsaW5rLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHNlY29uZCBzdWJtYXRyaXggb2YgdGhlIGxpbmsuCisgICAqLworICAgU3ViTWF0cml4IGdldFNNYXQyKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA2KQorICAgKiBHZXQgdGhlIGJpbmQgY29sdW1ucyBvZiB0aGUgc2Vjb25kIHN1Ym1hdHJpeCB1c2VkIGluIHRoZSBsaW5rIChlLmcuCisgICAqIFRpbWUpLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvbHVtbnMgb2YgdGhlIHNlY29uZCBzdWJtYXRyaXguCisgICAqLworICAgQ29sdW1uU2VxdWVuY2UgZ2V0U01hdDJDb2x1bW5zKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA3KQorICAgKiBTZXQgdGhlIGJ1aWxkIG9yIGxpbmsgdHlwZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9CVUlMRFVQX0ZVTkNUSU9OCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgbGlua1R5cGUgIFRoZSByZXF1ZXN0ZWQgYnVpbGQtdXAgZnVuY3Rpb24uCisgICAqLworICAgdm9pZCBzZXRMaW5rVHlwZSgKKyAgICAgIGluIEJ1aWxkVXBGdW5jdGlvbiBsaW5rVHlwZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDA4KQorICAgKiBTZXQgdGhlIG9yZGluYWwgb3Igc2VxdWVuY2UgbnVtYmVyLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX09SRElOQUxOVU1CRVIKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBvcmRpbmFsTnVtYmVyICBUaGUgc2VxdWVuY2UgbnVtYmVyLgorICAgKi8KKyAgIHZvaWQgc2V0T3JkaW5hbE51bWJlcigKKyAgICAgIGluIFRfTE9ORyBvcmRpbmFsTnVtYmVyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwMDkpCisgICAqIFNldCB0aGUgZmlyc3Qgc3VibWF0cml4IG9mIHRoZSBsaW5rLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JTlZBTElEX1NVQk1BVFJJWAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHN1Yk1hdDEgIFRoZSBmaXJzdCBzdWIgbWF0cml4IG9mIHRoZSBzdWIgbWF0cml4IGxpbmsuCisgICAqLworICAgdm9pZCBzZXRTTWF0MSgKKyAgICAgIGluIFN1Yk1hdHJpeCBzdWJNYXQxKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwMTApCisgICAqIFNldCB0aGUgYmluZCBjb2x1bW5zIG9mIHRoZSBmaXJzdCBzdWJtYXRyaXggdXNlZCBpbiB0aGUgbGluayAoZS5nLgorICAgKiBUaW1lKS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9DT0xVTU4KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2x1bW5zICBUaGUgY29sdW1uIHNlcXVlbmNlIG9mIHRoZSBzdWIgbWF0cml4LgorICAgKi8KKyAgIHZvaWQgc2V0U01hdDFDb2x1bW5zKAorICAgICAgaW4gQ29sdW1uU2VxdWVuY2UgY29sdW1ucykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIwMDExKQorICAgKiBTZXQgdGhlIHNlY29uZCBzdWJtYXRyaXggb2YgdGhlIGxpbmsuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19JTlZBTElEX1NVQk1BVFJJWAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgc3ViTWF0MiAgVGhlIHNlY29uZCBzdWIgbWF0cml4IG9mIHRoZSBzdWIgbWF0cml4IGxpbmsuCisgICAqLworICAgdm9pZCBzZXRTTWF0MigKKyAgICAgIGluIFN1Yk1hdHJpeCBzdWJNYXQyKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjAwMTIpCisgICAqIFNldCB0aGUgYmluZCBjb2x1bW5zIG9mIHRoZSBzZWNvbmQgc3VibWF0cml4IHVzZWQgaW4gdGhlIGxpbmsgKGUuZy4KKyAgICogVGltZSkuIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgY29sdW1uIGJvdW5kIHRoZSBjb2x1bW4gc2VxdWVuY2UKKyAgICogbXVzdCBiZSBpZGVudGljYWwgd2l0aCB0aGUgY29sdW1uIHNlcXVlbmNlIG9mIHRoZSBmaXJzdCBzdWJtYXRyaXguCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19JTlZBTElEX0NPTFVNTgorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sdW1ucyAgVGhlIGNvbHVtbiBzZXF1ZW5jZSBvZiB0aGUgc3ViIG1hdHJpeC4KKyAgICovCisgICB2b2lkIHNldFNNYXQyQ29sdW1ucygKKyAgICAgIGluIENvbHVtblNlcXVlbmNlIGNvbHVtbnMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIFNNYXRMaW5rLgorCisvKioKKyogVGhlIEFTQU0gT0RTIHN1Ym1hdHJpeCBpbnRlcmZhY2UuIFRoZSBpbnN0YW5jZXMgb2YgdGhlIHN1Ym1hdHJpeCBjYW4gYmUKKyogYWNjZXNzZWQgdmlhIHRoZSBtZXRob2QgZ2V0UmVsYXRlZEluc3RhbmNlcyBvZiB0aGUgaW50ZXJmYWNlCisqIE1lYXN1cmVtZW50LiBUaGUgaW50ZXJmYWNlIFN1Yk1hdHJpeCBleHRlbmRzIHRoZSBpbnRlcmZhY2UKKyogSW5zdGFuY2VFbGVtZW50LiBUaHVzIGFsbGwgbWV0aG9kcyBvZiB0aGUgaW50ZXJmYWNlIEluc3RhbmNlRWxlbWVudCBkbworKiBhbHNvIHdvcmsgaGVyZS4KKyovCitpbnRlcmZhY2UgU3ViTWF0cml4IDogSW5zdGFuY2VFbGVtZW50IHsKKworICAgLyoqICgyMTAwMSkKKyAgICogR2V0IHRoZSBjb2x1bW5zIG9mIHRoZSBzdWJtYXRyaXguIFRoZSBjb2x1bW4gaXMgbm90IGluaGVyaXRlZCBmcm9tCisgICAqIHRoZSBJbnN0YW5jZUVsZW1lbnQgaW50ZXJmYWNlLiBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byBnZXQgYSBjb2x1bW4uCisgICAqIFRoZSBjb2x1bW5zIGFyZSB1c2VkIGluIHRoZSBTTWF0TGluayBpbnRlcmZhY2UgdG8gYnVpbGQgdGhlIHZhbHVlCisgICAqIG1hdHJpeC4gVGhlIHBhdHRlcm4gaXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkCisgICAqIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgY29sdW1uCisgICAqICAgICAgICAgICAgICAgICAgICAgbmFtZXMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBjb2x1bW5zIG9mIHRoZSBzdWJtYXRyaXguCisgICAqLworICAgQ29sdW1uU2VxdWVuY2UgZ2V0Q29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIxMDAyKQorICAgKiBHZXQgYSB2YWx1ZSBtYXRyaXggb2YgdGhlIHN1Ym1hdHJpeC4KKyAgICogQnkgY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIHZhbHVlIG1hdHJpeCBtb2RlIG9mIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgKiBtYXRyaXggd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjb250ZXh0IHZhcmlhYmxlICdWQUxVRU1BVFJJWF9NT0RFJy4KKyAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gZXNwZWNpYWxseSBvbiBkaWZmZXJlbnQgbW9kZXMgb2YgdGhlIHZhbHVlCisgICAqIG1hdHJpeCwgc2VlIGRlc2NyaXB0aW9uIGF0IHRoZSBtZXRob2QgZ2V0VmFsdWVNYXRyaXhJbk1vZGUoKSBvZiB0aGlzCisgICAqIGludGVyZmFjZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfU01BVExJTksKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeC4KKyAgICovCisgICBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMTAwMykKKyAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBvZiB0aGUgc3VibWF0cml4LiBUaGUgbmFtZSBzZXF1ZW5jZSBpcworICAgKiBpZGVudGljYWwgd2l0aCB0aGUgbmFtZXMgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLiBUaGUgcGF0dGVybiBpcworICAgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbWF5IGNvbnRhaW4gd2lsZGNhcmQgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2xQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBjb2x1bW4KKyAgICogICAgICAgICAgICAgICAgICAgICBuYW1lcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvbHVtbiBuYW1lcyBvZiB0aGUgc3VibWF0cml4LgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0Q29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIxMDA0KQorICAgKiBHZXQgdGhlIHZhbHVlIG1hdHJpeCBvZiBhIHN1Ym1hdHJpeCBpbiB0aGUgcmVxdWVzdGVkIG1vZGUuCisgICAqIAorICAgKiBUaGUgc2VydmVyIGRvZXNuJ3QgY2hlY2sgYW55IGluZGVwZW5kZW50IGNvbHVtbnMuIFRoZSBjb2x1bW5zIGFyZQorICAgKiBvbmx5IHRoZSBsb2NhbCBjb2x1bW5zIGZyb20gdGhpcyBzdWJtYXRyaXguIFRoZSBmbGFncyBpbiB0aGUKKyAgICogVFNfVmFsdWVTZXEgYXJlIHRoZSBmbGFncyBvZiB0aGUgbG9jYWxjb2x1bW4uIElmIG5vIGZsYWdzIGFyZSBnaXZlbgorICAgKiB0aGVyZSBhcmUgbm8gZmxhZ3MgYXZhaWxhYmxlLCB0aGUgY2xpZW50IGhhdmUgdG8gY2hlY2sgdGhlCisgICAqIGdsb2JhbF9mbGFnLgorICAgKiAKKyAgICogSW4gdGhlIENBTENVTEFURUQgbW9kZSB0aGUgc2VydmVyIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWVzIGZvcgorICAgKiBpbXBsaWNpdCBhbmQgcmF3IHZhbHVlcy4gVGhlIHNlcnZlciByZXR1cm5zIGF0IGVhY2ggbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgdGhlIGV4cGxpY2l0IHZhbHVlIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGltcGxpY2l0IGNoYW5uZWxzLiBUaGUKKyAgICogcmF3IHZhbHVlcyBhcmUgY2FsY3VsYXRlZCB0byB0aGUgZXhwbGljaXQgdmFsdWVzLgorICAgKiAKKyAgICogSW4gdGhlIFNUT1JBR0UgbW9kZSB0aGUgc2VydmVyIGhhbmRsZXMgdGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxjb2x1bW4KKyAgICogYXMgdGhleSBhcmUgaW4gdGhlIHN0b3JhZ2UuIFdyaXRlIGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZSB2YWx1ZQorICAgKiBtYXRyaXggaXMgaW4gdGhlIFNUUk9BR0UgbW9kZS4gVGhlIHZhbHVlcyBhcmUgZXhhY3RseSBmcm9tIHRoaXMKKyAgICogc3VibWF0cml4LiBUaGUgcmF3IC8gaW1wbGljaXQgdmFsdWVzIGFyZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdm1Nb2RlICBUaGUgcmVxdWVzdGVkIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeC4KKyAgICovCisgICBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeEluTW9kZSgKKyAgICAgIGluIFZhbHVlTWF0cml4TW9kZSB2bU1vZGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIFN1Yk1hdHJpeC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyB2YWx1ZSBtYXRyaXggaW50ZXJmYWNlLiBWYWx1ZSBtYXRyaXggaXMgYW4gaW50ZXJmYWNlIHVzZWQKKyogYnkgTWVhc3VyZW1lbnQgYW5kIFN1Yk1hdHJpeCB0byBoYW5kbGUgdmVjdG9ycyBvZiB2YWx1ZXMuCisqLworaW50ZXJmYWNlIFZhbHVlTWF0cml4IHsKKworICAgLyoqICgyMjAwMSkKKyAgICogR2V0IHRoZSBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXggbm8gbWF0dGVyIHdoZXRoZXIgdGhlIGNvbHVtbiBpcworICAgKiBkZXBlbmRlbnQgb3IgaW5kZXBlbmRlbnQuIFRoZSBwYXR0ZXJuIGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkKKyAgICogY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbFBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIGNvbHVtbgorICAgKiAgICAgICAgICAgICAgICAgICAgIG5hbWVzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LCBubyBtYXR0ZXIgd2hldGhlciB0aGUKKyAgICogICAgICAgICAgY29sdW1uIGlzIGRlcGVuZGVudCwgaW5kZXBlbmRlbnQgb3Igc2NhbGluZworICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldENvbHVtbnMoCisgICAgICBpbiBQYXR0ZXJuIGNvbFBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwMikKKyAgICogR2V0IHRoZSBjb2x1bW4gY291bnQgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIFRfTE9ORyBnZXRDb2x1bW5Db3VudCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwMykKKyAgICogR2V0IHRoZSBpbmRlcGVuZGVudCBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXguIFRoZSBpbmRlcGVuZGVudAorICAgKiBjb2x1bW5zIGFyZSB0aGUgY29sdW1ucyB1c2VkIHRvIGJ1aWxkIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudCBjb2x1bW4gbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGluZGVwZW5kZW50IGNvbHVtbiBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldEluZGVwZW5kZW50Q29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDA0KQorICAgKiBHZXQgdGhlIHJvdyBjb3VudCBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiByb3dzIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqLworICAgVF9MT05HIGdldFJvd0NvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDA1KQorICAgKiBHZXQgYSBtZWFzdXJlbWVudCBwb2ludCBvZiB0aGUgdmFsdWUgbWF0cml4LiBUaGUgcGFyYW1ldGVyIG1lYVBvaW50CisgICAqIHNwZWNpZmllcyB0aGUgcm93IG9mIHRoZSBtYXRyaXguIFRoZSBpdGVyYXRvciBhbGxvd3MgdG8gYWNjZXNzIGFsbAorICAgKiBlbGVtZW50cyBpbiB0aGUgcm93LgorICAgKiAKKyAgICogVGhlIHNlcnZlciBiZWhhdmlvciBkZXBlbmRzIG9uIHRoZSBtb2RlIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqIFZhbHVlIG1hdHJpeCBtb2RlICdDQUxDVUxBVEVEJzoKKyAgICogSW4gY2FzZSAnc2VxdWVuY2VfcmVwcmVzZW50YXRpb24nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGNvbHVtbgorICAgKiBpcyBvbmUgb2YgdGhlIGVudHJpZXMgJ3Jhd19saW5lYXInLCByYXdfcG9seW5vbWlhbCcsCisgICAqICdyYXdfbGluZWFyX2V4dGVybmFsJywgJ3Jhd19wb2x5bm9taWFsX2V4dGVybmFsJywKKyAgICogJ3Jhd19saW5lYXJfY2FsaWJyYXRlZCcsIG9yICdyYXdfbGluZWFyX2NhbGlicmF0ZWRfZXh0ZXJuYWwnLCB0aGUKKyAgICogc2VydmVyIHdpbGwgZmlyc3QgY2FsY3VsYXRlIHRoZSBwaHlzaWNhbCB2YWx1ZXMgZnJvbSByYXcgdmFsdWVzIGFuZAorICAgKiBnZW5lcmF0aW9uIHBhcmFtZXRlcnMsIGJlZm9yZSBpdCByZXR1cm5zIHRoZW0gdG8gdGhlIHJlcXVlc3RpbmcKKyAgICogY2xpZW50LgorICAgKiBWYWx1ZSBtYXRyaXggbW9kZSAnU1RPUkFHRSc6CisgICAqIEluIGNhc2UgJ3NlcXVlbmNlX3JlcHJlc2VudGF0aW9uJyBvZiB0aGUgY29ycmVzcG9uZGluZyBsb2NhbCBjb2x1bW4KKyAgICogaXMgb25lIG9mIHRoZSBlbnRyaWVzICdyYXdfbGluZWFyJywgcmF3X3BvbHlub21pYWwnLAorICAgKiAncmF3X2xpbmVhcl9leHRlcm5hbCcsICdyYXdfcG9seW5vbWlhbF9leHRlcm5hbCcsCisgICAqICdyYXdfbGluZWFyX2NhbGlicmF0ZWQnLCBvciAncmF3X2xpbmVhcl9jYWxpYnJhdGVkX2V4dGVybmFsJywgdGhlCisgICAqIHNlcnZlciB3aWxsIHJldHVybiB0aGUgcmF3IHZhbHVlcyBvZiB0aGUgbG9jYWwgY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIG1lYVBvaW50ICBUaGUgbWVhc3VyZW1lbnQgcG9pbnQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgbWVhc3VyZW1lbnQgcG9pbnQuCisgICAqLworICAgTmFtZVZhbHVlVW5pdEl0ZXJhdG9yIGdldFZhbHVlTWVhUG9pbnQoCisgICAgICBpbiBUX0xPTkcgbWVhUG9pbnQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwNikKKyAgICogR2V0IHRoZSB2YWx1ZXMgb3IgYSBwYXJ0IG9mIHZhbHVlcyBvZiB0aGUgY29sdW1uIGZyb20gdGhlIHZhbHVlCisgICAqIG1hdHJpeC4gVGhlIHBhcmFtZXRlciBjb2x1bW4gc3BlY2lmaWVzIGZyb20gd2hpY2ggY29sdW1uIHRoZSB2YWx1ZXMKKyAgICogd2lsbCBiZSByZXR1cm5lZC4gVGhlIHN0YXJ0UG9pbnQgYW5kIGNvdW50IHNwZWNpZnkgdGhlIHBhcnQgb2YgdGhlCisgICAqIHZlY3Rvci4gQSBzdGFydFBvaW50ID0gMCBhbmQgY291bnQgPSByb3dDb3VudCB3aWxsIHJldHVybiB0aGUgZW50aXJlCisgICAqIHZlY3Rvci4gV2hlbiBzdGFydFBvaW50ID49IHJvd0NvdW50IGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uIElmCisgICAqIHN0YXJ0UG9pbnQgKyBjb3VudCA+IHJvd0NvdW50IG9ubHkgdGhlIHJlbWFpbmluZyB2YWx1ZXMgb2YgdGhlCisgICAqIHZlY3RvciBhcmUgcmV0dXJuZWQgYW5kIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFVzZSB0aGUgZ2V0TmFtZSBhbmQKKyAgICogZ2V0VW5pdCBtZXRob2Qgb2YgdGhlIGludGVyZmFjZSBjb2x1bW4gZm9yIHRoZSBuYW1lIGFuZCB0aGUgdW5pdCBvZgorICAgKiB0aGUgY29sdW1uLiBUaGUgbmFtZSBhbmQgdGhlIHZhbHVlIGFyZSBub3Qgc3RvcmVkIGF0IGVhY2ggZWxlbWVudCBvZgorICAgKiB0aGUgdmVjdG9yLiBUaGUgcmV0dXJuIHR5cGUgVFNfVmFsdWVTZXEgaXMgbm90IGEgc2VxdWVuY2Ugb2YKKyAgICogVFNfVmFsdWUgYnV0IGEgc3BlY2lhbCBzdHJ1Y3R1cmUuCisgICAqIAorICAgKiBUaGUgc2VydmVyIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICogVmFsdWUgbWF0cml4IG1vZGUgJ0NBTENVTEFURUQnOgorICAgKiBJbiBjYXNlICdzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbicgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwgY29sdW1uCisgICAqIGlzIG9uZSBvZiB0aGUgZW50cmllcyAncmF3X2xpbmVhcicsIHJhd19wb2x5bm9taWFsJywKKyAgICogJ3Jhd19saW5lYXJfZXh0ZXJuYWwnLCAncmF3X3BvbHlub21pYWxfZXh0ZXJuYWwnLAorICAgKiAncmF3X2xpbmVhcl9jYWxpYnJhdGVkJywgb3IgJ3Jhd19saW5lYXJfY2FsaWJyYXRlZF9leHRlcm5hbCcsIHRoZQorICAgKiBzZXJ2ZXIgd2lsbCBmaXJzdCBjYWxjdWxhdGUgdGhlIHBoeXNpY2FsIHZhbHVlcyBmcm9tIHJhdyB2YWx1ZXMgYW5kCisgICAqIGdlbmVyYXRpb24gcGFyYW1ldGVycywgYmVmb3JlIGl0IHJldHVybnMgdGhlbSB0byB0aGUgcmVxdWVzdGluZworICAgKiBjbGllbnQuCisgICAqIFZhbHVlIG1hdHJpeCBtb2RlICdTVE9SQUdFJzoKKyAgICogSW4gY2FzZSAnc2VxdWVuY2VfcmVwcmVzZW50YXRpb24nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGNvbHVtbgorICAgKiBpcyBvbmUgb2YgdGhlIGVudHJpZXMgJ3Jhd19saW5lYXInLCByYXdfcG9seW5vbWlhbCcsCisgICAqICdyYXdfbGluZWFyX2V4dGVybmFsJywgJ3Jhd19wb2x5bm9taWFsX2V4dGVybmFsJywKKyAgICogJ3Jhd19saW5lYXJfY2FsaWJyYXRlZCcsIG9yICdyYXdfbGluZWFyX2NhbGlicmF0ZWRfZXh0ZXJuYWwnLCB0aGUKKyAgICogc2VydmVyIHdpbGwgcmV0dXJuIHRoZSByYXcgdmFsdWVzIG9mIHRoZSBsb2NhbCBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQ09MVU1OCisgICAqICAgIEFPX0lOVkxBSURfQ09VTlQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2wgIFRoZSBjb2x1bW4gdG8gcmV0cmlldmUgdGhlIHZhbHVlcyBmcm9tLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBzdGFydGluZyBwb2ludCBpbiB0aGUgY29sdW1uLgorICAgKgorICAgKiBAcGFyYW0gIGNvdW50ICBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBiZSByZXRyaWV2ZWQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXF1ZXN0ZWQgY29sdW1uIHZhbHVlcyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIFRTX1ZhbHVlU2VxIGdldFZhbHVlVmVjdG9yKAorICAgICAgaW4gQ29sdW1uIGNvbCwKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVF9MT05HIGNvdW50KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMDcpCisgICAqIEdldCB0aGUgbmFtZXMgb2YgdGhlIGNvbHVtbnMgb2YgdGhlIHZhbHVlIG1hdHJpeCBubyBtYXR0ZXIgd2hldGhlcgorICAgKiB0aGUgY29sdW1uIGlzIGRlcGVuZGVudCBvciBpbmRlcGVuZGVudC4gVGhlIHBhdHRlcm4gaXMgY2FzZQorICAgKiBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sUGF0dGVybiAgVGhlIG5hbWUgb3IgdGhlIHNlYXJjaCBwYXR0ZXJuIGZvciB0aGUgY29sdW1uCisgICAqICAgICAgICAgICAgICAgICAgICAgbmFtZXMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIHZhbHVlIG1hdHJpeCwgbm8gbWF0dGVyIHdoZXRoZXIgdGhlCisgICAqICAgICAgICAgIGNvbHVtbiBpcyBkZXBlbmRlbnQsIGluZGVwZW5kZW50IG9yIHNjYWxlZCBieSBhbm90aGVyIG9uZS4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdENvbHVtbnMoCisgICAgICBpbiBQYXR0ZXJuIGNvbFBhdHRlcm4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAwOCkKKyAgICogR2V0IHRoZSBuYW1lcyBvZiB0aGUgaW5kZXBlbmRlbnQgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LiBUaGUKKyAgICogaW5kZXBlbmRlbnQgY29sdW1ucyBhcmUgdGhlIGNvbHVtbnMgdXNlZCB0byBidWlsZCB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbFBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlCisgICAqICAgICAgICAgICAgICAgICAgICAgaW5kZXBlbmRlbnQgY29sdW1uIG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgaW5kZXBlbmRlbnQgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBsaXN0SW5kZXBlbmRlbnRDb2x1bW5zKAorICAgICAgaW4gUGF0dGVybiBjb2xQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMDkpCisgICAqIFJlbW92ZSB0aGUgdmFsdWVzIG9mIHRoZSBjb2x1bW5zIGF0IGEgZ2l2ZW4gbWVhc3VyZW1lbnQgcG9pbnQuCisgICAqIFJlbW92ZSB0aGUgbnVtYmVyIG9mIHBvaW50cyBvZiB0aGUgZ2l2ZW4gY29sdW1uLiBJZiB0aGUgY291bnQgaXMgMAorICAgKiBhbGwgcG9pbnRzIHVudGlsIHRoZSBlbmQgb2YgdGhlIGNvbHVtbiBhcmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9DT1VOVAorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2x1bW5OYW1lcyAgVGhlIGNvbHVtbnMgZnJvbSB3aGljaCB0aGUgbWVhc3VyZW1lbnQgcG9pbnRzCisgICAqICAgICAgICAgICAgICAgICAgICAgIGFyZSB0byBiZSByZW1vdmVkLgorICAgKgorICAgKiBAcGFyYW0gIG1lYVBvaW50ICBUaGUgbWVhc3VyZW1lbnQgcG9pbnQgdG8gYmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHBhcmFtICBjb3VudCAgVGhlIG51bWJlciBvZiBwb2ludHMgdG8gYmUgcmVtb3ZlZCBmcm9tIGVhY2ggY29sdW1uLgorICAgKi8KKyAgIHZvaWQgcmVtb3ZlVmFsdWVNZWFQb2ludCgKKyAgICAgIGluIE5hbWVTZXF1ZW5jZSBjb2x1bW5OYW1lcywKKyAgICAgIGluIFRfTE9ORyBtZWFQb2ludCwKKyAgICAgIGluIFRfTE9ORyBjb3VudCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDEwKQorICAgKiBSZW1vdmUgdGhlIHZhbHVlcyBmcm9tIGEgdmFsdWUgdmVjdG9yLiBCZWdpbm5pbmcgYXQgc3RhcnRQb2ludCB0aGUKKyAgICogbnVtYmVyIG9mIHZhbHVlcyBzcGVjaWZpZWQgaW4gY291bnQgYXJlIHJlbW92ZWQuIElmIGNvdW50IGlzIDAgYWxsCisgICAqIHZhbHVlcyBmcm9tICB0aGUgc3RhcnRQb2ludCB1bnRpbCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IgYXJlIHJlbW92ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQ09MVU1OCisgICAqICAgIEFPX0lOVkFMSURfQ09VTlQKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sICBUaGUgY29sdW1uIGZyb20gd2hpY2ggdGhlIHZhbHVlcyBhcmUgdG8gYmUgcmVtb3ZlZC4KKyAgICoKKyAgICogQHBhcmFtICBzdGFydFBvaW50ICBUaGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSB2YWx1ZSByZW1vdmFsLgorICAgKgorICAgKiBAcGFyYW0gIGNvdW50ICBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGNvbHVtbi4KKyAgICovCisgICB2b2lkIHJlbW92ZVZhbHVlVmVjdG9yKAorICAgICAgaW4gQ29sdW1uIGNvbCwKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVF9MT05HIGNvdW50KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTEpCisgICAqIENyZWF0ZSBvciBtb2RpZnkgYSBtZWFzdXJlbWVudCBwb2ludCBvZiBhIHZhbHVlIG1hdHJpeC4gCisgICAqIFRoZSBzZXF1ZW5jZSBvZiBuYW1lIHZhbHVlcyBzcGVjaWZpZXMgdGhlIG5hbWVzIG9mIHRoZSBjb2x1bW4gd2l0aAorICAgKiB0aGUgbmV3IHZhbHVlcy4gCisgICAqIFRoZSBtZWFuaW5nIG9mIHRoZSBwYXJhbWV0ZXIgc2V0VHlwZSBpczoKKyAgICogCisgICAqICAgIElOU0VSVCAgIEluc2VydCB0aGUgdmFsdWVzIGF0IG1lYVBvaW50LCB0aGUgY3VycmVudCB2YWx1ZXMgYXQKKyAgICogbWVhUG9pbnQgICAgYXJlIG1vdmVkIHRvIHRoZSBlbmQgb2YgIHRoZSBuZXcgaW5zZXJ0ZWQgdmFsdWVzLgorICAgKiAKKyAgICogICAgQVBQRU5EICAgVGhlIHZhbHVlIG9mIG1lYVBvaW50IGlzIGlnbm9yZWQsIHRoZSB2YWx1ZXMgYXJlCisgICAqIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdmFsdWVzLgorICAgKiAKKyAgICogICAgVVBEQVRFICAgVXBkYXRlIG9yIG1vZGlmeSB0aGUgdmFsdWVzIGF0IG1lYVBvaW50LCB0aGUgY3VycmVudAorICAgKiB2YWx1ZXMgYXJlIG92ZXJ3cml0dGVuLiBJZiBtZWFQb2ludCBpcyBiaWdnZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisgICAqIHZhbHVlcyBpbiB0aGUgICAgICAgICAgdmVjdG9yLCB0aGUgbWVhc3VyZW1lbnQgcG9pbnQgaXMKKyAgICogYXV0b21hdGljYWxseSBhcHBlbmRlZC4KKyAgICogCisgICAqIFRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucyBoYXZlIHRvIGV4aXN0LgorICAgKiAKKyAgICogV2hlbiBhIGNsaWVudCBjcmVhdGVzIGEgVmFsdWVNYXRyaXggYmFzZWQgb24gQW9NZWFzdXJlbWVudCB0aGlzCisgICAqIG1ldGhvZHMgYmVoYXZlcyBhcyBmb2xsb3dzOgorICAgKiBUaGUgc2VydmVyIGNoZWNrcyB0aGUgc3ViIG1hdHJpY2VzIGFuZCBjcmVhdGVzIGFsbCBuZWNlc3NhcnkKKyAgICogaW5zdGFuY2VzIG9mIEFvU3VibWF0cml4LCBBb0xvY2FsQ29sdW1uIGFuZCBBb01lYXN1cmVtZW50UXVhbnRpdHkuIAorICAgKiBUaGUgdmFsdWVzIG9mIHRoZSBuYW1lIGF0dHJpYnV0ZSBvZiBBb1N1Ym1hdHJpeCBtdXN0IGJlIGdlbmVyYXRlZCBieQorICAgKiB0aGUgc2VydmVyLiBUaGUgdmFsdWUgd2lsbCBiZSBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBJRAorICAgKiAoY29udmVydGVkIHRvIERUX1NUUklORykuIE1pc3NpbmcgaW5zdGFuY2VzIG9mIEFvTWVhc3VyZW1lbnRRdWFudGl0eQorICAgKiB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHNlcnZlciwgdG9vLiAKKyAgICogCisgICAqIFRoZSBtYW5kYXRvcnkgYXR0cmlidXRlcyB3aWxsIGdldCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgdmFsdWVzOgorICAgKiBOYW1lIHN1cHBsaWVkIGJ5IGNsaWVudCAKKyAgICogRGF0YXR5cGUgY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X2RhdGF0eXBlCisgICAqIFR5cGVzaXplIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF90eXBlc2l6ZQorICAgKiBJbnRlcnBvbGF0aW9uIG5vIGludGVycG9sYXRpb24KKyAgICogUmFuayBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfcmFuaworICAgKiBEaW1lbnNpb24gY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X2RpbWVuc2lvbgorICAgKiAKKyAgICogVGhlIHNlcnZlciB0YWtlcyB0aGUgdmFsdWUgb2YgdGhlIGNoYW5uZWwgKHN1cHBsaWVkIGJ5IGNsaWVudCkgYW5kCisgICAqIGxvb2tzIHVwIHRoZSBjb3JyZXNwb25kaW5nIGluc3RhbmNlIGluIEFvUXVhbnRpdHkgdXNpbmcgdGhlCisgICAqIGF0dHJpYnV0ZSBkZWZhdWx0X21lcV9uYW1lLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19JU19NRUFTVVJFTUVOVF9NQVRSSVgKKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFRoZSBzZXQgdHlwZS4KKyAgICoKKyAgICogQHBhcmFtICBtZWFQb2ludCAgVGhlIG1lYXN1cmVtZW50IHBvaW50LgorICAgKgorICAgKiBAcGFyYW0gIHZhbHVlICBUaGUgdmFsdWVzIHRvIGJlIGluc2VydGVkLgorICAgKi8KKyAgIHZvaWQgc2V0VmFsdWVNZWFQb2ludCgKKyAgICAgIGluIFNldFR5cGUgc2V0LAorICAgICAgaW4gVF9MT05HIG1lYVBvaW50LAorICAgICAgaW4gTmFtZVZhbHVlU2VxdWVuY2UgdmFsdWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAxMikKKyAgICogQ3JlYXRlIG9yIG1vZGlmeSBhIHZhbHVlIHZlY3RvciBpbiBhIHZhbHVlIG1hdHJpeC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgdmFsdWVzIG9mIHRoZSB2YWx1ZSBtYXRyaXggb3V0c2lkZSBhCisgICAqIHRyYW5zYWN0aW9uIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBhIHRyYW5zYWN0aW9uLgorICAgKiAKKyAgICogVGhlIGRhdGEgaXMgbWFkZSBwZXJtYW5lbnQgb24gdHJhbnNhY3Rpb24gY29tbWl0LiBVbnRpbCB0aGUKKyAgICogdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIG9yIHVudGlsIHRoZSBhY2Nlc3MgdG8gdGhlIG1lYXN1cmVtZW50CisgICAqIHBvaW50IG9mIHRoZSB2YWx1ZSBtYXRyaXgsIGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mCisgICAqIHZhbHVlcyBpbiB0aGUgZGlmZmVyZW50IHZhbHVlIHZlY3RvcnMuCisgICAqIAorICAgKiBUaGUgbWVhbmluZyBvZiB0aGUgcGFyYW1ldGVyIHNldFR5cGUgaXM6CisgICAqIAorICAgKiAgICBJTlNFUlQgICBJbnNlcnQgdGhlIHZhbHVlcyBmcm9tIHN0YXJ0UG9pbnQsIHRoZSBjdXJyZW50IGF2YWlsYWJsZQorICAgKiB2YWx1ZXMgZnJvbSBzdGFydFBvaW50IGFyZSBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoZSBuZXcgaW5zZXJ0ZWQKKyAgICogdmFsdWVzLgorICAgKiAKKyAgICogICAgQVBQRU5EICAgVGhlIHZhbHVlIG9mIHN0YXJ0UG9pbnQgaXMgaWdub3JlZCwgIHRoZSB2YWx1ZXMgYXJlCisgICAqIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdmFsdWVzLgorICAgKiAKKyAgICogICAgVVBEQVRFICAgVXBkYXRlIG9yIG1vZGlmeSB0aGUgdmFsdWVzIGZyb20gc3RhcnRQb2ludCwgdGhlIGN1cnJlbnQKKyAgICogdmFsdWVzIGFyZSBvdmVyd3JpdHRlbi4gSWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIHBhcmFtZXRlcgorICAgKiB2YWx1ZXMgaXMgdG9vIGJpZyAgICB0aGUgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkLgorICAgKiAKKyAgICogV2hlbiBhIGNsaWVudCBjcmVhdGVzIGEgVmFsdWVNYXRyaXggYmFzZWQgb24gQW9NZWFzdXJlbWVudCB0aGlzCisgICAqIG1ldGhvZHMgCisgICAqIGJlaGF2ZXMgYXMgZm9sbG93czoKKyAgICogVGhlIHNlcnZlciBjaGVja3MgdGhlIHN1YiBtYXRyaWNlcyBhbmQgY3JlYXRlcyBhbGwgbmVjZXNzYXJ5CisgICAqIGluc3RhbmNlcyBvZiBBb1N1Ym1hdHJpeCwgQW9Mb2NhbENvbHVtbiBhbmQgQW9NZWFzdXJlbWVudFF1YW50aXR5LiAKKyAgICogVGhlIHZhbHVlcyBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgQW9TdWJtYXRyaXggbXVzdCBiZSBnZW5lcmF0ZWQgYnkKKyAgICogdGhlIHNlcnZlci4gVGhlIHZhbHVlIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgSUQKKyAgICogKGNvbnZlcnRlZCB0byBEVF9TVFJJTkcpLiBNaXNzaW5nIGluc3RhbmNlcyBvZiBBb01lYXN1cmVtZW50UXVhbnRpdHkKKyAgICogd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIsIAorICAgKiB0b28uIAorICAgKiAKKyAgICogVGhlIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIHdpbGwgZ2V0IHRoZSBmb2xsb3dpbmcgZGVmYXVsdCB2YWx1ZXM6CisgICAqIE5hbWUgc3VwcGxpZWQgYnkgY2xpZW50IAorICAgKiBEYXRhdHlwZSBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfZGF0YXR5cGUKKyAgICogVHlwZXNpemUgY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X3R5cGVzaXplCisgICAqIEludGVycG9sYXRpb24gbm8gaW50ZXJwb2xhdGlvbgorICAgKiBSYW5rIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF9yYW5rCisgICAqIERpbWVuc2lvbiBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfZGltZW5zaW9uCisgICAqIAorICAgKiBUaGUgc2VydmVyIHRha2VzIHRoZSB2YWx1ZSBvZiB0aGUgY2hhbm5lbCAoc3VwcGxpZWQgYnkgY2xpZW50KSBhbmQKKyAgICogbG9va3MgdXAgdGhlIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgaW4gQW9RdWFudGl0eSB1c2luZyB0aGUKKyAgICogYXR0cmlidXRlIGRlZmF1bHRfbWVxX25hbWUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX0lOVkFMSURfQ09MVU1OCisgICAqICAgIEFPX0lOVkFMSURfU0VUX1RZUEUKKyAgICogICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sICBUaGUgY29sdW1uIHdob3NlIHZhbHVlcyBhcmUgdG8gYmUgc2V0LgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgVGhlIHNldCB0eXBlLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIG5ldyB2YWx1ZXMuCisgICAqCisgICAqIEBwYXJhbSAgdmFsdWUgIFRoZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQuCisgICAqLworICAgdm9pZCBzZXRWYWx1ZVZlY3RvcigKKyAgICAgIGluIENvbHVtbiBjb2wsCisgICAgICBpbiBTZXRUeXBlIHNldCwKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVFNfVmFsdWVTZXEgdmFsdWUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAxMykKKyAgICogQ3JlYXRlIG9yIG1vZGlmeSBhIG51bWJlciBvZiB2YWx1ZSB2ZWN0b3JzIGluIGEgdmFsdWUgbWF0cml4LiAKKyAgICogCisgICAqIEl0IGlzIGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSB2YWx1ZXMgb2YgdGhlIHZhbHVlIG1hdHJpeCBvdXRzaWRlIGEKKyAgICogdHJhbnNhY3Rpb24gYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZGF0YSBpcyBtYWRlIHBlcm1hbmVudCBvbiB0cmFuc2FjdGlvbiBjb21taXQuIFVudGlsIHRoZQorICAgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3IgdW50aWwgdGhlIGFjY2VzcyB0byB0aGUgbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgb2YgdGhlIHZhbHVlIG1hdHJpeCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2YKKyAgICogdmFsdWVzIGluIHRoZSBkaWZmZXJlbnQgdmFsdWUgdmVjdG9ycy4KKyAgICogCisgICAqIFRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zLiBUaGUKKyAgICogdmFsdWVzIGFyZSB0aGUgbmV3IHZhbHVlcyBvZiB0aGUgY29sdW1uLiAoc2V0VmFsdWVNZWFQb2ludCBhbGxvd3MKKyAgICogb25seSBvbmUgcG9pbnQsIHRoZSBUU19WYWx1ZVNlcSBhbGxvd3MgbW9yZSB0aGVuIG9uZSBwb2ludCkgVGhlcmUgaXMKKyAgICogYSBzZXF1ZW5jZSBvZiBuYW1lIHZhbHVlIHBhaXJzIChzZXRWYWx1ZVZlY3RvciBhbGxvd3Mgb25seSBvbmUKKyAgICogY29sdW1uKSwgc28gYSBibG9jayBvZiB2YWx1ZXMgY2FuIGJlIG1vZGlmaWVkLgorICAgKiAKKyAgICogVGhlIG1lYW5pbmcgb2YgdGhlIHBhcmFtZXRlciBzZXRUeXBlIGlzOgorICAgKiAKKyAgICogICAgSU5TRVJUICAgSW5zZXJ0IHRoZSB2YWx1ZXMgZnJvbSBzdGFydFBvaW50LCAgdGhlIGN1cnJlbnQKKyAgICogYXZhaWxhYmxlIHZhbHVlcyBmcm9tICBzdGFydFBvaW50IGFyZSBtb3ZlZCB0byB0aGUgZW5kIG9mICB0aGUgbmV3CisgICAqIGluc2VydGVkIHZhbHVlcy4KKyAgICogCisgICAqICAgIEFQUEVORCAgIFRoZSB2YWx1ZSBvZiBzdGFydFBvaW50IGlzIGlnbm9yZWQsIHRoZSB2YWx1ZXMgYXJlCisgICAqIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdmFsdWVzLgorICAgKiAKKyAgICogICAgVVBEQVRFICAgVXBkYXRlIG9yIG1vZGlmeSB0aGUgdmFsdWVzIGZyb20gc3RhcnRQb2ludCwgdGhlIGN1cnJlbnQKKyAgICogdmFsdWVzIGFyZSBvdmVyd3JpdHRlbi4gSWYgdGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgKiBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSAgdmVjdG9yLCB0aGUgbWVhc3VyZW1lbnQgcG9pbnQgaXMgCisgICAqIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQuCisgICAqIAorICAgKiAgICBSRU1PVkUgIFJlbW92ZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBmcm9tIGVhY2ggY29sdW1uLCBzdGFydGluZworICAgKiB3aXRoIHN0YXJ0UG9pbnQuIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaXMgZ2l2ZW4gYXMgdGhlIG5hbWUgb2YgdGhlCisgICAqIE5hbWVWYWx1ZXNlcVVuaXQsIHRoZSAgbnVtYmVyIG9mIHZhbHVlcyB0byByZW1vdmUgaXMgZ2l2ZW4gIGluIHRoZQorICAgKiBudW1iZXIgb2YgdGhlIHZhbHVlcyBpbiB0aGUgICB2YWx1ZS4KKyAgICogCisgICAqIFdoZW4gYSBjbGllbnQgY3JlYXRlcyBhIFZhbHVlTWF0cml4IGJhc2VkIG9uIEFvTWVhc3VyZW1lbnQgdGhpcworICAgKiBtZXRob2RzIGJlaGF2ZXMgYXMgZm9sbG93czoKKyAgICogVGhlIHNlcnZlciBjaGVja3MgdGhlIHN1YiBtYXRyaWNlcyBhbmQgY3JlYXRlcyBhbGwgbmVjZXNzYXJ5CisgICAqIGluc3RhbmNlcyBvZiBBb1N1Ym1hdHJpeCwgQW9Mb2NhbENvbHVtbiBhbmQgQW9NZWFzdXJlbWVudFF1YW50aXR5LiAKKyAgICogVGhlIHZhbHVlcyBvZiB0aGUgbmFtZSBhdHRyaWJ1dGUgb2YgQW9TdWJtYXRyaXggbXVzdCBiZSBnZW5lcmF0ZWQgYnkKKyAgICogdGhlIHNlcnZlci4gVGhlIHZhbHVlIHdpbGwgYmUgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgSUQKKyAgICogKGNvbnZlcnRlZCB0byBEVF9TVFJJTkcpLiBNaXNzaW5nIGluc3RhbmNlcyBvZiBBb01lYXN1cmVtZW50UXVhbnRpdHkKKyAgICogd2lsbCBiZSBjcmVhdGVkIGJ5IHRoZSBzZXJ2ZXIsIHRvby4gCisgICAqIAorICAgKiBUaGUgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBkZWZhdWx0IHZhbHVlczoKKyAgICogTmFtZSBzdXBwbGllZCBieSBjbGllbnQgCisgICAqIERhdGF0eXBlIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF9kYXRhdHlwZQorICAgKiBUeXBlc2l6ZSBjb3BpZWQgZnJvbSBBb1F1YW50aXR5LmRlZmF1bHRfdHlwZXNpemUKKyAgICogSW50ZXJwb2xhdGlvbiBubyBpbnRlcnBvbGF0aW9uCisgICAqIFJhbmsgY29waWVkIGZyb20gQW9RdWFudGl0eS5kZWZhdWx0X3JhbmsKKyAgICogRGltZW5zaW9uIGNvcGllZCBmcm9tIEFvUXVhbnRpdHkuZGVmYXVsdF9kaW1lbnNpb24KKyAgICogCisgICAqIFRoZSBzZXJ2ZXIgdGFrZXMgdGhlIHZhbHVlIG9mIHRoZSBjaGFubmVsIChzdXBwbGllZCBieSBjbGllbnQpIGFuZAorICAgKiBsb29rcyB1cCB0aGUgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBpbiBBb1F1YW50aXR5IHVzaW5nIHRoZQorICAgKiBhdHRyaWJ1dGUgZGVmYXVsdF9tZXFfbmFtZS4KKyAgICogCisgICAqIFRoZSBWYWx1ZU1hdHJpeCBpbnRlcmZhY2UgaGFuZGxlcyB0aGUgdmFsdWVzIGJ1dCBub3QgdGhlIHJhdyB2YWx1ZXMsCisgICAqIHRvIG1vZGlmeSB0aGUgcmF3IHZhbHVlcyB0aGUgaW5zdGFuY2VzIG9mIGxvY2FsY29sdW1uIG11c3QgYmUKKyAgICogY3JlYXRlZCwgdGhlIGJhc2UgYXR0cmlidXRlIHNlcXVlbmNlX3JlcHJlc2VudGF0aW9uLCByYXdfZGF0YXR5cGUKKyAgICogYW5kIHRoZSBnZW5lcmF0aW9uX3BhcmFtZXRlciBtdXN0IGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSB2YWx1ZXMgYXJlCisgICAqIG1vZGlmaWVkLiBUaGUgdmFsdWVzIG11c3QgaGF2ZSB0aGUgZGF0YSB0eXBlIGlkZW50aWNhbCB3aXRoIHRoZQorICAgKiByYXdfZGF0YXR5cGUsIGFueSBvdGhlciBkYXRhIHR5cGUgd2lsbCBjYXVzZSBhbiBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqIGV4Y2VwdGlvbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9DT0xVTU4KKyAgICogICAgQU9fSU5WQUxJRF9TRVRfVFlQRQorICAgKiAgICBBT19JTlZBTElEX0RBVEFUWVBFCisgICAqICAgIEFPX0lTX01FQVNVUkVNRU5UX01BVFJJWAorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHNldCAgVGhlIHNldCB0eXBlLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBtZWFzdXJlbWVudCBwb2ludC4KKyAgICoKKyAgICogQHBhcmFtICB2YWx1ZSAgVGhlIHZhbHVlcyB0byBiZSBpbnNlcnRlZC4KKyAgICovCisgICB2b2lkIHNldFZhbHVlKAorICAgICAgaW4gU2V0VHlwZSBzZXQsCisgICAgICBpbiBUX0xPTkcgc3RhcnRQb2ludCwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcVVuaXRTZXF1ZW5jZSB2YWx1ZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDE0KQorICAgKiBBZGQgYSBjb2x1bW4gdG8gdGhlIHZhbHVlIG1hdHJpeC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIGNyZWF0ZSBhCisgICAqIHZhbHVlIHZlY3RvciBpZiB0aGUgdmFsdWUgbWF0cml4IGlzIGNyZWF0ZWQgZnJvbSBhIHN1Ym1hdHJpeC4gCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIGFkZCBhIGNvbHVtbiBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZGF0YSBpcyBtYWRlIHBlcm1hbmVudCBvbiB0cmFuc2FjdGlvbiBjb21taXQuIFVudGlsIHRoZQorICAgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3IgdW50aWwgdGhlIGFjY2VzcyB0byB0aGUgbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgb2YgdGhlIHZhbHVlIG1hdHJpeCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZgorICAgKiB2YWx1ZXMgaW4gdGhlIGRpZmZlcmVudCB2YWx1ZSB2ZWN0b3JzLiBBZnRlciB0aGUgbmV3IGNvbHVtbiBpcworICAgKiBhZGRlZCwgaXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9OQU1FCisgICAqICAgIEFPX0lOVkFMSURfU0VUX1RZUEUKKyAgICogICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBuZXdDb2x1bW4gIFRoZSBuYW1lIGFuZCB1bml0IG9mIHRoZSBjb2x1bW4gdG8gYWRkLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV3IGNvbHVtbi4KKyAgICovCisgICBDb2x1bW4gYWRkQ29sdW1uKAorICAgICAgaW4gTmFtZVVuaXQgbmV3Q29sdW1uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTUpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBHZXQgdGhlIG5hbWVzIG9mIHRoZSBzY2FsaW5nIGNvbHVtbnMgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBjb2xQYXR0ZXJuICBUaGUgbmFtZSBvciB0aGUgc2VhcmNoIHBhdHRlcm4gZm9yIHRoZSBzY2FsaW5nCisgICAqICAgICAgICAgICAgICAgICAgICAgY29sdW1uIG5hbWUuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgc2NhbGluZyBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqLworICAgTmFtZVNlcXVlbmNlIGxpc3RTY2FsaW5nQ29sdW1ucygKKyAgICAgIGluIFBhdHRlcm4gY29sUGF0dGVybikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDIyMDE2KQorICAgKiBEZXByZWNhdGVkLCBzb2x2ZWQgYnkgTlZIIEFwcGxpY2F0aW9uIG1vZGVsLgorICAgKiAKKyAgICogR2V0IHRoZSBzY2FsaW5nIGNvbHVtbiBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGNvbFBhdHRlcm4gIFRoZSBuYW1lIG9yIHRoZSBzZWFyY2ggcGF0dGVybiBmb3IgdGhlIHNjYWxpbmcKKyAgICogICAgICAgICAgICAgICAgICAgICBjb2x1bW4gbmFtZS4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHNjYWxpbmcgY29sdW1ucyBvZiB0aGUgdmFsdWUgbWF0cml4LgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldFNjYWxpbmdDb2x1bW5zKAorICAgICAgaW4gUGF0dGVybiBjb2xQYXR0ZXJuKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTcpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBMaXN0IHRoZSBuYW1lcyBvZiB0aGUgY29sdW1ucywgd2hpY2ggYXJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT19TQ0FMSU5HX0NPTFVNTgorICAgKgorICAgKiBAcGFyYW0gIHNjYWxpbmdDb2x1bW4gIFRoZSBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIHdoaWNoIGFyZSBzY2FsZWQgYnkgdGhlIGdpdmVuCisgICAqICAgICAgICAgIGlucHV0IGNvbHVtbi4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdENvbHVtbnNTY2FsZWRCeSgKKyAgICAgIGluIENvbHVtbiBzY2FsaW5nQ29sdW1uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTgpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBHZXQgdGhlIGNvbHVtbnMgd2hpY2ggYXJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gY29sdW1uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT19TQ0FMSU5HX0NPTFVNTgorICAgKgorICAgKiBAcGFyYW0gIHNjYWxpbmdDb2x1bW4gIFRoZSBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGNvbHVtbnMgd2hpY2ggYXJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gaW5wdXQgY29sdW1uLgorICAgKi8KKyAgIENvbHVtblNlcXVlbmNlIGdldENvbHVtbnNTY2FsZWRCeSgKKyAgICAgIGluIENvbHVtbiBzY2FsaW5nQ29sdW1uKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMTkpCisgICAqIERlcHJlY2F0ZWQsIHNvbHZlZCBieSBOVkggQXBwbGljYXRpb24gbW9kZWwuCisgICAqIAorICAgKiBBZGQgYSBjb2x1bW4gdG8gdGhlIHZhbHVlIG1hdHJpeC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIGNyZWF0ZSBhCisgICAqIHZhbHVlIHZlY3RvciBpZiB0aGUgdmFsdWUgbWF0cml4IGlzIGNyZWF0ZWQgZnJvbSBhIHN1Ym1hdHJpeC4gVGhlCisgICAqIGNvbHVtbiB3aWxsIGJlIHNjYWxlZCBieSB0aGUgZ2l2ZW4gc2NhbGluZyBjb2x1bW4uCisgICAqIAorICAgKiBJdCBpcyBhbGxvd2VkIHRvIGFkZCBhIGNvbHVtbiBvdXRzaWRlIGEgdHJhbnNhY3Rpb24gYnV0IGl0IGlzCisgICAqIHJlY29tbWVuZGVkIHRvIGFjdGl2YXRlIGEgdHJhbnNhY3Rpb24uCisgICAqIAorICAgKiBUaGUgZGF0YSBpcyBtYWRlIHBlcm1hbmVudCBvbiB0cmFuc2FjdGlvbiBjb21taXQuIFVudGlsIHRoZQorICAgKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgb3IgdW50aWwgdGhlIGFjY2VzcyB0byB0aGUgbWVhc3VyZW1lbnQKKyAgICogcG9pbnQgb2YgdGhlIHZhbHVlIG1hdHJpeCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZgorICAgKiB2YWx1ZXMgaW4gdGhlIGRpZmZlcmVudCB2YWx1ZSB2ZWN0b3JzLiBBZnRlciB0aGUgbmV3IGNvbHVtbiBpcworICAgKiBhZGRlZCwgaXQgaXMgcG9zc2libGUgdG8gc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fSU5WQUxJRF9OQU1FCisgICAqICAgIEFPX0lOVkFMSURfU0VUX1RZUEUKKyAgICogICAgQU9fSVNfTUVBU1VSRU1FTlRfTUFUUklYCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PX1NDQUxJTkdfQ09MVU1OCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBuZXdDb2x1bW4gIFRoZSBuYW1lIGFuZCB1bml0IG9mIHRoZSBjb2x1bW4gdG8gYWRkLgorICAgKgorICAgKiBAcGFyYW0gIHNjYWxpbmdDb2x1bW4gIFRoZSBzY2FsaW5nIGNvbHVtbi4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5ldyBjb2x1bW4uCisgICAqLworICAgQ29sdW1uIGFkZENvbHVtblNjYWxlZEJ5KAorICAgICAgaW4gTmFtZVVuaXQgbmV3Q29sdW1uLAorICAgICAgaW4gQ29sdW1uIHNjYWxpbmdDb2x1bW4pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMjAyMCkKKyAgICogRGVzdHJveSB0aGUgb2JqZWN0IG9uIHRoZSBzZXJ2ZXIuIFRoZSBkZXN0cnVjdG9yIG9mIHRoZSBjbGllbnQsIHNvCisgICAqIHRoZSBzZXJ2ZXIga25vd3MgdGhpcyBvYmplY3QgaXMgbm90IHVzZWQgYW55bW9yZSBieSB0aGUgY2xpZW50LgorICAgKiBBY2Nlc3MgdG8gdGhpcyBvYmplY3QgYWZ0ZXIgdGhlIGRlc3Ryb3kgbWV0aG9kIHdpbGwgbGVhZCB0byBhbgorICAgKiBleGNlcHRpb24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGRlc3Ryb3koKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMjEpCisgICAqIEdldCB0aGUgdmFsdWVzIG9mIGRpZmZlcmVudCBjb2x1bW5zIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqIAorICAgKiBUaGUgc2VydmVyIGJlaGF2aW9yIGRlcGVuZHMgb24gdGhlIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICogVmFsdWUgbWF0cml4IG1vZGUgJ0NBTENVTEFURUQnOgorICAgKiBJbiBjYXNlICdzZXF1ZW5jZV9yZXByZXNlbnRhdGlvbicgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWwgY29sdW1uCisgICAqIGlzIG9uZSBvZiB0aGUgZW50cmllcyAncmF3X2xpbmVhcicsIHJhd19wb2x5bm9taWFsJywKKyAgICogJ3Jhd19saW5lYXJfZXh0ZXJuYWwnLCAncmF3X3BvbHlub21pYWxfZXh0ZXJuYWwnLAorICAgKiAncmF3X2xpbmVhcl9jYWxpYnJhdGVkJywgb3IgJ3Jhd19saW5lYXJfY2FsaWJyYXRlZF9leHRlcm5hbCcsIHRoZQorICAgKiBzZXJ2ZXIgd2lsbCBmaXJzdCBjYWxjdWxhdGUgdGhlIHBoeXNpY2FsIHZhbHVlcyBmcm9tIHJhdyB2YWx1ZXMgYW5kCisgICAqIGdlbmVyYXRpb24gcGFyYW1ldGVycywgYmVmb3JlIGl0IHJldHVybnMgdGhlbSB0byB0aGUgcmVxdWVzdGluZworICAgKiBjbGllbnQuCisgICAqIFZhbHVlIG1hdHJpeCBtb2RlICdTVE9SQUdFJzoKKyAgICogSW4gY2FzZSAnc2VxdWVuY2VfcmVwcmVzZW50YXRpb24nIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxvY2FsIGNvbHVtbgorICAgKiBpcyBvbmUgb2YgdGhlIGVudHJpZXMgJ3Jhd19saW5lYXInLCByYXdfcG9seW5vbWlhbCcsCisgICAqICdyYXdfbGluZWFyX2V4dGVybmFsJywgJ3Jhd19wb2x5bm9taWFsX2V4dGVybmFsJywKKyAgICogJ3Jhd19saW5lYXJfY2FsaWJyYXRlZCcsIG9yICdyYXdfbGluZWFyX2NhbGlicmF0ZWRfZXh0ZXJuYWwnLCB0aGUKKyAgICogc2VydmVyIHdpbGwgcmV0dXJuIHRoZSByYXcgdmFsdWVzIG9mIHRoZSBsb2NhbCBjb2x1bW4uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgY29sdW1ucyAgVGhlIHJlcXVlc3RlZCBjb2x1bW5zLgorICAgKgorICAgKiBAcGFyYW0gIHN0YXJ0UG9pbnQgIFRoZSBzdGFydGluZyBwb2ludCBpbiB0aGUgY29sdW1uLgorICAgKgorICAgKiBAcGFyYW0gIGNvdW50ICBUaGUgbnVtYmVyIG9mIHBvaW50cyB0byBiZSByZXRyaWV2ZWQuIDAgbWVhbiB1bnRpbAorICAgKiAgICAgICAgICAgICAgICBlbmQgb2YgY29sdW1uLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgdmFsdWVzIG9mIHRoZSBkaWZmZXJlbnQgY29sdW1ucy4gVGhlIG5hbWUgb2YgdGhlIHJldHVybgorICAgKiAgICAgICAgICBzdHJ1Y3R1cmUgY29ycmVzcG9uZHMgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY29sdW1uLiBUaGUgdW5pdAorICAgKiAgICAgICAgICBjb3JyZXNwb25kcyB3aXRoIHRoZSB1bml0IG9mIHRoZSBjb2x1bW4uIFRoZSBvcmRlciBvZiB0aGUKKyAgICogICAgICAgICAgcmVzdWx0cyBtaWdodCBub3QgbWF0Y2ggdGhlIG9yZGVyIGluIHRoZSByZXF1ZXN0ZWQKKyAgICogICAgICAgICAgc2VxdWVuY2UuCisgICAqLworICAgTmFtZVZhbHVlU2VxVW5pdFNlcXVlbmNlIGdldFZhbHVlKAorICAgICAgaW4gQ29sdW1uU2VxdWVuY2UgY29sdW1ucywKKyAgICAgIGluIFRfTE9ORyBzdGFydFBvaW50LAorICAgICAgaW4gVF9MT05HIGNvdW50KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjIwMjIpCisgICAqIEdldCB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSB2YWx1ZSBtYXRyaXguCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbW9kZSBvZiB0aGUgdmFsdWUgbWF0cml4CisgICAqLworICAgVmFsdWVNYXRyaXhNb2RlIGdldE1vZGUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBWYWx1ZU1hdHJpeC4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBuYW1lLXZhbHVlLXVuaXRJZCBpdGVyYXRvciBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGlzCisqIGlkZW50aWNhbCB3aXRoIHRoZSBOYW1lVmFsdWVVbml0SXRlcmF0b3IsIGV4Y2VwdCB0aGUgdW5pdCBpcyBnaXZlbiBhcworKiBhbiBJZCBpbnNlYWQgb2YgYSBzdHJpbmcuCisqLworaW50ZXJmYWNlIE5hbWVWYWx1ZVVuaXRJZEl0ZXJhdG9yIHsKKworICAgLyoqICgyMzAwMSkKKyAgICogRGVzdHJveSB0aGUgaXRlcmF0b3IgYW5kIGZyZWUgdGhlIGFzc29jaWF0ZWQgbWVtb3J5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIGRlc3Ryb3koKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjMwMDIpCisgICAqIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGFjY2Vzc2libGUgYnkgdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICovCisgICBUX0xPTkcgZ2V0Q291bnQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjMwMDMpCisgICAqIEdldCB0aGUgbmV4dCBuIGVsZW1lbnRzIGZyb20gdGhlIHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGhvd19tYW55ICBUaGUgbnVtYmVyIG9mIHJlcXVlc3RlZCBlbGVtZW50cy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbiBuYW1lLXZhbHVlLXVuaXQgdHVwbGVzIGZyb20gdGhlIG5hbWUtdmFsdWUtdW5pdAorICAgKiAgICAgICAgICB0dXBsZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWVTZXFVbml0SWQgbmV4dE4oCisgICAgICBpbiBUX0xPTkcgaG93X21hbnkpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMzAwNCkKKyAgICogR2V0IHRoZSBuZXh0IGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuYW1lLXZhbHVlLXVuaXRJZCB0dXBsZSBmcm9tIHRoZSBuYW1lLXZhbHVlLXVuaXRJZAorICAgKiAgICAgICAgICB0dXBsZSBzZXF1ZW5jZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0SWQgbmV4dE9uZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyMzAwNSkKKyAgICogUmVzZXQgdGhlIHBvaW50ZXIgaW4gdGhlIGVsZW1lbnQgc2VxdWVuY2UgdG8gdGhlIGZpcnN0IGVsZW1lbnQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKi8KKyAgIHZvaWQgcmVzZXQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBOYW1lVmFsdWVVbml0SWRJdGVyYXRvci4KKworLyoqCisqIFRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGFjY2Vzcy4gIFRoZSBBcHBsRWxlbUFjY2VzcyBpbnRlcmZhY2UgKFJQQyBBUEkKKyogR2V0VmFsLCBQdXRWYWwsIEdldEluc3RSZWYsIC4uLikgaXMgcmVzcG9uc2libGUgdG8gcmV0cmlldmUgaW5zdGFuY2VzCisqIG9mIGFwcGxpY2F0aW9uIGVsZW1lbnRzLiBDdXJyZW50bHkgYXZhaWxhYmxlIHF1ZXJ5IG1ldGhvZHMgYXJlOgorKiAtIHF1ZXJ5IHdpdGggYXR0cmlidXRlIGFuZCB2YWx1ZQorKiAtIHF1ZXJ5IHdpdGggYXR0cmlidXRlIGFuZCB2YWx1ZXMgKG5vdClpbiBzZXQKKyogLSBzb3J0ZWQgcmVzdWx0cworKiAtIGdyb3VwZWQgcmVzdWx0cyBpbmNsdWRpbmcgaGF2aW5nIGNvbmRpdGlvbgorKi8KK2ludGVyZmFjZSBBcHBsRWxlbUFjY2VzcyB7CisKKyAgIC8qKiAoMjQwMDEpCisgICAqIFBlcmZvcm0gdGhlIFF1ZXJ5LgorICAgKiAKKyAgICogVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgYXBwbGljYXRpb24gZWxlbWVudHMgd2hpY2ggYXJlIHJlcXVlc3RlZCBhcmUKKyAgICogZXhhY3RseSBkZWZpbmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSBnaXZlbiBpbiB0aGUgZmllbGQKKyAgICogYW51U2VxIG9mIHRoZSBRdWVyeVN0cnVjdHVyZS4gVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYWxzbyBnaXZlbiBpbiB0aGUgZGVmaW5pdGlvbi4gVGhlIG51bWJlciBvZgorICAgKiBtYXRjaGluZyBpbnN0YW5jZXMgKHRoZWlyIGF0dHJpYnV0ZXMpIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBxdWVyeQorICAgKiBhbmQgY2FuIGJlIGEgbGFyZ2UgYW1vdW50LiBUaGVyZWZvcmUgb25seSBvbmUgaXRlcmF0b3IgZm9yIHRoZQorICAgKiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBkZWZpbmVkLgorICAgKiAKKyAgICogVGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxjb2x1bW4gaW5zdGFuY2VzIGlzIHBhcnQgb2YgdGhlIHJlc3VsdHNldAorICAgKiB3aGVuIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYWxsIGZpdDoKKyAgICogCisgICAqIC0gT25seSB3aGVuIHRoZSBhdHRyaWJ1dGVzIGlkLCBnZW5lcmF0aW9uX3BhcmFtZXRlcnMsIHZhbHVlcywgZmxhZ3MKKyAgICogYXJlIHJlcXVlc3RlZCwgYXMgc29vbiBhcyBhbnkgb3RoZXIgYXR0cmlidXRlcyBpcyByZXF1ZXN0ZWQgdGhlCisgICAqIHZhbHVlcyBhcmUgbm90IHJlcG9ydGVkLgorICAgKiAtIFRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsY29sdW1uIG11c3QgYWxsIGJlbG9uZyB0byBleGFjdGx5IG9uZQorICAgKiBpbnN0YW5jZXMgb2YgQW9NZWFzdXJlbWVudAorICAgKiAtIFRoZSBzZXJ2ZXIgaGF2ZSBhIGxpbWl0YXRpb24gb2YgdGhlIG1lbW9yeSwgbm90IHRoZSBzeXN0ZW0gbWVtb3J5CisgICAqIGxpbWl0YXRpb24sIGFzIHNvb24gYXMgdGhlIHJlc3VsdCBzZXQgd2lsbCBicmVhayB0aGUgbGltaXRhdGlvbiBhbgorICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAqIAorICAgKiAtIE5vIGl0ZXJhdG9yIGZvciB0aGUgcmVzdCBpcyByZXF1aXJlZC4KKyAgICogCisgICAqIEluIGNhc2UgYW4gYXR0cmlidXRlIG9mIGJsb2IgdHlwZSBpcyBhbW9uZyB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMsCisgICAqIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm4gc3RydWN0dXJlIHdpbGwgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2YKKyAgICogaW5zdGFuY2VzIHRoYXQgYXJlIHJldHVybmVkOgorICAgKiAtIEluIGNhc2UgYXR0cmlidXRlcyBvZiBvbmx5IG9uZSBpbnN0YW5jZSBhcmUgcmV0dXJuZWQgKGVpdGhlcgorICAgKiBiZWNhdXNlICdob3dfbWFueScgd2FzIHNldCB0byAxIG9yIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlCisgICAqIGF2YWlsYWJsZSBhdCB0aGUgc2VydmVyKSwgdGhlIHJldHVybiBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGJsb2IKKyAgICogaXRzZWxmLgorICAgKiAtSW4gY2FzZSBhdHRyaWJ1dGVzIG9mIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgYXJlIHJldHVybmVkLCB0aGUKKyAgICogcmV0dXJuIHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIHRoZSBibG9iczsgaW5zdGVhZCBpdCBjb250YWlucyB0aGUKKyAgICogaGVhZGVycyBvZiB0aGUgcmVzcGVjdGl2ZSBibG9icy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhb3EgIFRoZSBxdWVyeSBkZWZpbml0aW9uLgorICAgKgorICAgKiBAcGFyYW0gIGhvd19tYW55ICBNYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgaW4gZWFjaCByZXN1bHQgc2V0LiBWYWxpZAorICAgKiAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgYXJlOiAKKyAgICogICAgICAgICAgICAgICAgICAgaG93X21hbnkgPSAwIDogcmVwb3J0IGFsbCBmb3VuZCB2YWx1ZXMsCisgICAqICAgICAgICAgICAgICAgICAgIGhvd19tYW55ID4gMCA6IHJlcG9ydCBhIG1heGltdW0gbnVtYmVyIG9mIHZhbHVlcy4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBzZXQgd2l0aCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAqLworICAgRWxlbVJlc3VsdFNldFNlcXVlbmNlIGdldEluc3RhbmNlcygKKyAgICAgIGluIFF1ZXJ5U3RydWN0dXJlIGFvcSwKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDAyKQorICAgKiBHZXQgcmVsYXRlZCBpbnN0YW5jZXMgKElkKS4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHNlcXVlbmNlIG9mCisgICAqIHJlbGF0ZWQgaW5zdGFuY2VzLiAKKyAgICogCisgICAqIFRoZSByZWxhdGlvbiBuYW1lIHNwZWNpZmllcyB0aGUgcmVsYXRpb24gZ2l2ZW4gaW4gdGhlCisgICAqIEFwcGxTdHJ1Y3RWYWx1ZS4gVGhlIGFpZCBvZiB0aGUgRWxlbUlkIGFuZCB0aGUgcmVsTmFtZSBkZWZpbmVzIHRoZQorICAgKiB1bmlxdWUgcmVsYXRpb24gYW5kIHRoZSB0YXJnZXQgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBlbGVtICBPcmlnaW5hbCBpbnN0YW5jZS4gCisgICAqICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgQXQgdGhlIFJQQyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZQorICAgKiAgICAgICAgICAgICAgIGZpZWxkIGVsZW1JZCBvZiB0aGUgc3RydWN0dXJlIEdldEluc3RSZWZSZXEgYW5kIHRoZQorICAgKiAgICAgICAgICAgICAgIHJlcXVlc3QgQU9QX0dldEluc3RSZWYuCisgICAqCisgICAqIEBwYXJhbSAgcmVsTmFtZSAgVGhlIHJlbGF0aW9uIG5hbWUuIAorICAgKiAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICAgICBmaWVsZCByZWZOYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgR2V0SW5zdFJlZlJlcSAgIGFuZAorICAgKiAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0IEFPUF9HZXRJbnN0UmVmLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbGlzdCBvZiB0aGUgSWQgb2YgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLgorICAgKi8KKyAgIFNfTE9OR0xPTkcgZ2V0UmVsSW5zdCgKKyAgICAgIGluIEVsZW1JZCBlbGVtLAorICAgICAgaW4gTmFtZSByZWxOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMDMpCisgICAqIFNldCB0aGUgaW5zdGFuY2UgcmVmZXJlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGVsZW0gIFRoZSBpbnN0YW5jZSB0byBhZGQgdGhlIHJlbGF0ZWQgaW5zdGFuY2VzLgorICAgKiAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICBmaWVsZCBlbGVtSWQxIG9mIHRoZSBzdHJ1Y3R1cmUgU2V0SW5zdFJlZlJlcSAgYW5kIHRoZQorICAgKiAgICAgICAgICAgICAgIHJlcXVlc3QgQU9QX1NldEluc3RSZWYuCisgICAqCisgICAqIEBwYXJhbSAgcmVsTmFtZSAgVGhlIG5hbWUgb2YgcmVsYXRpb24uIAorICAgKiAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICAgICBmaWVsZCByZWZOYW1lIG9mIHRoZSBzdHJ1Y3R1cmUgU2V0SW5zdFJlZlJlcSBhbmQKKyAgICogICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdCBBT1BfU2V0SW5zdFJlZi4KKyAgICoKKyAgICogQHBhcmFtICBpbnN0SWRzICBTZXF1ZW5jZSBvZiBpbnN0YW5jZSBpZCdzLiAKKyAgICogICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgICBBdCB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlCisgICAqICAgICAgICAgICAgICAgICAgZmllbGQgZWxlbUlkMiBvZiB0aGUgc3RydWN0dXJlIFNldEluc3RSZWZSZXEgYW5kCisgICAqICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgQU9QX1NldEluc3RSZWYuIEl0IHdhcyBub3QgcG9zc2libGUgdG8KKyAgICogICAgICAgICAgICAgICAgICBzZXQgbW9yZSB0aGVuIG9uZSByZWxhdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICB0eXBlICBUaGUgdHlwZSBvZiB0aGUgbW9kaWZpY2F0aW9uLCBpbnNlcnQsIHVwZGF0ZSBvcgorICAgKiAgICAgICAgICAgICAgIHJlbW92ZS4gCisgICAqICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgQXQgdGhlIFJQQyBBUEkgdGhpcyBpbmZvcm1hdGlvbiB3YXMgc3RvcmVkIGluIHRoZQorICAgKiAgICAgICAgICAgICAgIGZpZWxkIG9uIG9mZiBvZiB0aGUgc3RydWN0dXJlIFNldEluc3RSZWZSZXEgYW5kIHRoZQorICAgKiAgICAgICAgICAgICAgIHJlcXVlc3QgQU9QX1NldEluc3RSZWYuCisgICAqLworICAgdm9pZCBzZXRSZWxJbnN0KAorICAgICAgaW4gRWxlbUlkIGVsZW0sCisgICAgICBpbiBOYW1lIHJlbE5hbWUsCisgICAgICBpbiBTX0xPTkdMT05HIGluc3RJZHMsCisgICAgICBpbiBTZXRUeXBlIHR5cGUpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwNCkKKyAgICogQ3JlYXRlIGluc3RhbmNlIGVsZW1lbnRzIG9mIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuIAorICAgKiBUaGUgYXBwbGljYXRpb24gZWxlbWVudCBpcyBzcGVjaWZpZWQgYnkgdGhlIEFJRCBvZiBpbnB1dCBzdHJ1Y3R1cmUuCisgICAqIAorICAgKiBUaGUgYXR0cmlidXRlIG5hbWVzIGFyZSBzcGVjaWZpZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGlucHV0CisgICAqIHN0cnVjdHVyZS4KKyAgICogVGhlIHZhbHVlcyBvZiBvbmUgaW5zdGFuY2UgZWxlbWVudCBhcmUgc3BlY2lmaWVkIGluIHRoZSB2YWx1ZXNlcSBvZgorICAgKiB0aGUgaW5wdXQgc3RydWN0dXJlLgorICAgKiBZb3UgY2FuIGNyZWF0ZSBzZXZlcmFsIGluc3RhbmNlIGVsZW1lbnRzIGluIG9uZSBjYWxsIGJ5IGZpbGxpbmcgdGhlCisgICAqIHZhbHVlc2VxIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUuCisgICAqIFRoZSBzYW1lIGluZGV4IGluIHRoZSB2YWx1ZXNlcSBjb3JyZXNwb25kcyB0byB0aGUgYXR0cmlidXRlcyB2YWx1ZXMKKyAgICogb2Ygb25lIGluc3RhbmNlIGVsZW1lbnQuIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzZXF1ZW5jZSBvZiBJZCdzLCB0aGUKKyAgICogb3JkZXIgaXMgcmVsYXRlZCB0byB0aGUgb3JkZXIgb2YgaW5zdGFuY2UgZWxlbWVudCBzcGVjaWZpZWQgaW4gdGhlCisgICAqIGlucHV0IHN0cnVjdHVyZS4gSW4gY2FzZSBvZiBpbmhlcml0YW5jZSwgdGhlIG1ldGhvZCBzdXBwb3J0cyBvbmx5CisgICAqIGluc3RhbmNlcyBvZiBzYW1lIHN1YnR5cGUgcGVyIGNhbGwuIFRoZSByZXR1cm5lZCBJZCdzIGFyZSB0aGUgSWQncworICAgKiBvZiB0aGUgcmVsYXRlZCBzdXBlciB0eXBlIGluc3RhbmNlcy4KKyAgICogCisgICAqIFRoZSBjbGllbnQgbXVzdCBzdXBwbHkgYWxsIG1hbmRhdG9yeSBhdHRyaWJ1dGVzIGFuZCByZWZlcmVuY2VzCisgICAqIHdpdGhpbiBvbmUgc2luZ2xlIG1ldGhvZCBjYWxsOyBvdGhlcndpc2UgdGhlIG9iamVjdCBjYW5ub3QgYmUgbWFkZQorICAgKiBwZXJzaXN0ZW50IGJ5IHRoZSBzZXJ2ZXIgaW4gdGhlIGRhdGFiYXNlIHdpdGhvdXQgdGhlIHJpc2sgb2YKKyAgICogdmlvbGF0aW5nIGFueSBkYXRhYmFzZSBjb25zdHJhaW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHZhbCAgVGhlIHNlcXVlbmNlIG9mIGF0dHJpYnV0ZXMgYW5kIHRoZWlyIHZhbHVlcy4gCisgICAqICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgIGZpZWxkcyBlbGVtSWQgYW5kIG52U2VxIG9mIHRoZSBzdHJ1Y3R1cmUgUHV0VmFsUmVxIGFuZAorICAgKiAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgQU9QX1B1dFZhbFJlcS4KKyAgICoKKyAgICogQHJldHVybiAgTGlzdCB3aXRoIHRoZSBJZCdzIG9mIHRoZSBuZXcgY3JlYXRlZCBpbnN0YW5jZXMuCisgICAqLworICAgRWxlbUlkU2VxdWVuY2UgaW5zZXJ0SW5zdGFuY2VzKAorICAgICAgaW4gQUlETmFtZVZhbHVlU2VxVW5pdElkU2VxdWVuY2UgdmFsKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMDUpCisgICAqIFVwZGF0ZSBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIG9uZSBvciBtb3JlIGluc3RhbmNlIGVsZW1lbnRzLiBJdCdzCisgICAqIG5lY2Vzc2FyeSB0aGF0IHRoZSBpbnB1dCBzdHJ1Y3R1cmUgaW5jbHVkZXMgYWxzbyB0aGUgSWQgYXR0cmlidXRlLAorICAgKiB0aGUgSWQgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCB0byBzZWxlY3QgdGhlIGluc3RhbmNlIGVsZW1lbnRzLiBJbgorICAgKiBjYXNlIG9mIGluaGVyaXRlZCBhcHBsaWNhdGlvbiBlbGVtZW50cyB0aGUgc3VwZXIgdHlwZSBJZCBoYXMgdG8gYmUKKyAgICogaW5jbHVkZWQuIFRoZSB2YWx1ZXMgb2Ygb25lIGluc3RhbmNlIGVsZW1lbnQgYXJlIHNwZWNpZmllZCBpbiB0aGUKKyAgICogdmFsdWVzZXEgb2YgdGhlIGlucHV0IHN0cnVjdHVyZS4gVGhlIHNhbWUgaW5kZXggaW4gdGhlIHZhbHVlc2VxCisgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBhdHRyaWJ1dGVzIHZhbHVlcyBvZiBvbmUgaW5zdGFuY2UgZWxlbWVudC4gCisgICAqIAorICAgKiBUaGUgc2VydmVyIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsY29sdW1uIGluc3RhbmNlcyB3aGVuCisgICAqIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYWxsIGZpdDoKKyAgICogCisgICAqIC0gT25seSB3aGVuIHRoZSBhdHRyaWJ1dGVzIGlkLCBnZW5lcmF0aW9uX3BhcmFtZXRlcnMsIHZhbHVlcywgZmxhZ3MKKyAgICogYXJlIGdpdmVuLCBhcyBzb29uIGFzIGFueSBvdGhlciBhdHRyaWJ1dGVzIGlzIGdpdmVuIGFuIGV4Y2VwdGlvbiBpcworICAgKiB0aHJvd24uCisgICAqIC0gVGhlIHZhbHVlcyBvZiB0aGUgbG9jYWxjb2x1bW4gbXVzdCBhbGwgYmVsb25nIHRvIGV4YWN0bHkgb25lCisgICAqIGluc3RhbmNlcyBvZiBBb01lYXN1cmVtZW50CisgICAqIC0gVGhlIHNlcnZlciBoYXZlIGEgbGltaXRhdGlvbiBvZiB0aGUgbWVtb3J5LCBub3QgdGhlIHN5c3RlbSBtZW1vcnkKKyAgICogbGltaXRhdGlvbiwgYXMgc29vbiBhcyB0aGUgZ2l2ZW4gdmFsdWVzIGJyZWFrcyB0aGUgbGltaXRhdGlvbiBhbgorICAgKiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgdmFsICBUaGUgc2VxdWVuY2Ugb2YgYXR0cmlidXRlcyBhbmQgdGhlaXIgdmFsdWVzLiBBdCBsZWFzdAorICAgKiAgICAgICAgICAgICAgb25lIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWVzIHNlcXVlbmNlIG11c3QgYmUgYSBzZXF1ZW5jZQorICAgKiAgICAgICAgICAgICAgd2l0aCB0aGUgSWQuIAorICAgKiAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICBBdCB0aGUgUlBDIEFQSSB0aGlzIGluZm9ybWF0aW9uIHdhcyBzdG9yZWQgaW4gdGhlCisgICAqICAgICAgICAgICAgICBmaWVsZHMgZWxlbUlkIGFuZCBudlNlcSBvZiB0aGUgc3RydWN0dXJlIFB1dFZhbFJlcSBhbmQKKyAgICogICAgICAgICAgICAgIHRoZSByZXF1ZXN0IEFPUF9QdXRWYWxSZXEuCisgICAqLworICAgdm9pZCB1cGRhdGVJbnN0YW5jZXMoCisgICAgICBpbiBBSUROYW1lVmFsdWVTZXFVbml0SWRTZXF1ZW5jZSB2YWwpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwNikKKyAgICogRGVsZXRlIGluc3RhbmNlcyBmcm9tIGFuIGFwcGxpY2F0aW9uIGVsZW1lbnQuIEluIGNhc2Ugb2YgaW5oZXJpdGVkCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnRzIHRoZSBJZCBvZiB0aGUgc3VwZXIgdHlwZSBoYXMgdG8gYmUgc3BlY2lmaWVkLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZGVsZXRlIHNldmVyYWwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQsIHRoZSBtZXRob2QgcmVtb3ZlSW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZQorICAgKiBBcHBsaWNhdGlvbkVsZW1lbnQgdG8gcmVtb3ZlIG9uZSBpbnN0YW5jZSBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50CisgICAqIHdpdGggdGhlIGNoaWxkcmVuIG9mIHRoZSBpbnN0YW5jZSBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEBwYXJhbSAgaW5zdElkcyAgVGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlIElkJ3MuIAorICAgKiAgICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgIEF0IHRoZSBSUEMgQVBJIHRoaXMgaW5mb3JtYXRpb24gd2FzIHN0b3JlZCBpbiB0aGUKKyAgICogICAgICAgICAgICAgICAgICBmaWVsZHMgZWxlbUlkIGFuZCBudlNlcSBvZiB0aGUgc3RydWN0dXJlIFB1dFZhbFJlcQorICAgKiAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcmVxdWVzdCBBT1BfUHV0VmFsUmVxLgorICAgKi8KKyAgIHZvaWQgZGVsZXRlSW5zdGFuY2VzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBTX0xPTkdMT05HIGluc3RJZHMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwNykKKyAgICogR2V0IHRoZSB2YWx1ZSBtYXRyaXggb2YgYSBtZWFzdXJlbWVudCBvciBhIHN1Ym1hdHJpeC4gSWYgdGhlIHZhbHVlCisgICAqIG1hdHJpeCB3aWxsIGJlIGJ1aWx0IHVwIHdpdGggc3BlY2lhbCBzdWJtYXRyaXggbGluaywgdXNlIHRoZQorICAgKiBpbnRlcmZhY2UgTWVhc3VyZW1lbnQuCisgICAqIEJ5IGNhbGxpbmcgdGhpcyBtZXRob2QsIHRoZSB2YWx1ZSBtYXRyaXggbW9kZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWUKKyAgICogbWF0cml4IHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgY29udGV4dCB2YXJpYWJsZSAnVkFMVUVNQVRSSVhfTU9ERScuCisgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGVzcGVjaWFsbHkgb24gZGlmZmVyZW50IG1vZGVzIG9mIHRoZSB2YWx1ZQorICAgKiBtYXRyaXgsIHNlZSBkZXNjcmlwdGlvbiBhdCB0aGUgbWV0aG9kIGdldFZhbHVlTWF0cml4SW5Nb2RlKCkgb2YgdGhlCisgICAqIGludGVyZmFjZXMgJ01lYXN1cmVtZW50JyBhbmQgJ1N1Yk1hdHJpeCcuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICoKKyAgICogQHBhcmFtICBlbGVtICBUaGUgZWxlbWVudCBpZC4gVGhlIGFpZCBoYXMgdG8gYmUgdGhlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgICAgICAgZWxlbWVudCBJZCBvZiB0aGUgQW9NZWFzdXJlbWVudCBvciBBb1N1Ym1hdHJpeC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeAorICAgKi8KKyAgIFZhbHVlTWF0cml4IGdldFZhbHVlTWF0cml4KAorICAgICAgaW4gRWxlbUlkIGVsZW0pCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwOCkKKyAgICogU2V0IHRoZSBBQ0wgaW5mb3JtYXRpb24gb24gc29tZSBhcHBsaWNhdGlvbiBlbGVtZW50LWF0dHJpYnV0ZQorICAgKiBkZWZpbmVkIGJ5IDxhaWQ+IGFuZCA8YXR0cl9uYW1lPi4gVGhlIDx1c2VyZ3JvdXBfaWQ+IGRlZmluZXMgdGhlCisgICAqIHVzZXIgZ3JvdXAgdGhlIHJpZ2h0cyBzaG91bGQgYmUgc2V0IGZvci4gPHJpZ2h0cz4gZGVmaW5lcyB0aGUgcmlnaHRzCisgICAqIHRvIHNldCBvciB0byBjbGVhci4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3NldCcsIHRoZQorICAgKiByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHNldCBhbGwgb3RoZXJzIGFyZSBjbGVhcmVkLiBJZiB0aGUgcGFyYW1ldGVyCisgICAqIDxzZXQ+IGlzIHNldCB0byAnYWRkJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgYWRkZWQgdG8gdGhlCisgICAqIGV4aXN0aW5nIHJpZ2h0cy4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3JlbW92ZScsIHRoZQorICAgKiByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHJlbW92ZWQgZnJvbSB0aGUgZXhpc3RpbmcgcmlnaHRzLiBSZXN0cmljdGlvbgorICAgKiBmb3IgdGhlIG1vZGVsOiBvbmx5IG9uZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mIHRoZSB0eXBlIEFvVXNlckdyb3VwCisgICAqIGlzIGFsbG93ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBhdHRyTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXBJZCAgVGhlIHVzZXIgZ3JvdXAgdG8gc2V0IHRoZSByaWdodHMgZm9yLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyByaWdodCBmb3IgdGhlIHVzZXIgZ3JvdXAuCisgICAqCisgICAqIEBwYXJhbSAgc2V0ICBXaGF0IHRvIGRvIHdpdGggdGhlIG5ldyByaWdodC4KKyAgICovCisgICB2b2lkIHNldEF0dHJpYnV0ZVJpZ2h0cygKKyAgICAgIGluIFRfTE9OR0xPTkcgYWlkLAorICAgICAgaW4gVF9TVFJJTkcgYXR0ck5hbWUsCisgICAgICBpbiBUX0xPTkdMT05HIHVzZXJncm91cElkLAorICAgICAgaW4gVF9MT05HIHJpZ2h0cywKKyAgICAgIGluIFJpZ2h0c1NldCBzZXQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAwOSkKKyAgICogU2V0IHRoZSBBQ0wgaW5mb3JtYXRpb24gb24gc29tZSBhcHBsaWNhdGlvbiBlbGVtZW50IGRlZmluZWQgYnkKKyAgICogPGFpZD4uIFRoZSA8dXNlcmdyb3VwX2lkPiBkZWZpbmVzIHRoZSB1c2VyIGdyb3VwIHRoZSByaWdodHMgc2hvdWxkCisgICAqIGJlIHNldCBmb3IuIDxyaWdodHM+IGRlZmluZXMgdGhlIHJpZ2h0cyB0byBzZXQgb3IgdG8gY2xlYXIuIElmIHRoZQorICAgKiBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdzZXQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZSBzZXQgYWxsCisgICAqIG90aGVycyBhcmUgY2xlYXJlZC4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ2FkZCcsIHRoZQorICAgKiByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyByaWdodHMuIElmIHRoZQorICAgKiBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdyZW1vdmUnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZQorICAgKiByZW1vdmVkIGZyb20gdGhlIGV4aXN0aW5nIHJpZ2h0cy4gIFJlc3RyaWN0aW9uIGZvciB0aGUgbW9kZWw6IG9ubHkKKyAgICogb25lIGFwcGxpY2F0aW9uIGVsZW1lbnQgb2YgdGhlIHR5cGUgQW9Vc2VyR3JvdXAgaXMgYWxsb3dlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICB1c2VyZ3JvdXBJZCAgVGhlIHVzZXIgZ3JvdXAgdG8gc2V0IHRoZSByaWdodHMgZm9yLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyByaWdodHMgZm9yIHRoZSB1c2VyIGdyb3VwLiBUaGUgcmlnaHRzCisgICAqICAgICAgICAgICAgICAgICBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlSaWdodHMuIFRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZQorICAgKiAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mIGVudW1lcmF0aW9ucworICAgKiAgICAgICAgICAgICAgICAgdGh1cyB0aGUgY29uc3RhbnQgZGVmaW5pdGlvbnMgaGFkIHRvIGJlIGRvbmUgaW4gYW4KKyAgICogICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgbmV3IHJpZ2h0LgorICAgKi8KKyAgIHZvaWQgc2V0RWxlbWVudFJpZ2h0cygKKyAgICAgIGluIFRfTE9OR0xPTkcgYWlkLAorICAgICAgaW4gVF9MT05HTE9ORyB1c2VyZ3JvdXBJZCwKKyAgICAgIGluIFRfTE9ORyByaWdodHMsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMTApCisgICAqIFNldCB0aGUgQUNMIGluZm9ybWF0aW9uIG9uIHNvbWUgaW5zdGFuY2UgZGVmaW5lZCBieSB0aGUgYXBwbGljYXRpb24KKyAgICogZWxlbWVudCBpZCA8YWlkPiBhbmQgYSBzZXF1ZW5jZSBvZiBpbnN0YW5jZSBkZWZpbmVkIGJ5IHRoZSBpZCA8aWlkPi4KKyAgICogVGhlIDx1c2VyZ3JvdXBfaWQ+IGRlZmluZXMgdGhlIHVzZXIgZ3JvdXAgdGhlIHJpZ2h0cyBzaG91bGQgYmUgc2V0CisgICAqIGZvci4gPHJpZ2h0cz4gZGVmaW5lcyB0aGUgcmlnaHRzIHRvIHNldCBvciB0byBjbGVhci4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3NldCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHNldCBhbGwKKyAgICogb3RoZXJzIGFyZSBjbGVhcmVkLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0byAnYWRkJywgdGhlCisgICAqIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHJpZ2h0cy4gSWYgdGhlCisgICAqIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8gJ3JlbW92ZScsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlCisgICAqIHJlbW92ZWQgZnJvbSB0aGUgZXhpc3RpbmcgcmlnaHRzLiAgUmVzdHJpY3Rpb24gZm9yIHRoZSBtb2RlbDogb25seQorICAgKiBvbmUgYXBwbGljYXRpb24gZWxlbWVudCBvZiB0aGUgdHlwZSBBb1VzZXJHcm91cCBpcyBhbGxvd2VkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIGluc3RJZHMgIFRoZSBzZXF1ZW5jZSBvZiBpbnN0YW5jZSBJZCdzLgorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cElkICBUaGUgdXNlciBncm91cCB0byBzZXQgdGhlIHJpZ2h0cyBmb3IuCisgICAqCisgICAqIEBwYXJhbSAgcmlnaHRzICBUaGUgbmV3IHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgbmV3IHJpZ2h0LgorICAgKi8KKyAgIHZvaWQgc2V0SW5zdGFuY2VSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCwKKyAgICAgIGluIFNfTE9OR0xPTkcgaW5zdElkcywKKyAgICAgIGluIFRfTE9OR0xPTkcgdXNlcmdyb3VwSWQsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDExKQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogYXR0cmlidXRlIDxhaWQ+LzxhdHRyX25hbWU+LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIGF0dHJOYW1lICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyaWVzIG9mIHRoZSBnaXZlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgIGF0dHJpYnV0ZS4KKyAgICovCisgICBBQ0xTZXF1ZW5jZSBnZXRBdHRyaWJ1dGVSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCwKKyAgICAgIGluIFRfU1RSSU5HIGF0dHJOYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMTIpCisgICAqIFJldHJpZXZlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQKKyAgICogYXBwbGljYXRpb24gZWxlbWVudCA8YWlkPi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIGFjY2VzcyBjb250cm9sIGxpc3QgZW50cmllcyBvZiB0aGUgZ2l2ZW4gYXBwbGljYXRpb24KKyAgICogICAgICAgICAgZWxlbWVudC4KKyAgICovCisgICBBQ0xTZXF1ZW5jZSBnZXRFbGVtZW50UmlnaHRzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAxMykKKyAgICogUmV0cmlldmUgYWNjZXNzIGNvbnRyb2wgbGlzdCBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBpbnN0YW5jZQorICAgKiA8YWlkPi88aWlkPi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBpaWQgIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgKi8KKyAgIEFDTFNlcXVlbmNlIGdldEluc3RhbmNlUmlnaHRzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBUX0xPTkdMT05HIGlpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE0KQorICAgKiBTZXQgdGhlIGFjY2VzcyBjb250cm9sIGxpc3QgaW5mb3JtYXRpb24gZm9yIHRoZSBpbml0aWFsIHJpZ2h0cyBvbgorICAgKiBzb21lIGFwcGxpY2F0aW9uIGVsZW1lbnQgZGVmaW5lZCBieSA8YWlkPi4gVGhlIDx1c2VyZ3JvdXBfaWQ+CisgICAqIGRlZmluZXMgdGhlIHVzZXIgZ3JvdXAgdGhlIHJpZ2h0cyBzaG91bGQgYmUgc2V0IGZvci4gPHJpZ2h0cz4KKyAgICogZGVmaW5lcyB0aGUgcmlnaHRzIHRvIHNldCBvciB0byBjbGVhci4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQKKyAgICogdG8gJ3NldCcsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHNldCBhbGwgb3RoZXJzIGFyZSBjbGVhcmVkLiBJZgorICAgKiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0byAnYWRkJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUKKyAgICogYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHJpZ2h0cy4gSWYgdGhlIHBhcmFtZXRlciA8c2V0PiBpcyBzZXQgdG8KKyAgICogJ3JlbW92ZScsIHRoZSByaWdodHMgaW4gPHJpZ2h0cz4gYXJlIHJlbW92ZWQgZnJvbSB0aGUgZXhpc3RpbmcKKyAgICogcmlnaHRzLiAgUmVzdHJpY3Rpb24gZm9yIHRoZSBtb2RlbDogb25seSBvbmUgYXBwbGljYXRpb24gZWxlbWVudCBvZgorICAgKiB0aGUgdHlwZSBBb1VzZXJHcm91cCBpcyBhbGxvd2VkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIHVzZXJncm91cElkICBUaGUgdXNlciBncm91cCB0byBzZXQgdGhlIGluaXRpYWwgcmlnaHRzIGZvci4KKyAgICoKKyAgICogQHBhcmFtICByaWdodHMgIFRoZSBuZXcgaW5pdGlhbCByaWdodHMgZm9yIHRoZSB1c2VyIGdyb3VwLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIHJpZ2h0cyBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZQorICAgKiAgICAgICAgICAgICAgICAgU2VjdXJpdHlSaWdodHMuIFRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbiBsYW5ndWFnZQorICAgKiAgICAgICAgICAgICAgICAgSURMIGRvZXMgbm90IGFsbG93IHRvIHNldCB0aGUgdmFsdWVzIG9mIGVudW1lcmF0aW9ucworICAgKiAgICAgICAgICAgICAgICAgdGh1cyB0aGUgY29uc3RhbnQgZGVmaW5pdGlvbnMgaGFkIHRvIGJlIGRvbmUgaW4gYW4KKyAgICogICAgICAgICAgICAgICAgIGludGVyZmFjZS4KKyAgICoKKyAgICogQHBhcmFtICByZWZBaWQgIFRoZSBJZCBvZiByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBlbGVtZW50IGZvciB3aGljaAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZC4gSWYgbm8gcmVmQWlkIGlzIHNldAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBuZXcKKyAgICogICAgICAgICAgICAgICAgIGluc3RhbmNlIGVsZW1lbnQgaW5kZXBlbmRlbnQgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgV2hhdCB0byBkbyB3aXRoIHRoZSBuZXcgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgdm9pZCBzZXRFbGVtZW50SW5pdGlhbFJpZ2h0cygKKyAgICAgIGluIFRfTE9OR0xPTkcgYWlkLAorICAgICAgaW4gVF9MT05HTE9ORyB1c2VyZ3JvdXBJZCwKKyAgICAgIGluIFRfTE9ORyByaWdodHMsCisgICAgICBpbiBUX0xPTkdMT05HIHJlZkFpZCwKKyAgICAgIGluIFJpZ2h0c1NldCBzZXQpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNDAxNSkKKyAgICogU2V0IHRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIGZvciB0aGUgaW5pdGlhbCByaWdodHMgb24KKyAgICogc29tZSBpbnN0YW5jZSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkIDxhaWQ+IGFuZCBhCisgICAqIHNlcXVlbmNlIG9mIGluc3RhbmNlIGRlZmluZWQgYnkgdGhlIGlkIDxpaWQ+LiBUaGUgPHVzZXJncm91cF9pZD4KKyAgICogZGVmaW5lcyB0aGUgdXNlciBncm91cCB0aGUgcmlnaHRzIHNob3VsZCBiZSBzZXQgZm9yLiA8cmlnaHRzPgorICAgKiBkZWZpbmVzIHRoZSByaWdodHMgdG8gc2V0IG9yIHRvIGNsZWFyLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldAorICAgKiB0byAnc2V0JywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgc2V0IGFsbCBvdGhlcnMgYXJlIGNsZWFyZWQuIElmCisgICAqIHRoZSBwYXJhbWV0ZXIgPHNldD4gaXMgc2V0IHRvICdhZGQnLCB0aGUgcmlnaHRzIGluIDxyaWdodHM+IGFyZQorICAgKiBhZGRlZCB0byB0aGUgZXhpc3RpbmcgcmlnaHRzLiBJZiB0aGUgcGFyYW1ldGVyIDxzZXQ+IGlzIHNldCB0bworICAgKiAncmVtb3ZlJywgdGhlIHJpZ2h0cyBpbiA8cmlnaHRzPiBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBleGlzdGluZworICAgKiByaWdodHMuICBSZXN0cmljdGlvbiBmb3IgdGhlIG1vZGVsOiBvbmx5IG9uZSBhcHBsaWNhdGlvbiBlbGVtZW50IG9mCisgICAqIHRoZSB0eXBlIEFvVXNlckdyb3VwIGlzIGFsbG93ZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYWlkICBUaGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQuCisgICAqCisgICAqIEBwYXJhbSAgaW5zdElkcyAgVGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlIElkJ3MuCisgICAqCisgICAqIEBwYXJhbSAgdXNlcmdyb3VwSWQgIFRoZSB1c2VyIGdyb3VwIHRvIHNldCB0aGUgaW5pdGlhbCByaWdodHMgZm9yLgorICAgKgorICAgKiBAcGFyYW0gIHJpZ2h0cyAgVGhlIG5ldyBpbml0aWFsIHJpZ2h0IGZvciB0aGUgdXNlciBncm91cC4KKyAgICoKKyAgICogQHBhcmFtICByZWZBaWQgIFRoZSBJZCBvZiByZWZlcmVuY2luZyBhcHBsaWNhdGlvbiBlbGVtZW50IGZvciB3aGljaAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZC4gSWYgbm8gcmVmQWlkIGlzIHNldAorICAgKiAgICAgICAgICAgICAgICAgdGhlIGluaXRpYWwgcmlnaHRzIHdpbGwgYmUgdXNlZCBmb3IgZWFjaCBuZXcKKyAgICogICAgICAgICAgICAgICAgIGluc3RhbmNlIGVsZW1lbnQgaW5kZXBlbmRlbnQgb2YgdGhlIGFwcGxpY2F0aW9uCisgICAqICAgICAgICAgICAgICAgICBlbGVtZW50LgorICAgKgorICAgKiBAcGFyYW0gIHNldCAgV2hhdCB0byBkbyB3aXRoIHRoZSBuZXcgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgdm9pZCBzZXRJbnN0YW5jZUluaXRpYWxSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCwKKyAgICAgIGluIFNfTE9OR0xPTkcgaW5zdElkcywKKyAgICAgIGluIFRfTE9OR0xPTkcgdXNlcmdyb3VwSWQsCisgICAgICBpbiBUX0xPTkcgcmlnaHRzLAorICAgICAgaW4gVF9MT05HTE9ORyByZWZBaWQsCisgICAgICBpbiBSaWdodHNTZXQgc2V0KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjQwMTYpCisgICAqIFNldCB0aGUgZmxhZyA8c2V0PiBpbiBzdmNhdHRyLCBpZiB0aGlzIHJlZmVyZW5jZSB3aWxsIGJlIHVzZWQgKG9yCisgICAqIG5vdCkgdG8gcmV0cmlldmUgdGhlIEluaXRpYWwgUmlnaHRzLiBJZiBtb3JlIHRoYW4gb25lIHJlZmVyZW5jZSBpcworICAgKiBzZXQgdG8gdHJ1ZSwgdGhlIHVuaW9uIChvci1mdW5jdGlvbikgb2YgYWxsIHJpZ2h0cyBhcmUgdXNlZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEBwYXJhbSAgcmVmTmFtZSAgVGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZS4KKyAgICoKKyAgICogQHBhcmFtICBzZXQgIFdoYXQgdG8gZG8gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlLgorICAgKi8KKyAgIHZvaWQgc2V0SW5pdGlhbFJpZ2h0UmVmZXJlbmNlKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBUX1NUUklORyByZWZOYW1lLAorICAgICAgaW4gUmlnaHRzU2V0IHNldCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE3KQorICAgKiBHZXQgYWxsIGF0dHJpYnV0ZSBuYW1lcyAocmVmZXJlbmNlcykgd2hpY2ggYXJlIHVzZWQgdG8gcmV0cmlldmUgdGhlCisgICAqIEluaXRpYWwgUmlnaHRzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgSWQuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuYW1lcyBvZiB0aGUgcmVmZXJlbmNlcyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZQorICAgKiAgICAgICAgICBpbml0aWFsIHJpZ2h0cyBkZXRlcm1pbmF0aW9uLgorICAgKi8KKyAgIE5hbWVTZXF1ZW5jZSBnZXRJbml0aWFsUmlnaHRSZWZlcmVuY2UoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE4KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBpbml0aWFsIHJpZ2h0cyBmb3IKKyAgICogdGhlIHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBlbGVtZW50IDxhaWQ+LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIGFpZCAgVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBlbnRyaWVzIG9mIHRoZSBnaXZlbiBhcHBsaWNhdGlvbgorICAgKiAgICAgICAgICBlbGVtZW50IGZvciB0aGUgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgSW5pdGlhbFJpZ2h0U2VxdWVuY2UgZ2V0RWxlbWVudEluaXRpYWxSaWdodHMoCisgICAgICBpbiBUX0xPTkdMT05HIGFpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDE5KQorICAgKiBSZXRyaWV2ZSBhY2Nlc3MgY29udHJvbCBsaXN0IGluZm9ybWF0aW9uIG9mIHRoZSBpbml0aWFsIHJpZ2h0cyBmb3IKKyAgICogdGhlIHJlcXVlc3RlZCBpbnN0YW5jZSA8YWlkPi88aWlkPi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBhaWQgIFRoZSBJZCBvZiB0aGUgYXBwbGljYXRpb24gZWxlbWVudC4KKyAgICoKKyAgICogQHBhcmFtICBpaWQgIFRoZSBJZCBvZiB0aGUgaW5zdGFuY2UuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGVudHJpZXMgb2YgdGhlIGdpdmVuIGluc3RhbmNlIGZvcgorICAgKiAgICAgICAgICB0aGUgaW5pdGlhbCByaWdodHMuCisgICAqLworICAgSW5pdGlhbFJpZ2h0U2VxdWVuY2UgZ2V0SW5zdGFuY2VJbml0aWFsUmlnaHRzKAorICAgICAgaW4gVF9MT05HTE9ORyBhaWQsCisgICAgICBpbiBUX0xPTkdMT05HIGlpZCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDIwKQorICAgKiBQZXJmb3JtIHRoZSBRdWVyeS4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGEgbW9yZSBwb3dlcmZ1bCBxdWVyeQorICAgKiBjb21wYXJlZCB0byB0aGUgbWV0aG9kIGdldEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSwgd2l0aCBqb2luCisgICAqIGRlZmluaXRpb25zIGFuZCBhZ2dyZWdhdGUgZnVuY3Rpb25zLgorICAgKiAKKyAgICogVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgYXBwbGljYXRpb24gZWxlbWVudHMgd2hpY2ggYXJlIHJlcXVlc3RlZCBhcmUKKyAgICogZXhhY3RseSBkZWZpbmVkIGJ5IHRoZSBkZWZpbml0aW9uIG9mIHRoZSBxdWVyeSBnaXZlbiBpbiB0aGUgZmllbGQKKyAgICogYW51U2VxIG9mIHRoZSBRdWVyeVN0cnVjdHVyZUV4dC4gVGhlIG51bWJlciBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgaXMgYWxzbyBnaXZlbiBpbiB0aGUgZGVmaW5pdGlvbi4gVGhlIG51bWJlciBvZgorICAgKiBtYXRjaGluZyBpbnN0YW5jZXMgKHRoZWlyIGF0dHJpYnV0ZXMpIGlzIG5vdCBkZWZpbmVkIGJ5IHRoZSBxdWVyeQorICAgKiBhbmQgY2FuIGJlIGEgbGFyZ2UgYW1vdW50LiBUaGVyZWZvcmUgb25seSBvbmUgaXRlcmF0b3IgZm9yIHRoZQorICAgKiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBkZWZpbmVkLgorICAgKiAKKyAgICogVGhlIHJldHVybiBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzdHJ1Y3R1cmUgUmVzdWx0U2V0RXh0IC4gVGhpcworICAgKiBzZXF1ZW5jZSB3aWxsIGFsd2F5cyBoYXZlIHRoZSBsZW5ndGggb2YgMS4gVGhpcworICAgKiBlbGVtZW50IGluIHRoZSBzdHJ1Y3R1cmUgaGF2ZSB0d28gZmllbGRzIAorICAgKiAgIC0gZmlyc3RFbGVtcyBvZiB0eXBlIEVsZW1SZXN1bHRTZXRFeHRTZXF1ZW5jZQorICAgKiAgIC0gcmVzdEVsZW1zIG9mIHR5cGUgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yCisgICAqIAorICAgKiBmaXJzdEVsZW1zCisgICAqIFRoZSBmaXJzdEVsZW1zIGlzIGEgc2VxdWVuY2Ugb2YgRWxlbVJlc3VsdFNldEV4dCwgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICogc2VxdWVuY2UgY29ycmVzcG9uZHMgd2l0aCB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBhcHBsaWNhdGlvbgorICAgKiBlbGVtZW50cyByZXF1ZXN0ZWQgaW4gdGhlIGFudVNlcSBvZiB0aGUgUXVlcnlTdHJ1Y3RydWVFeHQuIFRoZQorICAgKiBzdHJ1Y3R1cmUgRWxlbVJlc3VsdFNldEV4dCBoYXMgdGhlIGZpZWxkcyBhaWQgYW5kIHZhbHVlcy4gVGhlIGFpZCBpcworICAgKiB0aGUgSWQgb2YgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQsIHRoZSB2YWx1ZXMsIGEgc2VxdWVuY2Ugb2YgdGhlCisgICAqIHN0cnVjdHVyZSBOYW1lVmFsdWVTZXFVbml0SWQgYXJlIHRoZSB2YWx1ZXMgb2YgdGhlIGF0dHJpYnV0ZXMuIEZvcgorICAgKiBlYWNoIHJlcG9ydGVkIGF0dHJpYnV0ZSBhbiBlbnRyeSBpcyBnaXZlbiBpbiB0aGUgc2VxdWVuY2UsIHRoZSBuYW1lCisgICAqIG9mIHRoZSBhdHRyaWJ1dGUgaXMgZ2l2ZW4gaW4gdGhlIGZpZWxkIHZhbE5hbWUuIFRoZSBJZCBvZiB0aGUgdW5pdAorICAgKiBpcyBnaXZlbiBpbiB0aGUgZmllbGQgdW5pdElkLCB0aGlzIGlzIHRoZSBJZCBvZiB0aGUgaW5zdGFuY2Ugb2YgdGhlCisgICAqIGFwcGxpY2F0aW9uIGVsZW1lbnQgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIGVsZW1lbnQgQW9Vbml0LiBUaGUgdmFsdWVzCisgICAqIGFyZSBnaXZlbiBpbiB0aGUgZmllbGQgdmFsdWUgd2l0aCB0aGUgdHlwZSBUU19WYWx1ZVNlcS4gRWFjaCB2YWx1ZQorICAgKiBzZXF1ZW5jZSBoYXMgdGhlIHNhbWUgbGVuZ3RoLCB0aGlzIGxlbmd0aCBpcyBtYXhpbXVtIGhvd19tYW55IHRoZQorICAgKiBwYXJhbWV0ZXIgb2YgdGhlIG1ldGhvZC4gSWYgbm8gdmFsdWVzIGFyZSBmb3VuZCB0aGUgbGVuZ3RoIG9mIHRoZQorICAgKiBzZXF1ZW5jZSBpcyAwLiBUaGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgaW5kZXggaW4gdGhlIGRpZmZlcmVudAorICAgKiBzZXF1ZW5jZXMgb2YgdGhlIGVudHJ5IGluIHRoZSBOYW1lVmFsdWVTZXFVbml0SWRTZXF1ZW5jZSBiZWxvbmdzIHRvCisgICAqIHRoZSBzYW1lIGluc3RhbmNlIGVsZW1lbnQuIAorICAgKiAKKyAgICogcmVzdEVsZW1zCisgICAqIFRoZSByZXN0RWxlbXMgaXMgYW4gaXRlcmF0b3IgZm9yIHRoZSByZW1haW5pbmcgc2VxdWVuY2Ugb2YKKyAgICogRWxlbVJlc3VsdFNldEV4dC4gVGhpcyBpdGVyYXRvciBhbGxvd3MgdG8gbG9hZCB0aGUgbmV4dCBOIHZhbHVlcworICAgKiBmcm9tIHRoZSBSZXN1bHRTZXQuIFRoZSByZXN1bHQgb2YgdGhlIGVsZW1lbnQgaXMgdGhlIHNhbWUgd2F5IHN0b3JlZAorICAgKiBhcyBhdCB0aGUgZmllbGQgZmlyc3RFbGVtcywgdGhlIG5leHQgTiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZQorICAgKiBvZiB0aGUgZmllbGQgdmFsdWUgb2YgdGhlIE5hbWVWYWx1ZVNlcVVuaXRJZC4gVGhlIG1ldGhvZCBuZXh0T25lIGlzCisgICAqIHdyb25nIHNwZWNpZmllZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLCB1c2UgaW5zdGVhZCB0aGUgbWV0aG9kIG5leHROCisgICAqIHdpdGggbj0xLiBUaGUgbWV0aG9kIGdldENvdW50IHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGZvdW5kCisgICAqIGVsZW1lbnQsIGFsc28gdGhlIG51bWJlciBhbHJlYWR5IHJldHVybmVkIGluIGZpcnN0RWxlbXMuIFRoZSBtZXRob2QKKyAgICogcmVzZXQgc2V0IHRoZSBpdGVyYXRvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBSZXN1bHRTZXQsIHRoaXMgaXMgdGhlCisgICAqIGJlZ2lubmluZyBvZiB0aGUgZmlyc3RFbGVtcy4KKyAgICogCisgICAqIFRoZSB2YWx1ZXMgb2YgdGhlIGxvY2FsY29sdW1uIGluc3RhbmNlcyBpcyBwYXJ0IG9mIHRoZSByZXN1bHRzZXQKKyAgICogd2hlbiB0aGUgZm9sbG93aW5nIGNyaXRlcmlhIGFsbCBmaXQ6CisgICAqIAorICAgKiAtIE9ubHkgd2hlbiB0aGUgYXR0cmlidXRlcyBpZCwgZ2VuZXJhdGlvbl9wYXJhbWV0ZXJzLCB2YWx1ZXMsIGZsYWdzCisgICAqIGFyZSByZXF1ZXN0ZWQsIGFzIHNvb24gYXMgYW55IG90aGVyIGF0dHJpYnV0ZXMgaXMgcmVxdWVzdGVkIHRoZQorICAgKiB2YWx1ZXMgYXJlIG5vdCByZXBvcnRlZC4KKyAgICogLSBUaGUgdmFsdWVzIG9mIHRoZSBsb2NhbGNvbHVtbiBtdXN0IGFsbCBiZWxvbmcgdG8gZXhhY3RseSBvbmUKKyAgICogaW5zdGFuY2VzIG9mIEFvTWVhc3VyZW1lbnQKKyAgICogLSBUaGUgc2VydmVyIGhhdmUgYSBsaW1pdGF0aW9uIG9mIHRoZSBtZW1vcnksIG5vdCB0aGUgc3lzdGVtIG1lbW9yeQorICAgKiBsaW1pdGF0aW9uLCBhcyBzb29uIGFzIHRoZSByZXN1bHQgc2V0IHdpbGwgYnJlYWsgdGhlIGxpbWl0YXRpb24gYW4KKyAgICogZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgorICAgKiAtIE5vIGl0ZXJhdG9yIGZvciB0aGUgcmVzdCBpcyByZXF1aXJlZC4KKyAgICogCisgICAqIEluIGNhc2UgYW4gYXR0cmlidXRlIG9mIGJsb2IgdHlwZSBpcyBhbW9uZyB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZXMsCisgICAqIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm4gc3RydWN0dXJlIHdpbGwgZGVwZW5kIG9uIHRoZSBudW1iZXIgb2YKKyAgICogaW5zdGFuY2VzIHRoYXQgYXJlIHJldHVybmVkOgorICAgKiAtIEluIGNhc2UgYXR0cmlidXRlcyBvZiBvbmx5IG9uZSBpbnN0YW5jZSBhcmUgcmV0dXJuZWQgKGVpdGhlcgorICAgKiBiZWNhdXNlICdob3dfbWFueScgd2FzIHNldCB0byAxIG9yIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlCisgICAqIGF2YWlsYWJsZSBhdCB0aGUgc2VydmVyKSwgdGhlIHJldHVybiBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGJsb2IKKyAgICogaXRzZWxmLgorICAgKiAtIEluIGNhc2UgYXR0cmlidXRlcyBvZiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIGFyZSByZXR1cm5lZCwgdGhlCisgICAqIHJldHVybiBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiB0aGUgYmxvYnM7IGluc3RlYWQgaXQgY29udGFpbnMgdGhlCisgICAqIGhlYWRlcnMgb2YgdGhlIHJlc3BlY3RpdmUgYmxvYnMuCisgICAqIAorICAgKiBUaGUgdmFsdWUgb2YgdmFsTmFtZSBvZiBxdWVyeSByZXN1bHQgdmFsdWVzIHNoYWxsIGJlIHRoZSBhYU5hbWUgaW4KKyAgICogY2FzZSBBZ2dyRnVuYz0nTk9ORScgYW5kIHNoYWxsIGJlIGNvbnN0cnVjdGVkIGZvciBhbGwgb3RoZXIgQWdnckZ1bmMKKyAgICogdmFsdWVzIGFzIHN0cmluZyBjb25jYXRlbmF0aW9uIG9mIHRoZSBBZ2dyRnVuYyB2YWx1ZSBmb2xsb3dlZCBieSBhCisgICAqICcoJyBjaGFyYWN0ZXIsIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIGF0dHJpYnV0ZSAoYWFOYW1lKSBmb2xsb3dlZAorICAgKiBieSBhICcpJyBjaGFyYWN0ZXIuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgYW9xICBUaGUgcXVlcnkgZGVmaW5pdGlvbi4KKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgTWF4aW11bSBudW1iZXIgb2YgdmFsdWVzIGluIGVhY2ggcmVzdWx0IHNldC4gVmFsaWQKKyAgICogICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGFyZTogCisgICAqICAgICAgICAgICAgICAgICAgIGhvd19tYW55ID0gMCA6IHJlcG9ydCBhbGwgZm91bmQgdmFsdWVzLAorICAgKiAgICAgICAgICAgICAgICAgICBob3dfbWFueSA+IDAgOiByZXBvcnQgYSBtYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXN1bHQgc2V0IHdpdGggdGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgdmFsdWVzLgorICAgKi8KKyAgIFJlc3VsdFNldEV4dFNlcXVlbmNlIGdldEluc3RhbmNlc0V4dCgKKyAgICAgIGluIFF1ZXJ5U3RydWN0dXJlRXh0IGFvcSwKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDIxKQorICAgKiBHZXQgdGhlIHZhbHVlIG1hdHJpeCBvZiBhIG1lYXN1cmVtZW50IG9yIGEgc3VibWF0cml4LiBJZiB0aGUgdmFsdWUKKyAgICogbWF0cml4IHdpbGwgYmUgYnVpbHQgdXAgd2l0aCBzcGVjaWFsIHN1Ym1hdHJpeCBsaW5rLCB1c2UgdGhlCisgICAqIGludGVyZmFjZSBNZWFzdXJlbWVudC4KKyAgICogVGhlIGJlaGF2aW9yIG9mIHRoZSBBU0FNIE9EUyBzZXJ2ZXIgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZQorICAgKiByZWZlcmVuY2VkIGVsZW1lbnQgaXMgYSBzdWJtYXRyaXggb3IgYSBtZWFzdXJlbWVudC4gRm9yIG1vcmUKKyAgICogaW5mb3JtYXRpb24gb24gdGhlIHNlcnZlciBiZWhhdmlvciBzZWUgZGVzY3JpcHRpb24gYXQgdGhlIG1ldGhvZAorICAgKiBnZXRWYWx1ZU1hdHJpeEluTW9kZSgpIG9mIHRoZSBpbnRlcmZhY2VzICdNZWFzdXJlbWVudCcgYW5kCisgICAqICdTdWJNYXRyaXgnLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19JTlZBTElEX0JBU0VUWVBFCisgICAqICAgIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFCisgICAqCisgICAqIEBwYXJhbSAgZWxlbSAgVGhlIGVsZW1lbnQgaWQuIFRoZSBhaWQgaGFzIHRvIGJlIHRoZSBhcHBsaWNhdGlvbgorICAgKiAgICAgICAgICAgICAgIGVsZW1lbnQgSWQgb2YgdGhlIEFvTWVhc3VyZW1lbnQgb3IgQW9TdWJtYXRyaXguCisgICAqCisgICAqIEBwYXJhbSAgdm1Nb2RlICBUaGUgcmVxdWVzdGVkIG1vZGUgb2YgdGhlIHZhbHVlIG1hdHJpeC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIHZhbHVlIG1hdHJpeC4KKyAgICovCisgICBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeEluTW9kZSgKKyAgICAgIGluIEVsZW1JZCBlbGVtLAorICAgICAgaW4gVmFsdWVNYXRyaXhNb2RlIHZtTW9kZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI0MDIyKQorICAgKiBHZXQgdGhlIE9EU0ZpbGUgaW50ZXJmYWNlIGZvciBhbiBpbnN0YW5jZSBvZiBhbiBhcHBsaWNhdGlvbiBlbGVtZW50CisgICAqIGRlcml2ZWQgZnJvbSBBb0ZpbGUuCisgICAqIAorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIE9EU0ZpbGUgaW50ZXJmYWNlLgorICAgKiAKKyAgICogT25lIHBhcmFtZXRlciBjb250cm9scyB0aGUgYmVoYXZpb3Igb2YgdGhpcyBtZXRob2Q6CisgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyICdlbGVtJyAod2l0aCBpdHMgY29tcG9uZW50cyAnYWlkJyBhbmQKKyAgICogJ2lpZCcpIHVuaXF1ZWx5IGlkZW50aWZpZXMKKyAgICogYW4gaW5zdGFuY2Ugd2l0aGluIHRoZSBPRFMgc3RvcmFnZS4gSWYgbm8gc3VjaCBpbnN0YW5jZSBleGlzdHMsIG9yCisgICAqIGlmIHRoZSBpbnN0YW5jZSBpcyBub3QKKyAgICogYW4gaW5zdGFuY2Ugb2YgYW4gYXBwbGljYXRpb24gZWxlbWVudCBkZXJpdmVkIGZyb20gQW9GaWxlLCB0aGUKKyAgICogZXhjZXB0aW9uCisgICAqIEFPX0lOVkFMSURfQkFTRVRZUEUgaXMgdGhyb3duLgorICAgKiAKKyAgICogTm90ZSB0aGF0IGFuIE9EUyBzZXJ2ZXIgbWF5IGJlIHNldCB1cCB0byBzdXBwb3J0IHRoZSBPRFMgc2VjdXJpdHkKKyAgICogY29uY2VwdHMgYW5kIHRoYXQgaW4KKyAgICogc3VjaCBjYXNlIGFjY2VzcyB0byBhIGZpbGUgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBhY2Nlc3MgcmlnaHRzIG9mCisgICAqIHRoZSBhY2Nlc3NpbmcgdXNlciBhcmUKKyAgICogc3VmZmljaWVudC4gSWYgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhdCBsZWFzdCBSRUFEIHJpZ2h0cyBmb3IgdGhlCisgICAqIGluc3RhbmNlIHNwZWNpZmllZCBieQorICAgKiAnZWxlbScgYW4gZXhjZXB0aW9uIEFPX0FDQ0VTU19ERU5JRUQgd2lsbCBiZSB0aHJvd24uCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0lOVkFMSURfQkFTRVRZUEUKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKgorICAgKiBAcGFyYW0gIGVsZW0gIFRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgZmlsZSBiZWxvbmdzLCB3aG9zZSBhY2Nlc3MKKyAgICogICAgICAgICAgICAgICBpcyBpbnRlbmRlZC4KKyAgICoKKyAgICogQHJldHVybiAgVGhlIE9EU0ZpbGUgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGUgZGVzaXJlZCBmaWxlLgorICAgKi8KKyAgIE9EU0ZpbGUgZ2V0T0RTRmlsZSgKKyAgICAgIGluIEVsZW1JZCBlbGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBBcHBsRWxlbUFjY2Vzcy4KKworLyoqCisqIFRoZSBBU0FNIE9EUyBxdWVyeSBldmFsdWF0b3IgaW50ZXJmYWNlIGFsbG93cyB0byBwZXJmb3JtIHF1ZXJpZXMgaW4KKyogc3luY2hyb25vdXMgbW9kZSBhbmQgdG8gY3JlYXRlIFF1ZXJ5IG9iamVjdHMgZm9yIGFzeW5jaHJvbm91cworKiBleGVjdXRpb24uCisqLworaW50ZXJmYWNlIFF1ZXJ5RXZhbHVhdG9yIHsKKworICAgLyoqICgyNTAwMCkKKyAgICogRXZhbHVhdGUgYSBxdWVyeSBpbiBzeW5jaHJvbm91cyBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fUVVFUllfVFlQRV9JTlZBTElECisgICAqICAgIEFPX1FVRVJZX0lOVkFMSUQKKyAgICogICAgQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorICAgKiAgICBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVECisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBxdWVyeVN0ciAgVGhlIHF1ZXJ5IHN0cmluZy4KKyAgICoKKyAgICogQHBhcmFtICBwYXJhbXMgIFNlcXVlbmNlIG9mIHBhcmFtZXRlciBuYW1lcyBhbmQgdmFsdWVzLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBwYXNzZWQ6CisgICAqICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgIE5hbWU6ICJNYXhEdXJhdGlvbiI7IAorICAgKiAgICAgICAgICAgICAgICAgVHlwZTogVF9MT05HCisgICAqICAgICAgICAgICAgICAgICBDb21tZW50OiBDYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUgcHJvY2Vzc2luZworICAgKiAgICAgICAgICAgICAgICAgdGltZS4gVGhlIHRpbWUgaXMgZ2l2ZW4gaW4gIG1pbGxpc2Vjb25kcywKKyAgICogICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IDAgKG5vIHJlc3RyaWN0aW9uKQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgcmVzdWx0IG9mIHRoZSBxdWVyeSBhcyBhbiBpbnN0YW5jZSBlbGVtZW50IGl0ZXJhdG9yLgorICAgKi8KKyAgIEluc3RhbmNlRWxlbWVudEl0ZXJhdG9yIGdldEluc3RhbmNlcygKKyAgICAgIGluIFRfU1RSSU5HIHF1ZXJ5U3RyLAorICAgICAgaW4gTmFtZVZhbHVlU2VxdWVuY2UgcGFyYW1zKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjUwMDEpCisgICAqIEV2YWx1YXRlIGEgcXVlcnkgaW4gc3luY2hyb25vdXMgbW9kZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX1FVRVJZX1RZUEVfSU5WQUxJRAorICAgKiAgICBBT19RVUVSWV9JTlZBTElECisgICAqICAgIEFPX1FVRVJZX1BST0NFU1NJTkdfRVJST1IKKyAgICogICAgQU9fUVVFUllfVElNRU9VVF9FWENFRURFRAorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgcXVlcnlTdHIgIFRoZSBxdWVyeSBzdHJpbmcuCisgICAqCisgICAqIEBwYXJhbSAgcGFyYW1zICBTZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcy4gVGhlCisgICAqICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgcGFyYW1ldGVycyBzaG91bGQgYmUgcGFzc2VkOgorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiTWF4RHVyYXRpb24iOyAKKyAgICogICAgICAgICAgICAgICAgIFR5cGU6IFRfTE9ORworICAgKiAgICAgICAgICAgICAgICAgQ29tbWVudDogQ2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHByb2Nlc3NpbmcKKyAgICogICAgICAgICAgICAgICAgIHRpbWUuIFRoZSB0aW1lIGlzIGdpdmVuIGluICBtaWxsaXNlY29uZHMsCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiAwIChubyByZXN0cmljdGlvbikKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgYXMgYSBuYW1lIHZhbHVlIHVuaXQgc2VxdWVuY2UKKyAgICogICAgICAgICAgaXRlcmF0b3IuIEVhY2ggbmFtZSB2YWx1ZSB1bml0IHR1cGxlIGlzIG9uZSBjZWxsIG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4gVGhlIG5hbWUgdmFsdWUgdW5pdCBzZXF1ZW5jZSBpcyBvbmUgcm93IG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0U2VxdWVuY2VJdGVyYXRvciBnZXRUYWJsZVJvd3MoCisgICAgICBpbiBUX1NUUklORyBxdWVyeVN0ciwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIHBhcmFtcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI1MDAyKQorICAgKiBFdmFsdWF0ZSBhIHF1ZXJ5IGluIHN5bmNocm9ub3VzIG1vZGUuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19RVUVSWV9UWVBFX0lOVkFMSUQKKyAgICogICAgQU9fUVVFUllfSU5WQUxJRAorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX1RJTUVPVVRfRVhDRUVERUQKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHF1ZXJ5U3RyICBUaGUgcXVlcnkgc3RyaW5nLgorICAgKgorICAgKiBAcGFyYW0gIHBhcmFtcyAgU2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMuIFRoZQorICAgKiAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHBhc3NlZDoKKyAgICogICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgTmFtZTogIk1heER1cmF0aW9uIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBUX0xPTkcKKyAgICogICAgICAgICAgICAgICAgIENvbW1lbnQ6IENhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwcm9jZXNzaW5nCisgICAqICAgICAgICAgICAgICAgICB0aW1lLiBUaGUgdGltZSBpcyBnaXZlbiBpbiAgbWlsbGlzZWNvbmRzLAorICAgKiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogMCAobm8gcmVzdHJpY3Rpb24pCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXN1bHQgb2YgdGhlIHF1ZXJ5IGFzIGEgbmFtZSB2YWx1ZSBzZXF1ZW5jZSB1bml0CisgICAqICAgICAgICAgIHNlcXVlbmNlLiBFYWNoIG5hbWUgdmFsdWUgc2VxdWVuY2UgdW5pdCB0dXBsZSBpcyBvbmUgY29sdW1uCisgICAqICAgICAgICAgIG9mIHRoZSB0YWJsZS4gVGhlIG5hbWUgdmFsdWUgc2VxdWVuY2UgdW5pdCBzZXF1ZW5jZSBpcyAgdGhlCisgICAqICAgICAgICAgIHRhYmxlLiBUaGUgcmVzdWx0IHN0cnVjdHVyZSBjYW4gYmUgdmVyeSBodWdlLgorICAgKi8KKyAgIE5hbWVWYWx1ZVNlcVVuaXRTZXF1ZW5jZSBnZXRUYWJsZSgKKyAgICAgIGluIFRfU1RSSU5HIHF1ZXJ5U3RyLAorICAgICAgaW4gTmFtZVZhbHVlU2VxdWVuY2UgcGFyYW1zKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjUwMDMpCisgICAqIENyZWF0ZSBhIHF1ZXJ5IG9iamVjdCB0byBleGVjdXRlIGl0IGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fUVVFUllfVFlQRV9JTlZBTElECisgICAqICAgIEFPX1FVRVJZX0lOVkFMSUQKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcGFyYW0gIHF1ZXJ5U3RyICBUaGUgcXVlcnkgc3RyaW5nCisgICAqCisgICAqIEBwYXJhbSAgcGFyYW1zICBTZXF1ZW5jZSBvZiBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcy4gVGhlCisgICAqICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgcGFyYW1ldGVycyBzaG91bGQgYmUgcGFzc2VkOgorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiUXVlcnlSZXN1bHRUeXBlIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBSZXN1bHRUeXBlLgorICAgKiAgICAgICAgICAgICAgICAgQ29tbWVudDogU3BlY2lmaWVzIHdoYXQga2luZCBvZiByZXN1bHQgaXMgZXhwZWN0ZWQKKyAgICogICAgICAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQuCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiBJTlNURUxFTV9JVEVSQVRPUl9BU19SRVNVTFQKKyAgICogICAgICAgICAgICAgICAgIAorICAgKiAgICAgICAgICAgICAgICAgTmFtZTogIk1heER1cmF0aW9uIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBUX0xPTkcKKyAgICogICAgICAgICAgICAgICAgIENvbW1lbnQ6IENhbiBiZSB1c2VkIHRvIHJlc3RyaWN0IHRoZSBwcm9jZXNzaW5nCisgICAqICAgICAgICAgICAgICAgICB0aW1lLiBUaGUgdGltZSBpcyBnaXZlbiBpbiAgbWlsbGlzZWNvbmRzLAorICAgKiAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZTogMCAobm8gcmVzdHJpY3Rpb24pCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBxdWVyeSBvYmplY3QuCisgICAqLworICAgUXVlcnkgY3JlYXRlUXVlcnkoCisgICAgICBpbiBUX1NUUklORyBxdWVyeVN0ciwKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIHBhcmFtcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgUXVlcnlFdmFsdWF0b3IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgaW50ZXJmYWNlIFF1ZXJ5LgorKi8KK2ludGVyZmFjZSBRdWVyeSB7CisKKyAgIC8qKiAoMjYwMDApCisgICAqIEdldCB0aGUgUXVlcnlFdmFsdWF0b3Igb2JqZWN0IHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHF1ZXJ5LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgUXVlcnlFdmFsdWF0b3Igb2JqZWN0IHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzCisgICAqICAgICAgICAgIHF1ZXJ5LgorICAgKi8KKyAgIFF1ZXJ5RXZhbHVhdG9yIGdldFF1ZXJ5RXZhbHVhdG9yKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI2MDAxKQorICAgKiBEbyB0aGUgcXVlcnkgcHJlLXByb2Nlc3NpbmcgKG9wdGltaXphdGlvbiwgZXRjLikgIENhbGwgY2FuIGJlCisgICAqIG9taXR0ZWQgYnkgdGhlIGNsaWVudC4gSW4gdGhpcyBjYXNlIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGV4ZWN1dGVkIG9uCisgICAqIHRoZSBjYWxsIG9mIGV4ZWN1dGVRdWVyeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorICAgKiAgICBBT19RVUVSWV9JTlZBTElEX1JFU1VMVFRZUEUKKyAgICoKKyAgICogQHBhcmFtICBwYXJhbXMgIFNlcXVlbmNlIG9mIHBhcmFtZXRlciBuYW1lcyBhbmQgdmFsdWVzLiBUaGUKKyAgICogICAgICAgICAgICAgICAgIGZvbGxvd2luZyBwYXJhbWV0ZXJzIHNob3VsZCBiZSBwYXNzZWQ6CisgICAqICAgICAgICAgICAgICAgICAKKyAgICogICAgICAgICAgICAgICAgIE5hbWU6ICJRdWVyeVJlc3VsdFR5cGUiOyAKKyAgICogICAgICAgICAgICAgICAgIFR5cGU6IFJlc3VsdFR5cGUuCisgICAqICAgICAgICAgICAgICAgICBDb21tZW50OiBTcGVjaWZpZXMgd2hhdCBraW5kIG9mIHJlc3VsdCBpcyBleHBlY3RlZAorICAgKiAgICAgICAgICAgICAgICAgYnkgdGhlIGNsaWVudCwgdGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgaWYgdGhlCisgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGlzbid0IGdpdmVuIGF0IHRoZSBtZXRob2QgY3JlYXRlUXVlcnkgb2YKKyAgICogICAgICAgICAgICAgICAgIHRoZSBpbnRlcmZhY2UgUXVlcnlFdmFsdWF0b3IuCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiBJTlNURUxFTV9JVEVSQVRPUl9BU19SRVNVTFQKKyAgICovCisgICB2b2lkIHByZXBhcmVRdWVyeSgKKyAgICAgIGluIE5hbWVWYWx1ZVNlcXVlbmNlIHBhcmFtcykKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI2MDAyKQorICAgKiBFeGVjdXRlIHF1ZXJ5IGluIGFzeW5jaHJvbm91cyBtb2RlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX0lOVkFMSURfUkVTVUxUVFlQRQorICAgKgorICAgKiBAcGFyYW0gIHBhcmFtcyAgU2VxdWVuY2Ugb2YgcGFyYW1ldGVyIG5hbWVzIGFuZCB2YWx1ZXMuIFRoZQorICAgKiAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHBhcmFtZXRlciBzaG91bGQgYmUgcGFzc2VkOgorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiUXVlcnlSZXN1bHRUeXBlIjsgCisgICAqICAgICAgICAgICAgICAgICBUeXBlOiBSZXN1bHRUeXBlLgorICAgKiAgICAgICAgICAgICAgICAgQ29tbWVudDogU3BlY2lmaWVzIHdoYXQga2luZCBvZiByZXN1bHQgaXMgZXhwZWN0ZWQKKyAgICogICAgICAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQsIHRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIGlmIHRoZQorICAgKiAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpc24ndCBnaXZlbiBhdCB0aGUgbWV0aG9kIHByZXBhcmVRdWVyeSBvcgorICAgKiAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCBjcmVhdGVRdWVyeSBvZiB0aGUgaW50ZXJmYWNlCisgICAqICAgICAgICAgICAgICAgICBRdWVyeUV2YWx1YXRvci4KKyAgICogICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWU6IElOU1RFTEVNX0lURVJBVE9SX0FTX1JFU1VMVAorICAgKiAgICAgICAgICAgICAgICAgCisgICAqICAgICAgICAgICAgICAgICBOYW1lOiAiU3luY2hyb25vdXMiOworICAgKiAgICAgICAgICAgICAgICAgVHlwZTogVF9CT09MRUFOCisgICAqICAgICAgICAgICAgICAgICBDb21tZW50OiBJbiBjYXNlIG9mICJ0cnVlIiBndWFyYW50ZWVzIHN5bmNocm9ub3VzCisgICAqICAgICAgICAgICAgICAgICBleGVjdXRpb24uCisgICAqICAgICAgICAgICAgICAgICBEZWZhdWx0IHZhbHVlOiAiZmFsc2UiCisgICAqLworICAgdm9pZCBleGVjdXRlUXVlcnkoCisgICAgICBpbiBOYW1lVmFsdWVTZXF1ZW5jZSBwYXJhbXMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyNjAwMykKKyAgICogUmV0dXJuIHF1ZXJ5IHN0YXR1cy4KKyAgICogCisgICAqIFJldHVybnMgSU5DT01QTEVURSBpZiB0aGUgcXVlcnkgaXMgc3RpbGwgZXhlY3V0aW5nLgorICAgKiAKKyAgICogUmV0dXJucyBDT01QTEVURSBpZiB0aGUgcXVlcnkgZmluaXNoZWQgZXhlY3V0aW9uIG9yIGlmIHRoZSBxdWVyeQorICAgKiBleGVjdXRpb24gc3RvcHBlZCBiZWNhdXNlIG9mIGFuIGVycm9yIG9yIGJlY2F1c2UgdGhlIHRpbWVvdXQgd2FzCisgICAqIGV4Y2VlZGVkLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc3RhdHVzIG9mIHRoZSBxdWVyeS4KKyAgICovCisgICBRdWVyeVN0YXR1cyBnZXRTdGF0dXMoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjYwMDQpCisgICAqIEdldCB0aGUgcXVlcnkgcmVzdWx0LiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlCisgICAqIHF1ZXJ5IGhhcyBiZWVuIGV4ZWN1dGVkLiBJdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIHRoZSBpbnN0YW5jZXMKKyAgICogdGhhdCB3ZXJlIGZvdW5kIGJ5IHRoZSBxdWVyeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorICAgKiAgICBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVECisgICAqICAgIEFPX1FVRVJZX0lOQ09NUExFVEUKKyAgICogICAgQU9fUVVFUllfSU5WQUxJRF9SRVNVTFRUWVBFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSByZXN1bHQgb2YgdGhlIHF1ZXJ5IGFzIGFuIGluc3RhbmNlIGVsZW1lbnQgaXRlcmF0b3IuCisgICAqLworICAgSW5zdGFuY2VFbGVtZW50SXRlcmF0b3IgZ2V0SW5zdGFuY2VzKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI2MDA1KQorICAgKiBHZXQgdGhlIHF1ZXJ5IHJlc3VsdC4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZQorICAgKiBxdWVyeSBoYXMgYmVlbiBleGVjdXRlZC4gSXQgcmV0dXJucyBhbiBpdGVyYXRvciBvbiB0aGUgbmFtZSB2YWx1ZQorICAgKiB1bml0IHNlcXVlbmNlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX1RJTUVPVVRfRVhDRUVERUQKKyAgICogICAgQU9fUVVFUllfSU5DT01QTEVURQorICAgKiAgICBBT19RVUVSWV9JTlZBTElEX1JFU1VMVFRZUEUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgYXMgYSBuYW1lIHZhbHVlIHVuaXQgc2VxdWVuY2UKKyAgICogICAgICAgICAgaXRlcmF0b3IuIEVhY2ggbmFtZSB2YWx1ZSB1bml0IHR1cGxlIGlzIG9uZSBjZWxsIG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4gVGhlIG5hbWUgdmFsdWUgdW5pdCBzZXF1ZW5jZSBpcyBvbmUgcm93IG9mIHRoZQorICAgKiAgICAgICAgICB0YWJsZS4KKyAgICovCisgICBOYW1lVmFsdWVVbml0U2VxdWVuY2VJdGVyYXRvciBnZXRUYWJsZVJvd3MoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjYwMDYpCisgICAqIEdldCB0aGUgcXVlcnkgcmVzdWx0LiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlCisgICAqIHF1ZXJ5IGhhcyBiZWVuIGV4ZWN1dGVkLiBJdCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYW4gc3RydWN0dXJlLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19RVUVSWV9QUk9DRVNTSU5HX0VSUk9SCisgICAqICAgIEFPX1FVRVJZX1RJTUVPVVRfRVhDRUVERUQKKyAgICogICAgQU9fUVVFUllfSU5DT01QTEVURQorICAgKiAgICBBT19RVUVSWV9JTlZBTElEX1JFU1VMVFRZUEUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIHJlc3VsdCBvZiB0aGUgcXVlcnkgYXMgYSBuYW1lIHZhbHVlIHNlcXVlbmNlIHVuaXQKKyAgICogICAgICAgICAgc2VxdWVuY2UuIEVhY2ggbmFtZSB2YWx1ZSBzZXF1ZW5jZSB1bml0IHR1cGxlIGlzIG9uZSBjb2x1bW4KKyAgICogICAgICAgICAgb2YgdGhlIHRhYmxlLiBUaGUgbmFtZSB2YWx1ZSBzZXF1ZW5jZSB1bml0IHNlcXVlbmNlIGlzICB0aGUKKyAgICogICAgICAgICAgdGFibGUuIFRoZSByZXN1bHQgc3RydWN0dXJlIGNhbiBiZSB2ZXJ5IGh1Z2UuCisgICAqLworICAgTmFtZVZhbHVlU2VxVW5pdFNlcXVlbmNlIGdldFRhYmxlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgUXVlcnkuCisKKy8qKgorKiBUaGUgbmFtZSB2YWx1ZSB1bml0IHNlcXVlbmNlIGl0ZXJhdG9yLiBUaGUgdGFibGUgaXRlcmF0b3IgYXMgcXVlcnkKKyogcmVzdWx0LgorKi8KK2ludGVyZmFjZSBOYW1lVmFsdWVVbml0U2VxdWVuY2VJdGVyYXRvciB7CisKKyAgIC8qKiAoMjcwMDEpCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI3MDAyKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI3MDAzKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHBhcmFtICBob3dfbWFueSAgVGhlIG51bWJlciBvZiByZXF1ZXN0ZWQgZWxlbWVudHMuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IG4gdmFsdWVzIG9mIHRoZSBuYW1lLXZhbHVlLXVuaXQgIHNlcXVlbmNlLiBGb3IKKyAgICogICAgICAgICAgZWFjaCBOYW1lVmFsdVVuaXQgdGhlIG5leHQgbiB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgdmFsdWUKKyAgICogICAgICAgICAgc2VxdWVuY2UuCisgICAqLworICAgTmFtZVZhbHVlU2VxVW5pdFNlcXVlbmNlIG5leHROKAorICAgICAgaW4gVF9MT05HIGhvd19tYW55KQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjcwMDQpCisgICAqIEdldCB0aGUgbmV4dCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIG5leHQgbmFtZS12YWx1ZS11bml0IHR1cGxlIHNlcXVlbmNlIGZyb20gdGhlCisgICAqICAgICAgICAgIG5hbWUtdmFsdWUtdW5pdCB0dXBsZS4KKyAgICovCisgICBOYW1lVmFsdWVTZXFVbml0IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjcwMDUpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgTmFtZVZhbHVlVW5pdFNlcXVlbmNlSXRlcmF0b3IuCisKKy8qKgorKiBUaGUgQVNBTSBPRFMgZW51bWVyYXRpb24gaW50ZXJmYWNlLgorKi8KK2ludGVyZmFjZSBFbnVtZXJhdGlvbkRlZmluaXRpb24geworCisgICAvKiogKDI4MDAwKQorICAgKiBMaXN0IHRoZSBwb3NzaWJsZSBuYW1lcyBvZiB0aGUgZW51bWVyYXRpb24uIFRoZSBzb3J0IG9yZGVyIG9mIHRoZQorICAgKiBsaXN0IGlzIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbS4gVGhlIGZpcnN0IGl0ZW0gaGFzIHRoZSB2YWx1ZSB6ZXJvLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBMaXN0IHdpdGggYWxsIHBvc3NpYmxlIG5hbWVzIG9mIHRoZSBlbnVtZXJhdGlvbiBpdGVtcy4KKyAgICovCisgICBOYW1lU2VxdWVuY2UgbGlzdEl0ZW1OYW1lcygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgyODAwMSkKKyAgICogR2V0IHRoZSB2YWx1ZSBvZiBhbiBpdGVtLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19OT1RfRk9VTkQKKyAgICoKKyAgICogQHBhcmFtICBpdGVtTmFtZSAgVGhlIG5hbWUgb2YgdGhlIGl0ZW0uCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgdGhlIGl0ZW0uCisgICAqLworICAgVF9MT05HIGdldEl0ZW0oCisgICAgICBpbiBUX1NUUklORyBpdGVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDAyKQorICAgKiBHZXQgdGhlIG5hbWUgb2YgYW4gaXRlbS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqCisgICAqIEBwYXJhbSAgaXRlbSAgVGhlIHZhbHVlIG9mIHRoZSBpdGVtLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmFtZSBvZiB0aGUgaXRlbS4KKyAgICovCisgICBUX1NUUklORyBnZXRJdGVtTmFtZSgKKyAgICAgIGluIFRfTE9ORyBpdGVtKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjgwMDMpCisgICAqIEFkZCBhIG5ldyBpdGVtIHRvIHRoZSBlbnVtZXJhdGlvbi4gVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlCisgICAqIGFwcGxpY2F0aW9uIG1vZGVsIGFuZCBpcyBvbmx5IGFsbG93ZWQgZm9yIHRoZSBzdXBlciB1c2VyLgorICAgKiAKKyAgICogVGhlIG5hbWUgb2YgYW4gaXRlbSBtdXN0IG5vdCBleGNlZWQgdGhlIG1heGltdW0gbmFtZSBsZW5ndGggb2YgdGhlCisgICAqIHVuZGVybHlpbmcgcGh5c2ljYWwgc3RvcmFnZS4gQ3VycmVudCBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIHJlc3RyaWN0CisgICAqIGl0IHRvIDEyOCBjaGFyYWN0ZXJzLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fRFVQTElDQVRFX05BTUUKKyAgICogICAgQU9fRFVQTElDQVRFX1ZBTFVFCisgICAqCisgICAqIEBwYXJhbSAgaXRlbU5hbWUgIFRoZSBuYW1lIG9mIHRoZSBuZXcgaXRlbS4KKyAgICovCisgICB2b2lkIGFkZEl0ZW0oCisgICAgICBpbiBUX1NUUklORyBpdGVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDA0KQorICAgKiBSZW5hbWUgdGhlIGl0ZW0gb2YgdGhlIGVudW1lcmF0aW9uLiBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUKKyAgICogYXBwbGljYXRpb24gbW9kZWwgYW5kIGlzIG9ubHkgYWxsb3dlZCBmb3IgdGhlIHN1cGVyIHVzZXIuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX1RSQU5TQUNUSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fTk9UX0ZPVU5ECisgICAqCisgICAqIEBwYXJhbSAgb2xkSXRlbU5hbWUgIFRoZSBleGlzdGluZyBuYW1lIG9mIHRoZSBpdGVtLgorICAgKgorICAgKiBAcGFyYW0gIG5ld0l0ZW1OYW1lICB0aGUgbmV3IG5hbWUgb2YgdGhlIGl0ZW0uCisgICAqLworICAgdm9pZCByZW5hbWVJdGVtKAorICAgICAgaW4gVF9TVFJJTkcgb2xkSXRlbU5hbWUsCisgICAgICBpbiBUX1NUUklORyBuZXdJdGVtTmFtZSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDA1KQorICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBOYW1lIG9mIHRoZSBlbnVtZXJhdGlvbi4KKyAgICovCisgICBUX1NUUklORyBnZXROYW1lKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI4MDA2KQorICAgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGVudW1lcmF0aW9uLiBUaGlzIG1ldGhvZCBtb2RpZmllcyB0aGUKKyAgICogYXBwbGljYXRpb24gbW9kZWwgYW5kIGlzIG9ubHkgYWxsb3dlZCBmb3IgdGhlIHN1cGVyIHVzZXIuCisgICAqIAorICAgKiBUaGUgbmFtZSBvZiBhbiBlbnVtZXJhdGlvbiBkZWZpbml0aW9uIG11c3Qgbm90IGV4Y2VlZCB0aGUgbWF4aW11bQorICAgKiBuYW1lIGxlbmd0aCBvZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBzdG9yYWdlLiBDdXJyZW50IHNlcnZlcgorICAgKiBpbXBsZW1lbnRhdGlvbnMgcmVzdHJpY3QgaXQgdG8gMzAgY2hhcmFjdGVycy4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fVFJBTlNBQ1RJT05fTk9UX0FDVElWRQorICAgKiAgICBBT19BQ0NFU1NfREVOSUVECisgICAqCisgICAqIEBwYXJhbSAgZW51bU5hbWUgIE5hbWUgb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKi8KKyAgIHZvaWQgc2V0TmFtZSgKKyAgICAgIGluIFRfU1RSSU5HIGVudW1OYW1lKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjgwMDcpCisgICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgaW5kZXggb2YgdGhlIGVudW1lcmF0aW9uLgorICAgKi8KKyAgIFRfTE9ORyBnZXRJbmRleCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworfTsgLy8gSW50ZXJmYWNlIEVudW1lcmF0aW9uRGVmaW5pdGlvbi4KKworLyoqCisqIEZvciBpdGVyYXRpb24gdGhyb3VnaCB0aGUgcmVzdWx0IGVsZW1lbnRzLCB0aGVyZSBpcyBhbHNvIGEgbmV3IGl0ZXJhdG9yCisqIG5lY2Vzc2FyeSBjYWxsZWQgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yLiBJdJJzIGZ1bmN0aW9uYWxpdHkgaXMKKyogc3RpbGwgdGhlIHNhbWUgYXMgYWxsIG90aGVyIGl0ZXJhdG9ycyBhbmQgbmVlZHMgdGhlcmVmb3JlIG5vIGZ1cnRoZXIKKyogZXhwbGFuYXRpb24uCisqIFRoZXJlIGlzIG9ubHkgb25lIGRpZmZlcmVuY2UgdG8gdGhlIG90aGVyIGl0ZXJhdGlvbnMuIFRoZSBpdGVyYXRpb24gaXMKKyogZG9uZSBvbiB0aGUgbG93ZXN0IGxldmVsIGluIHRoYXQgY2FzZSBvbiB0aGUgVFNfVW5pb25TZXEuCisqLworaW50ZXJmYWNlIEVsZW1SZXN1bHRTZXRFeHRTZXFJdGVyYXRvciB7CisKKyAgIC8qKiAoMjkwMDApCisgICAqIERlc3Ryb3kgdGhlIGl0ZXJhdG9yIGFuZCBmcmVlIHRoZSBhc3NvY2lhdGVkIG1lbW9yeS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBkZXN0cm95KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI5MDAxKQorICAgKiBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhY2Nlc3NpYmxlIGJ5IHRoZSBpdGVyYXRvci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgYWNjZXNzaWJsZSBieSB0aGUgaXRlcmF0b3IuCisgICAqLworICAgVF9MT05HIGdldENvdW50KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI5MDAyKQorICAgKiBHZXQgdGhlIG5leHQgbiBlbGVtZW50cyBmcm9tIHRoZSBzZXF1ZW5jZS4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEBwYXJhbSAgaG93X21hbnkgIFRoZSBudW1iZXIgb2YgcmVxdWVzdGVkIGVsZW1lbnRzLgorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBuIGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSB0aGUgZWxlbWVudCByZXN1bHQgc2V0CisgICAqICAgICAgICAgIHNlcXVlbmNlLgorICAgKi8KKyAgIEVsZW1SZXN1bHRTZXRFeHRTZXF1ZW5jZSBuZXh0TigKKyAgICAgIGluIFRfTE9ORyBob3dfbWFueSkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDI5MDAzKQorICAgKiBHZXQgdGhlIG5leHQgIGVsZW1lbnQgZnJvbSB0aGUgc2VxdWVuY2UuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgbmV4dCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdGhlIGVsZW1lbnQgcmVzdWx0IHNldAorICAgKiAgICAgICAgICBzZXF1ZW5jZS4KKyAgICovCisgICBFbGVtUmVzdWx0U2V0RXh0IG5leHRPbmUoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMjkwMDQpCisgICAqIFJlc2V0IHRoZSBwb2ludGVyIGluIHRoZSBlbGVtZW50IHNlcXVlbmNlIHRvIHRoZSBmaXJzdCBlbGVtZW50LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICovCisgICB2b2lkIHJlc2V0KCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgRWxlbVJlc3VsdFNldEV4dFNlcUl0ZXJhdG9yLgorCisvKioKKyogVGhlIGludGVyZmFjZSBPRFNGaWxlIGV4dGVuZHMgdGhlIGludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQuIFRodXMgYWxsCisqIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZSBJbnN0YW5jZUVsZW1lbnQgZG8gYWxzbyB3b3JrIGhlcmUuIAorKiAKKyogT0RTRmlsZSBhbGxvd3MgdG8gY3JlYXRlIGEgZmlsZSB0aGF0IGlzIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE9EUyBzZXJ2ZXIKKyogKGEgJ21hbmFnZWQgZmlsZScpLiBPRFNGaWxlIGZ1cnRoZXJtb3JlIGFsbG93cyByZWFkLCB3cml0ZSwgYXBwZW5kIG9yCisqIHJlbW92ZSBvcGVyYXRpb25zIHRvIGEgbWFuYWdlZCBmaWxlLgorKiAKKyogR2VuZXJhbCBpbmZvcm1hdGlvbiBvZiB0aGUgZmlsZSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhpcyBpbnRlcmZhY2UgYXMKKyogd2VsbC4gTm90ZSwgdGhhdCBubyByYW5kb20gYWNjZXNzIG9uIGEgZmlsZSBpcyBwcm92aWRlZDsgb25seSBhCisqIHNlcXVlbnRpYWwgcmVhZCBhbmQgYSB3cml0ZSBieSBhcHBlbmRpbmcgYXQgdGhlIGVuZCBpcyBwb3NzaWJsZS4KKyogCisqIFJlcGxhY2luZyBhbiBleGlzdGluZyBmaWxlIGJ5IGEgbmV3IG9uZSByZXF1aXJlcyB0byBmaXJzdCByZW1vdmUgdGhlCisqIG9sZCBvbmUgYW5kIHRoZW4gY3JlYXRlIHRoZSBuZXcgb25lLgorKi8KK2ludGVyZmFjZSBPRFNGaWxlIDogSW5zdGFuY2VFbGVtZW50IHsKKworICAgLyoqICgzMDAwMCkKKyAgICogR2V0IHRoZSBPRFNXcml0ZVRyYW5zZmVyIGludGVyZmFjZSBmb3IgdGhlIGZpbGUsIHRvIGFsbG93IGFwcGVuZGluZworICAgKiBmdXJ0aGVyIGJ5dGVzIHRvIHRoZSBmaWxlLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UgZm9yIHRoZSBmaWxlCisgICAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QuIFRoYXQgaW50ZXJmYWNlIGFsbG93cyB0byB3cml0ZQorICAgKiBzZXF1ZW50aWFsbHkgdG8gdGhlIGZpbGUsIGJlZ2lubmluZyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50bHkKKyAgICogZXhpc3RpbmcgZmlsZS4KKyAgICogQmVmb3JlIHJldHVybmluZyB0aGUgaW50ZXJmYWNlIE9EU1dyaXRlVHJhbnNmZXIsIHRoZSBwaHlzaWNhbCBmaWxlCisgICAqIHdpbGwgYmUgb3BlbmVkIGZvciBzdWJzZXF1ZW50IHdyaXRlIG9wZXJhdGlvbnMuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIFVQREFURSByaWdodCBmb3IgdGhlIGluc3RhbmNlIChyZXNwLgorICAgKiBmb3IgYWxsIG9mIGl0cyBhdHRyaWJ1dGVzIGluIGNhc2Ugb2YgYXR0cmlidXRlIHNlY3VyaXR5KSBmcm9tIHdoaWNoCisgICAqIHRoaXMgT0RTRmlsZSBvYmplY3Qgd2FzIGNyZWF0ZWQsIHRoZSBleGNlcHRpb24gQU9fQUNDRVNTX0RFTklFRCB3aWxsCisgICAqIGJlIHRocm93bi4KKyAgICogCisgICAqIEluIGNhc2UgdGhlIHBoeXNpY2FsIGZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0IGNhbm5vdAorICAgKiBiZSBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKiAKKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgaXMKKyAgICogY3VycmVudGx5IG9wZW5lZCBieSBhbiBPRFNSZWFkVHJhbnNmZXIgb3IgYW4gT0RTV3JpdGVUcmFuc2ZlcgorICAgKiBvYmplY3QsIHRoZSBleGNlcHRpb24gQU9fRklMRV9MT0NLRUQgd2lsbCBiZSB0aHJvd24uCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19TWVNURU1fUFJPQkxFTSB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0ZJTEVfTE9DS0VECisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UgdG8gYXBwZW5kIHRvIHRoZSBmaWxlLgorICAgKi8KKyAgIE9EU1dyaXRlVHJhbnNmZXIgYXBwZW5kKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDAxKQorICAgKiBDaGVjayB3aGV0aGVyIHRoZSBmaWxlIG1heSBiZSBvcGVuZWQgZm9yIHJlYWRpbmcuCisgICAqIAorICAgKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUKKyAgICogb2JqZWN0IG1heSBiZSBvcGVuZWQgYnkgdGhlIE9EUyBzZXJ2ZXIgZm9yIHJlYWRpbmcgYWNjZXNzLgorICAgKiAKKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIGEgYm9vbGVhbiBUUlVFIGluIGNhc2UgdGhlIGZpbGUgbWF5IGJlIG9wZW5lZCBmb3IKKyAgICogcmVhZGluZywgYW5kIGEgYm9vbGVhbiBGQUxTRSBpbiBjYXNlIGl0IGNhbm5vdCBiZSBvcGVuZWQgZm9yIHJlYWRpbmcKKyAgICogb3IgaXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHdyaXRlIGFjY2VzcyAoaS5lLiBhbiBPRFNXcml0ZVRyYW5zZmVyCisgICAqIG9iamVjdCBmb3IgdGhpcyBmaWxlIGV4aXN0cykuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBwaHlzaWNhbCBmaWxlIHJlZmVyZW5jZWQgYnkgdGhpcyBPRFNGaWxlIG9iamVjdCBjYW5ub3QKKyAgICogYmUgZm91bmQsIGZhbHNlIHdpbGwgYmUgcmV0dXJuZWQuCisgICAqCisgICAqIEB0aHJvd3MgQW9FeGNlcHRpb24KKyAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgKiAgICBBT19DT05ORUNUSU9OX0xPU1QKKyAgICogICAgQU9fSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgKiAgICBBT19OT1RfSU1QTEVNRU5URUQKKyAgICogICAgQU9fTk9fTUVNT1JZCisgICAqICAgIEFPX1NFU1NJT05fTk9UX0FDVElWRQorICAgKgorICAgKiBAcmV0dXJuICBJbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIHRoZSBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yCisgICAqICAgICAgICAgIHJlYWRpbmcKKyAgICovCisgICBUX0JPT0xFQU4gY2FuUmVhZCgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwMikKKyAgICogQ2hlY2sgd2hldGhlciB0aGUgZmlsZSBtYXkgYmUgb3BlbmVkIGZvciB3cml0aW5nLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2hlY2tzIHdoZXRoZXIgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBPRFNGaWxlCisgICAqIG9iamVjdCBtYXkgYmUgb3BlbmVkIGJ5IHRoZSBPRFMgc2VydmVyIGZvciB3cml0aW5nIGFjY2Vzcy4KKyAgICogCisgICAqIFRoZSBtZXRob2QgcmV0dXJucyBhIGJvb2xlYW4gVFJVRSBpbiBjYXNlIHRoZSB1c2VyIGhhcyBhcHByb3ByaWF0ZQorICAgKiByaWdodHMgYW5kIHRoZSBmaWxlIGNhbiBiZSBvcGVuZWQgZm9yIHdyaXRpbmcsIGFuZCBhIGJvb2xlYW4gRkFMU0UKKyAgICogaW4gY2FzZSBpdCBpcyBhbHJlYWR5IG9wZW5lZCBmb3Igd3JpdGUgYWNjZXNzIChpLmUuIGFuCisgICAqIE9EU1dyaXRlVHJhbnNmZXIgb2JqZWN0IGZvciB0aGlzIGZpbGUgZXhpc3RzKSBvciBmb3IgcmVhZCBhY2Nlc3MKKyAgICogKGkuZS4gb25lIG9yIG1vcmUgT0RTUmVhZFRyYW5zZmVyIG9iamVjdHMgZm9yIHRoaXMgZmlsZSBleGlzdCkuCisgICAqIAorICAgKiBJbiBjYXNlIGFvX2xvY2F0aW9uIGlzIGRlZmluZWQgYW5kIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIFVQREFURQorICAgKiByaWdodCBmb3IgdGhlIGluc3RhbmNlIGZyb20gd2hpY2ggdGhpcyBPRFNGaWxlIG9iamVjdCB3YXMgY3JlYXRlZCwgYQorICAgKiBib29sZWFuIEZBTFNFIHdpbGwgYmUgcmV0dXJuZWQuCisgICAqIAorICAgKiBJbiBjYXNlIGFvX2xvY2F0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIGN1cnJlbnQgdXNlciBoYXMgbm8gSU5TRVJUCisgICAqIHJpZ2h0IGZvciB0aGUgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGlzIE9EU0ZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkLCBhCisgICAqIGJvb2xlYW4gRkFMU0Ugd2lsbCBiZSByZXR1cm5lZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIEluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdGhlIGZpbGUgY2FuIGJlIG9wZW5lZCBmb3IKKyAgICogICAgICAgICAgd3JpdGluZworICAgKi8KKyAgIFRfQk9PTEVBTiBjYW5Xcml0ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwMykKKyAgICogQ3JlYXRlIGEgbmV3IGZpbGUgYXQgdGhlIE9EUyBzZXJ2ZXIgYW5kIGdldCB0aGUgT0RTV3JpdGVUcmFuc2ZlcgorICAgKiBpbnRlcmZhY2UgZm9yIHRoYXQgZmlsZSwgdG8gYWxsb3cgc3RvcmluZyBieXRlcyB0byB0aGUgZmlsZS4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIE9EU1dyaXRlVHJhbnNmZXIgaW50ZXJmYWNlIGZvciB0aGUgZmlsZQorICAgKiByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0LiBUaGF0IGludGVyZmFjZSBhbGxvd3MgdG8gd3JpdGUKKyAgICogc2VxdWVudGlhbGx5IHRvIHRoZSAoaW5pdGlhbGx5IGVtcHR5KSBmaWxlLiAKKyAgICogCisgICAqIEJlZm9yZSByZXR1cm5pbmcgdGhlIGludGVyZmFjZSBPRFNXcml0ZVRyYW5zZmVyLCB0aGUgcGh5c2ljYWwgZmlsZQorICAgKiB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIE9EUyBzZXJ2ZXIgYW5kIG9wZW5lZCBmb3Igc3Vic2VxdWVudCB3cml0ZQorICAgKiBvcGVyYXRpb25zLiBUaGUgZmlsZSBuYW1lIHdpbGwgYmUgZGVjaWRlZCBieSB0aGUgT0RTIHNlcnZlciBhbmQgc2V0CisgICAqIGFzIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tIHRoZSBiYXNlIGF0dHJpYnV0ZQorICAgKiAnYW9fbG9jYXRpb24nIG9mIHRoZSBpbnN0YW5jZSBmcm9tIHdoaWNoIHRoaXMgT0RTRmlsZSBvYmplY3Qgd2FzCisgICAqIGNyZWF0ZWQuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIElOU0VSVCByaWdodCBmb3IgdGhlIGluc3RhbmNlIGZyb20KKyAgICogd2hpY2ggdGhpcyBPRFNGaWxlIG9iamVjdCB3YXMgY3JlYXRlZCwgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19BQ0NFU1NfREVOSUVEIHdpbGwgYmUgdGhyb3duLgorICAgKiAKKyAgICogSWYgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20gJ2FvX2xvY2F0aW9uJyBvZiB0aGUgaW5zdGFuY2UgZnJvbQorICAgKiB3aGljaCB0aGlzIE9EU0ZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkIGFscmVhZHkgaGFzIGEgdmFsdWUsIHRoZQorICAgKiBpbnN0YW5jZSBwb3RlbnRpYWxseSBhbHJlYWR5IHJlZmVyZW5jZXMgYSBmaWxlIHdoaWNoIHdhcyBub3QgeWV0CisgICAqIHJlbW92ZWQsIGFuZCB0aGUgc2VydmVyIHdpbGwgY2hlY2sgd2hldGhlciB0aGF0IGZvcm1lciBmaWxlIHN0aWxsCisgICAqIGV4aXN0cy4gSWYgc28gdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duIGFuZCBubworICAgKiBuZXcgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuCisgICAqIAorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgZm9yIHdyaXRpbmcgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19TWVNURU1fUFJPQkxFTSB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0FDQ0VTU19ERU5JRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UgdG8gYSBuZXcgZmlsZS4KKyAgICovCisgICBPRFNXcml0ZVRyYW5zZmVyIGNyZWF0ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwNCkKKyAgICogQ2hlY2sgd2hldGhlciB0aGUgZmlsZSBwaHlzaWNhbGx5IGV4aXN0cyBhdCB0aGUgT0RTIHNlcnZlci4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB3aGV0aGVyIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZQorICAgKiBvYmplY3QgdHJ1bHkgZXhpc3RzIGF0IHRoZSBleHBlY3RlZCBsb2NhdGlvbiAoZS5nLiBvbiBhIHNwZWNpZmljCisgICAqIGRyaXZlL2RpcmVjdG9yeSkgd2l0aGluIHJlYWNoIG9mICB0aGUgT0RTIHNlcnZlci4KKyAgICogCisgICAqIFRoZSBtZXRob2QgcmV0dXJucyBhIGJvb2xlYW4gVFJVRSBpbiBjYXNlIHRoZSBmaWxlIGV4aXN0cywgYW5kIGEKKyAgICogYm9vbGVhbiBGQUxTRSBpbiBjYXNlIGl0IGRvZXMgbm90IGV4aXN0LgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgSW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0aGUgZmlsZSBleGlzdHMuCisgICAqLworICAgVF9CT09MRUFOIGV4aXN0cygpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwNSkKKyAgICogR2V0IHRoZSBkYXRlIG9mIHRoZSBmaWxlLgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBkYXRlIG9mIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZQorICAgKiBvYmplY3QuIFRoZSByZXR1cm5lZCBzdHJpbmcgZm9sbG93cyB0aGUgcnVsZXMgZm9yIE9EUyBkYXRlIGFuZCB0aW1lCisgICAqIHNwZWNpZmljYXRpb24gc3RyaW5ncy4KKyAgICogVGhlIGRhdGUgcmV0dXJuZWQgc2hhbGwgc3BlY2lmeSB0aGUgdGltZXN0YW1wIG9mIHRoZSBsYXRlc3QgY2hhbmdlCisgICAqIG9mIHRoZSBmaWxlLiBJdCBpcyB0aGUgaW5mb3JtYXRpb24gdGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIE9EUworICAgKiBzZXJ2ZXIgcHJvdmlkZXM7IGlmIHRoZXJlIGlzIG5vIGRhdGUgYXZhaWxhYmxlIGZyb20gdGhlIG9wZXJhdGluZworICAgKiBzeXN0ZW0gd2l0aCBleGFjdGx5IHRoaXMgbWVhbmluZywgdGhlIE9EUyBzZXJ2ZXIgc2hhbGwgcmV0dXJuIHRoZQorICAgKiBjbG9zZXN0IGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgY2Fubm90CisgICAqIGJlIGZvdW5kLCB0aGUgZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBwaHlzaWNhbCBmaWxlIHJlZmVyZW5jZWQgYnkgdGhpcyBPRFNGaWxlIG9iamVjdCBpcworICAgKiBjdXJyZW50bHkgb3BlbmVkIGJ5IGFuIE9EU1dyaXRlVHJhbnNmZXIgb2JqZWN0IG9mIGFub3RoZXIgc2Vzc2lvbiwKKyAgICogdGhlIGV4Y2VwdGlvbiBBT19GSUxFX0xPQ0tFRCB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGVyZSBpcyBubyBmaWxlIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX2xvY2F0aW9uJywgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKiAgICBBT19GSUxFX0xPQ0tFRAorICAgKgorICAgKiBAcmV0dXJuICBUaGUgZGF0ZSBvZiBsYXN0IGNoYW5nZSBvZiB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzCisgICAqICAgICAgICAgIE9EU0ZpbGUgb2JqZWN0LgorICAgKi8KKyAgIFRfREFURSBnZXREYXRlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDA2KQorICAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIGZpbGUuCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBPRFNGaWxlCisgICAqIG9iamVjdC4gCisgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBzaGFsbCBzcGVjaWZ5IHRoZSBleGFjdCBmaWxlIHNpemUgaW4gYnl0ZXMuIEl0IGlzCisgICAqIHRoZSBpbmZvcm1hdGlvbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBvZiB0aGUgT0RTIHNlcnZlciBwcm92aWRlcy4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgY2Fubm90CisgICAqIGJlIGZvdW5kLCB0aGUgZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZXJlIGlzIG5vIGZpbGUgZGVmaW5lZCBieSB0aGUgYXR0cmlidXRlIGRlcml2ZWQgZnJvbQorICAgKiAnYW9fbG9jYXRpb24nLCB0aGUgZXhjZXB0aW9uIEFPX0JBRF9PUEVSQVRJT04gd2lsbCBiZSB0aHJvd24uCisgICAqIEluIGNhc2UgdGhlIHBoeXNpY2FsIGZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0IGlzCisgICAqIGN1cnJlbnRseSBvcGVuZWQgYnkgYW4gT0RTV3JpdGVUcmFuc2ZlciBvYmplY3Qgb2YgYW5vdGhlciBzZXNzaW9uLAorICAgKiB0aGUgZXhjZXB0aW9uIEFPX0ZJTEVfTE9DS0VEIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUKKyAgICogICAgICAgICAgb2JqZWN0LgorICAgKi8KKyAgIFRfTE9OR0xPTkcgZ2V0U2l6ZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAwNykKKyAgICogUmVtb3ZlIGEgZmlsZSBmcm9tIHRoZSBPRFMgc2VydmVyLgorICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgZnJvbQorICAgKiB0aGUgT0RTIHNlcnZlciBpZiB0aGUgdXNlciBoYXMgYXBwcm9wcmlhdGUgcmlnaHRzLiBUaGUgYXR0cmlidXRlCisgICAqIGRlcml2ZWQgZnJvbSB0aGUgYmFzZSBhdHRyaWJ1dGUgJ2FvX2xvY2F0aW9uJyBvZiB0aGUgaW5zdGFuY2UgZnJvbQorICAgKiB3aGljaCB0aGlzIE9EU0ZpbGUgb2JqZWN0IHdhcyBjcmVhdGVkIHdpbGwgYmVjb21lIHVuZGVmaW5lZCBhbmQKKyAgICogYW9fc2l6ZSB3aWxsIGJlIHNldCB0byAwLgorICAgKiBJbiBjYXNlIHRoZSBjdXJyZW50IHVzZXIgaGFzIG5vIERFTEVURSByaWdodCBmb3IgdGhlIGluc3RhbmNlIGZyb20KKyAgICogd2hpY2ggdGhpcyBPRFNGaWxlIG9iamVjdCB3YXMgY3JlYXRlZCwgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19BQ0NFU1NfREVOSUVEIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGlzIGN1cnJlbnRseSBvcGVuZWQgZm9yIHdyaXRlIGFjY2VzcyAoaS5lLiBhbgorICAgKiBPRFNXcml0ZVRyYW5zZmVyIG9iamVjdCBmb3IgdGhpcyBmaWxlIGV4aXN0cykgb3IgZm9yIHJlYWQgYWNjZXNzCisgICAqIChpLmUuIG9uZSBvciBtb3JlIE9EU1JlYWRUcmFuc2ZlciBvYmplY3RzIGZvciB0aGlzIGZpbGUgZXhpc3QpIGFuCisgICAqIGV4Y2VwdGlvbiBBT19GSUxFX0xPQ0tFRCB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgZG9lcyBub3QKKyAgICogZXhpc3QsIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gd2l0aG91dCBhbnkgZnVydGhlciBmaWxlIGFjdGlvbjsgaXQKKyAgICogd2lsbCBzZXQgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20gdGhlIGJhc2UgYXR0cmlidXRlICdhb19sb2NhdGlvbicKKyAgICogdG8gdW5kZWZpbmVkIGFuZCAnYW9fc2l6ZScgdG8gMDsgaXQgd2lsbCBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIHRvCisgICAqIHNpZ25hbCB0aGUgbm9uLWV4aXN0ZW5jZSBvZiB0aGUgZmlsZS4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSBjYW5ub3QgYmUgcGh5c2ljYWxseSBkZWxldGVkIGZyb20gaXRzIGxvY2F0aW9uLCB0aGUKKyAgICogZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fQUNDRVNTX0RFTklFRAorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKi8KKyAgIHZvaWQgcmVtb3ZlKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMwMDA4KQorICAgKiBHZXQgdGhlIE9EU1JlYWRUcmFuc2ZlciBpbnRlcmZhY2UgZm9yIHRoZSBmaWxlLgorICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBPRFNSZWFkVHJhbnNmZXIgaW50ZXJmYWNlIGZvciB0aGUgZmlsZQorICAgKiByZXByZXNlbnRlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0LiBUaGF0IGludGVyZmFjZSBhbGxvd3MgdG8gcmVhZAorICAgKiBzZXF1ZW50aWFsbHkgZnJvbSB0aGUgZmlsZSwgZWl0aGVyIHN0YXJ0aW5nIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvcgorICAgKiBhdCBhIHVzZXItc3BlY2lmaWVkIGJ5dGUgbG9jYXRpb24gd2l0aGluIHRoZSBmaWxlLgorICAgKiBCZWZvcmUgcmV0dXJuaW5nIHRoZSBpbnRlcmZhY2UgT0RTUmVhZFRyYW5zZmVyLCB0aGUgcGh5c2ljYWwgZmlsZQorICAgKiB3aWxsIGJlIG9wZW5lZCBmb3IgcmVhZGluZy4KKyAgICogSW4gY2FzZSB0aGUgcGh5c2ljYWwgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgaXMKKyAgICogY3VycmVudGx5IG9wZW5lZCBieSBhbiBPRFNXcml0ZVRyYW5zZmVyIG9iamVjdCwgdGhlIGV4Y2VwdGlvbgorICAgKiBBT19GSUxFX0xPQ0tFRCB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGVyZSBpcyBubyBmaWxlIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX2xvY2F0aW9uJywgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tICdhb19sb2NhdGlvbicgaXMgZGVmaW5lZCBidXQgdGhlCisgICAqIHBoeXNpY2FsIGZpbGUgcmVmZXJlbmNlZCBieSB0aGlzIE9EU0ZpbGUgb2JqZWN0IGNhbm5vdCBiZSBmb3VuZCBvcgorICAgKiBjYW5ub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nLCB0aGUgZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwKKyAgICogYmUgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcmV0dXJuICBUaGUgT0RTUmVhZFRyYW5zZmVyIGludGVyZmFjZSB0byByZWFkIGZyb20gdGhlIGZpbGUuCisgICAqLworICAgT0RTUmVhZFRyYW5zZmVyIHJlYWQoKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzAwMDkpCisgICAqIFB1dCBhIGZpbGUgdGhhdCBpcyBhbHJlYWR5IHJlc2lkaW5nIHdpdGhpbiByZWFjaCBvZiB0aGUgT0RTIHNlcnZlcgorICAgKiB1bmRlciBjb250cm9sIG9mIHRoZSBPRFMgc2VydmVyLgorICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdG8gcHV0IGZpbGVzIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE9EUyBzZXJ2ZXIKKyAgICogKG1ha2UgdGhlbSBhICdtYW5hZ2VkIGZpbGUnKSB3aXRob3V0IHRoZSBuZWVkIHRvIHN0cmVhbSB0aGVpciBieXRlcworICAgKiB0aHJvdWdoIHRoZSBPRFNXcml0ZVRyYW5zZmVyIGludGVyZmFjZS4KKyAgICogVGhlIHBhcmFtZXRlciAnc291cmNlVXJsJyBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBmaWxlIHRoYXQKKyAgICogc2hhbGwgYmVjb21lIGEgbWFuYWdlZCBmaWxlLiBUaGlzIGxvY2F0aW9uIG11c3QgcmVmZXJlbmNlIGEgZmlsZQorICAgKiB3aGljaCBpcyBhY2Nlc3NpYmxlIGJ5IHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgd2lsbCBtb3ZlIHRoZSBmaWxlIHRvCisgICAqIGEgbG9jYXRpb24gd2hlcmUgbWFuYWdlZCBmaWxlcyByZXNpZGUgYW5kIGdpdmUgaXQgYSBuYW1lIG9mIGl0cyBvd24KKyAgICogY2hvaWNlOyB0aGUgZmlsZSB3aWxsIG5vIGxvbmdlciBleGlzdCBhdCBpdHMgcHJldmlvdXMgbG9jYXRpb24uIFRoZQorICAgKiBzZXJ2ZXIgd2lsbCBzdG9yZSBmaWxlIG5hbWUgYW5kIGxvY2F0aW9uIGluIHRoZSBhdHRyaWJ1dGUgZGVyaXZlZAorICAgKiBmcm9tICdhb19sb2NhdGlvbicgYW5kIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIHRoZSBhdHRyaWJ1dGUKKyAgICogZGVyaXZlZCBmcm9tICdhb19zaXplJy4KKyAgICogVGhlIHN0cmluZyB2YWx1ZSBvZiAnc291cmNlVXJsJyBtdXN0IGNvbXBseSB0byB0aGUgVVJMIHNwZWNpZmljYXRpb24KKyAgICogZ2l2ZW4gaW4gUkZDIDIzOTYgd2l0aCB0aGUgcmVzdHJpY3Rpb24gdGhhdCBBU0FNIE9EUyBvbmx5IHN1cHBvcnRzCisgICAqIGFic29sdXRlIFVSTHMgd2l0aCB0aGUgYWNjZXNzIHNjaGVtZSAiZmlsZToiLCBvdGhlcndpc2UgdGhlCisgICAqIGV4Y2VwdGlvbiBBT19CQURfUEFSQU1FVEVSICB3aWxsIGJlIHRocm93bi4KKyAgICogSW4gY2FzZSB0aGVyZSBpcyBubyBmaWxlIGRlZmluZWQgYnkgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX2xvY2F0aW9uJywgdGhlIGV4Y2VwdGlvbiBBT19CQURfT1BFUkFUSU9OIHdpbGwgYmUgdGhyb3duLgorICAgKiBJbiBjYXNlIHRoZSBmaWxlIGNhbm5vdCBiZSBwaHlzaWNhbGx5IG1vdmVkIGZyb20gaXRzIG9yaWdpbmFsCisgICAqIGxvY2F0aW9uIHRvIGEgc2VydmVyLWxvY2F0aW9uIHdoZXJlIG1hbmFnZWQgZmlsZXMgcmVzaWRlLCB0aGUKKyAgICogZXhjZXB0aW9uIEFPX1NZU1RFTV9QUk9CTEVNIHdpbGwgYmUgdGhyb3duIChlLmcuIGlmIHRoZSBmaWxlCisgICAqIHNwZWNpZmllZCBieSAnc291cmNlVXJsJyBkb2VzIG5vdCBleGlzdCwgb3IgaWYgaXQgY2Fubm90IGJlCisgICAqIHBoeXNpY2FsbHkgbW92ZWQsIGV0Yy4pLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKiAgICBBT19CQURfT1BFUkFUSU9OCisgICAqICAgIEFPX1NZU1RFTV9QUk9CTEVNCisgICAqCisgICAqIEBwYXJhbSAgc291cmNlVXJsICBGaWxlbmFtZSBVUkwgb2YgdGhlIGZpbGUgdG8gdGFrZSB1bmRlciBjb250cm9sIGFzCisgICAqICAgICAgICAgICAgICAgICAgICBhIG1hbmFnZWQgZmlsZS4KKyAgICovCisgICB2b2lkIHRha2VVbmRlckNvbnRyb2woCisgICAgICBpbiBUX1NUUklORyBzb3VyY2VVcmwpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMDAxMCkKKyAgICogUmVtb3ZlIGEgZmlsZSB0aGF0IGlzIGN1cnJlbnRseSB1bmRlciBjb250cm9sIG9mIHRoZSBPRFMgc2VydmVyIG91dAorICAgKiBvZiBjb250cm9sIG9mIHRoZSBzZXJ2ZXIgYW5kIG1vdmUgaXQgdG8gYSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aGluCisgICAqIHJlYWNoIG9mIHRoZSBzZXJ2ZXIuCisgICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0byB0YWtlIGZpbGVzIG91dCBvZiBjb250cm9sIG9mIHRoZSBPRFMgc2VydmVyCisgICAqIGFuZCBwbGFjZSB0aGVtIGF0IGEgc3BlY2lmaWVkIGxvY2F0aW9uLCB3aXRob3V0IHRoZSBuZWVkIHRvIHN0cmVhbQorICAgKiB0aGVpciBieXRlcyB0aHJvdWdoIHRoZSBPRFNSZWFkVHJhbnNmZXIgaW50ZXJmYWNlLgorICAgKiBUaGUgcGFyYW1ldGVyICd0YXJnZXRVcmwnIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gd2hpY2ggdGhlCisgICAqIGN1cnJlbnRseSBtYW5hZ2VkIGZpbGUgc2hhbGwgYmUgbW92ZWQuIFRoaXMgbG9jYXRpb24gbXVzdCBiZQorICAgKiBhY2Nlc3NpYmxlIGJ5IHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgd2lsbCBtb3ZlIHRoZSBmaWxlIGZyb20gdGhlCisgICAqIGxvY2F0aW9uIHdoZXJlIG1hbmFnZWQgZmlsZXMgcmVzaWRlIHRvIHRoZSBsb2NhdGlvbiBnaXZlbiBieQorICAgKiAndGFyZ2V0VXJsJzsgdGhlIGZpbGUgd2lsbCBubyBsb25nZXIgZXhpc3QgYXQgaXRzIHByZXZpb3VzIGxvY2F0aW9uLgorICAgKiBUaGUgc2VydmVyIHdpbGwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIGRlcml2ZWQgZnJvbQorICAgKiAnYW9fbG9jYXRpb24nIHRvIHVuZGVmaW5lZCBhbmQgb2YgdGhlIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20KKyAgICogJ2FvX3NpemUnIHRvIDAuCisgICAqIFRoZSBzdHJpbmcgdmFsdWUgb2YgJ3RhcmdldFVybCcgbXVzdCBjb21wbHkgdG8gdGhlIFVSTCBzcGVjaWZpY2F0aW9uCisgICAqIGdpdmVuIGluIFJGQyAyMzk2IHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgQVNBTSBPRFMgb25seSBzdXBwb3J0cworICAgKiBhYnNvbHV0ZSBVUkxzIHdpdGggdGhlIGFjY2VzcyBzY2hlbWUgImZpbGU6Ijsgb3RoZXJ3aXNlIHRoZQorICAgKiBleGNlcHRpb24gQU9fQkFEX1BBUkFNRVRFUiAgd2lsbCBiZSB0aHJvd24uCisgICAqIEluIGNhc2UgdGhlIGZpbGUgc3BlY2lmaWVkIGJ5ICd0YXJnZXRVcmwnIGFscmVhZHkgZXhpc3RzIHRoZQorICAgKiBleGNlcHRpb24gQU9fQkFEX1BBUkFNRVRFUiB3aWxsIGJlIHRocm93biBhbmQgbm8gYWN0aW9uIHdpbGwgYmUKKyAgICogcGVyZm9ybWVkIGJ5IHRoaXMgbWV0aG9kLgorICAgKiBJbiBjYXNlIHRoZSBmaWxlIHNwZWNpZmllZCBieSAndGFyZ2V0VXJsJyBjYW5ub3QgYmUgcGh5c2ljYWxseSBtb3ZlZAorICAgKiB0byB0aGUgaW50ZW5kZWQgbG9jYXRpb24sIHRoZSBleGNlcHRpb24gQU9fU1lTVEVNX1BST0JMRU0gd2lsbCBiZQorICAgKiB0aHJvd24gYW5kIG5vIGFjdGlvbiB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGlzIG1ldGhvZC4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSByZWZlcmVuY2VkIGJ5IHRoaXMgT0RTRmlsZSBvYmplY3QgaXMgY3VycmVudGx5CisgICAqIG9wZW5lZCBmb3Igd3JpdGUgYWNjZXNzIChpLmUuIGFuIE9EU1dyaXRlVHJhbnNmZXIgb2JqZWN0IGZvciB0aGlzCisgICAqIGZpbGUgZXhpc3RzKSBvciBmb3IgcmVhZCBhY2Nlc3MgKGkuZS4gb25lIG9yIG1vcmUgT0RTUmVhZFRyYW5zZmVyCisgICAqIG9iamVjdHMgZm9yIHRoaXMgZmlsZSBleGlzdCkgYW4gZXhjZXB0aW9uIEFPX0ZJTEVfTE9DS0VEIHdpbGwgYmUKKyAgICogdGhyb3duIGFuZCBubyBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQgYnkgdGhpcyBtZXRob2QuCisgICAqIEluIGNhc2UgdGhlcmUgaXMgbm8gZmlsZSBkZWZpbmVkIGJ5IHRoZSBhdHRyaWJ1dGUgZGVyaXZlZCBmcm9tCisgICAqICdhb19sb2NhdGlvbicsIHRoZSBleGNlcHRpb24gQU9fQkFEX09QRVJBVElPTiB3aWxsIGJlIHRocm93bi4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICogICAgQU9fRklMRV9MT0NLRUQKKyAgICogICAgQU9fU1lTVEVNX1BST0JMRU0KKyAgICogICAgQU9fQkFEX09QRVJBVElPTgorICAgKiAgICBBT19CQURfUEFSQU1FVEVSCisgICAqCisgICAqIEBwYXJhbSAgdGFyZ2V0VXJsICBGaWxlbmFtZSBVUkwgb2YgdGhlIGZpbGUgd2hlcmUgdG8gbW92ZSB0aGUKKyAgICogICAgICAgICAgICAgICAgICAgIG1hbmFnZWQgZmlsZS4KKyAgICovCisgICB2b2lkIHJlbW92ZUZyb21Db250cm9sKAorICAgICAgaW4gVF9TVFJJTkcgdGFyZ2V0VXJsKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBPRFNGaWxlLgorCisvKioKKyogVGhlIGludGVyZmFjZSB3aGljaCBhbGxvd3MgYSByZWFkIHRyYW5zZmVyIChmcm9tIHRoZSBPRFMgc2VydmVyIHRvIGEKKyogY2xpZW50KSBvZiB0aGUgY29udGVudCBvZiBhIGZpbGUgdGhhdCBpcyB1bmRlciBjb250cm9sIG9mIHRoZSBPRFMKKyogc2VydmVyLgorKi8KK2ludGVyZmFjZSBPRFNSZWFkVHJhbnNmZXIgeworCisgICBjb25zdCBUX0xPTkcgUkVBREFMTCA9IC0xOyAvLyBSZWFkIGFsbCBieXRlcyBvZiB0aGUgZmlsZS4KKworICAgLyoqICgzMTAwMCkKKyAgICogQ2xvc2UgdGhpcyBPRFNSZWFkVHJhbnNmZXIgaW50ZXJmYWNlLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgY2xvc2VzIHRoZSBmaWxlIG9uIHRoZSBPRFMgc2VydmVyJ3MgZmlsZSBzeXN0ZW0gYW5kCisgICAqIGRlc3Ryb3lzIHRoaXMgT0RTUmVhZFRyYW5zZmVyIG9iamVjdC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBjbG9zZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMTAwMSkKKyAgICogUmVhZCBhIHNlcXVlbmNlIG9mIGJ5dGVzIGZyb20gdGhlIGZpbGUuCisgICAqIFRoaXMgbWV0aG9kIHJlYWRzIHRoZSBmaWxlIGF0IHRoZSBPRFMgc2VydmVyIHJlZmVyZW5jZWQgYnkgdGhpcworICAgKiBPRFNSZWFkVHJhbnNmZXIgYW5kIHJldHVybnMgYSBzZXF1ZW5jZSBvZiBieXRlcyBmcm9tIHRoYXQgZmlsZS4KKyAgICogCisgICAqIFRoZSBwYXJhbWV0ZXIgJ21heE9jdGV0cycgY29udHJvbHMgdGhlIHJldHVybiBiZWhhdmlvciBvZiB0aGUgT0RTCisgICAqIHNlcnZlci4gSWYgdGhlIGZpbGUgY29udGFpbnMgbW9yZSBieXRlcyB0aGFuIGFyZSBnaXZlbiBieQorICAgKiAnbWF4T2N0ZXRzJywgb25seSAnbWF4T2N0ZXRzJyBieXRlcyB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBmaXJzdAorICAgKiBtZXRob2QgaW52b2NhdGlvbi4gQSBzdWJzZXF1ZW50IG1ldGhvZCBpbnZvY2F0aW9uIHdpbGwgcmV0dXJuIHRoZQorICAgKiBuZXh0ICdtYXhPY3RldHMnIGJ5dGVzIGZyb20gdGhlIGZpbGUsIGV0Yy4sIHVudGlsIHRoZSBjb21wbGV0ZSBmaWxlCisgICAqIGNvbnRlbnRzIGhhcyBiZWVuIHJldHVybmVkLiBGdXJ0aGVyIG1ldGhvZCBpbnZvY2F0aW9ucyByZXR1cm4gYW4KKyAgICogZW1wdHkgc2VxdWVuY2UuCisgICAqIAorICAgKiBJZiAnbWF4T2N0ZXRzJyBpcyBnaXZlbiB3aXRoIGEgZXF1YWwgdG8gdGhlIGNvbnN0YW50IFJFQURBTEwoLTEpLAorICAgKiB0aGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiB0aGUgbnVtYmVyIG9mIGJ5dGVzLCBhbmQgdGhlIGNvbXBsZXRlCisgICAqIGZpbGUgY29udGVudHMgd2lsbCBiZSByZXR1cm5lZCB3aXRoIG9ubHkgb25lIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgKiAKKyAgICogTm90ZSB0aGF0IG9ubHkgYSBzZXF1ZW50aWFsIHJlYWRpbmcsIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBieXRlIG9mCisgICAqIHRoZSBmaWxlLCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbnRlcmZhY2UuIElmIHByZXZpb3VzIHBhcnRzIG9mIHRoZQorICAgKiBmaWxlIG5lZWQgdG8gYmUgYWNjZXNzZWQgYWdhaW4sIHRoZSBjdXJyZW50IE9EU1JlYWRUcmFuc2ZlciBvYmplY3QKKyAgICogbXVzdCBiZSBjbG9zZWQgYW5kIGEgbmV3IG9uZSBtdXN0IGJlIGluc3RhbnRpYXRlZC4KKyAgICogCisgICAqIEluIGNhc2UgdGhlIHBhcmFtZXRlciAnbWF4T2N0ZXRzJyBpcyBuZWdhdGl2ZSBvdGhlciB0aGVuIHRoZQorICAgKiBjb25zdGFudCBSRUFEQUxMIHRoZSBleGNlcHRpb24gQU9fQkFEX1BBUkFNRVRFUiBpcyB0aHJvd24uCisgICAqIAorICAgKiBJbiBjYXNlIHRoZXJlIGlzIGFueSBwcm9ibGVtIHJlYWRpbmcgdGhlIGZpbGUsIHRoZSBleGNlcHRpb24KKyAgICogQU9fU1lTVEVNX1BST0JMRU0gaXMgdGhyb3duLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICogICAgQU9fU1lTVEVNX1BST0JMRU0KKyAgICogICAgQU9fQkFEX1BBUkFNRVRFUgorICAgKgorICAgKiBAcGFyYW0gIG1heE9jdGV0cyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJldHVybmVkIGJ5IG9uZQorICAgKiAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwuCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBuZXh0IChhdCBtb3N0ICdtYXhPY3RldHMnKSBieXRlcyBpbiB0aGUgZmlsZS4KKyAgICovCisgICBTX0JZVEUgZ2V0T2N0ZXRTZXEoCisgICAgICBpbiBUX0xPTkcgbWF4T2N0ZXRzKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKKyAgIC8qKiAoMzEwMDIpCisgICAqIFNraXAgYSBudW1iZXIgb2YgYnl0ZXMgd2hpbGUgcmVhZGluZyB0aGUgZmlsZS4KKyAgICogVGhpcyBtZXRob2QgbW92ZXMgdGhlIHJlYWQgcG9pbnRlciBpbiB0aGUgZmlsZSBhIG51bWJlciBvZiBieXRlcworICAgKiBhaGVhZCwgc3RhcnRpbmcgYXQgaXRzIGN1cnJlbnQgcG9zaXRpb247IGl0IHdpbGwgbm90IHJldHVybiB0aG9zZQorICAgKiBieXRlcy4gVGhlIHBhcmFtZXRlciAnbnVtT2N0ZXRzJyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0bworICAgKiBza2lwLgorICAgKiAKKyAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSB0cnVlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgc2tpcHBlZC4gVGhpcworICAgKiBtYXkgZGlmZmVyIGZyb20gJ251bU9jdGV0cycgZS5nLiBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkLgorICAgKiBJZiB0aGUgcmVhZCBwb2ludGVyIGhhcyByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW55IGZ1cnRoZXIKKyAgICogbWV0aG9kIGludm9jYXRpb25zIHdpbGwgcmV0dXJuIGEgdmFsdWUgb2YgMCBmb3IgJ251bVNraXBwZWQnLgorICAgKiAKKyAgICogVGhpcyBtZXRob2QgbWF5IGJlIGludm9rZWQgc2V2ZXJhbCB0aW1lcyBhbmQgbWF5IGJlIGFyYml0cmFyaWx5CisgICAqIGNvbWJpbmVkIHdpdGggZ2V0T2N0ZXRTZXEoKS4KKyAgICogCisgICAqIE5vdGUgdGhhdCBvbmx5IGEgc2VxdWVudGlhbCByZWFkaW5nLCBzdGFydGluZyBhdCB0aGUgZmlyc3QgYnl0ZSBvZgorICAgKiB0aGUgZmlsZSwgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgaW50ZXJmYWNlLiBJZiBwcmV2aW91cyBwYXJ0cyBvZiB0aGUKKyAgICogZmlsZSBuZWVkIHRvIGJlIGFjY2Vzc2VkIGFnYWluLCB0aGUgY3VycmVudCBPRFNSZWFkVHJhbnNmZXIgb2JqZWN0CisgICAqIG11c3QgYmUgY2xvc2VkIGFuZCBhIG5ldyBvbmUgbXVzdCBiZSBpbnN0YW50aWF0ZWQuCisgICAqIAorICAgKiBJZiAnbnVtT2N0ZXRzJyBpcyBnaXZlbiB3aXRoIGEgdmFsdWUgbGVzcyB0aGFuIDAsIHRoZSBtZXRob2Qgd2lsbAorICAgKiB0aHJvdyB0aGUgZXhjZXB0aW9uIEFPX0JBRF9QQVJBTUVURVIgYW5kIHdpbGwgbm90IHBlcmZvcm0gYW55IGZpbGUKKyAgICogYWNjZXNzIG5vciBjaGFuZ2UgdGhlIHJlYWQgcG9pbnRlci4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX0JBRF9QQVJBTUVURVIKKyAgICoKKyAgICogQHBhcmFtICBudW1PY3RldHMgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgc2tpcHBlZC4KKyAgICoKKyAgICogQHJldHVybiAgdGhlIHJlYWwgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQgaW4gdGhlIGZpbGUuCisgICAqLworICAgVF9MT05HTE9ORyBza2lwT2N0ZXRzKAorICAgICAgaW4gVF9MT05HTE9ORyBudW1PY3RldHMpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMTAwMykKKyAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlYWQgcG9pbnRlciBpbiB0aGUgZmlsZS4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgZmlsZSBwb2ludGVyLgorICAgKiBUaGUgc3RhcnQgb2YgdGhlIGZpbGUgY29ycmVzcG9uZHMgdG8gYSBwb3NpdGlvbiBvZiAwLgorICAgKgorICAgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICogICAgQU9fQ09OTkVDVElPTl9MT1NUCisgICAqICAgIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICogICAgQU9fTk9UX0lNUExFTUVOVEVECisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyAgICoKKyAgICogQHJldHVybiAgVGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlYWQgcG9pbnRlciBpbiB0aGUgZmlsZS4KKyAgICovCisgICBUX0xPTkdMT05HIGdldFBvc2l0aW9uKCkKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCit9OyAvLyBJbnRlcmZhY2UgT0RTUmVhZFRyYW5zZmVyLgorCisvKioKKyogVGhlIGludGVyZmFjZSB3aGljaCBhbGxvd3MgYSB3cml0ZSB0cmFuc2ZlciAoZnJvbSBhIGNsaWVudCB0byB0aGUgT0RTCisqIHNlcnZlcikgb2YgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIHRoYXQgaXMgdW5kZXIgY29udHJvbCBvZiB0aGUgT0RTCisqIHNlcnZlci4KKyovCitpbnRlcmZhY2UgT0RTV3JpdGVUcmFuc2ZlciB7CisKKyAgIC8qKiAoMzIwMDApCisgICAqIENsb3NlIHRoaXMgT0RTV3JpdGVUcmFuc2ZlciBpbnRlcmZhY2UuCisgICAqIFRoaXMgbWV0aG9kIGNsb3NlcyB0aGUgZmlsZSBvbiB0aGUgT0RTIHNlcnZlcidzIGZpbGUgc3lzdGVtOyB0aGVyZWJ5CisgICAqIGFueSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYW5kIHN0aWxsIHJlc2lkaW5nIGluIE9EUyBzZXJ2ZXIKKyAgICogY2FjaGUgd2lsbCBiZSBmbHVzaGVkIHRvIHRoZSBmaWxlLiAKKyAgICogVGhlIG1ldGhvZCBmaW5hbGx5IGRlc3Ryb3lzIHRoaXMgT0RTV3JpdGVUcmFuc2ZlciBvYmplY3QgYW5kIGFsc28KKyAgICogdGhlIGNvcnJlc3BvbmRpbmcgQ09SQkEgb2JqZWN0LiBBY2Nlc3MgdG8gc3VjaCBvYmplY3RzIGFmdGVyIGhhdmluZworICAgKiBpbnZva2VkIHRoaXMgY2xvc2UgbWV0aG9kIHdpbGwgbGVhZCB0byBhIENPUkJBIGV4Y2VwdGlvbi4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSBjcmVhdGlvbiBhbmQvb3Igd3JpdGUgb3BlcmF0aW9ucyBoYXZlIGJlZW4KKyAgICogcGVyZm9ybWVkIHdpdGhpbiBhIHRyYW5zYWN0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIG5vdCB5ZXQgc2F2ZSB0aGUKKyAgICogb3BlcmF0aW9ucycgcmVzdWx0cyBwZXJtYW5lbnRseSBhdCB0aGUgcGh5c2ljYWwgZmlsZSBsb2NhdGlvbiBidXQKKyAgICoga2VlcCB0aGVtIGluIGludGVybWVkaWF0ZSBzdG9yYWdlIHVudGlsIHRoZSB0cmFuc2FjdGlvbiBpcworICAgKiBjb21taXR0ZWQuIFRoZSBmaWxlIHdpbGwgYmUgbG9ja2VkIGZvciBhbnkgYWNjZXNzIHRocm91Z2gKKyAgICogT0RTUmVhZFRyYW5zZmVyIG9yIE9EU1dyaXRlVHJhbnNmZXIgd2l0aGluIGFueSBvdGhlciBzZXNzaW9uIHVudGlsCisgICAqIHRoZSBlbmQgb2YgdGhlIHRyYW5zYWN0aW9uLgorICAgKiBBbnkgc3Vic2VxdWVudCByZWFkIHRyYW5zZmVycyBvciB3cml0ZSB0cmFuc2ZlcnMgd2l0aGluIHRoZSBzYW1lCisgICAqIHRyYW5zYWN0aW9uIGFyZSBhbGxvd2VkLCBhbmQgd2lsbCB3b3JrIG9uIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUKKyAgICogZmlsZS4gSW4gY2FzZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIHdpdGhvdXQgYSBwcmVjZWRpbmcgY2xvc2UKKyAgICogb3BlcmF0aW9uIHRoZSBPRFNXcml0ZVRyYW5zZmVyIHdpbGwgYmUgY2xvc2VkIGF1dG9tYXRpY2FsbHkgYnkgdGhlCisgICAqIHNlcnZlci4KKyAgICogSW4gY2FzZSB0aGUgZmlsZSBjcmVhdGlvbiBhbmQvb3Igd3JpdGUgb3BlcmF0aW9ucyBoYXZlIGJlZW4KKyAgICogcGVyZm9ybWVkIG91dHNpZGUgYSB0cmFuc2FjdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBtYWtlIGFsbCBjaGFuZ2VzCisgICAqIHBlcm1hbmVudC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqLworICAgdm9pZCBjbG9zZSgpCisgICAgICByYWlzZXMgKEFvRXhjZXB0aW9uKTsKKworICAgLyoqICgzMjAwMSkKKyAgICogV3JpdGUgYSBzZXF1ZW5jZSBvZiBieXRlcyB0byB0aGUgZmlsZS4KKyAgICogVGhpcyBtZXRob2Qgd3JpdGVzIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdG8gdGhlIGZpbGUgYXQgdGhlIE9EUyBzZXJ2ZXIKKyAgICogcmVwcmVzZW50ZWQgYnkgdGhpcyBPRFNXcml0ZVRyYW5zZmVyLiAKKyAgICogCisgICAqIFRoZSBwYXJhbWV0ZXIgJ2J1ZmZlcicgY29udGFpbnMgdGhlIGJ5dGUgc2VxdWVuY2UgdGhhdCBpcyB0byBiZQorICAgKiB3cml0dGVuIHRvIHRoZSBmaWxlLiBUaGUgY29udGVudHMgb2YgJ2J1ZmZlcicgd2lsbCBiZSBhcHBlbmRlZCBhdAorICAgKiB0aGUgZW5kIG9mIHRoZSBmaWxlICh3aGljaCBtYXkgYWxzbyBiZSB0aGUgdmVyeSBzdGFydCBvZiB0aGUgZmlsZSBpbgorICAgKiBjYXNlIHRoZSBmaWxlIHdhcyBuZXdseSBjcmVhdGVkKSwgYW5kIHN1YnNlcXVlbnQgbWV0aG9kIGludm9jYXRpb25zCisgICAqIHdpbGwgYWRkIHRoZWlyIGJ5dGVzIGF0IHRoZSB0aGVuIGFjdHVhbCBlbmQgb2YgdGhlIGZpbGUuCisgICAqIAorICAgKiBOb3RlIHRoYXQgb25seSBhIHNlcXVlbnRpYWwgd3JpdGluZyBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBpbnRlcmZhY2UuCisgICAqIElmIHByZXZpb3VzIHBhcnRzIG9mIHRoZSBmaWxlIG5lZWQgdG8gYmUgY2hhbmdlZCwgdGhlIGZpbGUgbXVzdCBiZQorICAgKiByZW1vdmVkIGFuZCBhIG5ldyBvbmUgbXVzdCBiZSBjcmVhdGVkLgorICAgKiAKKyAgICogSW4gY2FzZSB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgZmlsZSBydW5zIG91dCBvZiBtZW1vcnkgb3IgYW55CisgICAqIG90aGVyIG9wZXJhdGluZyBzeXN0ZW0gcHJvYmxlbSBvY2N1cnMgdGhlIE9EUyBzZXJ2ZXIgd2lsbCByZXR1cm4gdGhlCisgICAqIGV4Y2VwdGlvbiBBT19TWVNURU1fUFJPQkxFTS4gSW4gdGhpcyBjYXNlIHRoZSByZXN1bHRzIG9mIHRoZSBhY3R1YWwKKyAgICogcHV0T2N0ZXRTZXEoKSBpbnZvY2F0aW9uIHdpbGwgYmUgdW5kb25lIChubyBieXRlIG9mICdidWZmZXInIGlzCisgICAqIGFkZGVkIHRvIHRoZSBmaWxlKSBhbmQgdGhlIGZpbGUgbWF5IGJlIGNsb3NlZCB3aXRob3V0IGNvbnRhaW5pbmcKKyAgICogJ2J1ZmZlcicgYXQgaXRzIGVuZC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqICAgIEFPX05PX01FTU9SWQorICAgKiAgICBBT19TWVNURU1fUFJPQkxFTQorICAgKgorICAgKiBAcGFyYW0gIGJ1ZmZlciAgVGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0CisgICAqICAgICAgICAgICAgICAgICBzaGFsbCBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLgorICAgKi8KKyAgIHZvaWQgcHV0T2N0ZWN0U2VxKAorICAgICAgaW4gU19CWVRFIGJ1ZmZlcikKKyAgICAgIHJhaXNlcyAoQW9FeGNlcHRpb24pOworCisgICAvKiogKDMyMDAyKQorICAgKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlciBpbiB0aGUgZmlsZS4KKyAgICogCisgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGN1cnJlbnQgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlci4KKyAgICogVGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGNvcnJlc3BvbmRzIHRvIGEgcG9zaXRpb24gb2YgMC4KKyAgICoKKyAgICogQHRocm93cyBBb0V4Y2VwdGlvbgorICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAqICAgIEFPX0NPTk5FQ1RJT05fTE9TVAorICAgKiAgICBBT19JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAqICAgIEFPX05PVF9JTVBMRU1FTlRFRAorICAgKiAgICBBT19OT19NRU1PUlkKKyAgICogICAgQU9fU0VTU0lPTl9OT1RfQUNUSVZFCisgICAqCisgICAqIEByZXR1cm4gIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB3cml0ZSBwb2ludGVyIGluIHRoZSBmaWxlLgorICAgKi8KKyAgIFRfTE9OR0xPTkcgZ2V0UG9zaXRpb24oKQorICAgICAgcmFpc2VzIChBb0V4Y2VwdGlvbik7CisKK307IC8vIEludGVyZmFjZSBPRFNXcml0ZVRyYW5zZmVyLgorCit9OyAvLyBNb2R1bGUgb2RzLgorCit9OyAvLyBNb2R1bGUgYXNhbS4KKworfTsgLy8gTW9kdWxlIG9yZy4KKworCisjZW5kaWYKKworLyoqCisqIFRoZSBBU0FNIE9EUyBlcnJvciBjb2Rlcy4KKyoKKyogQU9fQUNDRVNTX0RFTklFRAorKiBUaGUgT0RTIHNlcnZlciBkZW5pZWQgdGhlIGFjY2Vzcy4KKyoKKyogQU9fQkFEX09QRVJBVElPTgorKiBBIG1ldGhvZCB3YXMgY2FsbGVkIHdoaWNoIGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuCisqCisqIEFPX0JBRF9QQVJBTUVURVIKKyogQSBwYXJhbWV0ZXIgb2Ygd3JvbmcgdHlwZSBvciB2YWx1ZSB3YXMgcGFzc2VkIHRvIHRoZSBtZXRob2QuIFRoZQorKiBtaW5vckNvZGUgdGVsbHMgd2hpY2ggcGFyYW1ldGVyICgxLCAyLCAzIG9yIDQpIGlzIGJhZC4gSWYgbW9yZSB0aGFuIG9uZQorKiBwYXJhbWV0ZXIgaXMgYmFkLCBvbmx5IHRoZSBmaXJzdCBvbmUgaXMgcmVwb3J0ZWQuCisqCisqIEFPX0NPTk5FQ1RJT05fTE9TVAorKiBEdWUgdG8gYSBoYXJkd2FyZSBvciBuZXR3b3JrIHNvZnR3YXJlIHByb2JsZW0gdGhlIGNvbm5lY3Rpb24gdG8gdGhlCisqIHNlcnZlciB3YXMgbG9zdC4KKyoKKyogQU9fQ09OTkVDVF9GQUlMRUQKKyogVGhlIGNvbm5lY3QgdG8gYSBzZXJ2ZXIgZmFpbGVkLiBUaGlzIGVycm9yIG1heSBvY2N1ciBpZiB0aGUgc2VydmVyIGlzCisqIGRvd24gb3IgY3VycmVudGx5IHVucmVhY2hhYmxlLgorKgorKiBBT19DT05ORUNUX1JFRlVTRUQKKyogVGhlIGNvbm5lY3Rpb24gd2FzIHJlZnVzZWQgYnkgdGhlIHNlcnZlci4gVGhpcyBlcnJvciBtYXkgb2NjdXIgaWYgdGhlCisqIHByZXNlbnRlZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpcyBlaXRoZXIgaW5jb3JyZWN0IG9yIGluY29tcGxldGUuCisqIFRoaXMgZXJyb3Igc2hhbGwgbm90IG9jY3VyIGlmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgYWNjZXB0IGFueSBtb3JlCisqIHNlc3Npb25zIGR1ZSB0byBvdmVybG9hZCBwcm9ibGVtcy4gU2VlIEFPX1NFU1NJT05fTElNSVRfUkVBQ0hFRCBmb3IKKyogdGhpcyBjYXNlLgorKgorKiBBT19EVVBMSUNBVEVfQkFTRV9BVFRSSUJVVEUKKyogQW55IGFwcGxpY2F0aW9uIGVsZW1lbnQgbWF5IGhhdmUgb25seSBvbmUgYmFzZSBhdHRyaWJ1dGUgb2YgYSBjZXJ0YWluCisqIHR5cGUuIFRoaXMgbWVhbnMgaXQgbWF5IGhhdmUgb25seSBvbmUgYXR0cmlidXRlIG9mIGJhc2UgYXR0cmlidXRlIHR5cGUKKyogTkFNRSwgb25lIElELCBvbmUgVkVSU0lPTiBhbmQgc28gb24uCisqCisqIEFPX0RVUExJQ0FURV9OQU1FCisqIFRoZSBpbXBsaWNpdCBvciBleHBsaWNpdCBzcGVjaWZpZWQgbmFtZSBpcyBhbHJlYWR5IGluIHVzZSBidXQgaXQgaXMKKyogcmVxdWlyZWQgdG8gYmUgdW5pcXVlLgorKgorKiBBT19EVVBMSUNBVEVfVkFMVUUKKyogVGhlIGF0dHJpYnV0ZSBpcyBtYXJrZWQgdW5pcXVlIGluIHRoZSBhcHBsaWNhdGlvbiBtb2RlbC4gVGh1cyBkdXBsaWNhdGUKKyogdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4KKyoKKyogQU9fRklMRV9MT0NLRUQKKyogVGhlIGtpbmQgb2YgYWNjZXNzIHRvIGEgbWFuYWdlZCBmaWxlIHRoYXQgd2FzIHJlcXVlc3RlZCBjYW5ub3QgYmUKKyogZ3JhbnRlZCwgYXMgdGhlIGZpbGUgaXMgY3VycmVudGx5IGluIHVzZSBieSBhbm90aGVyIHJlYWQgb3Igd3JpdGUKKyogdHJhbnNmZXIgdGhyb3VnaCB0aGUgT08tQVBJLgorKgorKiBBT19IQVNfQkFTRV9BVFRSSUJVVEUKKyogQmFzZSBhdHRyaWJ1dGUgZm91bmQuIEl0IGlzIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgZGF0YXR5cGUsIHVuaXF1ZS0KKyogb3Igb2JsaWdhdG9yeSBmbGFnIC4KKyoKKyogQU9fSEFTX0JBU0VfUkVMQVRJT04KKyogQmFzZSByZWxhdGlvbiBmb3VuZC4gSXQgaXMgbm90IGFsbG93ZWQgdG8gbW9kaWZ5IHRoZSByZWxhdGlvbnR5cGUsCisqIC1yYW5nZSBvciAtc2hpcCBvZiBhbiBhcHBsaWNhdGlvbiByZWxhdGlvbiBkZXJpdmVkIGZyb20gYSBiYXNlCisqIHJlbGF0aW9uLgorKgorKiBBT19IQVNfSU5TVEFOQ0VTCisqIFRoZSBvcGVyYXRpb24gaXMgbm90IGFsbG93ZWQgZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBpbnN0YW5jZXMuCisqCisqIEFPX0hBU19SRUZFUkVOQ0VTCisqIFRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgYmVjYXVzZSB0aGUgdGFyZ2V0IGVsZW1lbnQgaGFzCisqIHJlZmVyZW5jZXMuCisqCisqIEFPX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyogVGhpcyBlcnJvciBpcyByZXNlcnZlZCBmb3IgdGhlIHJlcG9ydGluZyBvZiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworKiBwcm9ibGVtcyB0aGF0IGFyZSBub3QgcHJvcGVybHkgaGFuZGxlZCBieSB0aGUgc3RhbmRhcmQgZXJyb3IKKyogZGVmaW5pdGlvbnMuIEFuIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgY3Jhc2ggaWYgdGhpcyBlcnJvciBvY2N1cnMgYnV0CisqIHRoZXJlIGlzIG5vIHdheSB0byByZWFjdCB0byB0aGlzIGVycm9yIG90aGVyIHRoYW4gcmVwb3J0aW5nIGFuZAorKiBpZ25vcmluZworKiBpdC4gVGhlIGludGVuZCBvZiB0aGlzIGVycm9yIGlzIG5vdCB0byBsZWF2ZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYworKiBlcnJvcnMgdW5yZXBvcnRlZC4KKyoKKyogQU9fSU5DT01QQVRJQkxFX1VOSVRTCisqIFRoZSB1bml0cyBhcmUgaW5jb21wYXRpYmxlLiBObyBjb252ZXJzaW9uIHJ1bGUgaXMga25vd24uCisqCisqIEFPX0lOVkFMSURfQVNBTV9QQVRICisqIFRoZSBzcGVjaWZpZWQgQXNhbSBwYXRoIGlzIGludmFsaWQuCisqCisqIEFPX0lOVkFMSURfQVRUUklCVVRFX1RZUEUKKyogVGhlIHJlcXVlc3RlZCBhdHRyaWJ1dGUgdHlwZSBpcyBpbnZhbGlkLgorKgorKiBBT19JTlZBTElEX0JBU0VUWVBFCisqIFRoZSBzcGVjaWZpZWQgYmFzZSB0eXBlIGlzIGludmFsaWQuIFRoZSBmb2xsb3dpbmcgYmFzZXR5cGVzIGFyZQorKiBhbGxvd2VkOgorKiAgICBBb0FueQorKiAgICBBb0F0dHJpYnV0ZU1hcAorKiAgICBBb0Vudmlyb25tZW50CisqICAgIEFvRmlsZQorKiAgICBBb0xvY2FsQ29sdW1uCisqICAgIEFvTG9nCisqICAgIEFvTWVhc3VyZW1lbnQKKyogICAgQW9NZWFzdXJlbWVudFF1YW50aXR5CisqICAgIEFvTmFtZU1hcAorKiAgICBBb1BhcmFtZXRlcgorKiAgICBBb1BhcmFtZXRlclNldAorKiAgICBBb1BoeXNpY2FsRGltZW5zaW9uCisqICAgIEFvUXVhbnRpdHkKKyogICAgQW9RdWFudGl0eUdyb3VwCisqICAgIEFvU3VibWF0cml4CisqICAgIEFvU3ViVGVzdAorKiAgICBBb1Rlc3QKKyogICAgQW9UZXN0RGV2aWNlCisqICAgIEFvVGVzdEVxdWlwbWVudAorKiAgICBBb1Rlc3RFcXVpcG1lbnRQYXJ0CisqICAgIEFvVGVzdFNlcXVlbmNlCisqICAgIEFvVGVzdFNlcXVlbmNlUGFydAorKiAgICBBb1VuaXQKKyogICAgQW9Vbml0R3JvdXAKKyogICAgQW9Vbml0VW5kZXJUZXN0CisqICAgIEFvVW5pdFVuZGVyVGVzdFBhcnQKKyogICAgQW9Vc2VyCisqICAgIEFvVXNlckdyb3VwCisqCisqIEFPX0lOVkFMSURfQkFTRV9FTEVNRU5UCisqIFRoZSBiYXNlIGVsZW1lbnQgaXMgaW52YWxpZCBpbiB0aGlzIGNvbnRleHQuIElmIHRoaXMgaXMgYW4gZWxlbWVudCBvZgorKiB0eXBlIG1lYXN1cmVtZW50LCBhbm90aGVyIGVsZW1lbnQgb2YgdGhpcyB0eXBlIG1heSBhbHJlYWR5IGV4aXN0LgorKgorKiBBT19JTlZBTElEX0JVSUxEVVBfRlVOQ1RJT04KKyogVGhlIHNwZWNpZmllZCBidWlsZC11cCBmdW5jdGlvbiBpcyBpbnZhbGlkLgorKgorKiBBT19JTlZBTElEX0NPTFVNTgorKiBUaGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBpbnZhbGlkLgorKgorKiBBT19JTlZBTElEX0NPVU5UCisqIFRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBvaW50cyBpcyBpbnZhbGlkIChwcm9iYWJseSBuZWdhdGl2ZSkuCisqCisqIEFPX0lOVkFMSURfREFUQVRZUEUKKyogVGhlIGRhdGF0eXBlIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBnaXZlbiBjb250ZXh0IG9yIGl0IGNvbmZsaWN0cyB3aXRoCisqIGFuIGV4aXN0aW5nIGRhdGF0eXBlIGRlZmluaXRpb24uCisqIAorKiBUaGlzIGVycm9yIG1heSBhbHNvIG9jY3VyIGluIG5vbi10eXBlc2F2ZSBsYW5ndWFnZSBiaW5kaW5ncy4gVG8gYXZvaWQKKyogdGhpcyBlcnJvciBpbiBhbGwgbGFuZ3VhZ2UgYmluZGluZ3MgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGFsd2F5cyB0aGUKKyogZGVmaW5pdGlvbnMgb2YgdGhlIGVudW1lcmF0aW9uICJEYXRhVHlwZSIuCisqCisqIEFPX0lOVkFMSURfRUxFTUVOVAorKiBUaGUgZWxlbWVudCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dC4KKyoKKyogQU9fSU5WQUxJRF9MRU5HVEgKKyogVGhlIGdpdmVuIGxlbmd0aCBpcyBpbnZhbGlkLiBOZWdhdGl2ZSBsZW5ndGggdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4KKyoKKyogQU9fSU5WQUxJRF9PUkRJTkFMTlVNQkVSCisqIFRoZSBvcmRpbmFsIG51bWJlciBpcyBlaXRoZXIgYWxyZWFkeSB1c2VkIG9yIGxlc3MgdGhhbiB6ZXJvLgorKgorKiBBT19JTlZBTElEX1JFTEFUSU9OCisqIFRoZSByZWxhdGlvbiBpcyBpbnZhbGlkLiBUaGUgcmVsYXRlZCBlbGVtZW50cyBhbmQgdGhlIGJhc2UgcmVsYXRpb24gZG8KKyogbm90IGZpdC4KKyoKKyogQU9fSU5WQUxJRF9SRUxBVElPTlNISVAKKyogVGhpcyBlcnJvciBtYXkgb2NjdXIgb25seSBpbiBub24tdHlwZXNhdmUgbGFuZ3VhZ2UgYmluZGluZ3MuIFRvIGF2b2lkCisqIHRoaXMgZXJyb3IgaW4gYWxsIGxhbmd1YWdlIGJpbmRpbmdzIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBhbHdheXMgdGhlCisqIGRlZmluaXRpb25zIG9mIHRoZSBlbnVtZXJhdGlvbiAiUmVsYXRpb25zaGlwIi4KKyoKKyogQU9fSU5WQUxJRF9SRUxBVElPTl9SQU5HRQorKiBUaGUgc3BlY2lmaWVkIHJlbGF0aW9uIHJhbmdlIGlzIGludmFsaWQuCisqCisqIEFPX0lOVkFMSURfUkVMQVRJT05fVFlQRQorKiBUaGlzIGVycm9yIG1heSBvY2N1ciBvbmx5IGluIG5vbi10eXBlc2F2ZSBsYW5ndWFnZSBiaW5kaW5ncy4gVG8gYXZvaWQKKyogdGhpcyBlcnJvciBpbiBhbGwgbGFuZ3VhZ2UgYmluZGluZ3MgaXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGFsd2F5cyB0aGUKKyogZGVmaW5pdGlvbnMgb2YgdGhlIGVudW1lcmF0aW9uICJSZWxhdGlvblR5cGUiLgorKgorKiBBT19JTlZBTElEX1NFVF9UWVBFCisqIFRoZSBzcGVjaWZpZWQgc2V0LXR5cGUgaXMgaW52YWxpZC4KKyoKKyogQU9fSU5WQUxJRF9TTUFUTElOSworKiBUaGUgc3VibWF0cml4IGxpbmsgaXMgaW52YWxpZC4gRWl0aGVyIHN1Ym1hdHJpeCAxIG9yIDIgaXMgbm90IHNwZWNpZmllZAorKiBvciB0aGUgb3JkaW5hbCBudW1iZXIgaXMgbWlzc2luZyB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgU01hdExpbmsuCisqCisqIEFPX0lOVkFMSURfU1VCTUFUUklYCisqIFRoZSBzcGVjaWZpZWQgc3VibWF0cml4IGlzIGludmFsaWQuCisqCisqIEFPX0lOVkFMSURfVkFMVUVNQVRSSVhfU1RSVUNUVVJFCisqIFRoZSBzZXJ2ZXIgaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGUgdmFsdWVtYXRyaXggZHVlIHRvIHRoZSBkYXRhIG9mIHRoZQorKiBtZWFzdXJlbWVudAorKiAgICAgIC0gaWYgdGhlcmUgYXJlIG5vIGluZGVwZW5kZW50IGNvbHVtbgorKiAgICAgIC0gaWYgdGhlcmUgYXJlIGRpZmZlcmVudCBpbmRlcGVuZGVudCBjb2x1bW5zCisqICAgICAgLSBpZiB0aGVyZSBhcmUgc3VibWF0cmljZXMgd2l0aCBtb3JlIHRoYW4gb25lIGluZGVwZW5kZW50CisqICAgICAgICBjb2x1bW4uCisqICAgICAgLSAuLgorKgorKiBBT19JU19CQVNFX0FUVFJJQlVURQorKiBUaGUgYXBwbGljYXRpb24gYXR0cmlidXRlIGlzIGFscmVhZHkgb2YgYSBiYXNlIGF0dHJpYnV0ZSB0eXBlLiBJdCBjYW4KKyogbm90IGJlIGNoYW5nZWQuIElmIHRoaXMgaXMgcmVxdWlyZWQsIHRoZSBhcHBsaWNhdGlvbiBhdHRyaWJ1dGUgaGFzIHRvCisqIGJlIHJlbW92ZWQgZnJvbSBpdHMgYXBwbGljYXRpb24gZWxlbWVudCBhbmQgcmUtY3JlYXRlZC4gVGhpcyBlcnJvciBtYXkKKyogb2NjdXIgaWYgYW4gYXBwbGljYXRpb24gYXR0cmlidXRlIGRlcml2ZWQgZnJvbSBhIGJhc2UgYXR0cmlidXRlCisqIAorKiAgICBhLiBzaGFsbCBiZSBvdmVyd3JpdHRlbiBieSBhbm90aGVyIGJhc2UKKyogICAgICAgYXR0cmlidXRlIHR5cGUuCisqICAgIGIuIHNoYWxsIHJlY2VpdmUgYW5vdGhlciBkYXRhdHlwZS4KKyogICAgYy4gc2hhbGwgcmVjZWl2ZSBhbm90aGVyIHVuaXF1ZS1mbGFnLgorKiAgICBkLiBzaGFsbCByZWNlaXZlIGFub3RoZXIgb2JsaWdhdG9yeS1mbGFnLgorKgorKiBBT19JU19CQVNFX1JFTEFUSU9OCisqIFByb3BlcnRpZXMgb2YgYmFzZSByZWxhdGlvbnMgbWF5IG5vdCBiZSBjaGFuZ2VkLgorKgorKiBBT19JU19NRUFTVVJFTUVOVF9NQVRSSVgKKyogVGhlIG1hdHJpeCBpcyBhIGNvbXBsZXgsIGdlbmVyYXRlZCBtYXRyaXggZnJvbSBhIG1lYXN1cmVtZW50IG5vdCBqdXN0IGEKKyogc2ltcGxlIHN1Ym1hdHJpeC4gSXQgaXMgb25seSBhbGxvd2VkIHRvIG1vZGlmeSBzdWJtYXRyaWNlcyBidXQgbm90IHRoZQorKiBjb21wb3NlZCBtZWFzdXJlbWVudCBtYXRyaWNlcy4KKyoKKyogQU9fTUFUSF9FUlJPUgorKiBBIGNvbXB1dGF0aW9uIGVycm9yIG9jY3VycmVkLiBUaGlzIGNhbiBiZSBhbiBvdmVyZmxvdywgYW4gdW5kZXJmbG93IG9yCisqIGEgZGl2aXNpb24gYnkgemVyby4KKyoKKyogQU9fTUlTU0lOR19BUFBMSUNBVElPTl9FTEVNRU5UCisqIEEgcmVxdWlyZWQgYXBwbGljYXRpb24gZWxlbWVudCBpcyBtaXNzaW5nLgorKgorKiBBT19NSVNTSU5HX0FUVFJJQlVURQorKiBBIHJlcXVpcmVkIChvYmxpZ2F0b3J5KSBhdHRyaWJ1dGUgaXMgbWlzc2luZy4KKyoKKyogQU9fTUlTU0lOR19SRUxBVElPTgorKiBBIHJlcXVpcmVkIHJlbGF0aW9uIGlzIG1pc3NpbmcuCisqCisqIEFPX01JU1NJTkdfVkFMVUUKKyogQW4gb2JsaWdhdG9yeSB2YWx1ZSBpcyBtaXNzaW5nLgorKgorKiBBT19OT1RfRk9VTkQKKyogVGhlIHJlcXVlc3RlZCBlbGVtZW50IHdhcyBub3QgZm91bmQuIFRoaXMgZXJyb3Igb2NjdXJzIG9ubHkgaW4gcmVtb3ZlCisqIG9yIHJlbmFtZSBvcGVyYXRpb25zIGlmIHRoZSBzdWJqZWN0IG9mIHRoZSBvcGVyYXRpb24gaXMgbm90IGZvdW5kLiBBbGwKKyogZ2V0LSBhbmQgbGlzdC1tZXRob2RzIHJldHVybiBhbiBlbXB0eSBsaXN0IGlmIHRoZSByZXF1ZXN0ZWQgaXRlbSBpcyBub3QKKyogZm91bmQuCisqCisqIEFPX05PVF9JTVBMRU1FTlRFRAorKiBUaGUgcmVxdWVzdGVkIG1ldGhvZCBpcyBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGVycm9yIGlzIG5vdCBhbGxvd2VkCisqIHRvIG9jY3VyIGluIGEgY2VydGlmaWVkIGltcGxlbWVudGF0aW9uLiBJdCBpcyBpbnRlbmRlZCB0byBhbGxvdyBwYXJ0aWFsCisqIG9wZXJhdGlvbmFsIHRlc3RzLiBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuCisqCisqIEFPX05PVF9VTklRVUUKKyogVGhpcyBlcnJvciBvY2N1cnMgaWYgdGhlIGluc3RhbmNlcyBvZiBhIHByb3BlcnR5IGFyZSByZXF1aXJlZCB0byBiZQorKiB1bmlxdWUuCisqCisqIEFPX05PX01FTU9SWQorKiBObyBtb3JlIHZvbGF0aWxlIG1lbW9yeSBhdmFpbGFibGUuCisqCisqIEFPX05PX1BBVEhfVE9fRUxFTUVOVAorKiBBIGZyZWUtZmxvYXRpbmcgZWxlbWVudCB3YXMgZGV0ZWN0ZWQuIE5vIG5hdmlnYXRpb24gcGF0aCBsZWFkcyB0byB0aGlzCisqIGVsZW1lbnQuCisqCisqIEFPX05PX1NDQUxJTkdfQ09MVU1OCisqIFRoZSBjb2x1bW4gaXMgbm8gc2NhbGluZyBjb2x1bW4uCisqCisqIEFPX09QRU5fTU9ERV9OT1RfU1VQUE9SVEVECisqIFRoZSByZXF1ZXN0ZWQgb3BlbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQuIFZhbGlkIG9wZW4gbW9kZXMgYXJlICJyZWFkIgorKiBhbmQgIndyaXRlIi4gQW55dGhpbmcgZWxzZSBpcyByZWplY3RlZCB3aXRoIHRoaXMgZXJyb3IgYW5kIG5vIHNlc3Npb24KKyogaXMgY3JlYXRlZC4KKyoKKyogQU9fUVVFUllfSU5DT01QTEVURQorKiBUaGUgZXhlY3V0aW9uIG9mIHRoZSBxdWVyeSB3YXMgbm90IHlldCBjb21wbGV0ZWQuCisqCisqIEFPX1FVRVJZX0lOVkFMSUQKKyogU29tZSBlcnJvciBpbiB0aGUgcXVlcnkgc3RyaW5nIG9yIHNvbWUgaW5jb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSByZXR1cm4KKyogdHlwZSBvZiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgIHJlc3VsdCB0eXBlIHNwZWNpZmllZCBieSBwYXJhbWV0ZXIKKyogIlF1ZXJ5UmVzdWx0VHlwZSIuCisqCisqIEFPX1FVRVJZX0lOVkFMSURfUkVTVUxUVFlQRQorKiBUaGUgcmVxdWVzdGVkIHJlc3VsdCB0eXBlIG9mIHRoZSBxdWVyeSBkbyBubyBtZXRjaCB3aXRoIHRoZSBwcmV2aW91cworKiBkZWZpbml0aW9uIG9mIHRoZSByZXN1bHQgdHlwZS4KKyoKKyogQU9fUVVFUllfUFJPQ0VTU0lOR19FUlJPUgorKiBTb21lIGVycm9yIG9jY3VyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIHF1ZXJ5LgorKgorKiBBT19RVUVSWV9USU1FT1VUX0VYQ0VFREVECisqIEl0IHdhcyBub3QgcG9zc2libGUgdG8gZXhlY3V0ZSB0aGUgcXVlcnkgd2l0aGluIHRoZSAgdGltZSBsaW1pdCBzZXQgYnkKKyogcGFyYW1ldGVyICJNYXhEdXJhdGlvbiIuCisqCisqIEFPX1FVRVJZX1RZUEVfSU5WQUxJRAorKiBUaGUgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBxdWVyeSBsYW5ndWFnZSB0eXBlLgorKgorKiBBT19TRVNTSU9OX0xJTUlUX1JFQUNIRUQKKyogVGhlIHNlcnZlciBkb2VzIG5vdCBhY2NlcHQgYW55IG5ldyBjb25uZWN0aW9ucy4gVGhpcyBlcnJvciBtYXkgb2NjdXIgaWYKKyogdGhlIHNlcnZlciByZWFjaGVkIHRoZSBzZXNzaW9uIGxpbWl0IGZvciBhIGRpc3RpbmN0IHVzZXIgb3IgdGhlIHRvdGFsCisqIG51bWJlciBvZiBzZXNzaW9ucyBhbGxvd2VkLgorKgorKiBBT19TRVNTSU9OX05PVF9BQ1RJVkUKKyogVGhlIHNlc3Npb24gaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gVGhpcyBlcnJvciBvY2N1cnMgaWYgYW4gYXR0ZW1wdCBpcworKiBtYWRlIHRvIGNhbGwgYSBtZXRob2Qgb2YgYSBjbG9zZWQgc2Vzc2lvbi4gVGhpcyBlcnJvciBzaGFsbCBub3QgYmUKKyogY29uZnVzZWQgd2l0aCB0aGUgZXJyb3IgQU9fQ09OTkVDVElPTl9MT1NULgorKgorKiBBT19TWVNURU1fUFJPQkxFTQorKiBUaGUgT0RTIHNlcnZlciBkZXRlY3RlZCBhIHByb2JsZW0gd2hpbGUgYWNjZXNzaW5nIG9wZXJhdGluZyBzeXN0ZW0KKyogcmVzc291cmNlcyAoZS5nLiB0aGUgc3BlY2lmaWVkIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBkcml2ZSBpcworKiBjdXJyZW50bHkgbm90IGF2YWlsYWJsZSwgLi4uKS4KKyoKKyogQU9fVFJBTlNBQ1RJT05fQUxSRUFEWV9BQ1RJVkUKKyogVGhlcmUgbWF5IGJlIG9ubHkgb25lIGFjdGl2ZSB0cmFuc2FjdGlvbiBhdCBvbmUgdGltZS4gSWYgdGhpcyBlcnJvcgorKiBvY2N1cnMgdGhlcmUgaXMgYWxyZWFkeSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24uIFRoYXQgdHJhbnNhY3Rpb24gcmVtYWlucworKiBhY3RpdmUgaW4gY2FzZSBvZiB0aGlzIGVycm9yLgorKgorKiBBT19UUkFOU0FDVElPTl9OT1RfQUNUSVZFCisqIFdyaXRlIG9wZXJhdGlvbiBoYXZlIHRvIGJlIGRvbmUgYWx3YXlzIGluIHRoZSBjb250ZXh0IG9mIGEgdHJhbnNhY3Rpb24uCisqIFRoaXMgZXJyb3Igb2NjdXJzIGlmIG5vIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZSBkdXJpbmcgYSB3cml0ZSBvcGVyYXRpb24uCisqCisqIEFPX1VOS05PV05fRVJST1IKKyogVXNlIHRoZSB6ZXJvIGFzIHVua25vd24gZXJyb3IgdG8gYXZvaWQgY29uZnVzaW5nIGVycm9yIG1lc3NhZ2VzIGlmIG5vCisqIGVycm9yIGNvZGUgaGFzIGJlZW4gc2V0LgorKgorKiBBT19VTktOT1dOX1VOSVQKKyogVGhlIHVuaXQgaXMgdW5rbm93bi4KKyovCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE4MGYzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9BdmFsb25FdmVudC5pZGwKKyogRnJlaXRhZywgNS4gQXVndXN0IDIwMTYgMDk6NDMgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IGltcGxlbWVudHMgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JRExFbnRpdHkKK3sKKworICAvKioKKyAgKiBUaGUgbW9kZSBvZiB0aGUgZXZlbnQuCisgICovCisgIHB1YmxpYyBzaG9ydCBtb2RlID0gKHNob3J0KTA7CisKKyAgLyoqCisgICogVGhlIElkIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorICAqLworICBwdWJsaWMgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWVJZCA9IG51bGw7CisKKyAgLyoqCisgICogVGhlIElkIG9mIHRoZSBpbnN0YW5jZS4KKyAgKi8KKyAgcHVibGljIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGllSWQgPSBudWxsOworCisgIC8qKgorICAqIFRoZSBJZCBvZiB0aGUgQW9Vc2VyIGluc3RhbmNlLgorICAqLworICBwdWJsaWMgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgdXNlcklkID0gbnVsbDsKKworICAvKioKKyAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSBldmVudC4KKyAgKi8KKyAgcHVibGljIFN0cmluZyB0aW1lc3RhbXAgPSBudWxsOworCisgIHB1YmxpYyBBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50ICgpCisgIHsKKyAgfSAvLyBjdG9yCisKKyAgcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgKHNob3J0IF9tb2RlLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBfYWVJZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgX2llSWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIF91c2VySWQsIFN0cmluZyBfdGltZXN0YW1wKQorICB7CisgICAgbW9kZSA9IF9tb2RlOworICAgIGFlSWQgPSBfYWVJZDsKKyAgICBpZUlkID0gX2llSWQ7CisgICAgdXNlcklkID0gX3VzZXJJZDsKKyAgICB0aW1lc3RhbXAgPSBfdGltZXN0YW1wOworICB9IC8vIGN0b3IKKworfSAvLyBjbGFzcyBBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjYjE4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIZWxwZXIuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhlbHBlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworYWJzdHJhY3QgcHVibGljIGNsYXNzIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQ6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IHRoYXQpCisgIHsKKyAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPSBhLmNyZWF0ZV9vdXRwdXRfc3RyZWFtICgpOworICAgIGEudHlwZSAodHlwZSAoKSk7CisgICAgd3JpdGUgKG91dCwgdGhhdCk7CisgICAgYS5yZWFkX3ZhbHVlIChvdXQuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdHlwZSAoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBfX2FjdGl2ZSA9IGZhbHNlOworICBzeW5jaHJvbml6ZWQgcHVibGljIHN0YXRpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIHR5cGUgKCkKKyAgeworICAgIGlmIChfX3R5cGVDb2RlID09IG51bGwpCisgICAgeworICAgICAgc3luY2hyb25pemVkIChvcmcub21nLkNPUkJBLlR5cGVDb2RlLmNsYXNzKQorICAgICAgeworICAgICAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgaWYgKF9fYWN0aXZlKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcub21nLkNPUkJBLk9SQi5pbml0KCkuY3JlYXRlX3JlY3Vyc2l2ZV90YyAoIF9pZCApOworICAgICAgICAgIH0KKyAgICAgICAgICBfX2FjdGl2ZSA9IHRydWU7CisgICAgICAgICAgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXJbXSBfbWVtYmVyczAgPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgWzVdOworICAgICAgICAgIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3RjT2ZfbWVtYmVyczAgPSBudWxsOworICAgICAgICAgIF90Y09mX21lbWJlcnMwID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5nZXRfcHJpbWl0aXZlX3RjIChvcmcub21nLkNPUkJBLlRDS2luZC50a19zaG9ydCk7CisgICAgICAgICAgX21lbWJlcnMwWzBdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJtb2RlIiwKKyAgICAgICAgICAgIF90Y09mX21lbWJlcnMwLAorICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgX3RjT2ZfbWVtYmVyczAgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci50eXBlICgpOworICAgICAgICAgIF9tZW1iZXJzMFsxXSA9IG5ldyBvcmcub21nLkNPUkJBLlN0cnVjdE1lbWJlciAoCisgICAgICAgICAgICAiYWVJZCIsCisgICAgICAgICAgICBfdGNPZl9tZW1iZXJzMCwKKyAgICAgICAgICAgIG51bGwpOworICAgICAgICAgIF90Y09mX21lbWJlcnMwID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIudHlwZSAoKTsKKyAgICAgICAgICBfbWVtYmVyczBbMl0gPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgKAorICAgICAgICAgICAgImllSWQiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnR5cGUgKCk7CisgICAgICAgICAgX21lbWJlcnMwWzNdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJ1c2VySWQiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX3N0cmluZ190YyAoMCk7CisgICAgICAgICAgX21lbWJlcnMwWzRdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJ0aW1lc3RhbXAiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfc3RydWN0X3RjIChjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLmlkICgpLCAiQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudCIsIF9tZW1iZXJzMCk7CisgICAgICAgICAgX19hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IHJlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaXN0cmVhbSkKKyAgeworICAgIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgdmFsdWUgPSBuZXcgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudCAoKTsKKyAgICB2YWx1ZS5tb2RlID0gaXN0cmVhbS5yZWFkX3Nob3J0ICgpOworICAgIHZhbHVlLmFlSWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpc3RyZWFtKTsKKyAgICB2YWx1ZS5pZUlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaXN0cmVhbSk7CisgICAgdmFsdWUudXNlcklkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaXN0cmVhbSk7CisgICAgdmFsdWUudGltZXN0YW1wID0gaXN0cmVhbS5yZWFkX3N0cmluZyAoKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG9zdHJlYW0sIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgdmFsdWUpCisgIHsKKyAgICBvc3RyZWFtLndyaXRlX3Nob3J0ICh2YWx1ZS5tb2RlKTsKKyAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAob3N0cmVhbSwgdmFsdWUuYWVJZCk7CisgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKG9zdHJlYW0sIHZhbHVlLmllSWQpOworICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlIChvc3RyZWFtLCB2YWx1ZS51c2VySWQpOworICAgIG9zdHJlYW0ud3JpdGVfc3RyaW5nICh2YWx1ZS50aW1lc3RhbXApOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL0F2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmVkNDY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvQXZhbG9uRXZlbnQuaWRsCisqIEZyZWl0YWcsIDUuIEF1Z3VzdCAyMDE2IDA5OjQzIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudCB2YWx1ZSA9IG51bGw7CisKKyAgcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnRIb2xkZXIgKGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLkF2YWxvbk5vdGlmaWNhdGlvbkNvcmJhRXZlbnQgaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9ERUxFVEUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfREVMRVRFLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MWNjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfREVMRVRFLmphdmEKQEAgLTAsMCArMSwxOCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbjsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9ERUxFVEUuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9BdmFsb25FdmVudC5pZGwKKyogRnJlaXRhZywgNS4gQXVndXN0IDIwMTYgMDk6NDMgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBpbnRlcmZhY2UgTU9ERV9ERUxFVEUKK3sKKworICAvKioKKyAgKiBUaGUgdmFsdWUgb2YgdGhlIG1vZGUgZmllbGQgaW4gdGhlIGV2ZW50IHdoZW4gYSBkZWxldGUgaXMgcmVnaXN0ZXJlZC4KKyAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB2YWx1ZSA9IChzaG9ydCkoMyk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX0lOU0VSVC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9JTlNFUlQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmE4NmU2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9JTlNFUlQuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX0lOU0VSVC5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworcHVibGljIGludGVyZmFjZSBNT0RFX0lOU0VSVAoreworCisgIC8qKgorICAqIFRoZSB2YWx1ZSBvZiB0aGUgbW9kZSBmaWVsZCBpbiB0aGUgZXZlbnQgd2hlbiBhbiBpbnNlcnQgaXMgcmVnaXN0ZXJlZC4KKyAgKi8KKyAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCB2YWx1ZSA9IChzaG9ydCkoMSk7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX01PRElGWVJJR0hUUy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9NT0RJRllSSUdIVFMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQ4Y2NkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9NT0RJRllSSUdIVFMuamF2YQpAQCAtMCwwICsxLDE4IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2F2YWxvbkNvcmJhTm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi9NT0RFX01PRElGWVJJR0hUUy5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworcHVibGljIGludGVyZmFjZSBNT0RFX01PRElGWVJJR0hUUworeworCisgIC8qKgorICAqIFRoZSB2YWx1ZSBvZiB0aGUgbW9kZSBmaWVsZCBpbiB0aGUgZXZlbnQgd2hlbiBhIG1vZGlmeXJpZ2h0cyBpcyByZWdpc3RlcmVkLgorICAqLworICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IHZhbHVlID0gKHNob3J0KSg0KTsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfUkVQTEFDRS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24vTU9ERV9SRVBMQUNFLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMxMjFjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfUkVQTEFDRS5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb247CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvYXZhbG9uQ29yYmFOb3RpZmljYXRpb24vbm90aWZpY2F0aW9uL01PREVfUkVQTEFDRS5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL0F2YWxvbkV2ZW50LmlkbAorKiBGcmVpdGFnLCA1LiBBdWd1c3QgMjAxNiAwOTo0MyBVaHIgTUVTWgorKi8KKworcHVibGljIGludGVyZmFjZSBNT0RFX1JFUExBQ0UKK3sKKworICAvKioKKyAgKiBUaGUgdmFsdWUgb2YgdGhlIG1vZGUgZmllbGQgaW4gdGhlIGV2ZW50IHdoZW4gYSByZXBsYWNlIGlzIHJlZ2lzdGVyZWQuCisgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgdmFsdWUgPSAoc2hvcnQpKDIpOworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWYxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24uamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZXh0ZW5kcyBvcmcub21nLkNPUkJBLlVzZXJFeGNlcHRpb24KK3sKKyAgcHVibGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgZXJyQ29kZSA9IG51bGw7CisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIHNldkZsYWcgPSBudWxsOworICBwdWJsaWMgU3RyaW5nIHJlYXNvbiA9IG51bGw7CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAoKQorICB7CisgICAgc3VwZXIoQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmlkKCkpOworICB9IC8vIGN0b3IKKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIF9lcnJDb2RlLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIF9zZXZGbGFnLCBTdHJpbmcgX3JlYXNvbikKKyAgeworICAgIHN1cGVyKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5pZCgpKTsKKyAgICBlcnJDb2RlID0gX2VyckNvZGU7CisgICAgc2V2RmxhZyA9IF9zZXZGbGFnOworICAgIHJlYXNvbiA9IF9yZWFzb247CisgIH0gLy8gY3RvcgorCisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAoU3RyaW5nICRyZWFzb24sIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgX2VyckNvZGUsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgX3NldkZsYWcsIFN0cmluZyBfcmVhc29uKQorICB7CisgICAgc3VwZXIoQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmlkKCkgKyAiICAiICsgJHJlYXNvbik7CisgICAgZXJyQ29kZSA9IF9lcnJDb2RlOworICAgIHNldkZsYWcgPSBfc2V2RmxhZzsKKyAgICByZWFzb24gPSBfcmVhc29uOworICB9IC8vIGN0b3IKKworfSAvLyBjbGFzcyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM4ZTBmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCI7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydCAob3JnLm9tZy5DT1JCQS5BbnkgYSwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGV4dHJhY3QgKG9yZy5vbWcuQ09SQkEuQW55IGEpCisgIHsKKyAgICByZXR1cm4gcmVhZCAoYS5jcmVhdGVfaW5wdXRfc3RyZWFtICgpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX190eXBlQ29kZSA9IG51bGw7CisgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gX19hY3RpdmUgPSBmYWxzZTsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIHN5bmNocm9uaXplZCAob3JnLm9tZy5DT1JCQS5UeXBlQ29kZS5jbGFzcykKKyAgICAgIHsKKyAgICAgICAgaWYgKF9fdHlwZUNvZGUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChfX2FjdGl2ZSkKKyAgICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCgpLmNyZWF0ZV9yZWN1cnNpdmVfdGMgKCBfaWQgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgX19hY3RpdmUgPSB0cnVlOworICAgICAgICAgIG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyW10gX21lbWJlcnMwID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyIFszXTsKKyAgICAgICAgICBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90Y09mX21lbWJlcnMwID0gbnVsbDsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGVIZWxwZXIudHlwZSAoKTsKKyAgICAgICAgICBfbWVtYmVyczBbMF0gPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgKAorICAgICAgICAgICAgImVyckNvZGUiLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIudHlwZSAoKTsKKyAgICAgICAgICBfbWVtYmVyczBbMV0gPSBuZXcgb3JnLm9tZy5DT1JCQS5TdHJ1Y3RNZW1iZXIgKAorICAgICAgICAgICAgInNldkZsYWciLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfdGNPZl9tZW1iZXJzMCA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX3N0cmluZ190YyAoMCk7CisgICAgICAgICAgX21lbWJlcnMwWzJdID0gbmV3IG9yZy5vbWcuQ09SQkEuU3RydWN0TWVtYmVyICgKKyAgICAgICAgICAgICJyZWFzb24iLAorICAgICAgICAgICAgX3RjT2ZfbWVtYmVyczAsCisgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfZXhjZXB0aW9uX3RjIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLmlkICgpLCAiQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIiwgX21lbWJlcnMwKTsKKyAgICAgICAgICBfX2FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB2YWx1ZSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICgpOworICAgIC8vIHJlYWQgYW5kIGRpc2NhcmQgdGhlIHJlcG9zaXRvcnkgSUQKKyAgICBpc3RyZWFtLnJlYWRfc3RyaW5nICgpOworICAgIHZhbHVlLmVyckNvZGUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLnJlYWQgKGlzdHJlYW0pOworICAgIHZhbHVlLnNldkZsYWcgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnSGVscGVyLnJlYWQgKGlzdHJlYW0pOworICAgIHZhbHVlLnJlYXNvbiA9IGlzdHJlYW0ucmVhZF9zdHJpbmcgKCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIHZhbHVlKQorICB7CisgICAgLy8gd3JpdGUgdGhlIHJlcG9zaXRvcnkgSUQKKyAgICBvc3RyZWFtLndyaXRlX3N0cmluZyAoaWQgKCkpOworICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGVIZWxwZXIud3JpdGUgKG9zdHJlYW0sIHZhbHVlLmVyckNvZGUpOworICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIud3JpdGUgKG9zdHJlYW0sIHZhbHVlLnNldkZsYWcpOworICAgIG9zdHJlYW0ud3JpdGVfc3RyaW5nICh2YWx1ZS5yZWFzb24pOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25Ib2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25Ib2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWNlMjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGZpbmFsIGNsYXNzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB2YWx1ZSA9IG51bGw7CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhvbGRlciAoKQorICB7CisgIH0KKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSG9sZGVyIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgX3JlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaSkKKyAgeworICAgIHZhbHVlID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkIChpKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIF93cml0ZSAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gbykKKyAgeworICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG8sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90eXBlICgpCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci50eXBlICgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYzRlZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi5qYXZhCkBAIC0wLDAgKzEsMTggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBpbnRlcmZhY2UgQ09SQkFGaWxlU2VydmVySUYgZXh0ZW5kcyBDT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMsIG9yZy5vbWcuQ09SQkEuT2JqZWN0LCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklETEVudGl0eSAKK3sKKworICAvKgorICAJICAqIFRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgSURMCisgIAkgICovCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSRkFDRVZFUlNJT04gPSAiMS4zIjsKK30gLy8gaW50ZXJmYWNlIENPUkJBRmlsZVNlcnZlcklGCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDRhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIZWxwZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ09SQkFGaWxlU2VydmVySUZIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRjoxLjAiOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQgKG9yZy5vbWcuQ09SQkEuQW55IGEsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRiB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9pbnRlcmZhY2VfdGMgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRkhlbHBlci5pZCAoKSwgIkNPUkJBRmlsZVNlcnZlcklGIik7CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRiByZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGlzdHJlYW0pCisgIHsKKyAgICByZXR1cm4gbmFycm93IChpc3RyZWFtLnJlYWRfT2JqZWN0IChfQ09SQkFGaWxlU2VydmVySUZTdHViLmNsYXNzKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG9zdHJlYW0sIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRiB2YWx1ZSkKKyAgeworICAgIG9zdHJlYW0ud3JpdGVfT2JqZWN0ICgob3JnLm9tZy5DT1JCQS5PYmplY3QpIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGIG5hcnJvdyAob3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqKQorICB7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGKQorICAgICAgcmV0dXJuIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYpb2JqOworICAgIGVsc2UgaWYgKCFvYmouX2lzX2EgKGlkICgpKSkKKyAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLkJBRF9QQVJBTSAoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9ICgob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PYmplY3RJbXBsKW9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5fQ09SQkFGaWxlU2VydmVySUZTdHViIHN0dWIgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLl9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIgKCk7CisgICAgICBzdHViLl9zZXRfZGVsZWdhdGUoZGVsZWdhdGUpOworICAgICAgcmV0dXJuIHN0dWI7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYgdW5jaGVja2VkX25hcnJvdyAob3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqKQorICB7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGKQorICAgICAgcmV0dXJuIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYpb2JqOworICAgIGVsc2UKKyAgICB7CisgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkRlbGVnYXRlIGRlbGVnYXRlID0gKChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk9iamVjdEltcGwpb2JqKS5fZ2V0X2RlbGVnYXRlICgpOworICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLl9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIgc3R1YiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuX0NPUkJBRmlsZVNlcnZlcklGU3R1YiAoKTsKKyAgICAgIHN0dWIuX3NldF9kZWxlZ2F0ZShkZWxlZ2F0ZSk7CisgICAgICByZXR1cm4gc3R1YjsKKyAgICB9CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGSG9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNjNDZiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZIb2xkZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK3B1YmxpYyBmaW5hbCBjbGFzcyBDT1JCQUZpbGVTZXJ2ZXJJRkhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGIHZhbHVlID0gbnVsbDsKKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVySUZIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlcklGSG9sZGVyIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYgaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZIZWxwZXIud3JpdGUgKG8sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90eXBlICgpCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGSGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Zjc0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZPcGVyYXRpb25zLmphdmEKQEAgLTAsMCArMSw0OTYgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZPcGVyYXRpb25zLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgaW50ZXJmYWNlIENPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucyAKK3sKKworICAvKioKKyAgICAgICAgKiBTYXZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW50cHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICBTdHJpbmcgc2F2ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICovCisgIFN0cmluZyBzYXZlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgbmFtZSBvZiBhbiBhcHBsY2lhdGlvbiBlbGVtZW50IGFuZCB0aGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudAorICAgICAgICAqIHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZQorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWVOYW1lIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBpZU5hbWUgdGhlIGluc3RhbmNlIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICBTdHJpbmcgc2F2ZUZvckluc3RhbmNlTmFtZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgYWVOYW1lLCBTdHJpbmcgaWVOYW1lLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICovCisgIHZvaWQgZGVsZXRlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICB1cmxvIHRoZSB1cmwgb2YgdGhlIGZpbGUuCisgICAgICAgICovCisgIHZvaWQgbW92ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyB1cmwpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybCB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICB2b2lkIGRlbGV0ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIHVybCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICB2b2lkIG1vdmVGb3JJbnN0YW5jZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgIHZvaWQgZ2V0QnlTb2NrZXQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgdXJsIHNwZWNpZmljYXRpb24gb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICovCisgIHZvaWQgZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgU3RyaW5nIHNhdmVCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIFN0cmluZyBzYXZlRm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBhZU5hbWUgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtICBpZU5hbWUgdGhlIGluc3RhbmNlIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgYWVOYW1lLCBTdHJpbmcgaWVOYW1lLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHJlYWQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmVhZCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqLworICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqICBHZXQgc2l6ZSBvZiB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzaXplIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICovCisgIGxvbmcgZ2V0U2l6ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICBsb25nIGdldFNpemVGb3JJbnN0YW5jZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBzaG91bGQgYmUgc3RhcnQgYSB0ZXJtaW5hdGlvbiBwcm9jZXNzLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLiBUaGUgY29udGVudCBkZXBlbmRzIG9uIHRoZQorICAgICAgICAqICAgICAgICAgc2VydmVyIHNpZGUgdGVybWluYXRlIGltcGxlbWVudGF0aW9uLgorICAgICAgICAqLworICB2b2lkIHRlcm1pbmF0ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyYW1ldGVyKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgIHZvaWQgdGVybWluYXRlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgaG9zdCB3aGVyZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEByZXR1cm4gdGhlIGhvc3RuYW1lCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIFN0cmluZyBnZXRIb3N0bmFtZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIEdldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgdmFsdWUKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlksCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfRk9VTkQKKyAgICAgICAgKi8KKyAgU3RyaW5nIGdldENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcga2V5KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBTZXQgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIHZvaWQgc2V0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmVtb3ZlIGEgY29udGV4dCB2YXJpYWJsZS4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQgb2YgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIHZvaWQgcmVtb3ZlQ29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXkpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIExpc3QgYWxsIGNvbnRleHQga2V5d29yZHMuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcmV0dXJuIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncy4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgU3RyaW5nW10gbGlzdENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIENvcmJhRmlsZVNlcnZlcklGLgorICAgICAgICAqIFJldHVybnMgZ2V0VmVyc2lvbiBvZiBDb3JiYUZpbGVTZXJ2ZXIuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEByZXR1cm4gIFRoZSBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGUgQ29yYmFGaWxlU2VydmVySUYuCisgICAgICAgICoKKyAgICAgICAgKi8KKyAgU3RyaW5nIGdldEludGVyZmFjZVZlcnNpb24gKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsb25nIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aAorICAgICAgICAqIG9mIHRoZSBmaWxlcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIFN0cmluZyBhcnJheS4KKyAgICAgICAgKiBUaGUgb3JkZXIgb2YgdGhlIGxvbmcgdmFsdWVzIG11c3QgbWF0Y2ggd2l0aCB0aGUgb3JkZXIKKyAgICAgICAgKiBvZiB0aGUgZmlsZW5hbWVzLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGFvU2VzcyB0aGUgYW9TZXNzaW9uIG9mIHRoZSBjYWxsZXIKKyAgICAgICAgKiBAcGFyYW0gbmFtZXMgdGhlIFN0cmluZyBhcnJheSBvZiBmaWxlbmFtZXMgZm9yIAorICAgICAgICAqICAgICAgICAgICAgICB3aGljaCB0byBnZXQgdGhlIHNpemVzCisgICAgICAgICogQHJldHVybiBhbiBBcnJheSBvZiBsb25nIHZhbHVlcyBjb250YWluaW5nIHRoZSBmaWxlIHNpemVzCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKgorICAgICAgICAqLworICBsb25nW10gZ2V0U2l6ZXMgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmdbXSBuYW1lcykgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247Cit9IC8vIGludGVyZmFjZSBDT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGUE9BLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjNzcwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQS5qYXZhCkBAIC0wLDAgKzEsOTYzIEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGUE9BLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ09SQkFGaWxlU2VydmVySUZQT0EgZXh0ZW5kcyBvcmcub21nLlBvcnRhYmxlU2VydmVyLlNlcnZhbnQKKyBpbXBsZW1lbnRzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMsIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW52b2tlSGFuZGxlcgoreworCisgIC8vIENvbnN0cnVjdG9ycworCisgIHByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgX21ldGhvZHMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSAoKTsKKyAgc3RhdGljCisgIHsKKyAgICBfbWV0aG9kcy5wdXQgKCJzYXZlIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgwKSk7CisgICAgX21ldGhvZHMucHV0ICgic2F2ZUZvckluc3RhbmNlIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxKSk7CisgICAgX21ldGhvZHMucHV0ICgic2F2ZUZvckluc3RhbmNlTmFtZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMikpOworICAgIF9tZXRob2RzLnB1dCAoImRlbGV0ZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMykpOworICAgIF9tZXRob2RzLnB1dCAoIm1vdmUiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDQpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJkZWxldGVGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoNSkpOworICAgIF9tZXRob2RzLnB1dCAoIm1vdmVGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoNikpOworICAgIF9tZXRob2RzLnB1dCAoImdldEJ5U29ja2V0IiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICg3KSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoOCkpOworICAgIF9tZXRob2RzLnB1dCAoInNhdmVCeVNvY2tldCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoOSkpOworICAgIF9tZXRob2RzLnB1dCAoInNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxMCkpOworICAgIF9tZXRob2RzLnB1dCAoInNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTEpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJyZWFkIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxMikpOworICAgIF9tZXRob2RzLnB1dCAoInJlYWRGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTMpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJnZXRTaXplIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxNCkpOworICAgIF9tZXRob2RzLnB1dCAoImdldFNpemVGb3JJbnN0YW5jZSIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTUpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJ0ZXJtaW5hdGUiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDE2KSk7CisgICAgX21ldGhvZHMucHV0ICgidGVybWluYXRlRm9ySW5zdGFuY2UiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDE3KSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0SG9zdG5hbWUiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDE4KSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0Q29udGV4dCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMTkpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJzZXRDb250ZXh0IiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgyMCkpOworICAgIF9tZXRob2RzLnB1dCAoInJlbW92ZUNvbnRleHQiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDIxKSk7CisgICAgX21ldGhvZHMucHV0ICgibGlzdENvbnRleHQiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDIyKSk7CisgICAgX21ldGhvZHMucHV0ICgiZ2V0SW50ZXJmYWNlVmVyc2lvbiIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMjMpKTsKKyAgICBfbWV0aG9kcy5wdXQgKCJnZXRTaXplcyIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMjQpKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBfaW52b2tlIChTdHJpbmcgJG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZXNwb25zZUhhbmRsZXIgJHJoKQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICBqYXZhLmxhbmcuSW50ZWdlciBfX21ldGhvZCA9IChqYXZhLmxhbmcuSW50ZWdlcilfbWV0aG9kcy5nZXQgKCRtZXRob2QpOworICAgIGlmIChfX21ldGhvZCA9PSBudWxsKQorICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTiAoMCwgb3JnLm9tZy5DT1JCQS5Db21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9NQVlCRSk7CisKKyAgICBzd2l0Y2ggKF9fbWV0aG9kLmludFZhbHVlICgpKQorICAgIHsKKworICAvKioKKyAgICAgICAgKiBTYXZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gaW50cHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICAgICAgIGNhc2UgMDogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9zYXZlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0gPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuc2F2ZSAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIHN0cmVhbSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDE6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUZvckluc3RhbmNlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgc3RyZWFtID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnNhdmVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGFpZCwgaWlkLCBzdHJlYW0pOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIG5hbWUgb2YgYW4gYXBwbGNpYXRpb24gZWxlbWVudCBhbmQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQKKyAgICAgICAgKiB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UKKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAqIEBwYXJhbSAgaWVOYW1lIHRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDI6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUZvckluc3RhbmNlTmFtZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyBzdWJEaXIgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIGFlTmFtZSA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgaWVOYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nICRyZXN1bHQgPSBudWxsOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5zYXZlRm9ySW5zdGFuY2VOYW1lIChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWVOYW1lLCBpZU5hbWUsIHN0cmVhbSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogRGVsZXRlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDM6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZGVsZXRlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgdGhpcy5kZWxldGUgKGFvU2VzcywgbmFtZSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBNb3ZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgdXJsbyB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqLworICAgICAgIGNhc2UgNDogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9tb3ZlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIHVybCA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICB0aGlzLm1vdmUgKGFvU2VzcywgdXJsKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybCB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICAgICAgIGNhc2UgNTogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9kZWxldGVGb3JJbnN0YW5jZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyB1cmwgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIHRoaXMuZGVsZXRlRm9ySW5zdGFuY2UgKGFvU2VzcywgdXJsLCBhaWQsIGlpZCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBNb3ZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKiBTcGVjaWZ5IHRoZSBBcHBsaWNhdGlvbkVsZW1lbnQgaWQgYW5kIHRoZSBJbnN0YW5jZUVsZW1lbnQgaWQKKyAgICAgICAgKiBvZiB0aGUgY29tcG9uZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDY6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvbW92ZUZvckluc3RhbmNlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIHRoaXMubW92ZUZvckluc3RhbmNlIChhb1Nlc3MsIG5hbWUsIGFpZCwgaWlkKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqLworICAgICAgIGNhc2UgNzogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi9nZXRCeVNvY2tldAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyBob3N0ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGludCBhUG9ydCA9IGluLnJlYWRfbG9uZyAoKTsKKyAgICAgICAgICAgdGhpcy5nZXRCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBob3N0LCBhUG9ydCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSB1cmwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICBjYXNlIDg6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBpbnQgYVBvcnQgPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIHRoaXMuZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgaG9zdCwgYVBvcnQpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICBjYXNlIDk6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUJ5U29ja2V0CisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBpbnQgYVBvcnQgPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuc2F2ZUJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgaG9zdCwgYVBvcnQpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBob3N0IHRoZSBob3N0bmFtZSBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gIHBvcnQgdGhlIHBvcnQgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICBjYXNlIDEwOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3NhdmVGb3JJbnN0YW5jZUJ5U29ja2V0CisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgaW50IGFQb3J0ID0gaW4ucmVhZF9sb25nICgpOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWlkLCBpaWQsIGhvc3QsIGFQb3J0KTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICAgIG91dC53cml0ZV9zdHJpbmcgKCRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGllTmFtZSB0aGUgaW5zdGFuY2UgZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICAqLworICAgICAgIGNhc2UgMTE6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0CisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIHN1YkRpciA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgYWVOYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyBpZU5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgU3RyaW5nIGhvc3QgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgaW50IGFQb3J0ID0gaW4ucmVhZF9sb25nICgpOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLnNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGFlTmFtZSwgaWVOYW1lLCBob3N0LCBhUG9ydCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogUmVhZCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqLworICAgICAgIGNhc2UgMTI6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvcmVhZAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGICRyZXN1bHQgPSBudWxsOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5yZWFkIChhb1Nlc3MsIG5hbWUpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIud3JpdGUgKG91dCwgJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFJlYWQgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDEzOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3JlYWRGb3JJbnN0YW5jZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMucmVhZEZvckluc3RhbmNlIChhb1Nlc3MsIG5hbWUsIGFpZCwgaWlkKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLndyaXRlIChvdXQsICRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICAgICAgIGNhc2UgMTQ6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0U2l6ZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIGxvbmcgJHJlc3VsdCA9IChsb25nKTA7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldFNpemUgKGFvU2VzcywgbmFtZSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZ2xvbmcgKCRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICAgICAgIGNhc2UgMTU6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0U2l6ZUZvckluc3RhbmNlCisgICAgICAgeworICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MgPSBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQgPSBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIGxvbmcgJHJlc3VsdCA9IChsb25nKTA7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldFNpemVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZ2xvbmcgKCRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgICAgICAgY2FzZSAxNjogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi90ZXJtaW5hdGUKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIHRoaXMudGVybWluYXRlIChhb1Nlc3MsIG5hbWUsIHBhcmFtZXRlcik7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgICAgICAgY2FzZSAxNzogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRi90ZXJtaW5hdGVGb3JJbnN0YW5jZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzID0gb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci5yZWFkIChpbik7CisgICAgICAgICAgIFN0cmluZyBuYW1lID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCA9IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLnJlYWQgKGluKTsKKyAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkID0gb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIHRoaXMudGVybWluYXRlRm9ySW5zdGFuY2UgKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQsIHBhcmFtZXRlcik7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGhvc3Qgd2hlcmUgdGhlIHNlcnZlciBpcyBydW5uaW5nCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSBob3N0bmFtZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICAgICAgIGNhc2UgMTg6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0SG9zdG5hbWUKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldEhvc3RuYW1lIChhb1Nlc3MpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIEdldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgdmFsdWUKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlksCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfRk9VTkQKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDE5OiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL2dldENvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcga2V5ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMuZ2V0Q29udGV4dCAoYW9TZXNzLCBrZXkpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgICAgb3V0LndyaXRlX3N0cmluZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFNldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDIwOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3NldENvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcga2V5ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICB0aGlzLnNldENvbnRleHQgKGFvU2Vzcywga2V5LCB2YWx1ZSk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBSZW1vdmUgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDIxOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL3JlbW92ZUNvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcga2V5ID0gaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgIHRoaXMucmVtb3ZlQ29udGV4dCAoYW9TZXNzLCBrZXkpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogTGlzdCBhbGwgY29udGV4dCBrZXl3b3Jkcy4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEByZXR1cm4gYSBzZXF1ZW5jZSBvZiBzdHJpbmdzLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICAgICAgIGNhc2UgMjI6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvbGlzdENvbnRleHQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdFtdID0gbnVsbDsKKyAgICAgICAgICAgJHJlc3VsdCA9IHRoaXMubGlzdENvbnRleHQgKGFvU2Vzcyk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLndyaXRlIChvdXQsICRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIHZlcnNpb24gb2YgdGhlIENvcmJhRmlsZVNlcnZlcklGLgorICAgICAgICAqIFJldHVybnMgZ2V0VmVyc2lvbiBvZiBDb3JiYUZpbGVTZXJ2ZXIuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEByZXR1cm4gIFRoZSBpbnRlcmZhY2UgdmVyc2lvbiBvZiB0aGUgQ29yYmFGaWxlU2VydmVySUYuCisgICAgICAgICoKKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDIzOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlcklGL2dldEludGVyZmFjZVZlcnNpb24KKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldEludGVyZmFjZVZlcnNpb24gKCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfc3RyaW5nICgkcmVzdWx0KTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisKKyAgLyoqCisgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsb25nIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aAorICAgICAgICAqIG9mIHRoZSBmaWxlcyB0aGF0IHdlcmUgcHJvdmlkZWQgaW4gdGhlIFN0cmluZyBhcnJheS4KKyAgICAgICAgKiBUaGUgb3JkZXIgb2YgdGhlIGxvbmcgdmFsdWVzIG11c3QgbWF0Y2ggd2l0aCB0aGUgb3JkZXIKKyAgICAgICAgKiBvZiB0aGUgZmlsZW5hbWVzLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGFvU2VzcyB0aGUgYW9TZXNzaW9uIG9mIHRoZSBjYWxsZXIKKyAgICAgICAgKiBAcGFyYW0gbmFtZXMgdGhlIFN0cmluZyBhcnJheSBvZiBmaWxlbmFtZXMgZm9yIAorICAgICAgICAqICAgICAgICAgICAgICB3aGljaCB0byBnZXQgdGhlIHNpemVzCisgICAgICAgICogQHJldHVybiBhbiBBcnJheSBvZiBsb25nIHZhbHVlcyBjb250YWluaW5nIHRoZSBmaWxlIHNpemVzCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKgorICAgICAgICAqLworICAgICAgIGNhc2UgMjQ6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUYvZ2V0U2l6ZXMKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcyA9IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBTdHJpbmcgbmFtZXNbXSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19TVFJJTkdIZWxwZXIucmVhZCAoaW4pOworICAgICAgICAgICBsb25nICRyZXN1bHRbXSA9IG51bGw7CisgICAgICAgICAgICRyZXN1bHQgPSB0aGlzLmdldFNpemVzIChhb1Nlc3MsIG5hbWVzKTsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZVJlcGx5KCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5MT05HX0FSUkFZSGVscGVyLndyaXRlIChvdXQsICRyZXN1bHQpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKyAgICAgICBkZWZhdWx0OgorICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTiAoMCwgb3JnLm9tZy5DT1JCQS5Db21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9NQVlCRSk7CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKKyAgfSAvLyBfaW52b2tlCisKKyAgLy8gVHlwZS1zcGVjaWZpYyBDT1JCQTo6T2JqZWN0IG9wZXJhdGlvbnMKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX19pZHMgPSB7CisgICAgIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUY6MS4wIn07CisKKyAgcHVibGljIFN0cmluZ1tdIF9hbGxfaW50ZXJmYWNlcyAob3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0EgcG9hLCBieXRlW10gb2JqZWN0SWQpCisgIHsKKyAgICByZXR1cm4gKFN0cmluZ1tdKV9faWRzLmNsb25lICgpOworICB9CisKKyAgcHVibGljIENPUkJBRmlsZVNlcnZlcklGIF90aGlzKCkgCisgIHsKKyAgICByZXR1cm4gQ09SQkFGaWxlU2VydmVySUZIZWxwZXIubmFycm93KAorICAgIHN1cGVyLl90aGlzX29iamVjdCgpKTsKKyAgfQorCisgIHB1YmxpYyBDT1JCQUZpbGVTZXJ2ZXJJRiBfdGhpcyhvcmcub21nLkNPUkJBLk9SQiBvcmIpIAorICB7CisgICAgcmV0dXJuIENPUkJBRmlsZVNlcnZlcklGSGVscGVyLm5hcnJvdygKKyAgICBzdXBlci5fdGhpc19vYmplY3Qob3JiKSk7CisgIH0KKworCit9IC8vIGNsYXNzIENPUkJBRmlsZVNlcnZlcklGUE9BCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZQT0FUaWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQVRpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2M2U5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUZQT0FUaWUuamF2YQpAQCAtMCwwICsxLDYyMyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJJRlBPQVRpZS5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIENPUkJBRmlsZVNlcnZlcklGUE9BVGllIGV4dGVuZHMgQ09SQkFGaWxlU2VydmVySUZQT0EKK3sKKworICAvLyBDb25zdHJ1Y3RvcnMKKworICBwdWJsaWMgQ09SQkFGaWxlU2VydmVySUZQT0FUaWUgKCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUZPcGVyYXRpb25zIGRlbGVnYXRlICkgeworICAgICAgdGhpcy5faW1wbCA9IGRlbGVnYXRlOworICB9CisgIHB1YmxpYyBDT1JCQUZpbGVTZXJ2ZXJJRlBPQVRpZSAoIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMgZGVsZWdhdGUgLCBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBwb2EgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgICAgICB0aGlzLl9wb2EgICAgICA9IHBvYTsKKyAgfQorICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucyBfZGVsZWdhdGUoKSB7CisgICAgICByZXR1cm4gdGhpcy5faW1wbDsKKyAgfQorICBwdWJsaWMgdm9pZCBfZGVsZWdhdGUgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRk9wZXJhdGlvbnMgZGVsZWdhdGUgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgIH0KKyAgcHVibGljIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BIF9kZWZhdWx0X1BPQSgpIHsKKyAgICAgIGlmKF9wb2EgIT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiBfcG9hOworICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHN1cGVyLl9kZWZhdWx0X1BPQSgpOworICAgICAgfQorICB9CisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBzYXZlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5zYXZlKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBzdHJlYW0pOworICB9IC8vIHNhdmUKKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUZvckluc3RhbmNlKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhaWQsIGlpZCwgc3RyZWFtKTsKKyAgfSAvLyBzYXZlRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqIFNwZWNpZnkgdGhlIG5hbWUgb2YgYW4gYXBwbGNpYXRpb24gZWxlbWVudCBhbmQgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIGVsZW1lbnQKKyAgICAgICAgKiB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UKKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAqIEBwYXJhbSAgaWVOYW1lIHRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBzYXZlRm9ySW5zdGFuY2VOYW1lIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBhZU5hbWUsIFN0cmluZyBpZU5hbWUsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5zYXZlRm9ySW5zdGFuY2VOYW1lKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhZU5hbWUsIGllTmFtZSwgc3RyZWFtKTsKKyAgfSAvLyBzYXZlRm9ySW5zdGFuY2VOYW1lCisKKworICAvKioKKyAgICAgICAgKiBEZWxldGUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBkZWxldGUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmRlbGV0ZShhb1Nlc3MsIG5hbWUpOworICB9IC8vIGRlbGV0ZQorCisKKyAgLyoqCisgICAgICAgICogTW92ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybG8gdGhlIHVybCBvZiB0aGUgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgbW92ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyB1cmwpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5tb3ZlKGFvU2VzcywgdXJsKTsKKyAgfSAvLyBtb3ZlCisKKworICAvKioKKyAgICAgICAgKiBEZWxldGUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICB1cmwgdGhlIHVybCBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZGVsZXRlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgdXJsLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmRlbGV0ZUZvckluc3RhbmNlKGFvU2VzcywgdXJsLCBhaWQsIGlpZCk7CisgIH0gLy8gZGVsZXRlRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqIFNwZWNpZnkgdGhlIEFwcGxpY2F0aW9uRWxlbWVudCBpZCBhbmQgdGhlIEluc3RhbmNlRWxlbWVudCBpZAorICAgICAgICAqIG9mIHRoZSBjb21wb25lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBtb3ZlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5tb3ZlRm9ySW5zdGFuY2UoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCk7CisgIH0gLy8gbW92ZUZvckluc3RhbmNlCisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0QnlTb2NrZXQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmdldEJ5U29ja2V0KGFvU2VzcywgbmFtZSwgaG9zdCwgYVBvcnQpOworICB9IC8vIGdldEJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSB1cmwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLmdldEZvckluc3RhbmNlQnlTb2NrZXQoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgaG9zdCwgYVBvcnQpOworICB9IC8vIGdldEZvckluc3RhbmNlQnlTb2NrZXQKKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUJ5U29ja2V0KGFvU2VzcywgbmFtZSwgc3ViRGlyLCBob3N0LCBhUG9ydCk7CisgIH0gLy8gc2F2ZUJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGFpZCwgaWlkLCBob3N0LCBhUG9ydCk7CisgIH0gLy8gc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQKKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgYWVOYW1lIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgICAqIEBwYXJhbSAgaWVOYW1lIHRoZSBpbnN0YW5jZSBlbGVtZW50IG5hbWUuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBhZU5hbWUsIFN0cmluZyBpZU5hbWUsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0KGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhZU5hbWUsIGllTmFtZSwgaG9zdCwgYVBvcnQpOworICB9IC8vIHNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldAorCisKKyAgLyoqCisgICAgICAgICogUmVhZCB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqLworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgcmVhZCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLnJlYWQoYW9TZXNzLCBuYW1lKTsKKyAgfSAvLyByZWFkCisKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwucmVhZEZvckluc3RhbmNlKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQpOworICB9IC8vIHJlYWRGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogIEdldCBzaXplIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHNpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0U2l6ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLmdldFNpemUoYW9TZXNzLCBuYW1lKTsKKyAgfSAvLyBnZXRTaXplCisKKworICAvKioKKyAgICAgICAgKiAgR2V0IHNpemUgb2YgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqLworICBwdWJsaWMgbG9uZyBnZXRTaXplRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuZ2V0U2l6ZUZvckluc3RhbmNlKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQpOworICB9IC8vIGdldFNpemVGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gdGhlIHNlcnZlciBzaG91bGQgYmUgc3RhcnQgYSB0ZXJtaW5hdGlvbiBwcm9jZXNzLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgcGFyYW1ldGVyIHRoZSBwYXJhbWV0ZXIgc3RyaW5nLiBUaGUgY29udGVudCBkZXBlbmRzIG9uIHRoZQorICAgICAgICAqICAgICAgICAgc2VydmVyIHNpZGUgdGVybWluYXRlIGltcGxlbWVudGF0aW9uLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCB0ZXJtaW5hdGUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmFtZXRlcikgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLnRlcm1pbmF0ZShhb1Nlc3MsIG5hbWUsIHBhcmFtZXRlcik7CisgIH0gLy8gdGVybWluYXRlCisKKworICAvKioKKyAgICAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBjbGllbnQgd2hlbiB0aGUgc2VydmVyIHNob3VsZCBiZSBzdGFydCBhIHRlcm1pbmF0aW9uIHByb2Nlc3MuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBwYXJhbWV0ZXIgdGhlIHBhcmFtZXRlciBzdHJpbmcuIFRoZSBjb250ZW50IGRlcGVuZHMgb24gdGhlCisgICAgICAgICogICAgICAgICBzZXJ2ZXIgc2lkZSB0ZXJtaW5hdGUgaW1wbGVtZW50YXRpb24uCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkLCBTdHJpbmcgcGFyYW1ldGVyKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgX2ltcGwudGVybWluYXRlRm9ySW5zdGFuY2UoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgcGFyYW1ldGVyKTsKKyAgfSAvLyB0ZXJtaW5hdGVGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBob3N0IHdoZXJlIHRoZSBzZXJ2ZXIgaXMgcnVubmluZworICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHJldHVybiB0aGUgaG9zdG5hbWUKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBnZXRIb3N0bmFtZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwuZ2V0SG9zdG5hbWUoYW9TZXNzKTsKKyAgfSAvLyBnZXRIb3N0bmFtZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IGEgY29udGV4dCB2YXJpYWJsZS4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQgb2YgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHJldHVybiB0aGUgY29udGV4dCB2YWx1ZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWSwKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9GT1VORAorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcga2V5KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLmdldENvbnRleHQoYW9TZXNzLCBrZXkpOworICB9IC8vIGdldENvbnRleHQKKworCisgIC8qKgorICAgICAgICAqIFNldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIF9pbXBsLnNldENvbnRleHQoYW9TZXNzLCBrZXksIHZhbHVlKTsKKyAgfSAvLyBzZXRDb250ZXh0CisKKworICAvKioKKyAgICAgICAgKiBSZW1vdmUgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXkpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5yZW1vdmVDb250ZXh0KGFvU2Vzcywga2V5KTsKKyAgfSAvLyByZW1vdmVDb250ZXh0CisKKworICAvKioKKyAgICAgICAgKiBMaXN0IGFsbCBjb250ZXh0IGtleXdvcmRzLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHJldHVybiBhIHNlcXVlbmNlIG9mIHN0cmluZ3MuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmdbXSBsaXN0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICByZXR1cm4gX2ltcGwubGlzdENvbnRleHQoYW9TZXNzKTsKKyAgfSAvLyBsaXN0Q29udGV4dAorCisKKyAgLyoqCisgICAgICAgICogR2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBDb3JiYUZpbGVTZXJ2ZXJJRi4KKyAgICAgICAgKiBSZXR1cm5zIGdldFZlcnNpb24gb2YgQ29yYmFGaWxlU2VydmVyLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcmV0dXJuICBUaGUgaW50ZXJmYWNlIHZlcnNpb24gb2YgdGhlIENvcmJhRmlsZVNlcnZlcklGLgorICAgICAgICAqCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0SW50ZXJmYWNlVmVyc2lvbiAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLmdldEludGVyZmFjZVZlcnNpb24oKTsKKyAgfSAvLyBnZXRJbnRlcmZhY2VWZXJzaW9uCisKKworICAvKioKKyAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxvbmcgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgbGVuZ3RoCisgICAgICAgICogb2YgdGhlIGZpbGVzIHRoYXQgd2VyZSBwcm92aWRlZCBpbiB0aGUgU3RyaW5nIGFycmF5LgorICAgICAgICAqIFRoZSBvcmRlciBvZiB0aGUgbG9uZyB2YWx1ZXMgbXVzdCBtYXRjaCB3aXRoIHRoZSBvcmRlcgorICAgICAgICAqIG9mIHRoZSBmaWxlbmFtZXMuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gYW9TZXNzIHRoZSBhb1Nlc3Npb24gb2YgdGhlIGNhbGxlcgorICAgICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgU3RyaW5nIGFycmF5IG9mIGZpbGVuYW1lcyBmb3IgCisgICAgICAgICogICAgICAgICAgICAgIHdoaWNoIHRvIGdldCB0aGUgc2l6ZXMKKyAgICAgICAgKiBAcmV0dXJuIGFuIEFycmF5IG9mIGxvbmcgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIGZpbGUgc2l6ZXMKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqCisgICAgICAgICovCisgIHB1YmxpYyBsb25nW10gZ2V0U2l6ZXMgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmdbXSBuYW1lcykgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5nZXRTaXplcyhhb1Nlc3MsIG5hbWVzKTsKKyAgfSAvLyBnZXRTaXplcworCisgIHByaXZhdGUgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGT3BlcmF0aW9ucyBfaW1wbDsKKyAgcHJpdmF0ZSBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBfcG9hOworCit9IC8vIGNsYXNzIENPUkJBRmlsZVNlcnZlcklGUE9BVGllCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfQllURUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmE5YjYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIZWxwZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIZWxwZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBEU19CWVRFSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfQllURToxLjAiOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQgKG9yZy5vbWcuQ09SQkEuQW55IGEsIGJ5dGVbXSB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmdldF9wcmltaXRpdmVfdGMgKG9yZy5vbWcuQ09SQkEuVENLaW5kLnRrX29jdGV0KTsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9zZXF1ZW5jZV90YyAoMCwgX190eXBlQ29kZSk7CisgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfYWxpYXNfdGMgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSGVscGVyLmlkICgpLCAiRFNfQllURSIsIF9fdHlwZUNvZGUpOworICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgYnl0ZSB2YWx1ZVtdID0gbnVsbDsKKyAgICBpbnQgX2xlbjAgPSBpc3RyZWFtLnJlYWRfbG9uZyAoKTsKKyAgICB2YWx1ZSA9IG5ldyBieXRlW19sZW4wXTsKKyAgICBpc3RyZWFtLnJlYWRfb2N0ZXRfYXJyYXkgKHZhbHVlLCAwLCBfbGVuMCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBieXRlW10gdmFsdWUpCisgIHsKKyAgICBvc3RyZWFtLndyaXRlX2xvbmcgKHZhbHVlLmxlbmd0aCk7CisgICAgb3N0cmVhbS53cml0ZV9vY3RldF9hcnJheSAodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX0JZVEVIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19CWVRFSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhODVmMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19CWVRFSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19CWVRFSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgRFNfQllURUhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgYnl0ZSB2YWx1ZVtdID0gbnVsbDsKKworICBwdWJsaWMgRFNfQllURUhvbGRlciAoKQorICB7CisgIH0KKworICBwdWJsaWMgRFNfQllURUhvbGRlciAoYnl0ZVtdIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgX3JlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaSkKKyAgeworICAgIHZhbHVlID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfQllURUhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfQllURUhlbHBlci50eXBlICgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19TVFJJTkdIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19TVFJJTkdIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJlOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX1NUUklOR0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgRFNfU1RSSU5HSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HOjEuMCI7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIGluc2VydCAob3JnLm9tZy5DT1JCQS5BbnkgYSwgU3RyaW5nW10gdGhhdCkKKyAgeworICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG91dCA9IGEuY3JlYXRlX291dHB1dF9zdHJlYW0gKCk7CisgICAgYS50eXBlICh0eXBlICgpKTsKKyAgICB3cml0ZSAob3V0LCB0aGF0KTsKKyAgICBhLnJlYWRfdmFsdWUgKG91dC5jcmVhdGVfaW5wdXRfc3RyZWFtICgpLCB0eXBlICgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9zdHJpbmdfdGMgKDApOworICAgICAgX190eXBlQ29kZSA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX3NlcXVlbmNlX3RjICgwLCBfX3R5cGVDb2RlKTsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9hbGlhc190YyAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX1NUUklOR0hlbHBlci5pZCAoKSwgIkRTX1NUUklORyIsIF9fdHlwZUNvZGUpOworICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSByZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGlzdHJlYW0pCisgIHsKKyAgICBTdHJpbmcgdmFsdWVbXSA9IG51bGw7CisgICAgaW50IF9sZW4wID0gaXN0cmVhbS5yZWFkX2xvbmcgKCk7CisgICAgdmFsdWUgPSBuZXcgU3RyaW5nW19sZW4wXTsKKyAgICBmb3IgKGludCBfbzEgPSAwO19vMSA8IHZhbHVlLmxlbmd0aDsgKytfbzEpCisgICAgICB2YWx1ZVtfbzFdID0gaXN0cmVhbS5yZWFkX3N0cmluZyAoKTsKKyAgICByZXR1cm4gdmFsdWU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG9zdHJlYW0sIFN0cmluZ1tdIHZhbHVlKQorICB7CisgICAgb3N0cmVhbS53cml0ZV9sb25nICh2YWx1ZS5sZW5ndGgpOworICAgIGZvciAoaW50IF9pMCA9IDA7X2kwIDwgdmFsdWUubGVuZ3RoOyArK19pMCkKKyAgICAgIG9zdHJlYW0ud3JpdGVfc3RyaW5nICh2YWx1ZVtfaTBdKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HSG9sZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRFNfU1RSSU5HSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3YmFjYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9EU19TVFJJTkdIb2xkZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0RTX1NUUklOR0hvbGRlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGZpbmFsIGNsYXNzIERTX1NUUklOR0hvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgU3RyaW5nIHZhbHVlW10gPSBudWxsOworCisgIHB1YmxpYyBEU19TVFJJTkdIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIERTX1NUUklOR0hvbGRlciAoU3RyaW5nW10gaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX1NUUklOR0hlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjgzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlLmphdmEKQEAgLTAsMCArMSw3MCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9FcnJvckNvZGUuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKKworLyoqCisgICAqIFRoZSBlcnJvciBjb2RlLgorICAgKi8KK3B1YmxpYyBjbGFzcyBFcnJvckNvZGUgaW1wbGVtZW50cyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklETEVudGl0eQoreworICBwcml2YXRlICAgICAgICBpbnQgX192YWx1ZTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IF9fc2l6ZSA9IDE1OworICBwcml2YXRlIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlW10gX19hcnJheSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIFtfX3NpemVdOworCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0FTQU1PRFNfRVhDRVBUSU9OID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfQVNBTU9EU19FWENFUFRJT04gPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9BU0FNT0RTX0VYQ0VQVElPTik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0FDQ0VTU19ERU5JRUQgPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgRklMRVNFUlZFUl9BQ0NFU1NfREVOSUVEID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfQUNDRVNTX0RFTklFRCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0ZJTEVfTk9UX0ZPVU5EID0gMjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfRklMRV9OT1RfRk9VTkQgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9GSUxFX05PVF9GT1VORCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0lPX0VYQ0VQVElPTiA9IDM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX0lPX0VYQ0VQVElPTiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0lPX0VYQ0VQVElPTik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0lORk9STUFUSU9OID0gNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfSU5GT1JNQVRJT04gPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9JTkZPUk1BVElPTik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIgPSA1OworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX01JU1NJTkdfUEFSQU1FVEVSID0gNjsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfTUlTU0lOR19QQVJBTUVURVIgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9NSVNTSU5HX1BBUkFNRVRFUik7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVEID0gNzsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZShfRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0NPTk5FQ1RfUkVGVVNFRCA9IDg7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX0NPTk5FQ1RfUkVGVVNFRCA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0NPTk5FQ1RfUkVGVVNFRCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVCA9IDk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVCA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVCk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0gPSAxMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0pOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQgPSAxMTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVEID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVEKTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgX0ZJTEVTRVJWRVJfTk9fTUVNT1JZID0gMTI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX05PX01FTU9SWSA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlKF9GSUxFU0VSVkVSX05PX01FTU9SWSk7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IF9GSUxFU0VSVkVSX05VTExfUEFSQU1FVEVSID0gMTM7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBGSUxFU0VSVkVSX05VTExfUEFSQU1FVEVSID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfTlVMTF9QQVJBTUVURVIpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfRklMRVNFUlZFUl9OT1RfRk9VTkQgPSAxNDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIEZJTEVTRVJWRVJfTk9UX0ZPVU5EID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUoX0ZJTEVTRVJWRVJfTk9UX0ZPVU5EKTsKKworICBwdWJsaWMgaW50IHZhbHVlICgpCisgIHsKKyAgICByZXR1cm4gX192YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSBmcm9tX2ludCAoaW50IHZhbHVlKQorICB7CisgICAgaWYgKHZhbHVlID49IDAgJiYgdmFsdWUgPCBfX3NpemUpCisgICAgICByZXR1cm4gX19hcnJheVt2YWx1ZV07CisgICAgZWxzZQorICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX1BBUkFNICgpOworICB9CisKKyAgcHJvdGVjdGVkIEVycm9yQ29kZSAoaW50IHZhbHVlKQorICB7CisgICAgX192YWx1ZSA9IHZhbHVlOworICAgIF9fYXJyYXlbX192YWx1ZV0gPSB0aGlzOworICB9Cit9IC8vIGNsYXNzIEVycm9yQ29kZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmM1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlSGVscGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9FcnJvckNvZGVIZWxwZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKKworLyoqCisgICAqIFRoZSBlcnJvciBjb2RlLgorICAgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBFcnJvckNvZGVIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9FcnJvckNvZGU6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIHRoYXQpCisgIHsKKyAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPSBhLmNyZWF0ZV9vdXRwdXRfc3RyZWFtICgpOworICAgIGEudHlwZSAodHlwZSAoKSk7CisgICAgd3JpdGUgKG91dCwgdGhhdCk7CisgICAgYS5yZWFkX3ZhbHVlIChvdXQuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdHlwZSAoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9lbnVtX3RjIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLmlkICgpLCAiRXJyb3JDb2RlIiwgbmV3IFN0cmluZ1tdIHsgIkZJTEVTRVJWRVJfQVNBTU9EU19FWENFUFRJT04iLCAiRklMRVNFUlZFUl9BQ0NFU1NfREVOSUVEIiwgIkZJTEVTRVJWRVJfRklMRV9OT1RfRk9VTkQiLCAiRklMRVNFUlZFUl9JT19FWENFUFRJT04iLCAiRklMRVNFUlZFUl9JTkZPUk1BVElPTiIsICJGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIiLCAiRklMRVNFUlZFUl9NSVNTSU5HX1BBUkFNRVRFUiIsICJGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVEIiwgIkZJTEVTRVJWRVJfQ09OTkVDVF9SRUZVU0VEIiwgIkZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUIiwgIkZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTSIsICJGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRCIsICJGSUxFU0VSVkVSX05PX01FTU9SWSIsICJGSUxFU0VSVkVSX05VTExfUEFSQU1FVEVSIiwgIkZJTEVTRVJWRVJfTk9UX0ZPVU5EIn0gKTsKKyAgICB9CisgICAgcmV0dXJuIF9fdHlwZUNvZGU7CisgIH0KKworICBwdWJsaWMgc3RhdGljIFN0cmluZyBpZCAoKQorICB7CisgICAgcmV0dXJuIF9pZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZSByZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGlzdHJlYW0pCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZS5mcm9tX2ludCAoaXN0cmVhbS5yZWFkX2xvbmcgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIHZhbHVlKQorICB7CisgICAgb3N0cmVhbS53cml0ZV9sb25nICh2YWx1ZS52YWx1ZSAoKSk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0Vycm9yQ29kZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYmIxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlSG9sZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvRXJyb3JDb2RlSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCisKKy8qKgorICAgKiBUaGUgZXJyb3IgY29kZS4KKyAgICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXJyb3JDb2RlSG9sZGVyIGltcGxlbWVudHMgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5TdHJlYW1hYmxlCit7CisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlIHZhbHVlID0gbnVsbDsKKworICBwdWJsaWMgRXJyb3JDb2RlSG9sZGVyICgpCisgIHsKKyAgfQorCisgIHB1YmxpYyBFcnJvckNvZGVIb2xkZXIgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5FcnJvckNvZGUgaW5pdGlhbFZhbHVlKQorICB7CisgICAgdmFsdWUgPSBpbml0aWFsVmFsdWU7CisgIH0KKworICBwdWJsaWMgdm9pZCBfcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpKQorICB7CisgICAgdmFsdWUgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZUhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRXJyb3JDb2RlSGVscGVyLnR5cGUgKCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUYuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzZTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGLmphdmEKQEAgLTAsMCArMSwxMyBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgaW50ZXJmYWNlIElucHV0U3RyZWFtSUYgZXh0ZW5kcyBJbnB1dFN0cmVhbUlGT3BlcmF0aW9ucywgb3JnLm9tZy5DT1JCQS5PYmplY3QsIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSURMRW50aXR5IAoreworfSAvLyBpbnRlcmZhY2UgSW5wdXRTdHJlYW1JRgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZIZWxwZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllZGMyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSGVscGVyLmphdmEKQEAgLTAsMCArMSw4NSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSGVscGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgSW5wdXRTdHJlYW1JRkhlbHBlcgoreworICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgIF9pZCA9ICJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUY6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBleHRyYWN0IChvcmcub21nLkNPUkJBLkFueSBhKQorICB7CisgICAgcmV0dXJuIHJlYWQgKGEuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF9fdHlwZUNvZGUgPSBudWxsOworICBzeW5jaHJvbml6ZWQgcHVibGljIHN0YXRpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIHR5cGUgKCkKKyAgeworICAgIGlmIChfX3R5cGVDb2RlID09IG51bGwpCisgICAgeworICAgICAgX190eXBlQ29kZSA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKCkuY3JlYXRlX2ludGVyZmFjZV90YyAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIuaWQgKCksICJJbnB1dFN0cmVhbUlGIik7CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHJlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaXN0cmVhbSkKKyAgeworICAgIHJldHVybiBuYXJyb3cgKGlzdHJlYW0ucmVhZF9PYmplY3QgKF9JbnB1dFN0cmVhbUlGU3R1Yi5jbGFzcykpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiB2YWx1ZSkKKyAgeworICAgIG9zdHJlYW0ud3JpdGVfT2JqZWN0ICgob3JnLm9tZy5DT1JCQS5PYmplY3QpIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgbmFycm93IChvcmcub21nLkNPUkJBLk9iamVjdCBvYmopCisgIHsKKyAgICBpZiAob2JqID09IG51bGwpCisgICAgICByZXR1cm4gbnVsbDsKKyAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRikKKyAgICAgIHJldHVybiAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYpb2JqOworICAgIGVsc2UgaWYgKCFvYmouX2lzX2EgKGlkICgpKSkKKyAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLkJBRF9QQVJBTSAoKTsKKyAgICBlbHNlCisgICAgeworICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9ICgob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PYmplY3RJbXBsKW9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5fSW5wdXRTdHJlYW1JRlN0dWIgc3R1YiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuX0lucHV0U3RyZWFtSUZTdHViICgpOworICAgICAgc3R1Yi5fc2V0X2RlbGVnYXRlKGRlbGVnYXRlKTsKKyAgICAgIHJldHVybiBzdHViOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgdW5jaGVja2VkX25hcnJvdyAob3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqKQorICB7CisgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgcmV0dXJuIG51bGw7CisgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYpCisgICAgICByZXR1cm4gKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGKW9iajsKKyAgICBlbHNlCisgICAgeworICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5EZWxlZ2F0ZSBkZWxlZ2F0ZSA9ICgob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PYmplY3RJbXBsKW9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5fSW5wdXRTdHJlYW1JRlN0dWIgc3R1YiA9IG5ldyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuX0lucHV0U3RyZWFtSUZTdHViICgpOworICAgICAgc3R1Yi5fc2V0X2RlbGVnYXRlKGRlbGVnYXRlKTsKKyAgICAgIHJldHVybiBzdHViOworICAgIH0KKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRkhvbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTQ1ODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZIb2xkZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgSW5wdXRTdHJlYW1JRkhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgdmFsdWUgPSBudWxsOworCisgIHB1YmxpYyBJbnB1dFN0cmVhbUlGSG9sZGVyICgpCisgIHsKKyAgfQorCisgIHB1YmxpYyBJbnB1dFN0cmVhbUlGSG9sZGVyIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBpbml0aWFsVmFsdWUpCisgIHsKKyAgICB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIF9yZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGkpCisgIHsKKyAgICB2YWx1ZSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLnJlYWQgKGkpOworICB9CisKKyAgcHVibGljIHZvaWQgX3dyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvKQorICB7CisgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIud3JpdGUgKG8sIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLlR5cGVDb2RlIF90eXBlICgpCisgIHsKKyAgICByZXR1cm4gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZIZWxwZXIudHlwZSAoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGT3BlcmF0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODExZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMuamF2YQpAQCAtMCwwICsxLDg1IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZPcGVyYXRpb25zLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgaW50ZXJmYWNlIElucHV0U3RyZWFtSUZPcGVyYXRpb25zIAoreworCisgIC8qKgorICAgICAgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpbnRvIGFuIGFycmF5CisgICAgICAgICogb2YgYnl0ZXMuIEFuIGF0dGVtcHQgaXMgbWFkZSB0byByZWFkIGFzIG1hbnkgYXMgbGVuIGJ5dGVzLCBidXQgYQorICAgICAgICAqIHNtYWxsZXIgbnVtYmVyIG1heSBiZSByZWFkLCBwb3NzaWJseSB6ZXJvLiBUaGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICogYWN0dWFsbHkgcmVhZCBpcyByZXR1cm5lZCBhcyBhbiBpbnRlZ2VyLgorICAgICAgICAqCisgICAgICAgICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBlbmQgb2YgZmlsZQorICAgICAgICAqIGlzIGRldGVjdGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgYiBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIG9mZiBpcyBuZWdhdGl2ZSwgb3IgbGVuIGlzIG5lZ2F0aXZlLCBvciBvZmYrbGVuIGlzIGdyZWF0ZXIKKyAgICAgICAgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGIsIHRoZW4gYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBsZW4gaXMgemVybywgdGhlbiBubyBieXRlcyBhcmUgcmVhZCBhbmQgMCBpcyByZXR1cm5lZDsKKyAgICAgICAgKiBvdGhlcndpc2UsIHRoZXJlIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZS4KKyAgICAgICAgKiBJZiBubyBieXRlIGlzIGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgYXQgZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlIHZhbHVlIC0xIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIGF0IGxlYXN0IG9uZSBieXRlIGlzIHJlYWQgYW5kIHN0b3JlZCBpbnRvIGIuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgZmlyc3QgYnl0ZSByZWFkIGlzIHN0b3JlZCBpbnRvIGVsZW1lbnQgYltvZmZdLCB0aGUgbmV4dCBvbmUgaW50byBiW29mZisxXSwKKyAgICAgICAgKiBhbmQgc28gb24uIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpcywgYXQgbW9zdCwgZXF1YWwgdG8gbGVuLiBMZXQgayBiZSB0aGUgbnVtYmVyCisgICAgICAgICogb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZDsgdGhlc2UgYnl0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gZWxlbWVudHMgYltvZmZdIHRocm91Z2ggYltvZmYray0xXSwKKyAgICAgICAgKiBsZWF2aW5nIGVsZW1lbnRzIGJbb2ZmK2tdIHRocm91Z2ggYltvZmYrbGVuLTFdIHVuYWZmZWN0ZWQuCisgICAgICAgICoKKyAgICAgICAgKiBJbiBldmVyeSBjYXNlLCBlbGVtZW50cyBiWzBdIHRocm91Z2ggYltvZmZdIGFuZCBlbGVtZW50cyBiW29mZitsZW5dCisgICAgICAgICogdGhyb3VnaCBiW2IubGVuZ3RoLTFdIGFyZSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSWYgdGhlIGZpcnN0IGJ5dGUgY2Fubm90IGJlIHJlYWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBlbmQgb2YgZmlsZSwKKyAgICAgICAgKiB0aGVuIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bi4gSW4gcGFydGljdWxhciwgYW4gSU9FeGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICogaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kIGZvciBjbGFzcyBJbnB1dFN0cmVhbSBzaW1wbHkgY2FsbHMgdGhlIG1ldGhvZAorICAgICAgICAqIHJlYWQoKSByZXBlYXRlZGx5LiBJZiB0aGUgZmlyc3Qgc3VjaCBjYWxsIHJlc3VsdHMgaW4gYW4gSU9FeGNlcHRpb24sCisgICAgICAgICogdGhhdCBleGNlcHRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byB0aGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kLgorICAgICAgICAqIElmIGFueSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVhZCgpIHJlc3VsdHMgaW4gYSBJT0V4Y2VwdGlvbiwgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIGlzIGNhdWdodCBhbmQgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGVuZCBvZiBmaWxlOyB0aGUgYnl0ZXMgcmVhZCB1cCB0byB0aGF0CisgICAgICAgICogcG9pbnQgYXJlIHN0b3JlZCBpbnRvIGIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBiZWZvcmUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIG9jY3VycmVkIGlzIHJldHVybmVkLiBTdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAorICAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGIgLSB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZC4KKyAgICAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSBiICBhdCB3aGljaCB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAgICAqIEBwYXJhbSBsZW4gLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIHRoZSBidWZmZXIsCisgICAgICAgICogICAgICAgICBvciAtMSBpcyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYmVjYXVzZSB0aGUgZW5kCisgICAgICAgICogICAgICAgICBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgaW50IHJlYWQgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSG9sZGVyIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICB2b2lkIGNsb3NlICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOworCisgIC8qKgorICAgICAgICAqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgdG8gYmUgdHJhbnNmZXJkLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIGludCBsZW5ndGggKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb247CisKKyAgLyoqCisgICAgICAgICogUmVzZXQgdGhlIHN0cmVhbQorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgdm9pZCByZXNldCAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKK30gLy8gaW50ZXJmYWNlIElucHV0U3RyZWFtSUZPcGVyYXRpb25zCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRlBPQS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZQT0EuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZiNDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZQT0EuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGUE9BLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5wdXRTdHJlYW1JRlBPQSBleHRlbmRzIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudAorIGltcGxlbWVudHMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZPcGVyYXRpb25zLCBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkludm9rZUhhbmRsZXIKK3sKKworICAvLyBDb25zdHJ1Y3RvcnMKKworICBwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIF9tZXRob2RzID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUgKCk7CisgIHN0YXRpYworICB7CisgICAgX21ldGhvZHMucHV0ICgicmVhZCIsIG5ldyBqYXZhLmxhbmcuSW50ZWdlciAoMCkpOworICAgIF9tZXRob2RzLnB1dCAoImNsb3NlIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgxKSk7CisgICAgX21ldGhvZHMucHV0ICgibGVuZ3RoIiwgbmV3IGphdmEubGFuZy5JbnRlZ2VyICgyKSk7CisgICAgX21ldGhvZHMucHV0ICgicmVzZXQiLCBuZXcgamF2YS5sYW5nLkludGVnZXIgKDMpKTsKKyAgfQorCisgIHB1YmxpYyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBfaW52b2tlIChTdHJpbmcgJG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZXNwb25zZUhhbmRsZXIgJHJoKQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKKyAgICBqYXZhLmxhbmcuSW50ZWdlciBfX21ldGhvZCA9IChqYXZhLmxhbmcuSW50ZWdlcilfbWV0aG9kcy5nZXQgKCRtZXRob2QpOworICAgIGlmIChfX21ldGhvZCA9PSBudWxsKQorICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuQkFEX09QRVJBVElPTiAoMCwgb3JnLm9tZy5DT1JCQS5Db21wbGV0aW9uU3RhdHVzLkNPTVBMRVRFRF9NQVlCRSk7CisKKyAgICBzd2l0Y2ggKF9fbWV0aG9kLmludFZhbHVlICgpKQorICAgIHsKKworICAvKioKKyAgICAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaW50byBhbiBhcnJheQorICAgICAgICAqIG9mIGJ5dGVzLiBBbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhcyBtYW55IGFzIGxlbiBieXRlcywgYnV0IGEKKyAgICAgICAgKiBzbWFsbGVyIG51bWJlciBtYXkgYmUgcmVhZCwgcG9zc2libHkgemVyby4gVGhlIG51bWJlciBvZiBieXRlcworICAgICAgICAqIGFjdHVhbGx5IHJlYWQgaXMgcmV0dXJuZWQgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBpbnB1dCBkYXRhIGlzIGF2YWlsYWJsZSwgZW5kIG9mIGZpbGUKKyAgICAgICAgKiBpcyBkZXRlY3RlZCwgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIGIgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBvZmYgaXMgbmVnYXRpdmUsIG9yIGxlbiBpcyBuZWdhdGl2ZSwgb3Igb2ZmK2xlbiBpcyBncmVhdGVyCisgICAgICAgICogdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBiLCB0aGVuIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgbGVuIGlzIHplcm8sIHRoZW4gbm8gYnl0ZXMgYXJlIHJlYWQgYW5kIDAgaXMgcmV0dXJuZWQ7CisgICAgICAgICogb3RoZXJ3aXNlLCB0aGVyZSBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgICAgICogSWYgbm8gYnl0ZSBpcyBhdmFpbGFibGUgYmVjYXVzZSB0aGUgc3RyZWFtIGlzIGF0IGVuZCBvZiBmaWxlLAorICAgICAgICAqIHRoZSB2YWx1ZSAtMSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFkIGFuZCBzdG9yZWQgaW50byBiLgorICAgICAgICAqCisgICAgICAgICogVGhlIGZpcnN0IGJ5dGUgcmVhZCBpcyBzdG9yZWQgaW50byBlbGVtZW50IGJbb2ZmXSwgdGhlIG5leHQgb25lIGludG8gYltvZmYrMV0sCisgICAgICAgICogYW5kIHNvIG9uLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMsIGF0IG1vc3QsIGVxdWFsIHRvIGxlbi4gTGV0IGsgYmUgdGhlIG51bWJlcgorICAgICAgICAqIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ7IHRoZXNlIGJ5dGVzIHdpbGwgYmUgc3RvcmVkIGluIGVsZW1lbnRzIGJbb2ZmXSB0aHJvdWdoIGJbb2ZmK2stMV0sCisgICAgICAgICogbGVhdmluZyBlbGVtZW50cyBiW29mZitrXSB0aHJvdWdoIGJbb2ZmK2xlbi0xXSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSW4gZXZlcnkgY2FzZSwgZWxlbWVudHMgYlswXSB0aHJvdWdoIGJbb2ZmXSBhbmQgZWxlbWVudHMgYltvZmYrbGVuXQorICAgICAgICAqIHRocm91Z2ggYltiLmxlbmd0aC0xXSBhcmUgdW5hZmZlY3RlZC4KKyAgICAgICAgKgorICAgICAgICAqIElmIHRoZSBmaXJzdCBieXRlIGNhbm5vdCBiZSByZWFkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlbiBhbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24uIEluIHBhcnRpY3VsYXIsIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgICAqIGlmIHRoZSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgICAqCisgICAgICAgICogVGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZCBmb3IgY2xhc3MgSW5wdXRTdHJlYW0gc2ltcGx5IGNhbGxzIHRoZSBtZXRob2QKKyAgICAgICAgKiByZWFkKCkgcmVwZWF0ZWRseS4gSWYgdGhlIGZpcnN0IHN1Y2ggY2FsbCByZXN1bHRzIGluIGFuIElPRXhjZXB0aW9uLAorICAgICAgICAqIHRoYXQgZXhjZXB0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgdG8gdGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZC4KKyAgICAgICAgKiBJZiBhbnkgc3Vic2VxdWVudCBjYWxsIHRvIHJlYWQoKSByZXN1bHRzIGluIGEgSU9FeGNlcHRpb24sIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBpcyBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBlbmQgb2YgZmlsZTsgdGhlIGJ5dGVzIHJlYWQgdXAgdG8gdGhhdAorICAgICAgICAqIHBvaW50IGFyZSBzdG9yZWQgaW50byBiIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmVmb3JlIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBvY2N1cnJlZCBpcyByZXR1cm5lZC4gU3ViY2xhc3NlcyBhcmUgZW5jb3VyYWdlZCB0byBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBiIC0gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQuCisgICAgICAgICogQHBhcmFtIG9mZiAtIHRoZSBzdGFydCBvZmZzZXQgaW4gYXJyYXkgYiAgYXQgd2hpY2ggdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgICAgKiBAcGFyYW0gbGVuIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB0aGUgYnVmZmVyLAorICAgICAgICAqICAgICAgICAgb3IgLTEgaXMgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGJlY2F1c2UgdGhlIGVuZAorICAgICAgICAqICAgICAgICAgb2YgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgICAgICAgY2FzZSAwOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUYvcmVhZAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSG9sZGVyIGIgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIb2xkZXIgKCk7CisgICAgICAgICAgIGludCBvZmYgPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIGludCBsZW4gPSBpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgIGludCAkcmVzdWx0ID0gKGludCkwOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5yZWFkIChiLCBvZmYsIGxlbik7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZyAoJHJlc3VsdCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSGVscGVyLndyaXRlIChvdXQsIGIudmFsdWUpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBDbG9zZSB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgICAgICBjYXNlIDE6ICAvLyBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRi9jbG9zZQorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIHRoaXMuY2xvc2UgKCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgfSBjYXRjaCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgb3V0ID0gJHJoLmNyZWF0ZUV4Y2VwdGlvblJlcGx5ICgpOworICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLndyaXRlIChvdXQsICRleCk7CisgICAgICAgICB9CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIHRvIGJlIHRyYW5zZmVyZC4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICAgICAgIGNhc2UgMjogIC8vIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGL2xlbmd0aAorICAgICAgIHsKKyAgICAgICAgIHRyeSB7CisgICAgICAgICAgIGludCAkcmVzdWx0ID0gKGludCkwOworICAgICAgICAgICAkcmVzdWx0ID0gdGhpcy5sZW5ndGggKCk7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVSZXBseSgpOworICAgICAgICAgICBvdXQud3JpdGVfbG9uZyAoJHJlc3VsdCk7CisgICAgICAgICB9IGNhdGNoIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlRXhjZXB0aW9uUmVwbHkgKCk7CisgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIud3JpdGUgKG91dCwgJGV4KTsKKyAgICAgICAgIH0KKyAgICAgICAgIGJyZWFrOworICAgICAgIH0KKworCisgIC8qKgorICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgICAgICAgY2FzZSAzOiAgLy8gY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUYvcmVzZXQKKyAgICAgICB7CisgICAgICAgICB0cnkgeworICAgICAgICAgICB0aGlzLnJlc2V0ICgpOworICAgICAgICAgICBvdXQgPSAkcmguY3JlYXRlUmVwbHkoKTsKKyAgICAgICAgIH0gY2F0Y2ggKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgIG91dCA9ICRyaC5jcmVhdGVFeGNlcHRpb25SZXBseSAoKTsKKyAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci53cml0ZSAob3V0LCAkZXgpOworICAgICAgICAgfQorICAgICAgICAgYnJlYWs7CisgICAgICAgfQorCisgICAgICAgZGVmYXVsdDoKKyAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLkJBRF9PUEVSQVRJT04gKDAsIG9yZy5vbWcuQ09SQkEuQ29tcGxldGlvblN0YXR1cy5DT01QTEVURURfTUFZQkUpOworICAgIH0KKworICAgIHJldHVybiBvdXQ7CisgIH0gLy8gX2ludm9rZQorCisgIC8vIFR5cGUtc3BlY2lmaWMgQ09SQkE6Ok9iamVjdCBvcGVyYXRpb25zCisgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIF9faWRzID0geworICAgICJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUY6MS4wIn07CisKKyAgcHVibGljIFN0cmluZ1tdIF9hbGxfaW50ZXJmYWNlcyAob3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0EgcG9hLCBieXRlW10gb2JqZWN0SWQpCisgIHsKKyAgICByZXR1cm4gKFN0cmluZ1tdKV9faWRzLmNsb25lICgpOworICB9CisKKyAgcHVibGljIElucHV0U3RyZWFtSUYgX3RoaXMoKSAKKyAgeworICAgIHJldHVybiBJbnB1dFN0cmVhbUlGSGVscGVyLm5hcnJvdygKKyAgICBzdXBlci5fdGhpc19vYmplY3QoKSk7CisgIH0KKworICBwdWJsaWMgSW5wdXRTdHJlYW1JRiBfdGhpcyhvcmcub21nLkNPUkJBLk9SQiBvcmIpIAorICB7CisgICAgcmV0dXJuIElucHV0U3RyZWFtSUZIZWxwZXIubmFycm93KAorICAgIHN1cGVyLl90aGlzX29iamVjdChvcmIpKTsKKyAgfQorCisKK30gLy8gY2xhc3MgSW5wdXRTdHJlYW1JRlBPQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0lucHV0U3RyZWFtSUZQT0FUaWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGUE9BVGllLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NTBjZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9JbnB1dFN0cmVhbUlGUE9BVGllLmphdmEKQEAgLTAsMCArMSwxMjggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRlBPQVRpZS5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIElucHV0U3RyZWFtSUZQT0FUaWUgZXh0ZW5kcyBJbnB1dFN0cmVhbUlGUE9BCit7CisKKyAgLy8gQ29uc3RydWN0b3JzCisKKyAgcHVibGljIElucHV0U3RyZWFtSUZQT0FUaWUgKCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMgZGVsZWdhdGUgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgIH0KKyAgcHVibGljIElucHV0U3RyZWFtSUZQT0FUaWUgKCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMgZGVsZWdhdGUgLCBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBwb2EgKSB7CisgICAgICB0aGlzLl9pbXBsID0gZGVsZWdhdGU7CisgICAgICB0aGlzLl9wb2EgICAgICA9IHBvYTsKKyAgfQorICBwdWJsaWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZPcGVyYXRpb25zIF9kZWxlZ2F0ZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLl9pbXBsOworICB9CisgIHB1YmxpYyB2b2lkIF9kZWxlZ2F0ZSAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUZPcGVyYXRpb25zIGRlbGVnYXRlICkgeworICAgICAgdGhpcy5faW1wbCA9IGRlbGVnYXRlOworICB9CisgIHB1YmxpYyBvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQSBfZGVmYXVsdF9QT0EoKSB7CisgICAgICBpZihfcG9hICE9IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gX3BvYTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICAgIHJldHVybiBzdXBlci5fZGVmYXVsdF9QT0EoKTsKKyAgICAgIH0KKyAgfQorCisgIC8qKgorICAgICAgICAqIFJlYWRzIHVwIHRvIGxlbiBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpbnRvIGFuIGFycmF5CisgICAgICAgICogb2YgYnl0ZXMuIEFuIGF0dGVtcHQgaXMgbWFkZSB0byByZWFkIGFzIG1hbnkgYXMgbGVuIGJ5dGVzLCBidXQgYQorICAgICAgICAqIHNtYWxsZXIgbnVtYmVyIG1heSBiZSByZWFkLCBwb3NzaWJseSB6ZXJvLiBUaGUgbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgICogYWN0dWFsbHkgcmVhZCBpcyByZXR1cm5lZCBhcyBhbiBpbnRlZ2VyLgorICAgICAgICAqCisgICAgICAgICogVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGlucHV0IGRhdGEgaXMgYXZhaWxhYmxlLCBlbmQgb2YgZmlsZQorICAgICAgICAqIGlzIGRldGVjdGVkLCBvciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgYiBpcyBudWxsLCBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIG9mZiBpcyBuZWdhdGl2ZSwgb3IgbGVuIGlzIG5lZ2F0aXZlLCBvciBvZmYrbGVuIGlzIGdyZWF0ZXIKKyAgICAgICAgKiB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5IGIsIHRoZW4gYW4gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBsZW4gaXMgemVybywgdGhlbiBubyBieXRlcyBhcmUgcmVhZCBhbmQgMCBpcyByZXR1cm5lZDsKKyAgICAgICAgKiBvdGhlcndpc2UsIHRoZXJlIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZS4KKyAgICAgICAgKiBJZiBubyBieXRlIGlzIGF2YWlsYWJsZSBiZWNhdXNlIHRoZSBzdHJlYW0gaXMgYXQgZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlIHZhbHVlIC0xIGlzIHJldHVybmVkOyBvdGhlcndpc2UsIGF0IGxlYXN0IG9uZSBieXRlIGlzIHJlYWQgYW5kIHN0b3JlZCBpbnRvIGIuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgZmlyc3QgYnl0ZSByZWFkIGlzIHN0b3JlZCBpbnRvIGVsZW1lbnQgYltvZmZdLCB0aGUgbmV4dCBvbmUgaW50byBiW29mZisxXSwKKyAgICAgICAgKiBhbmQgc28gb24uIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpcywgYXQgbW9zdCwgZXF1YWwgdG8gbGVuLiBMZXQgayBiZSB0aGUgbnVtYmVyCisgICAgICAgICogb2YgYnl0ZXMgYWN0dWFsbHkgcmVhZDsgdGhlc2UgYnl0ZXMgd2lsbCBiZSBzdG9yZWQgaW4gZWxlbWVudHMgYltvZmZdIHRocm91Z2ggYltvZmYray0xXSwKKyAgICAgICAgKiBsZWF2aW5nIGVsZW1lbnRzIGJbb2ZmK2tdIHRocm91Z2ggYltvZmYrbGVuLTFdIHVuYWZmZWN0ZWQuCisgICAgICAgICoKKyAgICAgICAgKiBJbiBldmVyeSBjYXNlLCBlbGVtZW50cyBiWzBdIHRocm91Z2ggYltvZmZdIGFuZCBlbGVtZW50cyBiW29mZitsZW5dCisgICAgICAgICogdGhyb3VnaCBiW2IubGVuZ3RoLTFdIGFyZSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSWYgdGhlIGZpcnN0IGJ5dGUgY2Fubm90IGJlIHJlYWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBlbmQgb2YgZmlsZSwKKyAgICAgICAgKiB0aGVuIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bi4gSW4gcGFydGljdWxhciwgYW4gSU9FeGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICogaWYgdGhlIGlucHV0IHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuCisgICAgICAgICoKKyAgICAgICAgKiBUaGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kIGZvciBjbGFzcyBJbnB1dFN0cmVhbSBzaW1wbHkgY2FsbHMgdGhlIG1ldGhvZAorICAgICAgICAqIHJlYWQoKSByZXBlYXRlZGx5LiBJZiB0aGUgZmlyc3Qgc3VjaCBjYWxsIHJlc3VsdHMgaW4gYW4gSU9FeGNlcHRpb24sCisgICAgICAgICogdGhhdCBleGNlcHRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byB0aGUgcmVhZChiLCBvZmYsIGxlbikgbWV0aG9kLgorICAgICAgICAqIElmIGFueSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVhZCgpIHJlc3VsdHMgaW4gYSBJT0V4Y2VwdGlvbiwgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIGlzIGNhdWdodCBhbmQgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGVuZCBvZiBmaWxlOyB0aGUgYnl0ZXMgcmVhZCB1cCB0byB0aGF0CisgICAgICAgICogcG9pbnQgYXJlIHN0b3JlZCBpbnRvIGIgYW5kIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBiZWZvcmUgdGhlIGV4Y2VwdGlvbgorICAgICAgICAqIG9jY3VycmVkIGlzIHJldHVybmVkLiBTdWJjbGFzc2VzIGFyZSBlbmNvdXJhZ2VkIHRvIHByb3ZpZGUgYSBtb3JlIGVmZmljaWVudAorICAgICAgICAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtIGIgLSB0aGUgYnVmZmVyIGludG8gd2hpY2ggdGhlIGRhdGEgaXMgcmVhZC4KKyAgICAgICAgKiBAcGFyYW0gb2ZmIC0gdGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSBiICBhdCB3aGljaCB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAgICAqIEBwYXJhbSBsZW4gLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIHRoZSBidWZmZXIsCisgICAgICAgICogICAgICAgICBvciAtMSBpcyB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYmVjYXVzZSB0aGUgZW5kCisgICAgICAgICogICAgICAgICBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgcHVibGljIGludCByZWFkIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfQllURUhvbGRlciBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgcmV0dXJuIF9pbXBsLnJlYWQoYiwgb2ZmLCBsZW4pOworICB9IC8vIHJlYWQKKworCisgIC8qKgorICAgICAgICAqIENsb3NlIHRoZSBpbnB1dCBzdHJlYW0uCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBjbG9zZSAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgX2ltcGwuY2xvc2UoKTsKKyAgfSAvLyBjbG9zZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSB0byBiZSB0cmFuc2ZlcmQuCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gaWYgYW4gSU8gZXhjZXB0aW9uIG9jY3Vycy4KKyAgICAgICAgKi8KKyAgcHVibGljIGludCBsZW5ndGggKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgIHJldHVybiBfaW1wbC5sZW5ndGgoKTsKKyAgfSAvLyBsZW5ndGgKKworCisgIC8qKgorICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICBfaW1wbC5yZXNldCgpOworICB9IC8vIHJlc2V0CisKKyAgcHJpdmF0ZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRk9wZXJhdGlvbnMgX2ltcGw7CisgIHByaXZhdGUgb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0EgX3BvYTsKKworfSAvLyBjbGFzcyBJbnB1dFN0cmVhbUlGUE9BVGllCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvTE9OR19BUlJBWUhlbHBlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmJhMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIZWxwZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIZWxwZXIuamF2YSAuCisqIEdlbmVyYXRlZCBieSB0aGUgSURMLXRvLUphdmEgY29tcGlsZXIgKHBvcnRhYmxlKSwgdmVyc2lvbiAiMy4yIgorKiBmcm9tIHNyYy9tYWluL2lkbC9jb3JiYWZpbGVzZXJ2ZXIuaWRsCisqIERvbm5lcnN0YWcsIDE2LiBKdW5pIDIwMTYgMTA6MzAgVWhyIE1FU1oKKyovCisKK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBMT05HX0FSUkFZSGVscGVyCit7CisgIHByaXZhdGUgc3RhdGljIFN0cmluZyAgX2lkID0gIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvTE9OR19BUlJBWToxLjAiOworCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnQgKG9yZy5vbWcuQ09SQkEuQW55IGEsIGxvbmdbXSB0aGF0KQorICB7CisgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3V0ID0gYS5jcmVhdGVfb3V0cHV0X3N0cmVhbSAoKTsKKyAgICBhLnR5cGUgKHR5cGUgKCkpOworICAgIHdyaXRlIChvdXQsIHRoYXQpOworICAgIGEucmVhZF92YWx1ZSAob3V0LmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCksIHR5cGUgKCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBsb25nW10gZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmdldF9wcmltaXRpdmVfdGMgKG9yZy5vbWcuQ09SQkEuVENLaW5kLnRrX2xvbmdsb25nKTsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9zZXF1ZW5jZV90YyAoMCwgX190eXBlQ29kZSk7CisgICAgICBfX3R5cGVDb2RlID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoKS5jcmVhdGVfYWxpYXNfdGMgKGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5MT05HX0FSUkFZSGVscGVyLmlkICgpLCAiTE9OR19BUlJBWSIsIF9fdHlwZUNvZGUpOworICAgIH0KKyAgICByZXR1cm4gX190eXBlQ29kZTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGlkICgpCisgIHsKKyAgICByZXR1cm4gX2lkOworICB9CisKKyAgcHVibGljIHN0YXRpYyBsb25nW10gcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgbG9uZyB2YWx1ZVtdID0gbnVsbDsKKyAgICBpbnQgX2xlbjAgPSBpc3RyZWFtLnJlYWRfbG9uZyAoKTsKKyAgICB2YWx1ZSA9IG5ldyBsb25nW19sZW4wXTsKKyAgICBpc3RyZWFtLnJlYWRfbG9uZ2xvbmdfYXJyYXkgKHZhbHVlLCAwLCBfbGVuMCk7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvc3RyZWFtLCBsb25nW10gdmFsdWUpCisgIHsKKyAgICBvc3RyZWFtLndyaXRlX2xvbmcgKHZhbHVlLmxlbmd0aCk7CisgICAgb3N0cmVhbS53cml0ZV9sb25nbG9uZ19hcnJheSAodmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7CisgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0xPTkdfQVJSQVlIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9MT05HX0FSUkFZSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhYjA2OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9MT05HX0FSUkFZSG9sZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorcGFja2FnZSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQ7CisKKworLyoqCisqIGNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9MT05HX0FSUkFZSG9sZGVyLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCitwdWJsaWMgZmluYWwgY2xhc3MgTE9OR19BUlJBWUhvbGRlciBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuU3RyZWFtYWJsZQoreworICBwdWJsaWMgbG9uZyB2YWx1ZVtdID0gbnVsbDsKKworICBwdWJsaWMgTE9OR19BUlJBWUhvbGRlciAoKQorICB7CisgIH0KKworICBwdWJsaWMgTE9OR19BUlJBWUhvbGRlciAobG9uZ1tdIGluaXRpYWxWYWx1ZSkKKyAgeworICAgIHZhbHVlID0gaW5pdGlhbFZhbHVlOworICB9CisKKyAgcHVibGljIHZvaWQgX3JlYWQgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gaSkKKyAgeworICAgIHZhbHVlID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkxPTkdfQVJSQVlIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuTE9OR19BUlJBWUhlbHBlci53cml0ZSAobywgdmFsdWUpOworICB9CisKKyAgcHVibGljIG9yZy5vbWcuQ09SQkEuVHlwZUNvZGUgX3R5cGUgKCkKKyAgeworICAgIHJldHVybiBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuTE9OR19BUlJBWUhlbHBlci50eXBlICgpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWcuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE2NDdmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvU2V2ZXJpdHlGbGFnLmphdmEgLgorKiBHZW5lcmF0ZWQgYnkgdGhlIElETC10by1KYXZhIGNvbXBpbGVyIChwb3J0YWJsZSksIHZlcnNpb24gIjMuMiIKKyogZnJvbSBzcmMvbWFpbi9pZGwvY29yYmFmaWxlc2VydmVyLmlkbAorKiBEb25uZXJzdGFnLCAxNi4gSnVuaSAyMDE2IDEwOjMwIFVociBNRVNaCisqLworCisKKy8qKgorICAgKiBUaGUgZXJyb3Igc2V2ZXJpdHkgZmxhZ3MuCisgICAqLworcHVibGljIGNsYXNzIFNldmVyaXR5RmxhZyBpbXBsZW1lbnRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSURMRW50aXR5Cit7CisgIHByaXZhdGUgICAgICAgIGludCBfX3ZhbHVlOworICBwcml2YXRlIHN0YXRpYyBpbnQgX19zaXplID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZ1tdIF9fYXJyYXkgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBbX19zaXplXTsKKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfU1VDQ0VTUyA9IDA7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBTVUNDRVNTID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcoX1NVQ0NFU1MpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfSU5GT1JNQVRJT04gPSAxOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgSU5GT1JNQVRJT04gPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyhfSU5GT1JNQVRJT04pOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfV0FSTklORyA9IDI7CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBXQVJOSU5HID0gbmV3IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcoX1dBUk5JTkcpOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBfRVJST1IgPSAzOworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgRVJST1IgPSBuZXcgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyhfRVJST1IpOworCisgIHB1YmxpYyBpbnQgdmFsdWUgKCkKKyAgeworICAgIHJldHVybiBfX3ZhbHVlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIGZyb21faW50IChpbnQgdmFsdWUpCisgIHsKKyAgICBpZiAodmFsdWUgPj0gMCAmJiB2YWx1ZSA8IF9fc2l6ZSkKKyAgICAgIHJldHVybiBfX2FycmF5W3ZhbHVlXTsKKyAgICBlbHNlCisgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5CQURfUEFSQU0gKCk7CisgIH0KKworICBwcm90ZWN0ZWQgU2V2ZXJpdHlGbGFnIChpbnQgdmFsdWUpCisgIHsKKyAgICBfX3ZhbHVlID0gdmFsdWU7CisgICAgX19hcnJheVtfX3ZhbHVlXSA9IHRoaXM7CisgIH0KK30gLy8gY2xhc3MgU2V2ZXJpdHlGbGFnCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvU2V2ZXJpdHlGbGFnSGVscGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvU2V2ZXJpdHlGbGFnSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmN2I1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWdIZWxwZXIuamF2YQpAQCAtMCwwICsxLDU3IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZ0hlbHBlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworCisvKioKKyAgICogVGhlIGVycm9yIHNldmVyaXR5IGZsYWdzLgorICAgKi8KK2Fic3RyYWN0IHB1YmxpYyBjbGFzcyBTZXZlcml0eUZsYWdIZWxwZXIKK3sKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nICBfaWQgPSAiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWc6MS4wIjsKKworICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0IChvcmcub21nLkNPUkJBLkFueSBhLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnIHRoYXQpCisgIHsKKyAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSBvdXQgPSBhLmNyZWF0ZV9vdXRwdXRfc3RyZWFtICgpOworICAgIGEudHlwZSAodHlwZSAoKSk7CisgICAgd3JpdGUgKG91dCwgdGhhdCk7CisgICAgYS5yZWFkX3ZhbHVlIChvdXQuY3JlYXRlX2lucHV0X3N0cmVhbSAoKSwgdHlwZSAoKSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgZXh0cmFjdCAob3JnLm9tZy5DT1JCQS5BbnkgYSkKKyAgeworICAgIHJldHVybiByZWFkIChhLmNyZWF0ZV9pbnB1dF9zdHJlYW0gKCkpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfX3R5cGVDb2RlID0gbnVsbDsKKyAgc3luY2hyb25pemVkIHB1YmxpYyBzdGF0aWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSB0eXBlICgpCisgIHsKKyAgICBpZiAoX190eXBlQ29kZSA9PSBudWxsKQorICAgIHsKKyAgICAgIF9fdHlwZUNvZGUgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0ICgpLmNyZWF0ZV9lbnVtX3RjIChjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnSGVscGVyLmlkICgpLCAiU2V2ZXJpdHlGbGFnIiwgbmV3IFN0cmluZ1tdIHsgIlNVQ0NFU1MiLCAiSU5GT1JNQVRJT04iLCAiV0FSTklORyIsICJFUlJPUiJ9ICk7CisgICAgfQorICAgIHJldHVybiBfX3R5cGVDb2RlOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTdHJpbmcgaWQgKCkKKyAgeworICAgIHJldHVybiBfaWQ7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgcmVhZCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSBpc3RyZWFtKQorICB7CisgICAgcmV0dXJuIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcuZnJvbV9pbnQgKGlzdHJlYW0ucmVhZF9sb25nICgpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZSAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gb3N0cmVhbSwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyB2YWx1ZSkKKyAgeworICAgIG9zdHJlYW0ud3JpdGVfbG9uZyAodmFsdWUudmFsdWUgKCkpOworICB9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWdIb2xkZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9TZXZlcml0eUZsYWdIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzBmNzkwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZ0hvbGRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL1NldmVyaXR5RmxhZ0hvbGRlci5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworCisvKioKKyAgICogVGhlIGVycm9yIHNldmVyaXR5IGZsYWdzLgorICAgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXZlcml0eUZsYWdIb2xkZXIgaW1wbGVtZW50cyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLlN0cmVhbWFibGUKK3sKKyAgcHVibGljIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWcgdmFsdWUgPSBudWxsOworCisgIHB1YmxpYyBTZXZlcml0eUZsYWdIb2xkZXIgKCkKKyAgeworICB9CisKKyAgcHVibGljIFNldmVyaXR5RmxhZ0hvbGRlciAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLlNldmVyaXR5RmxhZyBpbml0aWFsVmFsdWUpCisgIHsKKyAgICB2YWx1ZSA9IGluaXRpYWxWYWx1ZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIF9yZWFkIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtIGkpCisgIHsKKyAgICB2YWx1ZSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIucmVhZCAoaSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBfd3JpdGUgKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtIG8pCisgIHsKKyAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnSGVscGVyLndyaXRlIChvLCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgb3JnLm9tZy5DT1JCQS5UeXBlQ29kZSBfdHlwZSAoKQorICB7CisgICAgcmV0dXJuIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5TZXZlcml0eUZsYWdIZWxwZXIudHlwZSAoKTsKKyAgfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9jb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvX0NPUkJBRmlsZVNlcnZlcklGU3R1Yi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdlOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIuamF2YQpAQCAtMCwwICsxLDExMzYgQEAKK3BhY2thZ2UgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkOworCisKKy8qKgorKiBjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvX0NPUkJBRmlsZVNlcnZlcklGU3R1Yi5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIF9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIgZXh0ZW5kcyBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk9iamVjdEltcGwgaW1wbGVtZW50cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUYKK3sKKworCisgIC8qKgorICAgICAgICAqIFNhdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBpbnRwdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0sIHJlYWR5IHRvIHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiBzdHJlYW0pIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgic2F2ZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChzdWJEaXIpOworICAgICAgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLndyaXRlICgkb3V0LCBzdHJlYW0pOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmUgKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBzdHJlYW0gICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gc2F2ZQorCisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBpaWQgdGhlIGluc3RhbmNlIGVsZW1lbnQgaWQuCisgICAgICAgICogQHBhcmFtICBzdHJlYW0gdGhlIGlucHV0IHN0cmVhbSwgcmVhZHkgdG8gcmVhZCBieSB0aGUgc2VydmVyLgorICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgKi8KKyAgcHVibGljIFN0cmluZyBzYXZlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGIHN0cmVhbSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJzYXZlRm9ySW5zdGFuY2UiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoc3ViRGlyKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgYWlkKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgaWlkKTsKKyAgICAgICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci53cml0ZSAoJG91dCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9ICRpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzYXZlRm9ySW5zdGFuY2UgKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhaWQsIGlpZCwgc3RyZWFtICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHNhdmVGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogU2F2ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGludHB1dCBzdHJlYW0uCisgICAgICAgICogU3BlY2lmeSB0aGUgbmFtZSBvZiBhbiBhcHBsY2lhdGlvbiBlbGVtZW50IGFuZCB0aGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgZWxlbWVudAorICAgICAgICAqIHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZQorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAqIEBwYXJhbSAgYWVOYW1lIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IG5hbWUuCisgICAgICAgICogQHBhcmFtICBpZU5hbWUgdGhlIGluc3RhbmNlIGVsZW1lbnQgbmFtZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICogQHJldHVybiB0aGUgdXJsIHN0cmluZyBvZiB0aGUgY3JlYXRlZCBmaWxlLgorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZU5hbWUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHN1YkRpciwgU3RyaW5nIGFlTmFtZSwgU3RyaW5nIGllTmFtZSwgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgc3RyZWFtKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoInNhdmVGb3JJbnN0YW5jZU5hbWUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoc3ViRGlyKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoYWVOYW1lKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoaWVOYW1lKTsKKyAgICAgICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci53cml0ZSAoJG91dCwgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9ICRpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzYXZlRm9ySW5zdGFuY2VOYW1lIChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWVOYW1lLCBpZU5hbWUsIHN0cmVhbSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBzYXZlRm9ySW5zdGFuY2VOYW1lCisKKworICAvKioKKyAgICAgICAgKiBEZWxldGUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBkZWxldGUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJkZWxldGUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgKGFvU2VzcywgbmFtZSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBkZWxldGUKKworCisgIC8qKgorICAgICAgICAqIE1vdmUgdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICAgICAgICAqCisgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtICB1cmxvIHRoZSB1cmwgb2YgdGhlIGZpbGUuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIG1vdmUgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgdXJsKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoIm1vdmUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nICh1cmwpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIG1vdmUgKGFvU2VzcywgdXJsICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIG1vdmUKKworCisgIC8qKgorICAgICAgICAqIERlbGV0ZSB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgICAgICAgICogU3BlY2lmeSB0aGUgQXBwbGljYXRpb25FbGVtZW50IGlkIGFuZCB0aGUgSW5zdGFuY2VFbGVtZW50IGlkCisgICAgICAgICogb2YgdGhlIGNvbXBvbmVudCB0aGF0IGhvbGRzIHRoZSBleHRlcm5hbCByZWZlcmVuY2UuCisgICAgICAgICoKKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0gIHVybCB0aGUgdXJsIG9mIHRoZSBmaWxlLgorICAgICAgICAqIEBwYXJhbSAgYWlkIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50IGlkLgorICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAqLworICBwdWJsaWMgdm9pZCBkZWxldGVGb3JJbnN0YW5jZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyB1cmwsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImRlbGV0ZUZvckluc3RhbmNlIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAodXJsKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgYWlkKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgaWlkKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICBkZWxldGVGb3JJbnN0YW5jZSAoYW9TZXNzLCB1cmwsIGFpZCwgaWlkICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGRlbGV0ZUZvckluc3RhbmNlCisKKworICAvKioKKyAgICAgICAgKiBNb3ZlIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKiBTcGVjaWZ5IHRoZSBBcHBsaWNhdGlvbkVsZW1lbnQgaWQgYW5kIHRoZSBJbnN0YW5jZUVsZW1lbnQgaWQKKyAgICAgICAgKiBvZiB0aGUgY29tcG9uZW50IHRoYXQgaG9sZHMgdGhlIGV4dGVybmFsIHJlZmVyZW5jZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgbW92ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoIm1vdmVGb3JJbnN0YW5jZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBhaWQpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBpaWQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIG1vdmVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBtb3ZlRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqLworICBwdWJsaWMgdm9pZCBnZXRCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldEJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIGdldEJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldEJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogR2V0IHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSB1cmwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgZ2V0Rm9ySW5zdGFuY2VCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBhaWQsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGlpZCwgU3RyaW5nIGhvc3QsIGludCBhUG9ydCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJnZXRGb3JJbnN0YW5jZUJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGFpZCk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGlpZCk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIGdldEZvckluc3RhbmNlQnlTb2NrZXQgKGFvU2VzcywgbmFtZSwgYWlkLCBpaWQsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldEZvckluc3RhbmNlQnlTb2NrZXQKKworCisgIC8qKgorICAgICAgICAgKiBTYXZlIHRoZSBkYXRhIHVzaW5nIGEgc29ja2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcG9zc2libGUgZXJyb3IgY29kZXM6CisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9CQURfUEFSQU1FVEVSCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9JTVBMRU1FTlRFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgICogQHBhcmFtICBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlLgorICAgICAgICAgKiBAcGFyYW0gIHN1YkRpciBhbiBhbHRlcm5hdGl2ZSBzdWIgZGlyZWN0b3J5LCB0aGF0IGNhbiBiZSBzcGVjaWZpZWQsCisgICAgICAgICAqICAgICAgICAgICAgICAgIGlmIHRoZSBmaWxlbmFtZSBzaG91bGQgbm90IHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZXN0aW5hdGlvbiBmb2xkZXIuCisgICAgICAgICAqIEBwYXJhbSAgaG9zdCB0aGUgaG9zdG5hbWUgZm9yIHRoZSBzb2NrZXQgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtICBwb3J0IHRoZSBwb3J0IGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHVybCBzdHJpbmcgb2YgdGhlIGNyZWF0ZWQgZmlsZS4KKyAgICAgICAgICovCisgIHB1YmxpYyBTdHJpbmcgc2F2ZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIFN0cmluZyBob3N0LCBpbnQgYVBvcnQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgic2F2ZUJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKHN1YkRpcik7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVCeVNvY2tldCAoYW9TZXNzLCBuYW1lLCBzdWJEaXIsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHNhdmVCeVNvY2tldAorCisKKyAgLyoqCisgICAgICAgICAqIFNhdmUgdGhlIGRhdGEgdXNpbmcgYSBzb2NrZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUX0ZBSUxFRAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9DT05ORUNUSU9OX0xPU1QKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9fTUVNT1JZCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAgKiBAcGFyYW0gIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAqIEBwYXJhbSAgc3ViRGlyIGFuIGFsdGVybmF0aXZlIHN1YiBkaXJlY3RvcnksIHRoYXQgY2FuIGJlIHNwZWNpZmllZCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgaWYgdGhlIGZpbGVuYW1lIHNob3VsZCBub3QgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGRlc3RpbmF0aW9uIGZvbGRlci4KKyAgICAgICAgICogQHBhcmFtICBhaWQgdGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgaWQuCisgICAgICAgICAqIEBwYXJhbSAgaWlkIHRoZSBpbnN0YW5jZSBlbGVtZW50IGlkLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBzdWJEaXIsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoInNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKHN1YkRpcik7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGFpZCk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGlpZCk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGhvc3QpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAoYVBvcnQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0IChhb1Nlc3MsIG5hbWUsIHN1YkRpciwgYWlkLCBpaWQsIGhvc3QsIGFQb3J0ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHNhdmVGb3JJbnN0YW5jZUJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgICogU2F2ZSB0aGUgZGF0YSB1c2luZyBhIHNvY2tldC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RfRkFJTEVECisgICAgICAgICAqICAgIEZJTEVTRVJWRVJfQkFEX1BBUkFNRVRFUgorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAgKiAgICBGSUxFU0VSVkVSX0lNUExFTUVOVEFUSU9OX1BST0JMRU0KKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICogQHBhcmFtICBzdWJEaXIgYW4gYWx0ZXJuYXRpdmUgc3ViIGRpcmVjdG9yeSwgdGhhdCBjYW4gYmUgc3BlY2lmaWVkLAorICAgICAgICAgKiAgICAgICAgICAgICAgICBpZiB0aGUgZmlsZW5hbWUgc2hvdWxkIG5vdCB1c2VkIHRvIGRldGVybWluZSB0aGUgZGVzdGluYXRpb24gZm9sZGVyLgorICAgICAgICAgKiBAcGFyYW0gIGFlTmFtZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGllTmFtZSB0aGUgaW5zdGFuY2UgZWxlbWVudCBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gIGhvc3QgdGhlIGhvc3RuYW1lIGZvciB0aGUgc29ja2V0IGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSAgcG9ydCB0aGUgcG9ydCBmb3IgdGhlIHNvY2tldCBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB1cmwgc3RyaW5nIG9mIHRoZSBjcmVhdGVkIGZpbGUuCisgICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIHNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc3ViRGlyLCBTdHJpbmcgYWVOYW1lLCBTdHJpbmcgaWVOYW1lLCBTdHJpbmcgaG9zdCwgaW50IGFQb3J0KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoInNhdmVGb3JJbnN0YW5jZU5hbWVCeVNvY2tldCIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChzdWJEaXIpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChhZU5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChpZU5hbWUpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChob3N0KTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX2xvbmcgKGFQb3J0KTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdCA9ICRpbi5yZWFkX3N0cmluZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzYXZlRm9ySW5zdGFuY2VOYW1lQnlTb2NrZXQgKGFvU2VzcywgbmFtZSwgc3ViRGlyLCBhZU5hbWUsIGllTmFtZSwgaG9zdCwgYVBvcnQgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gc2F2ZUZvckluc3RhbmNlTmFtZUJ5U29ja2V0CisKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVhZCIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGICRyZXN1bHQgPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWQgKGFvU2VzcywgbmFtZSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyByZWFkCisKKworICAvKioKKyAgICAgICAgKiBSZWFkIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtLCByZWFkeSB0byByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICAgICovCisgIHB1YmxpYyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRiByZWFkRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVhZEZvckluc3RhbmNlIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGFpZCk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkdIZWxwZXIud3JpdGUgKCRvdXQsIGlpZCk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLklucHV0U3RyZWFtSUYgJHJlc3VsdCA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEZvckluc3RhbmNlIChhb1Nlc3MsIG5hbWUsIGFpZCwgaWlkICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHJlYWRGb3JJbnN0YW5jZQorCisKKyAgLyoqCisgICAgICAgICogIEdldCBzaXplIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHNpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0U2l6ZSAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBuYW1lKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldFNpemUiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBsb25nICRyZXN1bHQgPSAkaW4ucmVhZF9sb25nbG9uZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRTaXplIChhb1Nlc3MsIG5hbWUgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gZ2V0U2l6ZQorCisKKyAgLyoqCisgICAgICAgICogIEdldCBzaXplIG9mIHRoZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHNpemUgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmcgZ2V0U2l6ZUZvckluc3RhbmNlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HIGFpZCwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgaWlkKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldFNpemVGb3JJbnN0YW5jZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKG5hbWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBhaWQpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HSGVscGVyLndyaXRlICgkb3V0LCBpaWQpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIGxvbmcgJHJlc3VsdCA9ICRpbi5yZWFkX2xvbmdsb25nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNpemVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBnZXRTaXplRm9ySW5zdGFuY2UKKworCisgIC8qKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHN0YXJ0IGEgdGVybWluYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHN0cmluZy4gVGhlIGNvbnRlbnQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgKiAgICAgICAgIHNlcnZlciBzaWRlIHRlcm1pbmF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgdGVybWluYXRlIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgidGVybWluYXRlIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAobmFtZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKHBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgdGVybWluYXRlIChhb1Nlc3MsIG5hbWUsIHBhcmFtZXRlciAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyB0ZXJtaW5hdGUKKworCisgIC8qKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYnkgdGhlIGNsaWVudCB3aGVuIHRoZSBzZXJ2ZXIgc2hvdWxkIGJlIHN0YXJ0IGEgdGVybWluYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVF9GQUlMRUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0JBRF9QQVJBTUVURVIKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSAgbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgKiBAcGFyYW0gIGFpZCB0aGUgYXBwbGljYXRpb24gZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIGlpZCB0aGUgaW5zdGFuY2UgZWxlbWVudCBpZC4KKyAgICAgICAgKiBAcGFyYW0gIHBhcmFtZXRlciB0aGUgcGFyYW1ldGVyIHN0cmluZy4gVGhlIGNvbnRlbnQgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgKiAgICAgICAgIHNlcnZlciBzaWRlIHRlcm1pbmF0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgdGVybWluYXRlRm9ySW5zdGFuY2UgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcgbmFtZSwgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkcgYWlkLCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORyBpaWQsIFN0cmluZyBwYXJhbWV0ZXIpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgidGVybWluYXRlRm9ySW5zdGFuY2UiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChuYW1lKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgYWlkKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuVF9MT05HTE9OR0hlbHBlci53cml0ZSAoJG91dCwgaWlkKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAocGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdGVGb3JJbnN0YW5jZSAoYW9TZXNzLCBuYW1lLCBhaWQsIGlpZCwgcGFyYW1ldGVyICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHRlcm1pbmF0ZUZvckluc3RhbmNlCisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGhvc3Qgd2hlcmUgdGhlIHNlcnZlciBpcyBydW5uaW5nCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcmV0dXJuIHRoZSBob3N0bmFtZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEhvc3RuYW1lIChvcmcuYXNhbS5vZHMuQW9TZXNzaW9uIGFvU2VzcykgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJnZXRIb3N0bmFtZSIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgU3RyaW5nICRyZXN1bHQgPSAkaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SG9zdG5hbWUgKGFvU2VzcyAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBnZXRIb3N0bmFtZQorCisKKyAgLyoqCisgICAgICAgICogR2V0IGEgY29udGV4dCB2YXJpYWJsZS4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleXdvcmQgb2YgdGhlIGNvbnRleHQgdmFsdWUuCisgICAgICAgICogQHJldHVybiB0aGUgY29udGV4dCB2YWx1ZQorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWSwKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PVF9GT1VORAorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzLCBTdHJpbmcga2V5KSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldENvbnRleHQiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uSGVscGVyLndyaXRlICgkb3V0LCBhb1Nlc3MpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfc3RyaW5nIChrZXkpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIFN0cmluZyAkcmVzdWx0ID0gJGluLnJlYWRfc3RyaW5nICgpOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldENvbnRleHQgKGFvU2Vzcywga2V5ICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldENvbnRleHQKKworCisgIC8qKgorICAgICAgICAqIFNldCBhIGNvbnRleHQgdmFyaWFibGUuCisgICAgICAgICoKKyAgICAgICAgKiBAcGFyYW0gIGFvU2VzcyB0aGUgQVNBTSBPRFMgc2Vzc2lvbi4KKyAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXl3b3JkIG9mIHRoZSBjb250ZXh0IHZhbHVlLgorICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgc2V0Q29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJzZXRDb250ZXh0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAoa2V5KTsKKyAgICAgICAgICAgICAgICAkb3V0LndyaXRlX3N0cmluZyAodmFsdWUpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHNldENvbnRleHQgKGFvU2Vzcywga2V5LCB2YWx1ZSAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBzZXRDb250ZXh0CisKKworICAvKioKKyAgICAgICAgKiBSZW1vdmUgYSBjb250ZXh0IHZhcmlhYmxlLgorICAgICAgICAqCisgICAgICAgICogQHBhcmFtICBhb1Nlc3MgdGhlIEFTQU0gT0RTIHNlc3Npb24uCisgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5d29yZCBvZiB0aGUgY29udGV4dCB2YWx1ZS4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICAgICAgICAqIHdpdGggdGhlIGZvbGxvd2luZyBwb3NzaWJsZSBlcnJvciBjb2RlczoKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX0NPTk5FQ1RJT05fTE9TVAorICAgICAgICAqICAgIEZJTEVTRVJWRVJfSU1QTEVNRU5UQVRJT05fUFJPQkxFTQorICAgICAgICAqICAgIEZJTEVTRVJWRVJfTk9UX0lNUExFTUVOVEVECisgICAgICAgICogICAgRklMRVNFUlZFUl9OT19NRU1PUlkKKyAgICAgICAgKi8KKyAgcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dCAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZyBrZXkpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVtb3ZlQ29udGV4dCIsIHRydWUpOworICAgICAgICAgICAgICAgIG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb25IZWxwZXIud3JpdGUgKCRvdXQsIGFvU2Vzcyk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9zdHJpbmcgKGtleSk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlQ29udGV4dCAoYW9TZXNzLCBrZXkgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gcmVtb3ZlQ29udGV4dAorCisKKyAgLyoqCisgICAgICAgICogTGlzdCBhbGwgY29udGV4dCBrZXl3b3Jkcy4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSAgYW9TZXNzIHRoZSBBU0FNIE9EUyBzZXNzaW9uLgorICAgICAgICAqIEByZXR1cm4gYSBzZXF1ZW5jZSBvZiBzdHJpbmdzLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nW10gbGlzdENvbnRleHQgKG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb24gYW9TZXNzKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImxpc3RDb250ZXh0IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgJHJlc3VsdFtdID0gY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX1NUUklOR0hlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RDb250ZXh0IChhb1Nlc3MgICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gbGlzdENvbnRleHQKKworCisgIC8qKgorICAgICAgICAqIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgQ29yYmFGaWxlU2VydmVySUYuCisgICAgICAgICogUmV0dXJucyBnZXRWZXJzaW9uIG9mIENvcmJhRmlsZVNlcnZlci4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICogQHJldHVybiAgVGhlIGludGVyZmFjZSB2ZXJzaW9uIG9mIHRoZSBDb3JiYUZpbGVTZXJ2ZXJJRi4KKyAgICAgICAgKgorICAgICAgICAqLworICBwdWJsaWMgU3RyaW5nIGdldEludGVyZmFjZVZlcnNpb24gKCkgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJnZXRJbnRlcmZhY2VWZXJzaW9uIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgU3RyaW5nICRyZXN1bHQgPSAkaW4ucmVhZF9zdHJpbmcgKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50ZXJmYWNlVmVyc2lvbiAoICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldEludGVyZmFjZVZlcnNpb24KKworCisgIC8qKgorICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgbG9uZyB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBsZW5ndGgKKyAgICAgICAgKiBvZiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHByb3ZpZGVkIGluIHRoZSBTdHJpbmcgYXJyYXkuCisgICAgICAgICogVGhlIG9yZGVyIG9mIHRoZSBsb25nIHZhbHVlcyBtdXN0IG1hdGNoIHdpdGggdGhlIG9yZGVyCisgICAgICAgICogb2YgdGhlIGZpbGVuYW1lcy4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBhb1Nlc3MgdGhlIGFvU2Vzc2lvbiBvZiB0aGUgY2FsbGVyCisgICAgICAgICogQHBhcmFtIG5hbWVzIHRoZSBTdHJpbmcgYXJyYXkgb2YgZmlsZW5hbWVzIGZvciAKKyAgICAgICAgKiAgICAgICAgICAgICAgd2hpY2ggdG8gZ2V0IHRoZSBzaXplcworICAgICAgICAqIEByZXR1cm4gYW4gQXJyYXkgb2YgbG9uZyB2YWx1ZXMgY29udGFpbmluZyB0aGUgZmlsZSBzaXplcworICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgICAgICAgICogd2l0aCB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIGVycm9yIGNvZGVzOgorICAgICAgICAqICAgIEZJTEVTRVJWRVJfQ09OTkVDVElPTl9MT1NUCisgICAgICAgICogICAgRklMRVNFUlZFUl9JTVBMRU1FTlRBVElPTl9QUk9CTEVNCisgICAgICAgICogICAgRklMRVNFUlZFUl9OT1RfSU1QTEVNRU5URUQKKyAgICAgICAgKiAgICBGSUxFU0VSVkVSX05PX01FTU9SWQorICAgICAgICAqCisgICAgICAgICoKKyAgICAgICAgKi8KKyAgcHVibGljIGxvbmdbXSBnZXRTaXplcyAob3JnLmFzYW0ub2RzLkFvU2Vzc2lvbiBhb1Nlc3MsIFN0cmluZ1tdIG5hbWVzKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImdldFNpemVzIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbkhlbHBlci53cml0ZSAoJG91dCwgYW9TZXNzKTsKKyAgICAgICAgICAgICAgICBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuRFNfU1RSSU5HSGVscGVyLndyaXRlICgkb3V0LCBuYW1lcyk7CisgICAgICAgICAgICAgICAgJGluID0gX2ludm9rZSAoJG91dCk7CisgICAgICAgICAgICAgICAgbG9uZyAkcmVzdWx0W10gPSBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuTE9OR19BUlJBWUhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIHJldHVybiAkcmVzdWx0OworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5BcHBsaWNhdGlvbkV4Y2VwdGlvbiAkZXgpIHsKKyAgICAgICAgICAgICAgICAkaW4gPSAkZXguZ2V0SW5wdXRTdHJlYW0gKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9pZCA9ICRleC5nZXRJZCAoKTsKKyAgICAgICAgICAgICAgICBpZiAoX2lkLmVxdWFscyAoIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uOjEuMCIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgb3JnLm9tZy5DT1JCQS5NQVJTSEFMIChfaWQpOworICAgICAgICAgICAgfSBjYXRjaCAob3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5SZW1hcnNoYWxFeGNlcHRpb24gJHJtKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNpemVzIChhb1Nlc3MsIG5hbWVzICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGdldFNpemVzCisKKyAgLy8gVHlwZS1zcGVjaWZpYyBDT1JCQTo6T2JqZWN0IG9wZXJhdGlvbnMKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX19pZHMgPSB7CisgICAgIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvQ09SQkFGaWxlU2VydmVySUY6MS4wIn07CisKKyAgcHVibGljIFN0cmluZ1tdIF9pZHMgKCkKKyAgeworICAgIHJldHVybiAoU3RyaW5nW10pX19pZHMuY2xvbmUgKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdCAoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgorICB7CisgICAgIFN0cmluZyBzdHIgPSBzLnJlYWRVVEYgKCk7CisgICAgIFN0cmluZ1tdIGFyZ3MgPSBudWxsOworICAgICBqYXZhLnV0aWwuUHJvcGVydGllcyBwcm9wcyA9IG51bGw7CisgICAgIG9yZy5vbWcuQ09SQkEuT1JCIG9yYiA9IG9yZy5vbWcuQ09SQkEuT1JCLmluaXQgKGFyZ3MsIHByb3BzKTsKKyAgIHRyeSB7CisgICAgIG9yZy5vbWcuQ09SQkEuT2JqZWN0IG9iaiA9IG9yYi5zdHJpbmdfdG9fb2JqZWN0IChzdHIpOworICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLkRlbGVnYXRlIGRlbGVnYXRlID0gKChvcmcub21nLkNPUkJBLnBvcnRhYmxlLk9iamVjdEltcGwpIG9iaikuX2dldF9kZWxlZ2F0ZSAoKTsKKyAgICAgX3NldF9kZWxlZ2F0ZSAoZGVsZWdhdGUpOworICAgfSBmaW5hbGx5IHsKKyAgICAgb3JiLmRlc3Ryb3koKSA7CisgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QgKGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgU3RyaW5nW10gYXJncyA9IG51bGw7CisgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKyAgICAgb3JnLm9tZy5DT1JCQS5PUkIgb3JiID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoYXJncywgcHJvcHMpOworICAgdHJ5IHsKKyAgICAgU3RyaW5nIHN0ciA9IG9yYi5vYmplY3RfdG9fc3RyaW5nICh0aGlzKTsKKyAgICAgcy53cml0ZVVURiAoc3RyKTsKKyAgIH0gZmluYWxseSB7CisgICAgIG9yYi5kZXN0cm95KCkgOworICAgfQorICB9Cit9IC8vIGNsYXNzIF9DT1JCQUZpbGVTZXJ2ZXJJRlN0dWIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9fSW5wdXRTdHJlYW1JRlN0dWIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL2NvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9fSW5wdXRTdHJlYW1JRlN0dWIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE5N2VjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19JbnB1dFN0cmVhbUlGU3R1Yi5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACitwYWNrYWdlIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZDsKKworCisvKioKKyogY29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL19JbnB1dFN0cmVhbUlGU3R1Yi5qYXZhIC4KKyogR2VuZXJhdGVkIGJ5IHRoZSBJREwtdG8tSmF2YSBjb21waWxlciAocG9ydGFibGUpLCB2ZXJzaW9uICIzLjIiCisqIGZyb20gc3JjL21haW4vaWRsL2NvcmJhZmlsZXNlcnZlci5pZGwKKyogRG9ubmVyc3RhZywgMTYuIEp1bmkgMjAxNiAxMDozMCBVaHIgTUVTWgorKi8KKworcHVibGljIGNsYXNzIF9JbnB1dFN0cmVhbUlGU3R1YiBleHRlbmRzIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT2JqZWN0SW1wbCBpbXBsZW1lbnRzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5JbnB1dFN0cmVhbUlGCit7CisKKworICAvKioKKyAgICAgICAgKiBSZWFkcyB1cCB0byBsZW4gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gaW50byBhbiBhcnJheQorICAgICAgICAqIG9mIGJ5dGVzLiBBbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhZCBhcyBtYW55IGFzIGxlbiBieXRlcywgYnV0IGEKKyAgICAgICAgKiBzbWFsbGVyIG51bWJlciBtYXkgYmUgcmVhZCwgcG9zc2libHkgemVyby4gVGhlIG51bWJlciBvZiBieXRlcworICAgICAgICAqIGFjdHVhbGx5IHJlYWQgaXMgcmV0dXJuZWQgYXMgYW4gaW50ZWdlci4KKyAgICAgICAgKgorICAgICAgICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBpbnB1dCBkYXRhIGlzIGF2YWlsYWJsZSwgZW5kIG9mIGZpbGUKKyAgICAgICAgKiBpcyBkZXRlY3RlZCwgb3IgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgICAgKgorICAgICAgICAqIElmIGIgaXMgbnVsbCwgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICAgICoKKyAgICAgICAgKiBJZiBvZmYgaXMgbmVnYXRpdmUsIG9yIGxlbiBpcyBuZWdhdGl2ZSwgb3Igb2ZmK2xlbiBpcyBncmVhdGVyCisgICAgICAgICogdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBiLCB0aGVuIGFuIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICAqCisgICAgICAgICogSWYgbGVuIGlzIHplcm8sIHRoZW4gbm8gYnl0ZXMgYXJlIHJlYWQgYW5kIDAgaXMgcmV0dXJuZWQ7CisgICAgICAgICogb3RoZXJ3aXNlLCB0aGVyZSBpcyBhbiBhdHRlbXB0IHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUuCisgICAgICAgICogSWYgbm8gYnl0ZSBpcyBhdmFpbGFibGUgYmVjYXVzZSB0aGUgc3RyZWFtIGlzIGF0IGVuZCBvZiBmaWxlLAorICAgICAgICAqIHRoZSB2YWx1ZSAtMSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhdCBsZWFzdCBvbmUgYnl0ZSBpcyByZWFkIGFuZCBzdG9yZWQgaW50byBiLgorICAgICAgICAqCisgICAgICAgICogVGhlIGZpcnN0IGJ5dGUgcmVhZCBpcyBzdG9yZWQgaW50byBlbGVtZW50IGJbb2ZmXSwgdGhlIG5leHQgb25lIGludG8gYltvZmYrMV0sCisgICAgICAgICogYW5kIHNvIG9uLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaXMsIGF0IG1vc3QsIGVxdWFsIHRvIGxlbi4gTGV0IGsgYmUgdGhlIG51bWJlcgorICAgICAgICAqIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQ7IHRoZXNlIGJ5dGVzIHdpbGwgYmUgc3RvcmVkIGluIGVsZW1lbnRzIGJbb2ZmXSB0aHJvdWdoIGJbb2ZmK2stMV0sCisgICAgICAgICogbGVhdmluZyBlbGVtZW50cyBiW29mZitrXSB0aHJvdWdoIGJbb2ZmK2xlbi0xXSB1bmFmZmVjdGVkLgorICAgICAgICAqCisgICAgICAgICogSW4gZXZlcnkgY2FzZSwgZWxlbWVudHMgYlswXSB0aHJvdWdoIGJbb2ZmXSBhbmQgZWxlbWVudHMgYltvZmYrbGVuXQorICAgICAgICAqIHRocm91Z2ggYltiLmxlbmd0aC0xXSBhcmUgdW5hZmZlY3RlZC4KKyAgICAgICAgKgorICAgICAgICAqIElmIHRoZSBmaXJzdCBieXRlIGNhbm5vdCBiZSByZWFkIGZvciBhbnkgcmVhc29uIG90aGVyIHRoYW4gZW5kIG9mIGZpbGUsCisgICAgICAgICogdGhlbiBhbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24uIEluIHBhcnRpY3VsYXIsIGFuIElPRXhjZXB0aW9uIGlzIHRocm93bgorICAgICAgICAqIGlmIHRoZSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgICAqCisgICAgICAgICogVGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZCBmb3IgY2xhc3MgSW5wdXRTdHJlYW0gc2ltcGx5IGNhbGxzIHRoZSBtZXRob2QKKyAgICAgICAgKiByZWFkKCkgcmVwZWF0ZWRseS4gSWYgdGhlIGZpcnN0IHN1Y2ggY2FsbCByZXN1bHRzIGluIGFuIElPRXhjZXB0aW9uLAorICAgICAgICAqIHRoYXQgZXhjZXB0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGwgdG8gdGhlIHJlYWQoYiwgb2ZmLCBsZW4pIG1ldGhvZC4KKyAgICAgICAgKiBJZiBhbnkgc3Vic2VxdWVudCBjYWxsIHRvIHJlYWQoKSByZXN1bHRzIGluIGEgSU9FeGNlcHRpb24sIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBpcyBjYXVnaHQgYW5kIHRyZWF0ZWQgYXMgaWYgaXQgd2VyZSBlbmQgb2YgZmlsZTsgdGhlIGJ5dGVzIHJlYWQgdXAgdG8gdGhhdAorICAgICAgICAqIHBvaW50IGFyZSBzdG9yZWQgaW50byBiIGFuZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmVmb3JlIHRoZSBleGNlcHRpb24KKyAgICAgICAgKiBvY2N1cnJlZCBpcyByZXR1cm5lZC4gU3ViY2xhc3NlcyBhcmUgZW5jb3VyYWdlZCB0byBwcm92aWRlIGEgbW9yZSBlZmZpY2llbnQKKyAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgICAgKgorICAgICAgICAqIEBwYXJhbSBiIC0gdGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRoZSBkYXRhIGlzIHJlYWQuCisgICAgICAgICogQHBhcmFtIG9mZiAtIHRoZSBzdGFydCBvZmZzZXQgaW4gYXJyYXkgYiAgYXQgd2hpY2ggdGhlIGRhdGEgaXMgd3JpdHRlbi4KKyAgICAgICAgKiBAcGFyYW0gbGVuIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgICAgICAgICogQHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB0aGUgYnVmZmVyLAorICAgICAgICAqICAgICAgICAgb3IgLTEgaXMgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGJlY2F1c2UgdGhlIGVuZAorICAgICAgICAqICAgICAgICAgb2YgdGhlIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyBpbnQgcmVhZCAoY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIb2xkZXIgYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24KKyAgeworICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5JbnB1dFN0cmVhbSAkaW4gPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLk91dHB1dFN0cmVhbSAkb3V0ID0gX3JlcXVlc3QgKCJyZWFkIiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgJG91dC53cml0ZV9sb25nIChvZmYpOworICAgICAgICAgICAgICAgICRvdXQud3JpdGVfbG9uZyAobGVuKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICBpbnQgJHJlc3VsdCA9ICRpbi5yZWFkX2xvbmcgKCk7CisgICAgICAgICAgICAgICAgYi52YWx1ZSA9IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5EU19CWVRFSGVscGVyLnJlYWQgKCRpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZCAoYiwgb2ZmLCBsZW4gICAgICAgICk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9yZWxlYXNlUmVwbHkgKCRpbik7CisgICAgICAgICAgICB9CisgIH0gLy8gcmVhZAorCisKKyAgLyoqCisgICAgICAgICogQ2xvc2UgdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIGNsb3NlICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgiY2xvc2UiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICBjbG9zZSAoICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIGNsb3NlCisKKworICAvKioKKyAgICAgICAgKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAgICAqCisgICAgICAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIHRvIGJlIHRyYW5zZmVyZC4KKyAgICAgICAgKiBAdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBpZiBhbiBJTyBleGNlcHRpb24gb2NjdXJzLgorICAgICAgICAqLworICBwdWJsaWMgaW50IGxlbmd0aCAoKSB0aHJvd3MgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbgorICB7CisgICAgICAgICAgICBvcmcub21nLkNPUkJBLnBvcnRhYmxlLklucHV0U3RyZWFtICRpbiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT3V0cHV0U3RyZWFtICRvdXQgPSBfcmVxdWVzdCAoImxlbmd0aCIsIHRydWUpOworICAgICAgICAgICAgICAgICRpbiA9IF9pbnZva2UgKCRvdXQpOworICAgICAgICAgICAgICAgIGludCAkcmVzdWx0ID0gJGluLnJlYWRfbG9uZyAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHJlc3VsdDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuQXBwbGljYXRpb25FeGNlcHRpb24gJGV4KSB7CisgICAgICAgICAgICAgICAgJGluID0gJGV4LmdldElucHV0U3RyZWFtICgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfaWQgPSAkZXguZ2V0SWQgKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pZC5lcXVhbHMgKCJJREw6Y29tL2hpZ2hxc29mdC9jb3JiYWZpbGVzZXJ2ZXIvZ2VuZXJhdGVkL0NPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjoxLjAiKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbkhlbHBlci5yZWFkICgkaW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy5vbWcuQ09SQkEuTUFSU0hBTCAoX2lkKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuUmVtYXJzaGFsRXhjZXB0aW9uICRybSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsZW5ndGggKCAgICAgICAgKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgX3JlbGVhc2VSZXBseSAoJGluKTsKKyAgICAgICAgICAgIH0KKyAgfSAvLyBsZW5ndGgKKworCisgIC8qKgorICAgICAgICAqIFJlc2V0IHRoZSBzdHJlYW0KKyAgICAgICAgKgorICAgICAgICAqIEB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGlmIGFuIElPIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgICAgICovCisgIHB1YmxpYyB2b2lkIHJlc2V0ICgpIHRocm93cyBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uCisgIHsKKyAgICAgICAgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuSW5wdXRTdHJlYW0gJGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLm9tZy5DT1JCQS5wb3J0YWJsZS5PdXRwdXRTdHJlYW0gJG91dCA9IF9yZXF1ZXN0ICgicmVzZXQiLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAkaW4gPSBfaW52b2tlICgkb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLkFwcGxpY2F0aW9uRXhjZXB0aW9uICRleCkgeworICAgICAgICAgICAgICAgICRpbiA9ICRleC5nZXRJbnB1dFN0cmVhbSAoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2lkID0gJGV4LmdldElkICgpOworICAgICAgICAgICAgICAgIGlmIChfaWQuZXF1YWxzICgiSURMOmNvbS9oaWdocXNvZnQvY29yYmFmaWxlc2VydmVyL2dlbmVyYXRlZC9DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb246MS4wIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb25IZWxwZXIucmVhZCAoJGluKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcub21nLkNPUkJBLk1BUlNIQUwgKF9pZCk7CisgICAgICAgICAgICB9IGNhdGNoIChvcmcub21nLkNPUkJBLnBvcnRhYmxlLlJlbWFyc2hhbEV4Y2VwdGlvbiAkcm0pIHsKKyAgICAgICAgICAgICAgICByZXNldCAoICAgICAgICApOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfcmVsZWFzZVJlcGx5ICgkaW4pOworICAgICAgICAgICAgfQorICB9IC8vIHJlc2V0CisKKyAgLy8gVHlwZS1zcGVjaWZpYyBDT1JCQTo6T2JqZWN0IG9wZXJhdGlvbnMKKyAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gX19pZHMgPSB7CisgICAgIklETDpjb20vaGlnaHFzb2Z0L2NvcmJhZmlsZXNlcnZlci9nZW5lcmF0ZWQvSW5wdXRTdHJlYW1JRjoxLjAifTsKKworICBwdWJsaWMgU3RyaW5nW10gX2lkcyAoKQorICB7CisgICAgcmV0dXJuIChTdHJpbmdbXSlfX2lkcy5jbG9uZSAoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0IChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisgIHsKKyAgICAgU3RyaW5nIHN0ciA9IHMucmVhZFVURiAoKTsKKyAgICAgU3RyaW5nW10gYXJncyA9IG51bGw7CisgICAgIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKKyAgICAgb3JnLm9tZy5DT1JCQS5PUkIgb3JiID0gb3JnLm9tZy5DT1JCQS5PUkIuaW5pdCAoYXJncywgcHJvcHMpOworICAgdHJ5IHsKKyAgICAgb3JnLm9tZy5DT1JCQS5PYmplY3Qgb2JqID0gb3JiLnN0cmluZ190b19vYmplY3QgKHN0cik7CisgICAgIG9yZy5vbWcuQ09SQkEucG9ydGFibGUuRGVsZWdhdGUgZGVsZWdhdGUgPSAoKG9yZy5vbWcuQ09SQkEucG9ydGFibGUuT2JqZWN0SW1wbCkgb2JqKS5fZ2V0X2RlbGVnYXRlICgpOworICAgICBfc2V0X2RlbGVnYXRlIChkZWxlZ2F0ZSk7CisgICB9IGZpbmFsbHkgeworICAgICBvcmIuZGVzdHJveSgpIDsKKyAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdCAoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKyAgeworICAgICBTdHJpbmdbXSBhcmdzID0gbnVsbDsKKyAgICAgamF2YS51dGlsLlByb3BlcnRpZXMgcHJvcHMgPSBudWxsOworICAgICBvcmcub21nLkNPUkJBLk9SQiBvcmIgPSBvcmcub21nLkNPUkJBLk9SQi5pbml0IChhcmdzLCBwcm9wcyk7CisgICB0cnkgeworICAgICBTdHJpbmcgc3RyID0gb3JiLm9iamVjdF90b19zdHJpbmcgKHRoaXMpOworICAgICBzLndyaXRlVVRGIChzdHIpOworICAgfSBmaW5hbGx5IHsKKyAgICAgb3JiLmRlc3Ryb3koKSA7CisgICB9CisgIH0KK30gLy8gY2xhc3MgX0lucHV0U3RyZWFtSUZTdHViCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQwZjVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5maWxlLkZpbGVTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5FbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuQ09SQkFGaWxlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZmlsZXRyYW5zZmVyLlRyYW5zZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuRW50aXR5TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24uT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2guT0RTU2VhcmNoU2VydmljZTsKK2ltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGOworCisvKioKKyAqIE9EU0NvbnRleHQgZW5jYXBzdWxhdGVzIGEgc2Vzc2lvbiB0byB0aGUgQVNBTSBPRFMgQ09SQkEgQVBJIGFuZCBwcm92aWRlcyB0aGUKKyAqIE9EUyBzcGVjaWZpYyBzZXJ2aWNlcyBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBjbGFzcyBPRFNDb250ZXh0IGltcGxlbWVudHMgQXBwbGljYXRpb25Db250ZXh0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPRFNDb250ZXh0LmNsYXNzKTsKKworCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzOworCXByaXZhdGUgZmluYWwgVHJhbnNmZXIgdHJhbnNmZXIgPSBUcmFuc2Zlci5TT0NLRVQ7CisKKwlwcml2YXRlIENPUkJBRmlsZVNlcnZlcklGIGZpbGVTZXJ2ZXI7CisJcHJpdmF0ZSBPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOworCXByaXZhdGUgT0RTUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZTsKKwlwcml2YXRlIEVudGl0eUxvYWRlciBlbnRpdHlMb2FkZXI7CisJcHJpdmF0ZSBPRFNFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXI7CisJcHJpdmF0ZSBPRFNTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IE9EUyBhcHBsaWNhdGlvbiBjb250ZXh0LgorCSAqIAorCSAqIEBwYXJhbSBvcmIgICAgICAgIHRoZSBDT1JCQSBPUkIgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBPRFMgQVBJCisJICogQHBhcmFtIGFvU2Vzc2lvbgorCSAqIEBwYXJhbSBmaWxlU2VydmVyCisJICogQHBhcmFtIHBhcmFtZXRlcnMKKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uCisJICovCisJcHVibGljIE9EU0NvbnRleHQoT1JCIG9yYiwgQW9TZXNzaW9uIGFvU2Vzc2lvbiwgQ09SQkFGaWxlU2VydmVySUYgZmlsZVNlcnZlciwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKQorCQkJdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJdGhpcy5maWxlU2VydmVyID0gZmlsZVNlcnZlcjsKKwkJdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKworCQl0aGlzLm1vZGVsTWFuYWdlciA9IG5ldyBPRFNNb2RlbE1hbmFnZXIob3JiLCBhb1Nlc3Npb24pOworCQl0aGlzLnF1ZXJ5U2VydmljZSA9IG5ldyBPRFNRdWVyeVNlcnZpY2UodGhpcy5tb2RlbE1hbmFnZXIpOworCQl0aGlzLmVudGl0eU1hbmFnZXIgPSBuZXcgT0RTRW50aXR5TWFuYWdlcih0aGlzKTsKKwkJdGhpcy5lbnRpdHlMb2FkZXIgPSBuZXcgRW50aXR5TG9hZGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlKTsKKwkJdGhpcy5zZWFyY2hTZXJ2aWNlID0gbmV3IE9EU1NlYXJjaFNlcnZpY2UodGhpcywgcXVlcnlTZXJ2aWNlLCBlbnRpdHlMb2FkZXIpOworCQlMT0dHRVIuZGVidWcoIk9EU0NvbnRleHQgaW5pdGlhbGl6ZWQuIik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxFbnRpdHlNYW5hZ2VyPiBnZXRFbnRpdHlNYW5hZ2VyKCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2YoZW50aXR5TWFuYWdlcik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxFbnRpdHlGYWN0b3J5PiBnZXRFbnRpdHlGYWN0b3J5KCkgeworCQl0cnkgeworCQkJcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBPRFNFbnRpdHlGYWN0b3J5KG1vZGVsTWFuYWdlciwgZW50aXR5TWFuYWdlci5sb2FkTG9nZ2VkT25Vc2VyKCkpKTsKKwkJfSBjYXRjaCAoRGF0YUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VkIGluIHVzZXIuIik7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9wdGlvbmFsPE1vZGVsTWFuYWdlcj4gZ2V0TW9kZWxNYW5hZ2VyKCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2YobW9kZWxNYW5hZ2VyKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9wdGlvbmFsPFF1ZXJ5U2VydmljZT4gZ2V0UXVlcnlTZXJ2aWNlKCkgeworCQkvLyBUT0RPCisJCS8vIGphdmEgZG9jczogY2FjaGUgdGhpcyBzZXJ2aWNlIGZvciBPTkUgcmVxdWVzdCEKKwkJcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBPRFNRdWVyeVNlcnZpY2UobW9kZWxNYW5hZ2VyKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxTZWFyY2hTZXJ2aWNlPiBnZXRTZWFyY2hTZXJ2aWNlKCkgeworCQlyZXR1cm4gT3B0aW9uYWwub2Yoc2VhcmNoU2VydmljZSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxGaWxlU2VydmljZT4gZ2V0RmlsZVNlcnZpY2UoKSB7CisJCWlmIChmaWxlU2VydmVyID09IG51bGwpIHsKKwkJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCQl9CisJCXJldHVybiBPcHRpb25hbC5vZihuZXcgQ09SQkFGaWxlU2VydmljZSh0aGlzLCB0cmFuc2ZlcikpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8Tm90aWZpY2F0aW9uU2VydmljZT4gZ2V0Tm90aWZpY2F0aW9uU2VydmljZSgpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBPcHRpb25hbC5vZihuZXcgT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkoKS5jcmVhdGUodGhpcywgcGFyYW1ldGVycykpOworCQl9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgbm90aWZpY2F0aW9uIG1hbmFnZXIuIiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGFyYW1ldGVycygpIHsKKwkJcmV0dXJuIHBhcmFtZXRlcnM7CisJfQorCisJLyoqCisJICogQHJldHVybnMgdGhlIHN0cmluZyAib2RzIgorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgZ2V0QWRhcHRlclR5cGUoKSB7CisJCXJldHVybiAib2RzIjsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCXRyeSB7CisJCQltb2RlbE1hbmFnZXIuY2xvc2UoKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLndhcm4oIlVuYWJsZSB0byBjbG9zZSBzZXNzc2lvbiBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgT0RTTW9kZWxNYW5hZ2VyfSB1c2VkIGZvciB0aGlzIGNvbnRleHQuCisJICogCisJICogQHJldHVybiB0aGUge0BsaW5rIE9EU01vZGVsTWFuYWdlcn0KKwkgKi8KKwlwdWJsaWMgT0RTTW9kZWxNYW5hZ2VyIGdldE9EU01vZGVsTWFuYWdlcigpIHsKKwkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQW9TZXNzaW9ufSB1c2VkIGZvciB0aGlzIGNvbnRleHQuCisJICogCisJICogQHJldHVybiB7QGxpbmsgQW9TZXNzaW9ufSB1c2VkIGZvciB0aGlzIGNvbnRleHQuCisJICovCisJcHVibGljIEFvU2Vzc2lvbiBnZXRBb1Nlc3Npb24oKSB7CisJCXJldHVybiBtb2RlbE1hbmFnZXIuZ2V0QW9TZXNzaW9uKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgT1JCIHVzZWQgZm9yIHRoaXMgY29udGV4dAorCSAqIAorCSAqIEByZXR1cm4gT1JCIHVzZWQgZm9yIHRoaXMgY29udGV4dAorCSAqLworCXB1YmxpYyBPUkIgZ2V0T1JCKCkgeworCQlyZXR1cm4gbW9kZWxNYW5hZ2VyLmdldE9SQigpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBDT1JCQUZpbGVTZXJ2ZXJJRn0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ09SQkFGaWxlU2VydmVySUZ9IGlzIHJldHVybmVkIG9yIG51bGwsIGlmIG1pc3NpbmcuCisJICovCisJcHVibGljIENPUkJBRmlsZVNlcnZlcklGIGdldEZpbGVTZXJ2ZXIoKSB7CisJCXJldHVybiBmaWxlU2VydmVyOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcge0BsaW5rIE9EU0NvbnRleHR9IHdpdGggYSBuZXcgT0RTIGNvLXNlc3Npb24uCisJICoKKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBPRFNDb250ZXh0fSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBvbiBlcnJvcnMuCisJICovCisJcHVibGljIE9EU0NvbnRleHQgbmV3Q29udGV4dCgpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgT0RTQ29udGV4dChtb2RlbE1hbmFnZXIuZ2V0T1JCKCksIGdldEFvU2Vzc2lvbigpLmNyZWF0ZUNvU2Vzc2lvbigpLCBmaWxlU2VydmVyLCBwYXJhbWV0ZXJzKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNDb250ZXh0RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMTA2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9GYWN0b3J5SGVscGVyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb1Nlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsKK2ltcG9ydCBvcmcub21nLkNPUkJBLk9iamVjdDsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1lQ29tcG9uZW50OworaW1wb3J0IG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHQ7CitpbXBvcnQgb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dEV4dEhlbHBlcjsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZS5DYW5ub3RQcm9jZWVkOworaW1wb3J0IG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLkludmFsaWROYW1lOworaW1wb3J0IG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLk5vdEZvdW5kOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlcklGOworaW1wb3J0IGNvbS5oaWdocXNvZnQuY29yYmFmaWxlc2VydmVyLmdlbmVyYXRlZC5DT1JCQUZpbGVTZXJ2ZXJJRkhlbHBlcjsKKworLyoqCisgKiBBU0FNIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEFwcGxpY2F0aW9uQ29udGV4dEZhY3Rvcnl9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU0NvbnRleHRGYWN0b3J5IGltcGxlbWVudHMgQXBwbGljYXRpb25Db250ZXh0RmFjdG9yeSB7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9OQU1FU0VSVklDRSA9ICJuYW1lc2VydmljZSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9TRVJWSUNFTkFNRSA9ICJzZXJ2aWNlbmFtZSI7CisKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VU0VSID0gInVzZXIiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUEFTU1dPUkQgPSAicGFzc3dvcmQiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0ZPUl9VU0VSID0gImZvcl91c2VyIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPRFNDb250ZXh0RmFjdG9yeS5jbGFzcyk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBPUkIgb3JiID0gT1JCLmluaXQobmV3IFN0cmluZ1tdIHt9LCBTeXN0ZW0uZ2V0UHJvcGVydGllcygpKTsKKworCXB1YmxpYyBPRFNDb250ZXh0RmFjdG9yeSgpIHsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICoKKwkgKiA8cD4KKwkgKiA8Yj5Ob3RlOjwvYj4gR2l2ZW4gcGFyYW1ldGVycyB7QGNvZGUgTWFwfSBtdXN0IGNvbnRhaW4gdmFsdWVzIGZvciBlYWNoIG9mIHRoZQorCSAqIGZvbGxvd2luZyBrZXlzOgorCSAqCisJICogPHVsPgorCSAqIDxsaT57QHZhbHVlICNQQVJBTV9OQU1FU0VSVklDRX08L2xpPgorCSAqIDxsaT57QHZhbHVlICNQQVJBTV9TRVJWSUNFTkFNRX08L2xpPgorCSAqIDxsaT57QHZhbHVlICNQQVJBTV9VU0VSfTwvbGk+CisJICogPGxpPntAdmFsdWUgI1BBUkFNX1BBU1NXT1JEfTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIExpc3RlZCBuYW1lcyBhcmUgYXZhaWxhYmxlIHZpYSBwdWJsaWMgZmllbGRzIG9mIHRoaXMgY2xhc3MuCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb25uZWN0KE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlBb1Nlc3Npb24gYW9TZXNzaW9uID0gbnVsbDsKKwkJdHJ5IChTZXJ2aWNlTG9jYXRvciBzZXJ2aWNlTG9jYXRvciA9IG5ldyBTZXJ2aWNlTG9jYXRvcihvcmIsIGdldFBhcmFtZXRlcihwYXJhbWV0ZXJzLCBQQVJBTV9OQU1FU0VSVklDRSkpKSB7CisJCQlTdHJpbmcgbmFtZU9mU2VydmljZSA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJzLCBQQVJBTV9TRVJWSUNFTkFNRSkucmVwbGFjZSgiLkFTQU0tT0RTIiwgIiIpOworCisJCQlBb0ZhY3RvcnkgYW9GYWN0b3J5ID0gc2VydmljZUxvY2F0b3IucmVzb2x2ZUZhY3RvcnkobmFtZU9mU2VydmljZSk7CisJCQlTdHJpbmcgYW9GYWN0b3J5TmFtZSA9IGFvRmFjdG9yeS5nZXROYW1lKCk7CisJCQlMT0dHRVIuaW5mbygiQ29ubmVjdGluZyB0byBPRFMgU2VydmVyIChuYW1lOiB7fSwgZGVzY3JpcHRpb246IHt9LCBpbnRlcmZhY2UgdmVyc2lvbjoge30sIHR5cGU6IHt9KSAuLi4iLAorCQkJCQlhb0ZhY3RvcnlOYW1lLCBhb0ZhY3RvcnkuZ2V0RGVzY3JpcHRpb24oKSwgYW9GYWN0b3J5LmdldEludGVyZmFjZVZlcnNpb24oKSwgYW9GYWN0b3J5LmdldFR5cGUoKSk7CisKKwkJCS8vIENyZWF0ZSBhIHBhcmFtZXRlcnMgbWFwIHdpdGhvdXQgcGFzc3dvcmQgKHdoaWNoIHNob3VsZCBub3QgYmUgdmlzaWJsZSBmcm9tCisJCQkvLyB0aGlzIHBvaW50IG9ud2FyZHMpLAorCQkJLy8gbGVhdmluZyB0aGUgb3JpZ2luYWwgbWFwIHVudG91Y2hlZDoKKwkJCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyc1dpdGhvdXRQYXNzd29yZCA9IG5ldyBIYXNoTWFwPD4ocGFyYW1ldGVycyk7CisJCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQlwYXJhbWV0ZXJzV2l0aG91dFBhc3N3b3JkLnB1dChQQVJBTV9QQVNTV09SRCwgIioqKioiKTsKKwkJCQlMT0dHRVIuZGVidWcoIkNvbm5lY3RpbmcgdG8gT0RTIHVzaW5nIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnM6IHt9IiwKKwkJCQkJCXNlc3Npb25QYXJhbWV0ZXJzQXNTdHJpbmcocGFyYW1ldGVyc1dpdGhvdXRQYXNzd29yZCkpOworCQkJfQorCQkJcGFyYW1ldGVyc1dpdGhvdXRQYXNzd29yZC5yZW1vdmUoUEFSQU1fUEFTU1dPUkQpOworCisJCQlhb1Nlc3Npb24gPSBhb0ZhY3RvcnkubmV3U2Vzc2lvbihzZXNzaW9uUGFyYW1ldGVyc0FzU3RyaW5nKHBhcmFtZXRlcnMpKTsKKworCQkJTE9HR0VSLmluZm8oIkNvbm5lY3Rpb24gdG8gT0RTIHNlcnZlciAne30nIGVzdGFibGlzaGVkLiIsIGFvRmFjdG9yeU5hbWUpOworCisJCQlDT1JCQUZpbGVTZXJ2ZXJJRiBmaWxlU2VydmVyID0gc2VydmljZUxvY2F0b3IucmVzb2x2ZUZpbGVTZXJ2ZXIobmFtZU9mU2VydmljZSk7CisKKwkJCXJldHVybiBuZXcgT0RTQ29udGV4dChvcmIsIGFvU2Vzc2lvbiwgZmlsZVNlcnZlciwgcGFyYW1ldGVyc1dpdGhvdXRQYXNzd29yZCk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCWNsb3NlU2Vzc2lvbihhb1Nlc3Npb24pOworCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIlVuYWJsZSB0byBjb25uZWN0IHRvIE9EUyBzZXJ2ZXIgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJcHJpdmF0ZSBTdHJpbmcgc2Vzc2lvblBhcmFtZXRlcnNBc1N0cmluZyhNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkZXIgPSBJbW11dGFibGVNYXAuPFN0cmluZywgU3RyaW5nPmJ1aWxkZXIoKQorCQkJCS5wdXQoIlVTRVIiLCBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fVVNFUikpCisJCQkJLnB1dCgiUEFTU1dPUkQiLCBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fUEFTU1dPUkQpKS5wdXQoIkNSRUFURV9DT1NFU1NJT05fQUxMT1dFRCIsICJUUlVFIik7CisKKwkJU3RyaW5nIGZvclVzZXJOYW1lID0gcGFyYW1ldGVycy5nZXQoUEFSQU1fRk9SX1VTRVIpOworCQlpZiAoIVN0cmluZ3MuaXNOdWxsT3JFbXB0eShmb3JVc2VyTmFtZSkpIHsKKwkJCWJ1aWxkZXIucHV0KCJGT1JfVVNFUiIsIGZvclVzZXJOYW1lKTsKKwkJfQorCQlyZXR1cm4gSm9pbmVyLm9uKCIsIikud2l0aEtleVZhbHVlU2VwYXJhdG9yKCI9Iikuam9pbihidWlsZGVyLmJ1aWxkKCkpOworCX0KKworCS8qKgorCSAqIENsb3NlcyBnaXZlbiB7QGxpbmsgQW9TZXNzaW9ufSB3aXRoIGNhdGNoaW5nIGFuZCBsb2dnaW5nIGVycm9ycy4KKwkgKgorCSAqIEBwYXJhbSBhb1Nlc3Npb24gVGhlIHtAY29kZSBBb1Nlc3Npb259IHRoYXQgc2hhbGwgYmUgY2xvc2VkLgorCSAqLworCXByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2VTZXNzaW9uKEFvU2Vzc2lvbiBhb1Nlc3Npb24pIHsKKwkJaWYgKGFvU2Vzc2lvbiA9PSBudWxsKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJYW9TZXNzaW9uLmNsb3NlKCk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi53YXJuKCJVbmFibGUgdG8gY2xvc2Ugc2Vzc3Npb24gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmVhZHMgdGhlIHByb3BlcnR5IGlkZW50aWZpZWQgYnkgZ2l2ZW4gcHJvcGVydHkgbmFtZS4KKwkgKgorCSAqIEBwYXJhbSBwYXJhbWV0ZXJzIFRoZSBwcm9wZXJ0aWVzIHtAY29kZSBNYXB9LgorCSAqIEBwYXJhbSBuYW1lICAgICAgIFRoZSBwcm9wZXJ0eSBuYW1lLgorCSAqIEByZXR1cm4gVGhlIHByb3BlcnR5IHZhbHVlIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiBUaHJvd24gaWYgcHJvcGVydHkgZG9lcyBub3QgZXhpc3Qgb3IgaXMgZW1wdHkuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFBhcmFtZXRlcihNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCVN0cmluZyB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KG5hbWUpOworCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBDb25uZWN0aW9uRXhjZXB0aW9uKCJDb25uZWN0aW9uIHBhcmFtZXRlciB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgaXMgZWl0aGVyIG1pc3Npbmcgb3IgZW1wdHkuIik7CisJCX0KKworCQlyZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogVXNlZCB0byByZXNvbHZlIENPUkJBIHNlcnZpY2Ugb2JqZWN0IGJ5IElEIGFuZCBraW5kLgorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNlcnZpY2VMb2NhdG9yIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZSB7CisKKwkJcHJpdmF0ZSBOYW1pbmdDb250ZXh0RXh0IG5hbWluZ0NvbnRleHQ7CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gb3JiICBUaGUge0BsaW5rIE9SQn0gc2luZ2xldG9uIGluc3RhbmNlLgorCQkgKiBAcGFyYW0gcGF0aCBUaGUgbmFtaW5nIGNvbnRleHQgcGF0aC4KKwkJICogQHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcmVzb2x2ZSB0aGUgbmFtaW5nIGNvbnRleHQuCisJCSAqLworCQlwdWJsaWMgU2VydmljZUxvY2F0b3IoT1JCIG9yYiwgU3RyaW5nIHBhdGgpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJCW5hbWluZ0NvbnRleHQgPSBOYW1pbmdDb250ZXh0RXh0SGVscGVyLm5hcnJvdyhvcmIuc3RyaW5nX3RvX29iamVjdChwYXRoKSk7CisJCQlpZiAobmFtaW5nQ29udGV4dCA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIlVuYWJsZSB0byByZXNvbHZlIE5hbWVTZXJ2aWNlICciICsgcGF0aCArICInLiIpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIFJlc29sdmVzIGFuZCByZXR1cm5zIHRoZSB7QGxpbmsgQW9GYWN0b3J5fSBzZXJ2aWNlIGZvciBnaXZlbiBJRC4KKwkJICoKKwkJICogQHBhcmFtIGlkIFVzZWQgYXMgaWRlbnRpZmllci4KKwkJICogQHJldHVybiBUaGUge0Bjb2RlIEFvRmFjdG9yeX0gaXMgcmV0dXJuZWQuCisJCSAqIEB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHJlc29sdmUgdGhlIHtAY29kZQorCQkgKiAJCUFvRmFjdG9yeX0gICAgICAgICAgLgorCQkgKi8KKwkJcHVibGljIEFvRmFjdG9yeSByZXNvbHZlRmFjdG9yeShTdHJpbmcgaWQpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJCXJldHVybiBBb0ZhY3RvcnlIZWxwZXIubmFycm93KHJlc29sdmUoaWQsICJBU0FNLU9EUyIpKTsKKwkJfQorCisJCS8qKgorCQkgKiBSZXNvbHZlcyBhbmQgcmV0dXJucyB0aGUge0BsaW5rIENPUkJBRmlsZVNlcnZlcklGfSBzZXJ2aWNlIGZvciBnaXZlbiBJRC4KKwkJICoKKwkJICogQHBhcmFtIGlkIFVzZWQgYXMgaWRlbnRpZmllci4KKwkJICogQHJldHVybiBUaGUge0Bjb2RlIENPUkJBRmlsZVNlcnZlcklGfSBvciBudWxsLCBpZiBub25lIGZvdW5kLCBpcyByZXR1cm5lZC4KKwkJICovCisJCXB1YmxpYyBDT1JCQUZpbGVTZXJ2ZXJJRiByZXNvbHZlRmlsZVNlcnZlcihTdHJpbmcgaWQpIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIENPUkJBRmlsZVNlcnZlcklGSGVscGVyLm5hcnJvdyhyZXNvbHZlKGlkLCAiQ09SQkEtRlQiKSk7CisJCQl9IGNhdGNoIChDb25uZWN0aW9uRXhjZXB0aW9uIGUpIHsKKwkJCQlMT0dHRVIud2FybihlLmdldE1lc3NhZ2UoKSk7CisJCQkJcmV0dXJuIG51bGw7CisJCQl9CisJCX0KKworCQkvKioKKwkJICogUmVzb2x2ZXMgYSBDT1JCQSBzZXJ2aWNlIG9iamVjdCBmb3IgZ2l2ZW4gaWQgYW5kIGtpbmQuCisJCSAqCisJCSAqIEBwYXJhbSBpZCAgIFVzZWQgYXMgaWRlbnRpZmllci4KKwkJICogQHBhcmFtIGtpbmQgVXNlZCBhcyBxdWFsaWZpZXIuCisJCSAqIEByZXR1cm4gVGhlIHJlc29sdmVkIENPUkJBIHNlcnZpY2Ugb2JqZWN0IGlzIHJldHVybmVkLgorCQkgKiBAdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCQkgKi8KKwkJcHVibGljIE9iamVjdCByZXNvbHZlKFN0cmluZyBpZCwgU3RyaW5nIGtpbmQpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIG5hbWluZ0NvbnRleHQucmVzb2x2ZShuZXcgTmFtZUNvbXBvbmVudFtdIHsgbmV3IE5hbWVDb21wb25lbnQoaWQsIGtpbmQpIH0pOworCQkJfSBjYXRjaCAoTm90Rm91bmQgfCBDYW5ub3RQcm9jZWVkIHwgSW52YWxpZE5hbWUgZSkgeworCQkJCXRocm93IG5ldyBDb25uZWN0aW9uRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVzb2x2ZSBzZXJ2aWNlICciICsgaWQgKyAiLiIgKyBraW5kICsgIicuIiwgZSk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCQluYW1pbmdDb250ZXh0Ll9yZWxlYXNlKCk7CisJCX0KKworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNFbnRpdHlNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTRW50aXR5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZTc2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTRW50aXR5TWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxpY2F0aW9uU3RydWN0dXJlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkluc3RhbmNlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVF9MT05HTE9ORzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5SZWFkUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0RGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnZpcm9ubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZWRWYWx1ZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkpvaW5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZWNvcmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2xhc3NpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZVRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5FbnRpdHlMb2FkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbi5PRFNUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIEFTQU0gT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgRW50aXR5TWFuYWdlcn0gaW50ZXJmYWNlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgT0RTRW50aXR5TWFuYWdlciBpbXBsZW1lbnRzIEVudGl0eU1hbmFnZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPRFNFbnRpdHlNYW5hZ2VyLmNsYXNzKTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJcHJpdmF0ZSBmaW5hbCBUcmFuc2ZlciB0cmFuc2ZlciA9IFRyYW5zZmVyLlNPQ0tFVDsKKworCXByaXZhdGUgZmluYWwgT0RTQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG9kc01vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2U7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlMb2FkZXIgZW50aXR5TG9hZGVyOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQgVGhlIHtAbGluayBPRFNDb250ZXh0fS4KKwkgKi8KKwlwdWJsaWMgT0RTRW50aXR5TWFuYWdlcihPRFNDb250ZXh0IGNvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwkJdGhpcy5vZHNNb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpOworCQl0aGlzLnF1ZXJ5U2VydmljZSA9IGNvbnRleHQuZ2V0UXVlcnlTZXJ2aWNlKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihRdWVyeVNlcnZpY2UuY2xhc3MpKTsKKwkJZW50aXR5TG9hZGVyID0gbmV3IEVudGl0eUxvYWRlcihvZHNNb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnZpcm9ubWVudCBsb2FkRW52aXJvbm1lbnQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8RW52aXJvbm1lbnQ+IGVudmlyb25tZW50cyA9IGxvYWRBbGwoRW52aXJvbm1lbnQuY2xhc3MpOworCQlpZiAoZW52aXJvbm1lbnRzLnNpemUoKSAhPSAxKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIGxhb2QgdGhlIGVudmlyb25tZW50IGVudGl0eS4iKTsKKwkJfQorCisJCXJldHVybiBlbnZpcm9ubWVudHMuZ2V0KDApOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8VXNlcj4gbG9hZExvZ2dlZE9uVXNlcigpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJSW5zdGFuY2VFbGVtZW50IGllVXNlciA9IG51bGw7CisJCXRyeSB7CisJCQlpZVVzZXIgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0QW9TZXNzaW9uKCkuZ2V0VXNlcigpOworCQkJcmV0dXJuIE9wdGlvbmFsLm9mKAorCQkJCQllbnRpdHlMb2FkZXIubG9hZChuZXcgS2V5PD4oVXNlci5jbGFzcyksIExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGllVXNlci5nZXRJZCgpKSkpKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIlVuYWJsZSB0byBsb2FkIHRoZSBsb2dnZWQgaW4gdXNlciBlbnRpdHkgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9IGZpbmFsbHkgeworCQkJdHJ5IHsKKwkJCQlpZiAoaWVVc2VyICE9IG51bGwpIHsKKwkJCQkJaWVVc2VyLmRlc3Ryb3koKTsKKwkJCQkJaWVVc2VyLl9yZWxlYXNlKCk7CisJCQkJfQorCQkJfSBjYXRjaCAoQW9FeGNlcHRpb24gYW9lKSB7CisJCQkJTE9HR0VSLndhcm4oIlVuYWJsZSB0byBkZXN0cm95IHRoZSBDT1JCQSByZXNvdXJjZSBkdWUgdG86ICIgKyBhb2UucmVhc29uLCBhb2UpOworCQkJCWllVXNlci5fcmVsZWFzZSgpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb2xsZWN0aW9uPFN0cmluZz4gaW5zdGFuY2VJRHMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oZW50aXR5Q2xhc3MpLCBpbnN0YW5jZUlEcyk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBsb2FkKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSwKKwkJCUNvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSksIGluc3RhbmNlSURzKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBPcHRpb25hbDxUPiBsb2FkUGFyZW50KEVudGl0eSBjaGlsZCwgQ2xhc3M8VD4gZW50aXR5Q2xhc3MpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRW50aXR5VHlwZSBwYXJlbnRFbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoZW50aXR5Q2xhc3MpOworCQlFbnRpdHlUeXBlIGNoaWxkRW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGNoaWxkKTsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChwYXJlbnRFbnRpdHlUeXBlKTsKKworCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBDaGFubmVsICYmIENoYW5uZWxHcm91cC5jbGFzcy5lcXVhbHMoZW50aXR5Q2xhc3MpKSB7CisJCQkvLyB0aGlzIGNvdmVycyB0aGUgZ2FwIGJldHdlZW4gY2hhbm5lbCBhbmQgY2hhbm5lbCBncm91cCB2aWEgbG9jYWwKKwkJCS8vIGNvbHVtbgorCQkJRW50aXR5VHlwZSBsb2NhbENvbHVtbkVudGl0eVR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZSgiTG9jYWxDb2x1bW4iKTsKKwkJCXF1ZXJ5LmpvaW4oY2hpbGRFbnRpdHlUeXBlLCBsb2NhbENvbHVtbkVudGl0eVR5cGUpLmpvaW4obG9jYWxDb2x1bW5FbnRpdHlUeXBlLCBwYXJlbnRFbnRpdHlUeXBlKTsKKwkJfSBlbHNlIHsKKwkJCXF1ZXJ5LmpvaW4oY2hpbGRFbnRpdHlUeXBlLCBwYXJlbnRFbnRpdHlUeXBlKTsKKwkJfQorCisJCU9wdGlvbmFsPFN0cmluZz4gaW5zdGFuY2VJRCA9IHF1ZXJ5LmZldGNoU2luZ2xldG9uKEZpbHRlci5pZE9ubHkoY2hpbGRFbnRpdHlUeXBlLCBjaGlsZC5nZXRJRCgpKSkKKwkJCQkubWFwKHIgLT4gci5nZXRSZWNvcmQocGFyZW50RW50aXR5VHlwZSkpLm1hcChSZWNvcmQ6OmdldElEKTsKKwkJaWYgKGluc3RhbmNlSUQuaXNQcmVzZW50KCkpIHsKKwkJCXJldHVybiBPcHRpb25hbC5vZihlbnRpdHlMb2FkZXIubG9hZChuZXcgS2V5PD4oZW50aXR5Q2xhc3MpLCBpbnN0YW5jZUlELmdldCgpKSk7CisJCX0KKworCQlyZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRBbGwoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oZW50aXR5Q2xhc3MpLCBwYXR0ZXJuKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4gTGlzdDxUPiBsb2FkQWxsKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdGF0dXMgc3RhdHVzLCBTdHJpbmcgcGF0dGVybikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoZW50aXR5Q2xhc3MpOworCQlFbnRpdHlUeXBlIGNsYXNzaWZpY2F0aW9uVHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENsYXNzaWZpY2F0aW9uLmNsYXNzKTsKKwkJRW50aXR5VHlwZSBzdGF0dXNFbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoc3RhdHVzLmdldFR5cGVOYW1lKCkpOworCisJCUxpc3Q8U3RyaW5nPiBpbnN0YW5jZUlEcyA9IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSgpLmpvaW4oZW50aXR5VHlwZSwgY2xhc3NpZmljYXRpb25UeXBlKQorCQkJCS5qb2luKGNsYXNzaWZpY2F0aW9uVHlwZSwgc3RhdHVzRW50aXR5VHlwZSkuc2VsZWN0SUQoZW50aXR5VHlwZSkKKwkJCQkuZmV0Y2goRmlsdGVyLmFuZCgpLmlkKHN0YXR1c0VudGl0eVR5cGUsIHN0YXR1cy5nZXRJRCgpKS5uYW1lKGVudGl0eVR5cGUsIHBhdHRlcm4pKS5zdHJlYW0oKQorCQkJCS5tYXAociAtPiByLmdldFJlY29yZChlbnRpdHlUeXBlKSkubWFwKFJlY29yZDo6Z2V0SUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJcmV0dXJuIGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihlbnRpdHlDbGFzcyksIGluc3RhbmNlSURzKTsKKwl9CisKKwkvKgorCSAqIEBPdmVycmlkZSBwdWJsaWMgTGlzdDxTdGF0dXM+IGxvYWRBbGxTdGF0dXMoQ2xhc3M8PyBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+CisJICogZW50aXR5Q2xhc3MsIFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7IHJldHVybgorCSAqIGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihTdGF0dXMuY2xhc3MsIGVudGl0eUNsYXNzKSwgcGF0dGVybik7IH0KKwkgKi8KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZEFsbChDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUsIFN0cmluZyBwYXR0ZXJuKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSksIHBhdHRlcm4pOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gbG9hZENoaWxkcmVuKEVudGl0eSBwYXJlbnQsIENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdHJpbmcgcGF0dGVybikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRW50aXR5VHlwZSBwYXJlbnRFbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUocGFyZW50KTsKKwkJRW50aXR5VHlwZSBjaGlsZEVudGl0eVR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcyk7CisJCVF1ZXJ5IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCk7CisKKwkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENoYW5uZWxHcm91cCAmJiBDaGFubmVsLmNsYXNzLmVxdWFscyhlbnRpdHlDbGFzcykpIHsKKwkJCS8vIHRoaXMgY292ZXJzIHRoZSBnYXAgYmV0d2VlbiBjaGFubmVsIGFuZCBjaGFubmVsIGdyb3VwIHZpYSBsb2NhbAorCQkJLy8gY29sdW1uCisJCQlFbnRpdHlUeXBlIGxvY2FsQ29sdW1uRW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKCJMb2NhbENvbHVtbiIpOworCQkJcXVlcnkuam9pbihjaGlsZEVudGl0eVR5cGUsIGxvY2FsQ29sdW1uRW50aXR5VHlwZSkuam9pbihsb2NhbENvbHVtbkVudGl0eVR5cGUsIHBhcmVudEVudGl0eVR5cGUpOworCQl9IGVsc2UgeworCQkJcXVlcnkuam9pbihjaGlsZEVudGl0eVR5cGUsIHBhcmVudEVudGl0eVR5cGUpOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IGluc3RhbmNlSURzID0gcXVlcnkuc2VsZWN0SUQoY2hpbGRFbnRpdHlUeXBlKQorCQkJCS5mZXRjaChGaWx0ZXIuYW5kKCkuaWQocGFyZW50RW50aXR5VHlwZSwgcGFyZW50LmdldElEKCkpLm5hbWUoY2hpbGRFbnRpdHlUeXBlLCBwYXR0ZXJuKSkuc3RyZWFtKCkKKwkJCQkubWFwKHIgLT4gci5nZXRSZWNvcmQoY2hpbGRFbnRpdHlUeXBlKSkubWFwKFJlY29yZDo6Z2V0SUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCXJldHVybiBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oZW50aXR5Q2xhc3MpLCBpbnN0YW5jZUlEcyk7CisJfQorCisJLy8gLyoqCisJLy8gKiB7QGluaGVyaXREb2N9CisJLy8gKi8KKwkvLyBAT3ZlcnJpZGUKKwkvLyBwdWJsaWMgPFQgZXh0ZW5kcyBTdGF0dXNBdHRhY2hhYmxlPiBMaXN0PFQ+IGxvYWRDaGlsZHJlbihFbnRpdHkgcGFyZW50LAorCS8vIENsYXNzPFQ+IGVudGl0eUNsYXNzLCBTdGF0dXMgc3RhdHVzLAorCS8vIFN0cmluZyBwYXR0ZXJuKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJLy8gRW50aXR5VHlwZSBwYXJlbnRFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUocGFyZW50KTsKKwkvLyBFbnRpdHlUeXBlIGNoaWxkRW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkvLyBFbnRpdHlUeXBlIHN0YXR1c0VudGl0eVR5cGUgPQorCS8vIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKHN0YXR1cy5nZXRUeXBlTmFtZSgpKTsKKwkvLworCS8vIExpc3Q8U3RyaW5nPiBpbnN0YW5jZUlEcyA9IG1vZGVsTWFuYWdlci5jcmVhdGVRdWVyeSgpCisJLy8gLmpvaW4oY2hpbGRFbnRpdHlUeXBlLCBwYXJlbnRFbnRpdHlUeXBlLCBzdGF0dXNFbnRpdHlUeXBlKQorCS8vIC5zZWxlY3RJRChjaGlsZEVudGl0eVR5cGUpCisJLy8gLmZldGNoKEZpbHRlci5hbmQoKQorCS8vIC5pZChwYXJlbnRFbnRpdHlUeXBlLCBwYXJlbnQuZ2V0SUQoKSkKKwkvLyAuaWQoc3RhdHVzRW50aXR5VHlwZSwgc3RhdHVzLmdldElEKCkpCisJLy8gLm5hbWUoY2hpbGRFbnRpdHlUeXBlLCBwYXR0ZXJuKSkKKwkvLyAuc3RyZWFtKCkubWFwKHIgLT4KKwkvLyByLmdldFJlY29yZChjaGlsZEVudGl0eVR5cGUpKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkvLworCS8vIHJldHVybiBlbnRpdHlMb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oZW50aXR5Q2xhc3MpLCBpbnN0YW5jZUlEcyk7CisJLy8gfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PENvbnRleHRUeXBlPiBsb2FkQ29udGV4dFR5cGVzKENvbnRleHREZXNjcmliYWJsZSBjb250ZXh0RGVzY3JpYmFibGUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJRW50aXR5VHlwZSBjb250ZXh0RGVzY3JpYmFibGVFbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoY29udGV4dERlc2NyaWJhYmxlKTsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKTsKKworCQlNYXA8Q29udGV4dFR5cGUsIEVudGl0eVR5cGU+IGNvbnRleHRSb290RW50aXR5VHlwZXMgPSBuZXcgRW51bU1hcDw+KENvbnRleHRUeXBlLmNsYXNzKTsKKwkJZm9yIChDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA6IENvbnRleHRUeXBlLnZhbHVlcygpKSB7CisJCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBvZHNNb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDb250ZXh0Um9vdC5jbGFzcywgY29udGV4dFR5cGUpOworCQkJY29udGV4dFJvb3RFbnRpdHlUeXBlcy5wdXQoY29udGV4dFR5cGUsIGVudGl0eVR5cGUpOworCQkJcXVlcnkuam9pbihjb250ZXh0RGVzY3JpYmFibGVFbnRpdHlUeXBlLmdldFJlbGF0aW9uKGVudGl0eVR5cGUpLCBKb2luVHlwZS5PVVRFUikuc2VsZWN0SUQoZW50aXR5VHlwZSk7CisJCX0KKworCQlPcHRpb25hbDxSZXN1bHQ+IHJlc3VsdCA9IHF1ZXJ5CisJCQkJLmZldGNoU2luZ2xldG9uKEZpbHRlci5pZE9ubHkoY29udGV4dERlc2NyaWJhYmxlRW50aXR5VHlwZSwgY29udGV4dERlc2NyaWJhYmxlLmdldElEKCkpKTsKKwkJaWYgKHJlc3VsdC5pc1ByZXNlbnQoKSkgeworCQkJTGlzdDxDb250ZXh0VHlwZT4gY29udGV4dFR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlmb3IgKEVudHJ5PENvbnRleHRUeXBlLCBFbnRpdHlUeXBlPiBlbnRyeSA6IGNvbnRleHRSb290RW50aXR5VHlwZXMuZW50cnlTZXQoKSkgeworCQkJCU9wdGlvbmFsPFN0cmluZz4gaW5zdGFuY2VJRCA9IHJlc3VsdC5tYXAociAtPiByLmdldFJlY29yZChlbnRyeS5nZXRWYWx1ZSgpKSkubWFwKFJlY29yZDo6Z2V0SUQpOworCQkJCWlmIChpbnN0YW5jZUlELmlzUHJlc2VudCgpKSB7CisJCQkJCWNvbnRleHRUeXBlcy5hZGQoZW50cnkuZ2V0S2V5KCkpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGNvbnRleHRUeXBlczsKKwkJfQorCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxDb250ZXh0VHlwZSwgQ29udGV4dFJvb3Q+IGxvYWRDb250ZXh0cyhDb250ZXh0RGVzY3JpYmFibGUgY29udGV4dERlc2NyaWJhYmxlLAorCQkJQ29udGV4dFR5cGUuLi4gY29udGV4dFR5cGVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUVudGl0eVR5cGUgY29udGV4dERlc2NyaWJhYmxlRW50aXR5VHlwZSA9IG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGNvbnRleHREZXNjcmliYWJsZSk7CisJCVF1ZXJ5IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCk7CisKKwkJTWFwPENvbnRleHRUeXBlLCBFbnRpdHlUeXBlPiBjb250ZXh0Um9vdEVudGl0eVR5cGVzID0gbmV3IEVudW1NYXA8PihDb250ZXh0VHlwZS5jbGFzcyk7CisJCWZvciAoQ29udGV4dFR5cGUgY29udGV4dFR5cGUgOiBjb250ZXh0VHlwZXMubGVuZ3RoID09IDAgPyBDb250ZXh0VHlwZS52YWx1ZXMoKSA6IGNvbnRleHRUeXBlcykgeworCQkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gb2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKTsKKwkJCWNvbnRleHRSb290RW50aXR5VHlwZXMucHV0KGNvbnRleHRUeXBlLCBlbnRpdHlUeXBlKTsKKwkJCXF1ZXJ5LmpvaW4oY29udGV4dERlc2NyaWJhYmxlRW50aXR5VHlwZS5nZXRSZWxhdGlvbihlbnRpdHlUeXBlKSwgSm9pblR5cGUuT1VURVIpLnNlbGVjdElEKGVudGl0eVR5cGUpOworCQl9CisKKwkJT3B0aW9uYWw8UmVzdWx0PiByZXN1bHQgPSBxdWVyeQorCQkJCS5mZXRjaFNpbmdsZXRvbihGaWx0ZXIuaWRPbmx5KGNvbnRleHREZXNjcmliYWJsZUVudGl0eVR5cGUsIGNvbnRleHREZXNjcmliYWJsZS5nZXRJRCgpKSk7CisJCWlmIChyZXN1bHQuaXNQcmVzZW50KCkpIHsKKwkJCU1hcDxDb250ZXh0VHlwZSwgQ29udGV4dFJvb3Q+IGNvbnRleHRSb290cyA9IG5ldyBFbnVtTWFwPD4oQ29udGV4dFR5cGUuY2xhc3MpOworCQkJZm9yIChFbnRyeTxDb250ZXh0VHlwZSwgRW50aXR5VHlwZT4gZW50cnkgOiBjb250ZXh0Um9vdEVudGl0eVR5cGVzLmVudHJ5U2V0KCkpIHsKKwkJCQlTdHJpbmcgaW5zdGFuY2VJRCA9IHJlc3VsdC5nZXQoKS5nZXRSZWNvcmQoZW50cnkuZ2V0VmFsdWUoKSkuZ2V0SUQoKTsKKwkJCQlpZiAoT0RTVXRpbHMuaXNWYWxpZElEKGluc3RhbmNlSUQpKSB7CisJCQkJCWNvbnRleHRSb290cy5wdXQoZW50cnkuZ2V0S2V5KCksCisJCQkJCQkJZW50aXR5TG9hZGVyLmxvYWQobmV3IEtleTw+KENvbnRleHRSb290LmNsYXNzLCBlbnRyeS5nZXRLZXkoKSksIGluc3RhbmNlSUQpKTsKKwkJCQl9CisJCQl9CisKKwkJCXJldHVybiBjb250ZXh0Um9vdHM7CisJCX0KKworCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRSZWxhdGVkRW50aXRpZXMoRW50aXR5IGVudGl0eSwgU3RyaW5nIHJlbGF0aW9uTmFtZSwgQ2xhc3M8VD4gcmVsYXRlZENsYXNzKSB7CisJCU9EU0VudGl0eVR5cGUgZW50aXR5VHlwZSA9ICgoT0RTRW50aXR5VHlwZSkgY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGVudGl0eSkpOworCQlFbGVtSWQgZWxlbUlkID0gbmV3IEVsZW1JZChlbnRpdHlUeXBlLmdldE9EU0lEKCksIE9EU0NvbnZlcnRlci50b09EU0lEKGVudGl0eS5nZXRJRCgpKSk7CisKKwkJdHJ5IHsKKwkJCVRfTE9OR0xPTkdbXSBpbnN0YW5jZUlkcyA9IGNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbEVsZW1BY2Nlc3MoKS5nZXRSZWxJbnN0KGVsZW1JZCwgcmVsYXRpb25OYW1lKTsKKwkJCUxpc3Q8U3RyaW5nPiBpbnN0YW5jZUlEcyA9IFN0cmVhbS5vZihpbnN0YW5jZUlkcykubWFwKE9EU0NvbnZlcnRlcjo6ZnJvbU9EU0xvbmcpLm1hcChsIC0+IGwudG9TdHJpbmcoKSkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCQlyZXR1cm4gZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KHJlbGF0ZWRDbGFzcyksIGluc3RhbmNlSURzKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIiIgKyBlLnJlYXNvbiwgZSk7IC8vIFRPRE8KKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxNZWFzdXJlZFZhbHVlcz4gcmVhZE1lYXN1cmVkVmFsdWVzKFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBuZXcgUmVhZFJlcXVlc3RIYW5kbGVyKG9kc01vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlKS5leGVjdXRlKHJlYWRSZXF1ZXN0KTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFRyYW5zYWN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gbmV3IE9EU1RyYW5zYWN0aW9uKGNvbnRleHQsIGxvYWRFbnZpcm9ubWVudCgpLCB0cmFuc2Zlcik7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gc3RhcnQgdHJhbnNhY3Rpb24gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0cml2ZXMgdGhlIEFTQU0gcGF0aHMgZm9yIHRoZSBnaXZlbiBlbnRpdGllcy4gVGhlIEFTQU0gcGF0aHMgYXJlIHByZWZpeGVkCisJICogd2l0aCBhIHNlcnZpY2VuYW1lLCBpbiB0aGUgZm9ybQorCSAqIDxjb2RlPmNvcmJhbG9jOltpb3B8c3NsaW9wXToxLjJASE9TVE5BTUU6UE9SVC9OYW1lU2VydmljZS9NRE0uQVNBTS1PRFMvPC9jb2RlPgorCSAqIAorCSAqIEByZXR1cm5zIHJldHVybnMgYSBtYXAgd2l0aCB0aGUgQVNBTSBwYXRocyB0byB0aGUgZ2l2ZW4gZW50aXRpZXMuIElmIGEgZW50aXR5CisJICogICAgICAgICAgaXMgbm90IGZvdW5kIGluIHRoZSBPRFMgc2VydmVyIHRoZSBlbnRpdHkgaXMgbm90IGluY2x1ZGVkIGluIHRoZQorCSAqICAgICAgICAgIHJlc3VsdCBtYXAuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uICAgICAgaWYgbGlua3MgY291bGQgbm90IGJlIGxvYWRlZCBmb3IgdGhlIGdpdmVuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMKKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIHRoZSBzb3VyY2Ugb3IgdHlwZU5hbWUgb2YgYW4gZW50aXR5IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZAorCSAqIEBzZWUgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkJhc2VFbnRpdHlNYW5hZ2VyI2dldExpbmtzKENvbGxlY3Rpb24pCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxFbnRpdHksIFN0cmluZz4gZ2V0TGlua3MoQ29sbGVjdGlvbjxFbnRpdHk+IGVudGl0aWVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJTWFwPEVudGl0eSwgU3RyaW5nPiBsaW5rTWFwID0gbmV3IEhhc2hNYXA8PigpOworCisJCUFwcGxpY2F0aW9uU3RydWN0dXJlIGFwcFN0cnVjdHVyZTsKKwkJdHJ5IHsKKwkJCWFwcFN0cnVjdHVyZSA9IG9kc01vZGVsTWFuYWdlci5nZXRBb1Nlc3Npb24oKS5nZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgYXBwbGljYXRpb24gc3RydWN0dXJlISBSZWFzb246ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0KKworCQlTdHJpbmcgc2VydmVyUm9vdCA9IGNvbnRleHQuZ2V0UGFyYW1ldGVycygpLmdldChPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRSkgKyAiLyIKKwkJCQkrIGNvbnRleHQuZ2V0UGFyYW1ldGVycygpLmdldChPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRSk7CisKKwkJTWFwPFN0cmluZywgTGlzdDxFbnRpdHk+PiBlbnRpdGllc0J5VHlwZU5hbWUgPSBlbnRpdGllcy5zdHJlYW0oKS5maWx0ZXIoZSAtPiBlLmdldFR5cGVOYW1lKCkgIT0gbnVsbCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoRW50aXR5OjpnZXRUeXBlTmFtZSkpOworCisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxFbnRpdHk+PiBlbnRyeSA6IGVudGl0aWVzQnlUeXBlTmFtZS5lbnRyeVNldCgpKSB7CisJCQlPRFNFbnRpdHlUeXBlIGV0ID0gKE9EU0VudGl0eVR5cGUpIG9kc01vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudHJ5LmdldEtleSgpKTsKKworCQkJTGlzdDxFbGVtSWQ+IGVsZW1JZHMgPSBlbnRyeS5nZXRWYWx1ZSgpLnN0cmVhbSgpCisJCQkJCS5tYXAoZSAtPiBuZXcgRWxlbUlkKGV0LmdldE9EU0lEKCksIE9EU0NvbnZlcnRlci50b09EU0xvbmcoTG9uZy5wYXJzZUxvbmcoZS5nZXRJRCgpKSkpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJdHJ5IHsKKwkJCQlJbnN0YW5jZUVsZW1lbnRbXSBpbnN0YW5jZXMgPSBhcHBTdHJ1Y3R1cmUuZ2V0SW5zdGFuY2VzQnlJZChlbGVtSWRzLnRvQXJyYXkobmV3IEVsZW1JZFswXSkpOworCisJCQkJZm9yIChJbnN0YW5jZUVsZW1lbnQgaWUgOiBpbnN0YW5jZXMpIHsKKwkJCQkJU3RyaW5nIGlkID0gTG9uZy50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoaWUuZ2V0SWQoKSkpOworCQkJCQlTdHJpbmcgYXNhbVBhdGggPSBzZXJ2ZXJSb290ICsgaWUuZ2V0QXNhbVBhdGgoKTsKKwkJCQkJZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKS5maWx0ZXIoZSAtPiBlLmdldElEKCkuZXF1YWxzKGlkKSkuZmluZEZpcnN0KCkKKwkJCQkJCQkuaWZQcmVzZW50KGUgLT4gbGlua01hcC5wdXQoZSwgYXNhbVBhdGgpKTsKKwkJCQl9CisJCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQkJTE9HR0VSLmRlYnVnKCJDb3VsZCBub3QgbG9hZCBsaW5rcyBmb3IgZW50aXRpZXM6ICIgKyBlbnRpdGllcyArICIuIFJlYXNvbjogIiArIGUucmVhc29uLCBlKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBsaW5rTWFwOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT3B0aW9uYWw8VGVtcGxhdGVUZXN0PiBsb2FkVGVtcGxhdGUoVGVzdCB0ZXN0KSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKE9EU0VudGl0eUZhY3RvcnkuZXh0cmFjdCh0ZXN0KS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0LmNsYXNzKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxUZW1wbGF0ZVRlc3RTdGVwPiBsb2FkVGVtcGxhdGUoVGVzdFN0ZXAgdGVzdFN0ZXApIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoT0RTRW50aXR5RmFjdG9yeS5leHRyYWN0KHRlc3RTdGVwKS5nZXRNdXRhYmxlU3RvcmUoKS5nZXQoVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9SZWFkUmVxdWVzdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9SZWFkUmVxdWVzdEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDZiMmQwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL1JlYWRSZXF1ZXN0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzc3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5JbW11dGFibGVQYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50dXBsZS5QYWlyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQ29sdW1uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLk5hbWVWYWx1ZVNlcVVuaXQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlZhbHVlTWF0cml4OworaW1wb3J0IG9yZy5hc2FtLm9kcy5WYWx1ZU1hdHJpeE1vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1hc3NkYXRhLlJlYWRSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5SZWFkUmVxdWVzdC5WYWx1ZXNNb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlZFZhbHVlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVW5pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbXBhcmlzb25PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKKworLyoqCisgKiBSZWFkcyBtYXNzIGRhdGEgc3BlY2lmaWVkIGluIHtAbGluayBSZWFkUmVxdWVzdH1zLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVhZFJlcXVlc3RIYW5kbGVyIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbHVtbkF0dHJpYnV0ZXMgeworCQlwcml2YXRlIFN0cmluZyBuYW1lOworCQlwcml2YXRlIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwkJcHJpdmF0ZSBkb3VibGVbXSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJcHJpdmF0ZSBib29sZWFuIGluZGVwZW5kZW50OworCQlwcml2YXRlIEF4aXNUeXBlIGF4aXNUeXBlOworCisJCXB1YmxpYyBDb2x1bW5BdHRyaWJ1dGVzKFN0cmluZyBuYW1lLCBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIHNlcXVlbmNlUmVwcmVzZW50YXRpb24sCisJCQkJZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnMsIGJvb2xlYW4gaW5kZXBlbmRlbnQsIEF4aXNUeXBlIGF4aXNUeXBlKSB7CisJCQl0aGlzLm5hbWUgPSBuYW1lOworCQkJdGhpcy5zZXF1ZW5jZVJlcHJlc2VudGF0aW9uID0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwkJCXRoaXMuZ2VuZXJhdGlvblBhcmFtZXRlcnMgPSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJCXRoaXMuaW5kZXBlbmRlbnQgPSBpbmRlcGVuZGVudDsKKwkJCXRoaXMuYXhpc1R5cGUgPSBheGlzVHlwZTsKKwkJfQorCisJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJCXJldHVybiBuYW1lOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCisJCXB1YmxpYyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIGdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSB7CisJCQlyZXR1cm4gc2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKKwkJfQorCisJCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQl0aGlzLnNlcXVlbmNlUmVwcmVzZW50YXRpb24gPSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworCQl9CisKKwkJcHVibGljIGRvdWJsZVtdIGdldEdlbmVyYXRpb25QYXJhbWV0ZXJzKCkgeworCQkJcmV0dXJuIGdlbmVyYXRpb25QYXJhbWV0ZXJzOworCQl9CisKKwkJcHVibGljIHZvaWQgc2V0R2VuZXJhdGlvblBhcmFtZXRlcnMoZG91YmxlW10gZ2VuZXJhdGlvblBhcmFtZXRlcnMpIHsKKwkJCXRoaXMuZ2VuZXJhdGlvblBhcmFtZXRlcnMgPSBnZW5lcmF0aW9uUGFyYW1ldGVyczsKKwkJfQorCisJCXB1YmxpYyBib29sZWFuIGlzSW5kZXBlbmRlbnRDb2x1bW4oKSB7CisJCQlyZXR1cm4gaW5kZXBlbmRlbnQ7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRJbmRlcGVuZGVudENvbHVtbihib29sZWFuIGluZGVwZW5kZW50KSB7CisJCQl0aGlzLmluZGVwZW5kZW50ID0gaW5kZXBlbmRlbnQ7CisJCX0KKworCQlwdWJsaWMgQXhpc1R5cGUgZ2V0QXhpc1R5cGUoKSB7CisJCQlyZXR1cm4gYXhpc1R5cGU7CisJCX0KKworCQlwdWJsaWMgdm9pZCBzZXRBeGlzVHlwZShBeGlzVHlwZSBheGlzVHlwZSkgeworCQkJdGhpcy5heGlzVHlwZSA9IGF4aXNUeXBlOworCQl9CisKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyOworCXByaXZhdGUgZmluYWwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBnYWluIGFjY2VzcyB0byB2YWx1ZSBtYXRyaWNlcy4KKwkgKi8KKwlwdWJsaWMgUmVhZFJlcXVlc3RIYW5kbGVyKE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIExvYWRzIHtAbGluayBNZWFzdXJlZFZhbHVlc30gYXMgZGVmaW5lZCBpbiBnaXZlbiB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFRoZSB7QGNvZGUgTWVhc3VyZWRWYWx1ZXN9IHJlcXVlc3QgY29uZmlndXJhdGlvbi4KKwkgKiBAcmV0dXJuIFRoZSBsb2FkZWQge0Bjb2RlIE1lYXN1cmVkVmFsdWVzfSBhcmUgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCB7QGNvZGUKKwkgKiAJCU1lYXN1cmVkVmFsdWVzfSAgICAgLgorCSAqLworCXB1YmxpYyBMaXN0PE1lYXN1cmVkVmFsdWVzPiBleGVjdXRlKFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCVZhbHVlTWF0cml4IHZhbHVlTWF0cml4ID0gbnVsbDsKKwkJQ29sdW1uW10gYXJyQ29sdW1ucyA9IG51bGw7CisKKwkJdHJ5IHsKKwkJCXZhbHVlTWF0cml4ID0gZ2V0VmFsdWVNYXRyaXgocmVhZFJlcXVlc3QpOworCQkJTGlzdDxQYWlyPENvbHVtbiwgQ29sdW1uQXR0cmlidXRlcz4+IGxpc3RDb2x1bW5QYWlycyA9IGdldE9EU0NvbHVtbnMocmVhZFJlcXVlc3QsIHZhbHVlTWF0cml4KTsKKworCQkJYXJyQ29sdW1ucyA9IGxpc3RDb2x1bW5QYWlycy5zdHJlYW0oKS5tYXAoUGFpcjo6Z2V0TGVmdCkudG9BcnJheShDb2x1bW5bXTo6bmV3KTsKKwkJCUNvbHVtbkF0dHJpYnV0ZXNbXSBhcnJDb2x1bW5BdHRyaWJ1dGVzID0gbGlzdENvbHVtblBhaXJzLnN0cmVhbSgpLm1hcChQYWlyOjpnZXRSaWdodCkKKwkJCQkJLnRvQXJyYXkoQ29sdW1uQXR0cmlidXRlc1tdOjpuZXcpOworCisJCQlOYW1lVmFsdWVTZXFVbml0W10gbnZzdXMgPSB2YWx1ZU1hdHJpeC5nZXRWYWx1ZShhcnJDb2x1bW5zLCByZWFkUmVxdWVzdC5nZXRTdGFydEluZGV4KCksCisJCQkJCXJlYWRSZXF1ZXN0LmdldFJlcXVlc3RTaXplKCkpOworCQkJcmV0dXJuIE9EU0NvbnZlcnRlci5mcm9tT0RTTWVhc3VyZWRWYWx1ZXNTZXEobnZzdXMsIGFyckNvbHVtbkF0dHJpYnV0ZXMpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBhb2UpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKGFvZS5yZWFzb24sIGFvZSk7CisJCX0gZmluYWxseSB7CisJCQlyZWxlYXNlQ29sdW1ucyhhcnJDb2x1bW5zKTsKKwkJCXJlbGVhc2VWYWx1ZU1hdHJpeCh2YWx1ZU1hdHJpeCk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgYWxsIGZvciBlYWNoIGRlZmluZWQge0BsaW5rIENoYW5uZWx9IGluIGdpdmVuIHtAbGluayBSZWFkUmVxdWVzdH0gYW5kCisJICogbG9hZHMgdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIENvbHVtbn0gdXNpbmcgZ2l2ZW4ge0BsaW5rIFZhbHVlTWF0cml4fS4KKwkgKgorCSAqIEBwYXJhbSByZWFkUmVxdWVzdCBEZWZpbmVzIHJlcXVpcmVkIHtAY29kZSBDb2x1bW59cy4KKwkgKiBAcGFyYW0gdmFsdWVNYXRyaXggVXNlZCB0byBsb2FkIHJlcXVpcmVkIHtAY29kZSBDb2x1bW59cy4KKwkgKiBAcmV0dXJuIHtAY29kZSBDb2x1bW59IGNvbmZpZ3VyZWQgaW4gZ2l2ZW4ge0Bjb2RlIFJlYWRSZXF1ZXN0fSBhcmUgcmV0dXJuZWQKKwkgKiAgICAgICAgIHdpdGggZGVmaW5lZCB7QGxpbmsgVW5pdH0gc2V0dXAuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiAgICAgICAgIFRocm93IGlmIHVuYWJsZSB0byBsb2FkIGFsbCBhdmFpbGFibGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIENvbHVtbn1zLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gd3Jvbmcge0Bjb2RlIFJlYWRSZXF1ZXN0fSBzZXR1cC4KKwkgKi8KKwlwcml2YXRlIExpc3Q8UGFpcjxDb2x1bW4sIENvbHVtbkF0dHJpYnV0ZXM+PiBnZXRPRFNDb2x1bW5zKFJlYWRSZXF1ZXN0IHJlYWRSZXF1ZXN0LCBWYWx1ZU1hdHJpeCB2YWx1ZU1hdHJpeCkKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8UGFpcjxDb2x1bW4sIENvbHVtbkF0dHJpYnV0ZXM+PiBsaXN0Q29sdW1uUGFpcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJTWFwPFN0cmluZywgQ29sdW1uPiBtYXBDb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworCisJCXRyeSB7CisJCQlpZiAocmVhZFJlcXVlc3QuaXNMb2FkQWxsQ2hhbm5lbHMoKSkgeworCQkJCS8vIFRPRE8gc2hvdWxkIGl0IGJlIHBvc3NpYmxlIHRvIG92ZXJ3cml0ZSB0aGUgdW5pdCBvZiBzb21lCisJCQkJLy8gY2hhbm5lbHM/IQorCQkJCS8vIC0+IHRoaXMgcmVzdWx0cyBpbiBhIHBlcmZvcm1hbmNlIGlzc3VlIHNpbmNlIHdlIG5lZWQgdG8gY2FsbAorCQkJCS8vIGdldE5hbWUoKQorCQkJCS8vIG9uIGVhY2ggY29sdW1uIGZvciBtYXBwaW5nISAobm8gbG9uZ2VyLCBzZWUgYmVsb3chKQorCQkJCUNvbHVtbltdIGNvbHVtbnMgPSB2YWx1ZU1hdHJpeC5nZXRDb2x1bW5zKCIqIik7CisKKwkJCQlpZiAobnVsbCAhPSBjb2x1bW5zKSB7CisJCQkJCWZvciAoQ29sdW1uIGNvbHVtbiA6IGNvbHVtbnMpIHsKKwkJCQkJCVN0cmluZyBjb2x1bW5OYW1lID0gY29sdW1uLmdldE5hbWUoKTsKKwkJCQkJCWlmIChtYXBDb2x1bW5zLmNvbnRhaW5zS2V5KGNvbHVtbk5hbWUpKSB7CisJCQkJCQkJcmVsZWFzZUNvbHVtbnMoY29sdW1ucyk7CisJCQkJCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oCisJCQkJCQkJCQlTdHJpbmcuZm9ybWF0KCJEdXBsaWNhdGUgY29sdW1uIG5hbWUgJyVzJyBmb3VuZCB3aXRoaW4gc3VibWF0cml4IElEICVkISIsCisJCQkJCQkJCQkJCWNvbHVtbk5hbWUsIExvbmcudmFsdWVPZihyZWFkUmVxdWVzdC5nZXRDaGFubmVsR3JvdXAoKS5nZXRJRCgpKSkpOworCQkJCQkJfQorCisJCQkJCQltYXBDb2x1bW5zLnB1dChjb2x1bW5OYW1lLCBjb2x1bW4pOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlmb3IgKEVudHJ5PENoYW5uZWwsIFVuaXQ+IGVudHJ5IDogcmVhZFJlcXVlc3QuZ2V0Q2hhbm5lbHMoKS5lbnRyeVNldCgpKSB7CisJCQkJCUNoYW5uZWwgY2hhbm5lbCA9IGVudHJ5LmdldEtleSgpOworCQkJCQlVbml0IHVuaXQgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJCQlTdHJpbmcgY2hhbm5lbE5hbWUgPSBjaGFubmVsLmdldE5hbWUoKTsKKwkJCQkJQ29sdW1uW10gY29sdW1ucyA9IHZhbHVlTWF0cml4LmdldENvbHVtbnMoY2hhbm5lbE5hbWUpOworCQkJCQlpZiAoY29sdW1ucyA9PSBudWxsIHx8IGNvbHVtbnMubGVuZ3RoICE9IDEpIHsKKwkJCQkJCXJlbGVhc2VDb2x1bW5zKGNvbHVtbnMpOworCQkJCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKwkJCQkJCQkJIlplcm8gb3IgbW9yZSB0aGFuIG9uZSBjb2x1bW4gd2l0aCBuYW1lICclcycgZm91bmQgd2l0aGluIHN1Ym1hdHJpeCBJRCAlZCEiLAorCQkJCQkJCQljaGFubmVsTmFtZSwgTG9uZy52YWx1ZU9mKHJlYWRSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpLmdldElEKCkpKSk7CisJCQkJCX0KKworCQkJCQlDb2x1bW4gY29sdW1uID0gY29sdW1uc1swXTsKKwkJCQkJaWYgKCF1bml0Lm5hbWVFcXVhbHMoY2hhbm5lbC5nZXRVbml0KCkuZ2V0TmFtZSgpKSkgeworCQkJCQkJY29sdW1uLnNldFVuaXQodW5pdC5nZXROYW1lKCkpOworCQkJCQl9CisKKwkJCQkJbWFwQ29sdW1ucy5wdXQoY2hhbm5lbE5hbWUsIGNvbHVtbik7CisJCQkJfQorCQkJfQorCisJCQlpZiAobWFwQ29sdW1ucy5zaXplKCkgPiAwKSB7CisJCQkJRW50aXR5VHlwZSBsb2NhbENvbHVtbkVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZSgiTG9jYWxDb2x1bW4iKTsKKwkJCQlBdHRyaWJ1dGUgaWRBdHRyID0gbG9jYWxDb2x1bW5FbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiSWQiKTsKKwkJCQlBdHRyaWJ1dGUgbmFtZUF0dHIgPSBsb2NhbENvbHVtbkVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJOYW1lIik7CisJCQkJQXR0cmlidXRlIHN1Ym1hdHJpeEF0dHIgPSBsb2NhbENvbHVtbkVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJTdWJNYXRyaXgiKTsKKworCQkJCS8vIERvbid0IHF1ZXJ5IEdlbmVyYXRpb25QYXJhbWV0ZXJzIHRvZ2V0aGVyIHdpdGggb3RoZXIgbm9uLUlEIGF0dHJpYnV0ZXMgYXMKKwkJCQkvLyBBdmFsb24gZGlzbGlrZXMgdGhpczoKKwkJCQlRdWVyeSBxdWVyeTEgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKQorCQkJCQkJLnNlbGVjdChMaXN0cy5uZXdBcnJheUxpc3QoaWRBdHRyLCBuYW1lQXR0ciwKKwkJCQkJCQkJbG9jYWxDb2x1bW5FbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiU2VxdWVuY2VSZXByZXNlbnRhdGlvbiIpLAorCQkJCQkJCQlsb2NhbENvbHVtbkVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJJbmRlcGVuZGVudEZsYWciKSwKKwkJCQkJCQkJbG9jYWxDb2x1bW5FbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiYXhpc3R5cGUiKSkpOworCisJCQkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5hbmQoKS5hZGQoQ29tcGFyaXNvbk9wZXJhdG9yLkVRVUFMLmNyZWF0ZShzdWJtYXRyaXhBdHRyLAorCQkJCQkJTG9uZy52YWx1ZU9mKHJlYWRSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpLmdldElEKCkpKSk7CisKKwkJCQlTZXQ8U3RyaW5nPiBzZXRDb2x1bW5OYW1lcyA9IG1hcENvbHVtbnMua2V5U2V0KCk7CisKKwkJCQlNYXA8U3RyaW5nLCBDb2x1bW5BdHRyaWJ1dGVzPiBtYXBDb2x1bW5BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8PigpOworCisJCQkJZm9yIChSZXN1bHQgcmVzdWx0IDogcXVlcnkxLmZldGNoKGZpbHRlcikpIHsKKwkJCQkJTWFwPFN0cmluZywgVmFsdWU+IG1hcFZhbHVlcyA9IHJlc3VsdC5nZXRSZWNvcmQobG9jYWxDb2x1bW5FbnRpdHlUeXBlKS5nZXRWYWx1ZXMoKTsKKworCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IG1hcFZhbHVlcy5nZXQoIk5hbWUiKS5leHRyYWN0KCk7CisKKwkJCQkJaWYgKHNldENvbHVtbk5hbWVzLmNvbnRhaW5zKGNvbHVtbk5hbWUpKSB7CisJCQkJCQlDb2x1bW5BdHRyaWJ1dGVzIGNhID0gbmV3IENvbHVtbkF0dHJpYnV0ZXMoY29sdW1uTmFtZSwKKwkJCQkJCQkJKFZhbHVlc01vZGUuQ0FMQ1VMQVRFRCA9PSByZWFkUmVxdWVzdC5nZXRWYWx1ZXNNb2RlKCkgPyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUCisJCQkJCQkJCQkJOiBtYXBWYWx1ZXMuZ2V0KCJTZXF1ZW5jZVJlcHJlc2VudGF0aW9uIikuZXh0cmFjdCgpKSwKKwkJCQkJCQkJbmV3IGRvdWJsZVswXSwgKChzaG9ydCkgbWFwVmFsdWVzLmdldCgiSW5kZXBlbmRlbnRGbGFnIikuZXh0cmFjdCgpICE9IDApLAorCQkJCQkJCQltYXBWYWx1ZXMuZ2V0KCJheGlzdHlwZSIpLmV4dHJhY3QoKSk7CisKKwkJCQkJCW1hcENvbHVtbkF0dHJpYnV0ZXMucHV0KG1hcFZhbHVlcy5nZXQoIklkIikuZXh0cmFjdCgpLCBjYSk7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoVmFsdWVzTW9kZS5DQUxDVUxBVEVEICE9IHJlYWRSZXF1ZXN0LmdldFZhbHVlc01vZGUoKSkgeworCQkJCQlRdWVyeSBxdWVyeTIgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoaWRBdHRyLAorCQkJCQkJCWxvY2FsQ29sdW1uRW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoIkdlbmVyYXRpb25QYXJhbWV0ZXJzIikpOworCisJCQkJCWZvciAoUmVzdWx0IHJlc3VsdCA6IHF1ZXJ5Mi5mZXRjaChmaWx0ZXIpKSB7CisJCQkJCQlNYXA8U3RyaW5nLCBWYWx1ZT4gbWFwVmFsdWVzID0gcmVzdWx0LmdldFJlY29yZChsb2NhbENvbHVtbkVudGl0eVR5cGUpLmdldFZhbHVlcygpOworCisJCQkJCQlDb2x1bW5BdHRyaWJ1dGVzIGNhID0gbWFwQ29sdW1uQXR0cmlidXRlcy5nZXQobWFwVmFsdWVzLmdldCgiSWQiKS5leHRyYWN0KCkpOworCisJCQkJCQlpZiAoY2EgIT0gbnVsbCkgeworCQkJCQkJCWNhLnNldEdlbmVyYXRpb25QYXJhbWV0ZXJzKG1hcFZhbHVlcy5nZXQoIkdlbmVyYXRpb25QYXJhbWV0ZXJzIikuZXh0cmFjdCgpKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKworCQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29sdW1uQXR0cmlidXRlcz4gbWUgOiBtYXBDb2x1bW5BdHRyaWJ1dGVzLmVudHJ5U2V0KCkpIHsKKwkJCQkJQ29sdW1uQXR0cmlidXRlcyBjYSA9IG1lLmdldFZhbHVlKCk7CisJCQkJCWxpc3RDb2x1bW5QYWlycy5hZGQobmV3IEltbXV0YWJsZVBhaXI8Q29sdW1uLCBDb2x1bW5BdHRyaWJ1dGVzPihtYXBDb2x1bW5zLmdldChjYS5nZXROYW1lKCkpLCBjYSkpOworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIGxpc3RDb2x1bW5QYWlyczsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJcmVsZWFzZUNvbHVtbnMobGlzdENvbHVtblBhaXJzLnN0cmVhbSgpLm1hcChQYWlyOjpnZXRMZWZ0KS50b0FycmF5KENvbHVtbltdOjpuZXcpKTsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9hZCBjb2x1bW4gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFZhbHVlTWF0cml4fSBDT1JCQSBzZXJ2aWNlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgUmVhZFJlcXVlc3R9LgorCSAqCisJICogQHBhcmFtIHJlYWRSZXF1ZXN0IFRoZSB7QGNvZGUgUmVhZFJlcXVlc3R9LgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBWYWx1ZU1hdHJpeH0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgdGhlIHtAY29kZSBWYWx1ZU1hdHJpeH0uCisJICovCisJcHJpdmF0ZSBWYWx1ZU1hdHJpeCBnZXRWYWx1ZU1hdHJpeChSZWFkUmVxdWVzdCByZWFkUmVxdWVzdCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJRW50aXR5IGVudGl0eSA9IHJlYWRSZXF1ZXN0LmdldENoYW5uZWxHcm91cCgpOworCQlUX0xPTkdMT05HIGlpZCA9IE9EU0NvbnZlcnRlci50b09EU0lEKGVudGl0eS5nZXRJRCgpKTsKKwkJVF9MT05HTE9ORyBhaWQgPSAoKE9EU0VudGl0eVR5cGUpIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eSkpLmdldE9EU0lEKCk7CisJCVZhbHVlTWF0cml4TW9kZSB2YWx1ZU1hdHJpeE1vZGUgPSBWYWx1ZU1hdHJpeE1vZGUuQ0FMQ1VMQVRFRDsKKwkJc3dpdGNoIChyZWFkUmVxdWVzdC5nZXRWYWx1ZXNNb2RlKCkpIHsKKwkJY2FzZSBDQUxDVUxBVEVEOgorCQkJdmFsdWVNYXRyaXhNb2RlID0gVmFsdWVNYXRyaXhNb2RlLkNBTENVTEFURUQ7CisJCQlicmVhazsKKwkJY2FzZSBTVE9SQUdFOgorCQkJdmFsdWVNYXRyaXhNb2RlID0gVmFsdWVNYXRyaXhNb2RlLlNUT1JBR0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKAorCQkJCQlTdHJpbmcuZm9ybWF0KCJVbnN1cHBvcnRlZCBWYWx1ZU1vZGUgJXMhIiwgcmVhZFJlcXVlc3QuZ2V0VmFsdWVzTW9kZSgpLm5hbWUoKSkpOworCQl9CisKKwkJcmV0dXJuIG1vZGVsTWFuYWdlci5nZXRBcHBsRWxlbUFjY2VzcygpLmdldFZhbHVlTWF0cml4SW5Nb2RlKG5ldyBFbGVtSWQoYWlkLCBpaWQpLCB2YWx1ZU1hdHJpeE1vZGUpOworCX0KKworCS8qKgorCSAqIFJlbGVhc2VzIGdpdmVuIHtAbGluayBWYWx1ZU1hdHJpeH0gQ09SQkEgb2JqZWN0LgorCSAqCisJICogQHBhcmFtIHZhbHVlTWF0cml4IFdpbGwgYmUgcmVsZWFzZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbGVhc2VWYWx1ZU1hdHJpeChWYWx1ZU1hdHJpeCB2YWx1ZU1hdHJpeCkgeworCQlpZiAodmFsdWVNYXRyaXggPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCXZhbHVlTWF0cml4LmRlc3Ryb3koKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gYW9lKSB7CisJCQkvLyBpZ25vcmUKKwkJfSBmaW5hbGx5IHsKKwkJCXZhbHVlTWF0cml4Ll9yZWxlYXNlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWxlYXNlcyBlYWNoIENPUkJBIHtAbGluayBDb2x1bW59IG9iamVjdC4KKwkgKgorCSAqIEBwYXJhbSBjb2x1bW5zIFdpbGwgYmUgcmVsZWFzZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlbGVhc2VDb2x1bW5zKENvbHVtbltdIGNvbHVtbnMpIHsKKwkJaWYgKGNvbHVtbnMgPT0gbnVsbCkgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChDb2x1bW4gY29sdW1uIDogY29sdW1ucykgeworCQkJdHJ5IHsKKwkJCQljb2x1bW4uZGVzdHJveSgpOworCQkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJCS8vIGlnbm9yZQorCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCQkvLyBpZ25vcmUKKwkJCX0gZmluYWxseSB7CisJCQkJY29sdW1uLl9yZWxlYXNlKCk7CisJCQl9CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvQ09SQkFGaWxlU2VydmVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzc4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNTIxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmZpbGV0cmFuc2ZlcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9TZXNzaW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLkludmFsaWROYW1lOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BSGVscGVyOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UuQWRhcHRlckluYWN0aXZlOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZS5PYmplY3ROb3RBY3RpdmU7CitpbXBvcnQgb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FQYWNrYWdlLlNlcnZhbnRBbHJlYWR5QWN0aXZlOworaW1wb3J0IG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZS5Xcm9uZ1BvbGljeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkNPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuQ09SQkFGaWxlU2VydmVySUY7CitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkRTX0JZVEVIb2xkZXI7CitpbXBvcnQgY29tLmhpZ2hxc29mdC5jb3JiYWZpbGVzZXJ2ZXIuZ2VuZXJhdGVkLkVycm9yQ29kZTsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRjsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuSW5wdXRTdHJlYW1JRlBPQTsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmNvcmJhZmlsZXNlcnZlci5nZW5lcmF0ZWQuU2V2ZXJpdHlGbGFnOworCisvKioKKyAqIFNlcnZpY2UgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBsb3cgbGV2ZWwge0BsaW5rIENPUkJBRmlsZVNlcnZlcklGfSBmaWxlCisgKiBzZXJ2aWNlIEFQSS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgQ09SQkFGaWxlU2VydmVyIHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDT1JCQUZpbGVTZXJ2ZXIuY2xhc3MpOworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMTAwXzAwMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU09DS0VUX1RJTUVPVVQgPSA1XzAwMDsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJGQUNFX05BTUVfUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmZpbGV0cmFuc2Zlci5pbnRlcmZhY2VOYW1lIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSE9TVF9OQU1FX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuaG9zdG5hbWUiOworCisJcHJpdmF0ZSBmaW5hbCBDT1JCQUZpbGVTZXJ2ZXJJRiBmaWxlU2VydmVyOworCXByaXZhdGUgZmluYWwgQW9TZXNzaW9uIGFvU2Vzc2lvbjsKKwlwcml2YXRlIGZpbmFsIE9SQiBvcmI7CisKKwlwcml2YXRlIGZpbmFsIFRyYW5zZmVyIHRyYW5zZmVyOworCisJcHJpdmF0ZSBmaW5hbCBpbnQgYnVmZmVyU2l6ZTsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQgIFVzZWQgZm9yIHNldHVwLgorCSAqIEBwYXJhbSB0cmFuc2ZlciBUaGUgdHJhbnNmZXIgdHlwZSBmb3IgdXAtIGFuZCBkb3dubG9hZHMuCisJICovCisJQ09SQkFGaWxlU2VydmVyKE9EU0NvbnRleHQgY29udGV4dCwgVHJhbnNmZXIgdHJhbnNmZXIpIHsKKwkJTW9kZWxNYW5hZ2VyIG1tID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKE1vZGVsTWFuYWdlci5jbGFzcykpOworCQlpZiAoIShtbSBpbnN0YW5jZW9mIE9EU01vZGVsTWFuYWdlcikpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBzdXBwbGllZCBNb2RlbE1hbmFnZXIgbXVzdCBiZSBhbiBPRFNNb2RlbE1hbmFnZXIhIik7CisJCX0KKworCQlmaWxlU2VydmVyID0gY29udGV4dC5nZXRGaWxlU2VydmVyKCk7CisJCWFvU2Vzc2lvbiA9IGNvbnRleHQuZ2V0QW9TZXNzaW9uKCk7CisJCW9yYiA9IGNvbnRleHQuZ2V0T1JCKCk7CisJCXRoaXMudHJhbnNmZXIgPSB0cmFuc2ZlcjsKKworCQlidWZmZXJTaXplID0gZ2V0QnVmZmVyU2l6ZSgpOworCX0KKworCS8qKgorCSAqIE9wZW5zIGEgY29uc3VtYWJsZSBkb3dubG9hZCB7QGxpbmsgSW5wdXRTdHJlYW19IGZvciBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9LgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rIFVzZWQgdG8gYWNjZXNzIHRoZSByZW1vdGUgcGF0aC4KKwkgKiBAcGFyYW0gZWxlbUlkICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEByZXR1cm4gVGhlIGNvbnN1bWFibGUge0Bjb2RlIElucHV0U3RyZWFtfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gb3BlbiBhbiB0aGUge0Bjb2RlIElucHV0U3RyZWFtfS4KKwkgKi8KKwlwdWJsaWMgSW5wdXRTdHJlYW0gb3BlblN0cmVhbShGaWxlTGluayBmaWxlTGluaywgRWxlbUlkIGVsZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisJCWlmICh0cmFuc2Zlci5pc1N0cmVhbSgpKSB7CisJCQlpbnB1dFN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbUFkYXB0ZXIob3BlblNpbXBsZVN0cmVhbShmaWxlTGluaywgZWxlbUlkKSk7CisJCX0gZWxzZSBpZiAodHJhbnNmZXIuaXNTb2NrZXQoKSkgeworCQkJaW5wdXRTdHJlYW0gPSBvcGVuU29ja2V0U3RyZWFtKGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJhbnNmZXIgc3RhdGUgJyIgKyB0cmFuc2ZlciArICInIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisJCX0KKworCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGJ1ZmZlclNpemUpOworCX0KKworCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUge0Bjb2RlIElucHV0U3RyZWFtfSB0byBiZSB1cGxvYWRlZC4KKwkgKiBAcGFyYW0gZmlsZUxpbmsgICAgVGhlIGFzc29jaWF0ZWQge0Bjb2RlIEZpbGVMaW5rfS4KKwkgKiBAcGFyYW0gZWxlbUlkICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byB1cGxvYWQgZ2l2ZW4ge0Bjb2RlIElucHV0U3RyZWFtfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGxvYWRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEZpbGVMaW5rIGZpbGVMaW5rLCBFbGVtSWQgZWxlbUlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgcmVtb3RlUGF0aDsKKwkJaWYgKHRyYW5zZmVyLmlzU3RyZWFtKCkpIHsKKwkJCXJlbW90ZVBhdGggPSB1cGxvYWRWSUFTdHJlYW0oaW5wdXRTdHJlYW0sIGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgaWYgKHRyYW5zZmVyLmlzU29ja2V0KCkpIHsKKwkJCXJlbW90ZVBhdGggPSB1cGxvYWRWSUFTb2NrZXQoaW5wdXRTdHJlYW0sIGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJhbnNmZXIgc3RhdGUgJyIgKyB0cmFuc2ZlciArICInIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisJCX0KKworCQlmaWxlTGluay5zZXRSZW1vdGVQYXRoKHJlbW90ZVBhdGgpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBmaWxlIHNpemUgZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30uCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmsgVGhlIHtAY29kZSBGaWxlTGlua30gd2hvc2UgZmlsZSBzaXplIHdpbGwgYmUgbG9hZGVkLgorCSAqIEBwYXJhbSBlbGVtSWQgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHJldHVybiBUaGUgZmlsZSBzaXplIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIHRoZSBmaWxlIHNpemUuCisJICovCisJcHVibGljIGxvbmcgbG9hZFNpemUoRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlyZXR1cm4gZmlsZVNlcnZlci5nZXRTaXplRm9ySW5zdGFuY2UoYW9TZXNzaW9uLCBmaWxlTGluay5nZXRSZW1vdGVQYXRoKCksIGVsZW1JZC5haWQsIGVsZW1JZC5paWQpOworCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gcXVlcnkgZmlsZSBzaXplIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgdGhlIHtAbGluayBGaWxlTGlua30gZnJvbSB0aGUgcmVtb3RlIHN0b3JhZ2UuCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmsgV2lsbCBiZSBkZWxldGVkIGZyb20gdGhlIHJlbW90ZSBzdG9yYWdlLgorCSAqIEBwYXJhbSBlbGVtSWQgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGRlbGV0ZSBnaXZlbiB7QGNvZGUgRmlsZUxpbmt9LgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZShGaWxlTGluayBmaWxlTGluaywgRWxlbUlkIGVsZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWZpbGVTZXJ2ZXIuZGVsZXRlRm9ySW5zdGFuY2UoYW9TZXNzaW9uLCBmaWxlTGluay5nZXRSZW1vdGVQYXRoKCksIGVsZW1JZC5haWQsIGVsZW1JZC5paWQpOworCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIHJlbW90ZSBmaWxlIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIE9wZW5zIGEgc2ltcGxlIHtAbGluayBJbnB1dFN0cmVhbUlGfSB1c2luZyB0aGUge0BsaW5rIENPUkJBRmlsZVNlcnZlcklGfS4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGluayBVc2VkIHRvIGFjY2VzcyB0aGUgcmVtb3RlIHBhdGguCisJICogQHBhcmFtIGVsZW1JZCAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcy4KKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgSW5wdXRTdHJlYW1JRn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIG9wZW4gdGhlIHtAY29kZSBJbnB1dFN0cmVhbUlGfS4KKwkgKi8KKwlwcml2YXRlIElucHV0U3RyZWFtSUYgb3BlblNpbXBsZVN0cmVhbShGaWxlTGluayBmaWxlTGluaywgRWxlbUlkIGVsZW1JZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBmaWxlU2VydmVyLnJlYWRGb3JJbnN0YW5jZShhb1Nlc3Npb24sIGZpbGVMaW5rLmdldFJlbW90ZVBhdGgoKSwgZWxlbUlkLmFpZCwgZWxlbUlkLmlpZCk7CisJCX0gY2F0Y2ggKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBvcGVuIHN0cmVhbSBmb3IgZmlsZSB0cmFuc2ZlciBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPcGVucyBhIHNvY2tldCB7QGxpbmsgSW5wdXRTdHJlYW19IHVzaW5nIHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHBhcmFtIGZpbGVMaW5rIFVzZWQgdG8gYWNjZXNzIHRoZSByZW1vdGUgcGF0aC4KKwkgKiBAcGFyYW0gZWxlbUlkICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIG9wZW4gdGhlIHNvY2tldCB7QGNvZGUKKwkgKiAJCUlucHV0U3RyZWFtfS4KKwkgKi8KKwlwcml2YXRlIElucHV0U3RyZWFtIG9wZW5Tb2NrZXRTdHJlYW0oRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIGF1dG8gYXNzaWduZWQgcG9ydCB3aXRoIGF3YWl0aW5nIGV4YWN0bHkgT05FIGluY29taW5nIGNvbm5lY3Rpb24KKwkJdHJ5IChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwLCAxLCBnZXRJbnRlcmZhY2VBZGRyZXNzKCkpKSB7CisJCQlzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KFNPQ0tFVF9USU1FT1VUICogNik7CisKKwkJCW5ldyBUaHJlYWQoKCkgLT4geworCQkJCXRyeSB7CisJCQkJCS8qCisJCQkJCSAqIE5PVEU6IFNpbmNlIGEgc29ja2V0IGZpbGUgdHJhbnNmZXIgcmVnaXN0cmF0aW9uIG1heSBibG9jayB1bnRpbCB0aGlzIHNlcnZlcgorCQkJCQkgKiBzb2NrZXQncyBhY2NlcHQgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIHJlZ2lzdHJhdGlvbiBpcyBkb25lIGFzeW5jaHJvbm91c2x5IQorCQkJCQkgKi8KKwkJCQkJZmlsZVNlcnZlci5nZXRGb3JJbnN0YW5jZUJ5U29ja2V0KGFvU2Vzc2lvbiwgZmlsZUxpbmsuZ2V0UmVtb3RlUGF0aCgpLCBlbGVtSWQuYWlkLCBlbGVtSWQuaWlkLAorCQkJCQkJCXNlcnZlclNvY2tldC5nZXRJbmV0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCksIHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKSk7CisJCQkJfSBjYXRjaCAoQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGUpIHsKKwkJCQkJTE9HR0VSLmVycm9yKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBzb2NrZXQgc3RyZWFtLCBhd2FpdGluZyBzb2NrZXQgdGltZW91dC4iLCBlKTsKKwkJCQl9CisJCQl9KS5zdGFydCgpOworCisJCQlTb2NrZXQgY2xpZW50ID0gc2VydmVyU29ja2V0LmFjY2VwdCgpOworCQkJY2xpZW50LnNldFNvVGltZW91dChTT0NLRVRfVElNRU9VVCk7CisJCQlyZXR1cm4gY2xpZW50LmdldElucHV0U3RyZWFtKCk7CisJCX0KKwl9CisKKwlwcml2YXRlIEluZXRBZGRyZXNzIGdldEludGVyZmFjZUFkZHJlc3MoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJU3RyaW5nIGhvc3RuYW1lUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSE9TVF9OQU1FX1BST1BFUlRZKTsKKwkJaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGhvc3RuYW1lUHJvcGVydHkpKSB7CisJCQlMT0dHRVIuZGVidWcoIlVzaW5nIGhvc3QgbmFtZSAnIiArIGhvc3RuYW1lUHJvcGVydHkgKyAiJyBmb3IgZmlsZSB0cmFuc2Zlci4iKTsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5TmFtZShob3N0bmFtZVByb3BlcnR5KTsKKwkJCX0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKwkJCQlMT0dHRVIud2FybigiU3BlY2lmaWVkIGhvc3QgbmFtZSAnIiArIGhvc3RuYW1lUHJvcGVydHkgKyAiJyBjYW5ub3QgYmUgdXNlZCBmb3IgZmlsZSB0cmFuc2Zlci4iLCBlKTsKKwkJCQkvLyBjb250aW51ZSB3aXRoIGxvb2t1cCBieSBpbnRlcmZhY2UgbmFtZQorCQkJfQorCQl9CisKKwkJU3RyaW5nIHByb3BlcnR5ID0gU3lzdGVtLmdldFByb3BlcnR5KElOVEVSRkFDRV9OQU1FX1BST1BFUlRZKTsKKwkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkocHJvcGVydHkpKSB7CisJCQlMT0dHRVIuZGVidWcoIlVzaW5nIG5vIHNwZWNpZmllZCBpbnRlcmZhY2UgZm9yIGZpbGUgdHJhbnNmZXIsIHByb3BlcnR5IG5vdCBzZXQuIik7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCQlMaXN0PE5ldHdvcmtJbnRlcmZhY2U+IGludGVyZmFjZXMgPSBnZXRJbnRlcmZhY2VMaXN0KCk7CisJCUxpc3Q8TmV0d29ya0ludGVyZmFjZT4gZmlsdGVyZWRJbnRlcmZhY2VzID0gZ2V0RmlsdGVyZWRJbnRlcmZhY2VzKGludGVyZmFjZXMpOworCQlmb3IgKE5ldHdvcmtJbnRlcmZhY2UgZmlsdGVyZWRJbnRlcmZhY2UgOiBmaWx0ZXJlZEludGVyZmFjZXMpIHsKKwkJCWlmIChmaWx0ZXJlZEludGVyZmFjZS5nZXROYW1lKCkuZXF1YWxzKHByb3BlcnR5KQorCQkJCQkmJiBmaWx0ZXJlZEludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCkuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKwkJCQlJbmV0QWRkcmVzcyBpbmV0QWRkcmVzcyA9IGZpbHRlcmVkSW50ZXJmYWNlLmdldEluZXRBZGRyZXNzZXMoKS5uZXh0RWxlbWVudCgpOworCQkJCUxPR0dFUi5kZWJ1ZygiVXNpbmcgaW50ZXJmYWNlIHt9IHdpdGggYWRkcmVzcyB7fSBmb3IgZmlsZSB0cmFuc2Zlci4iLCBmaWx0ZXJlZEludGVyZmFjZS5nZXROYW1lKCksCisJCQkJCQlpbmV0QWRkcmVzcyk7CisJCQkJcmV0dXJuIGluZXRBZGRyZXNzOworCQkJfQorCQl9CisJCXJldHVybiBnZXRGYWxsYmFjayhmaWx0ZXJlZEludGVyZmFjZXMpOworCX0KKworCXByaXZhdGUgSW5ldEFkZHJlc3MgZ2V0RmFsbGJhY2soTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBmaWx0ZXJlZEludGVyZmFjZXMpIHsKKwkJaWYgKGZpbHRlcmVkSW50ZXJmYWNlcy5pc0VtcHR5KCkpIHsKKwkJCUxPR0dFUi5kZWJ1ZygiVXNpbmcgbm8gc3BlY2lmaWVkIGludGVyZmFjZSBmb3IgZmlsZSB0cmFuc2ZlciwgcHJvcGVydHkgc2V0IGJ1dCBubyBydW5uaW5nIGludGVyZmFjZS4iKTsKKwkJCXJldHVybiBudWxsOworCQl9CisJCU5ldHdvcmtJbnRlcmZhY2UgbmV0d29ya0ludGVyZmFjZSA9IGZpbHRlcmVkSW50ZXJmYWNlcy5nZXQoMCk7CisJCUVudW1lcmF0aW9uPEluZXRBZGRyZXNzPiBpbmV0QWRkcmVzc2VzID0gbmV0d29ya0ludGVyZmFjZS5nZXRJbmV0QWRkcmVzc2VzKCk7CisJCWlmIChpbmV0QWRkcmVzc2VzLmhhc01vcmVFbGVtZW50cygpKSB7CisJCQlJbmV0QWRkcmVzcyBhZGRyZXNzID0gaW5ldEFkZHJlc3Nlcy5uZXh0RWxlbWVudCgpOworCQkJTE9HR0VSLmRlYnVnKCJVc2luZyBpbnRlcmZhY2Uge30gd2l0aCBhZGRyZXNzIHt9IGZvciBmaWxlIHRyYW5zZmVyLiIsIG5ldHdvcmtJbnRlcmZhY2UuZ2V0TmFtZSgpLCBhZGRyZXNzKTsKKwkJCXJldHVybiBhZGRyZXNzOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCXByaXZhdGUgTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBnZXRGaWx0ZXJlZEludGVyZmFjZXMoTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBpbnRlcmZhY2VzKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiBmaWx0ZXJlZEludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChOZXR3b3JrSW50ZXJmYWNlIGFuSW50ZXJmYWNlIDogaW50ZXJmYWNlcykgeworCQkJaWYgKGFuSW50ZXJmYWNlLmlzVXAoKSAmJiAhYW5JbnRlcmZhY2UuaXNMb29wYmFjaygpICYmICFhbkludGVyZmFjZS5pc1ZpcnR1YWwoKSkgeworCQkJCWZpbHRlcmVkSW50ZXJmYWNlcy5hZGQoYW5JbnRlcmZhY2UpOworCQkJfQorCQl9CisJCXJldHVybiBmaWx0ZXJlZEludGVyZmFjZXM7CisJfQorCisJcHJpdmF0ZSBMaXN0PE5ldHdvcmtJbnRlcmZhY2U+IGdldEludGVyZmFjZUxpc3QoKSB0aHJvd3MgU29ja2V0RXhjZXB0aW9uIHsKKwkJTGlzdDxOZXR3b3JrSW50ZXJmYWNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRW51bWVyYXRpb248TmV0d29ya0ludGVyZmFjZT4gbmV0d29ya0ludGVyZmFjZXMgPSBOZXR3b3JrSW50ZXJmYWNlLmdldE5ldHdvcmtJbnRlcmZhY2VzKCk7CisJCXdoaWxlIChuZXR3b3JrSW50ZXJmYWNlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworCQkJcmVzdWx0LmFkZChuZXR3b3JrSW50ZXJmYWNlcy5uZXh0RWxlbWVudCgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB1c2luZyB0aGUKKwkgKiB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGJlIHVwbG9hZGVkLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBlbGVtSWQgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHJldHVybiBUaGUgcmVtb3RlIHBhdGggb2YgdGhlIHVwbG9hZGVkIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBnaXZlbiB7QGNvZGUgSW5wdXRTdHJlYW19LgorCSAqLworCXByaXZhdGUgU3RyaW5nIHVwbG9hZFZJQVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSAoQ09SQkFJbnB1dFN0cmVhbUFkYXB0ZXIgc3RyZWFtID0gbmV3IENPUkJBSW5wdXRTdHJlYW1BZGFwdGVyKG9yYiwgaW5wdXRTdHJlYW0sIGZpbGVMaW5rLmdldFNpemUoKSkpIHsKKwkJCXJldHVybiBmaWxlU2VydmVyLnNhdmVGb3JJbnN0YW5jZShhb1Nlc3Npb24sIGZpbGVMaW5rLmdldEZpbGVOYW1lKCksICIiLCBlbGVtSWQuYWlkLCBlbGVtSWQuaWlkLAorCQkJCQlzdHJlYW0uX3RoaXMoKSk7CisJCX0gY2F0Y2ggKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byB1cGxvYWQgZmlsZSB2aWEgc3RyZWFtIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIElucHV0U3RyZWFtfSBmb3IgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB2aWEgc29ja2V0CisJICogdXBsb2FkIHVzaW5nIHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9LgorCSAqCisJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSB7QGNvZGUgSW5wdXRTdHJlYW19IHRvIGJlIHVwbG9hZGVkLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgRmlsZUxpbmt9LgorCSAqIEBwYXJhbSBlbGVtSWQgICAgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHJldHVybiBUaGUgcmVtb3RlIHBhdGggb2YgdGhlIHVwbG9hZGVkIHtAY29kZSBJbnB1dFN0cmVhbX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBnaXZlbiB7QGNvZGUgSW5wdXRTdHJlYW19LgorCSAqLworCXByaXZhdGUgU3RyaW5nIHVwbG9hZFZJQVNvY2tldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRmlsZUxpbmsgZmlsZUxpbmssIEVsZW1JZCBlbGVtSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCS8vIGF1dG8gYXNzaWduZWQgcG9ydCB3aXRoIGF3YWl0aW5nIGV4YWN0bHkgT05FIGluY29taW5nIGNvbm5lY3Rpb24KKwkJdHJ5IChTZXJ2ZXJTb2NrZXQgc2VydmVyU29ja2V0ID0gbmV3IFNlcnZlclNvY2tldCgwLCAxLCBnZXRJbnRlcmZhY2VBZGRyZXNzKCkpKSB7CisJCQlzZXJ2ZXJTb2NrZXQuc2V0U29UaW1lb3V0KFNPQ0tFVF9USU1FT1VUICogNik7CisKKwkJCW5ldyBUaHJlYWQoKCkgLT4geworCQkJCXRyeSAoU29ja2V0IGNsaWVudCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNsaWVudC5nZXRPdXRwdXRTdHJlYW0oKSkgeworCQkJCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07CisKKwkJCQkJaW50IGxlbmd0aDsKKwkJCQkJd2hpbGUgKChsZW5ndGggPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcikpID4gLTEpIHsKKwkJCQkJCW91dHB1dFN0cmVhbS53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CisJCQkJCX0KKwkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJCUxPR0dFUi5lcnJvcigiVW5hYmxlIHRvIGluaXRpYWxpemUgc29ja2V0IHN0cmVhbSwgYXdhaXRpbmcgc29ja2V0IHRpbWVvdXQuIiwgZSk7CisJCQkJfQorCQkJfSkuc3RhcnQoKTsKKworCQkJaW50IGxvY2FsUG9ydCA9IHNlcnZlclNvY2tldC5nZXRMb2NhbFBvcnQoKTsKKwkJCVN0cmluZyBsb2NhbEhvc3ROYW1lID0gc2VydmVyU29ja2V0LmdldEluZXRBZGRyZXNzKCkuZ2V0SG9zdEFkZHJlc3MoKTsKKwkJCXRyeSB7CisJCQkJcmV0dXJuIGZpbGVTZXJ2ZXIuc2F2ZUZvckluc3RhbmNlQnlTb2NrZXQoYW9TZXNzaW9uLCBmaWxlTGluay5nZXRGaWxlTmFtZSgpLCAiIiwgZWxlbUlkLmFpZCwgZWxlbUlkLmlpZCwKKwkJCQkJCWxvY2FsSG9zdE5hbWUsIGxvY2FsUG9ydCk7CisJCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJCVN0cmluZyBtZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIHVwbG9hZCBmaWxlIHZpYSBzb2NrZXQgdG8gJXM6JWQgZHVlIHRvOiAlcyIsIGxvY2FsSG9zdE5hbWUsCisJCQkJCQlsb2NhbFBvcnQsIGUucmVhc29uKTsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24obWVzc2FnZSwgZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKioKKwkgKiBUcmllcyB0byBsb2FkIHRoZSBidWZmZXIgc2l6ZSB1c2VkIGJ5IHRoZSB7QGxpbmsgQ09SQkFGaWxlU2VydmVySUZ9IHRvIHJlYWNoCisJICogYmVzdCBwZXJmb3JtYW5jZS4gSW4gY2FzZSBvZiBlcnJvcnMgYSBkZWZhdWx0IGJ1ZmZlciBzaXplIG9mIG9mCisJICoge0B2YWx1ZSAjREVGQVVMVF9CVUZGRVJfU0laRX0gaXMgdXNlZC4KKwkgKgorCSAqIEByZXR1cm4gVGhlIGJ1ZmZlciBzaXplIGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgaW50IGdldEJ1ZmZlclNpemUoKSB7CisJCXRyeSB7CisJCQkvLyB0cnkgdG8gdXNlIHRoZSBzYW1lIGJ1ZmZlciBzaXplIGFzIHRoZSBjb3JiYSBmaWxlIHNlcnZlciBmb3IgYmVzdAorCQkJLy8gcGVyZm9ybWFuY2UKKwkJCXJldHVybiBJbnRlZ2VyLnBhcnNlSW50KGZpbGVTZXJ2ZXIuZ2V0Q29udGV4dChhb1Nlc3Npb24sICJDT1JCQUZpbGVTZXJ2ZXIuQnVmZmVyU2l6ZSIpKTsKKwkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHwgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIGUpIHsKKwkJCXJldHVybiBERUZBVUxUX0JVRkZFUl9TSVpFOworCQl9CisJfQorCisJLyoqCisJICogQSBzaW1wbGUge0BsaW5rIElucHV0U3RyZWFtfSBhZGFwdGVyIGltcGxlbWVudGF0aW9uIGZvciBhbgorCSAqIHtAbGluayBJbnB1dFN0cmVhbUlGfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnB1dFN0cmVhbUFkYXB0ZXIgZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKwkJcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbUlGIGlucHV0U3RyZWFtOworCisJCS8qKgorCQkgKiBDb25zdHJ1Y3Rvci4KKwkJICoKKwkJICogQHBhcmFtIGlucHV0U3RyZWFtIFRoZSB3cmFwcGVkIHtAbGluayBJbnB1dFN0cmVhbUlGfS4KKwkJICovCisJCXByaXZhdGUgSW5wdXRTdHJlYW1BZGFwdGVyKElucHV0U3RyZWFtSUYgaW5wdXRTdHJlYW0pIHsKKwkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbMV07CisJCQlyZXR1cm4gcmVhZChiKSA9PSAtMSA/IC0xIDogYlswXTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCURTX0JZVEVIb2xkZXIgYnl0ZUhvbGRlciA9IG5ldyBEU19CWVRFSG9sZGVyKCk7CisJCQkJaW50IHJlY2VpdmVkQnl0ZXMgPSBpbnB1dFN0cmVhbS5yZWFkKGJ5dGVIb2xkZXIsIG9mZnNldCwgbGVuZ3RoKTsKKwkJCQlpZiAocmVjZWl2ZWRCeXRlcyA+IDApIHsKKwkJCQkJU3lzdGVtLmFycmF5Y29weShieXRlSG9sZGVyLnZhbHVlLCAwLCBidWZmZXIsIDAsIHJlY2VpdmVkQnl0ZXMpOworCQkJCX0KKwkJCQlyZXR1cm4gcmVjZWl2ZWRCeXRlczsKKwkJCX0gY2F0Y2ggKENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmV0cmlldmUgYnl0ZXMgZnJvbSBDT1JCQSBpbnB1dCBzdHJlYW0gZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7CisJCQl9IGNhdGNoIChDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNsb3NlIENPUkJBIGlucHV0IHN0cmVhbSBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCQl9IGZpbmFsbHkgeworCQkJCWlucHV0U3RyZWFtLl9yZWxlYXNlKCk7CisJCQl9CisJCX0KKworCX0KKworCS8vIHJlbW90ZWx5IGNvbnN1bWFibGUgbG9jYWwgaW5wdXQgc3RyZWFtCisJLyoqCisJICogQSBzaW1wbGUge0BsaW5rIElucHV0U3RyZWFtSUZ9IGFkYXB0ZXIgaW1wbGVtZW50YXRpb24gZm9yIGFuCisJICoge0BsaW5rIElucHV0U3RyZWFtfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDT1JCQUlucHV0U3RyZWFtQWRhcHRlciBleHRlbmRzIElucHV0U3RyZWFtSUZQT0EgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKworCQlwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCQlwcml2YXRlIGZpbmFsIGxvbmcgbGVuZ3RoOworCisJCXByaXZhdGUgZmluYWwgYnl0ZVtdIG9iamVjdElEOworCQlwcml2YXRlIGZpbmFsIFBPQSBwb2E7CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gb3JiICAgICAgICAgVXNlZCB0byBhY2Nlc3MgdGhlIHJvb3Qge0BsaW5rIFBPQX0gdG8gYWN0aXZhdGUgdGhpcyBDT1JCQQorCQkgKiAgICAgICAgICAgICAgICAgICAgc2VydmljZSBvYmplY3QuCisJCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSBUaGUgd3JhcHBlZCB7QGxpbmsgSW5wdXRTdHJlYW19LgorCQkgKiBAcGFyYW0gbGVuZ3RoICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgd3JhcHBlZCB7QGNvZGUgSW5wdXRTdHJlYW19LgorCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBvbiBlcnJvcnMuCisJCSAqLworCQlwcml2YXRlIENPUkJBSW5wdXRTdHJlYW1BZGFwdGVyKE9SQiBvcmIsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBsb25nIGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKwkJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOworCisJCQl0cnkgeworCQkJCXBvYSA9IFBPQUhlbHBlci5uYXJyb3cob3JiLnJlc29sdmVfaW5pdGlhbF9yZWZlcmVuY2VzKCJSb290UE9BIikpOworCQkJCXBvYS50aGVfUE9BTWFuYWdlcigpLmFjdGl2YXRlKCk7CisJCQkJb2JqZWN0SUQgPSBwb2EuYWN0aXZhdGVfb2JqZWN0KHRoaXMpOworCQkJfSBjYXRjaCAoQWRhcHRlckluYWN0aXZlIHwgSW52YWxpZE5hbWUgfCBTZXJ2YW50QWxyZWFkeUFjdGl2ZSB8IFdyb25nUG9saWN5IGUpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byBjcmVhdGUgQ09SQkEgaW5wdXQgc3RyZWFtLiIsIGUpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IHJlYWQoRFNfQllURUhvbGRlciBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIHsKKwkJCWIudmFsdWUgPSBuZXcgYnl0ZVtsZW5dOworCisJCQl0cnkgeworCQkJCXJldHVybiBpbnB1dFN0cmVhbS5yZWFkKGIudmFsdWUsIG9mZiwgbGVuKTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uKEVycm9yQ29kZS5GSUxFU0VSVkVSX0lPX0VYQ0VQVElPTiwgU2V2ZXJpdHlGbGFnLkVSUk9SLAorCQkJCQkJZS5nZXRNZXNzYWdlKCkpOworCQkJfQorCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24geworCQkJdHJ5IHsKKwkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOworCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCXRocm93IG5ldyBDT1JCQUZpbGVTZXJ2ZXJFeGNlcHRpb24oRXJyb3JDb2RlLkZJTEVTRVJWRVJfSU9fRVhDRVBUSU9OLCBTZXZlcml0eUZsYWcuRVJST1IsCisJCQkJCQllLmdldE1lc3NhZ2UoKSk7CisJCQl9IGZpbmFsbHkgeworCQkJCXRyeSB7CisJCQkJCXBvYS5kZWFjdGl2YXRlX29iamVjdChvYmplY3RJRCk7CisJCQkJfSBjYXRjaCAoT2JqZWN0Tm90QWN0aXZlIHwgV3JvbmdQb2xpY3kgZSkgeworCQkJCQlMT0dHRVIud2FybigiVW5hYmxlIHRvIGRlYWN0aXZlIENPUkJBIGlucHV0IHN0cmVhbSIsIGUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIGludCBsZW5ndGgoKSB0aHJvd3MgQ09SQkFGaWxlU2VydmVyRXhjZXB0aW9uIHsKKwkJCS8qCisJCQkgKiBOT1RFOiBBIGZpbGUgbGVuZ3RoIGlzIG9mIHR5cGUgbG9uZyBhbmQgdGhlcmVmb3JlLCBmb3IgdmVyeSBsYXJnZSBmaWxlcyAoPgorCQkJICogMi4xNCBHQiksIHRoZSBleGFjdCBsZW5ndGggaXMgbG9zdCBkdWUgdG8gbmFycm93aW5nIGNvbnZlcnNpb24hCisJCQkgKi8KKwkJCXJldHVybiAoaW50KSBsZW5ndGg7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbiB7CisJCQl0cnkgeworCQkJCWlucHV0U3RyZWFtLnJlc2V0KCk7CisJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IENPUkJBRmlsZVNlcnZlckV4Y2VwdGlvbihFcnJvckNvZGUuRklMRVNFUlZFUl9JT19FWENFUFRJT04sIFNldmVyaXR5RmxhZy5FUlJPUiwKKwkJCQkJCWUuZ2V0TWVzc2FnZSgpKTsKKwkJCX0KKwkJfQorCisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvQ09SQkFGaWxlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODRmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL0NPUkJBRmlsZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQ3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLmdyb3VwaW5nQnk7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5yZWR1Y2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnRpbWUuRHVyYXRpb247CitpbXBvcnQgamF2YS50aW1lLkxvY2FsVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmZpbGUuRmlsZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZUxpbms7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIENPUkJBIGZpbGUgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEZpbGVTZXJ2aWNlfSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBDT1JCQUZpbGVTZXJ2aWNlIGltcGxlbWVudHMgRmlsZVNlcnZpY2UgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDT1JCQUZpbGVTZXJ2aWNlLmNsYXNzKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUSFJFQURfUE9PTF9TSVpFID0gNTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIENPUkJBRmlsZVNlcnZlciBmaWxlU2VydmVyOworCXByaXZhdGUgZmluYWwgTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gY29udGV4dCAgVXNlZCBmb3Ige0BsaW5rIEVudGl0eX0gdG8ge0BsaW5rIEVsZW1JZH0gY29udmVyc2lvbi4KKwkgKiBAcGFyYW0gdHJhbnNmZXIgVGhlIHRyYW5zZmVyIHR5cGUgZm9yIHVwLSBhbmQgZG93bmxvYWRzLgorCSAqLworCXB1YmxpYyBDT1JCQUZpbGVTZXJ2aWNlKE9EU0NvbnRleHQgY29udGV4dCwgVHJhbnNmZXIgdHJhbnNmZXIpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oTW9kZWxNYW5hZ2VyLmNsYXNzKSk7CisKKwkJZmlsZVNlcnZlciA9IG5ldyBDT1JCQUZpbGVTZXJ2ZXIoY29udGV4dCwgdHJhbnNmZXIpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBkb3dubG9hZFNlcXVlbnRpYWwoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywKKwkJCVByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZG93bmxvYWRTZXF1ZW50aWFsKHRvRWxlbUlEKGVudGl0eSksIHRhcmdldCwgZmlsZUxpbmtzLCBwcm9ncmVzc0xpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZG93bmxvYWRTZXF1ZW50aWFsKEVsZW1JZCBlbGVtSWQsIFBhdGggdGFyZ2V0LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsCisJCQlQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxTdHJpbmcsIExpc3Q8RmlsZUxpbms+PiBncm91cHMgPSBmaWxlTGlua3Muc3RyZWFtKCkuZmlsdGVyKEZpbGVMaW5rOjppc1JlbW90ZSkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoRmlsZUxpbms6OmdldFJlbW90ZVBhdGgpKTsKKworCQlsb25nIHRvdGFsU2l6ZSA9IGNhbGN1bGF0ZURvd25sb2FkU2l6ZShlbGVtSWQsIGdyb3Vwcyk7CisJCWZpbmFsIEF0b21pY0xvbmcgdHJhbnNmZXJyZWQgPSBuZXcgQXRvbWljTG9uZygpOworCQlMb2NhbFRpbWUgc3RhcnQgPSBMb2NhbFRpbWUubm93KCk7CisJCVVVSUQgaWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKwkJTE9HR0VSLmRlYnVnKCJTZXF1ZW50aWFsIGRvd25sb2FkIG9mIHt9IGZpbGUocykgd2l0aCBpZCAne30nIHN0YXJ0ZWQuIiwgZ3JvdXBzLnNpemUoKSwgaWQpOworCQlmb3IgKExpc3Q8RmlsZUxpbms+IGdyb3VwIDogZ3JvdXBzLnZhbHVlcygpKSB7CisJCQlGaWxlTGluayBmaWxlTGluayA9IGdyb3VwLmdldCgwKTsKKworCQkJZG93bmxvYWQoZWxlbUlkLCB0YXJnZXQsIGZpbGVMaW5rLCAoYiwgcCkgLT4geworCQkJCWRvdWJsZSB0cmFuZmVycmVkQnl0ZXMgPSB0cmFuc2ZlcnJlZC5hZGRBbmRHZXQoYik7CisJCQkJaWYgKHByb2dyZXNzTGlzdGVuZXIgIT0gbnVsbCkgeworCQkJCQlwcm9ncmVzc0xpc3RlbmVyLnByb2dyZXNzKGIsIChmbG9hdCkgKHRyYW5mZXJyZWRCeXRlcyAvIHRvdGFsU2l6ZSkpOworCQkJCX0KKwkJCX0pOworCisJCQlmb3IgKEZpbGVMaW5rIG90aGVyIDogZ3JvdXAuc3ViTGlzdCgxLCBncm91cC5zaXplKCkpKSB7CisJCQkJb3RoZXIuc2V0TG9jYWxTdHJlYW0oZmlsZUxpbmsuZ2V0TG9jYWxTdHJlYW0oKSk7CisJCQl9CisJCX0KKwkJTE9HR0VSLmRlYnVnKCJTZXF1ZW50aWFsIGRvd25sb2FkIHdpdGggaWQgJ3t9JyBmaW5pc2hlZCBpbiB7fS4iLCBpZCwgRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvd25sb2FkUGFyYWxsZWwoRW50aXR5IGVudGl0eSwgUGF0aCB0YXJnZXQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywKKwkJCVByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZG93bmxvYWRQYXJhbGxlbCh0b0VsZW1JRChlbnRpdHkpLCB0YXJnZXQsIGZpbGVMaW5rcywgcHJvZ3Jlc3NMaXN0ZW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRvd25sb2FkUGFyYWxsZWwoRWxlbUlkIGVsZW1JZCwgUGF0aCB0YXJnZXQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywKKwkJCVByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgTGlzdDxGaWxlTGluaz4+IGdyb3VwcyA9IGZpbGVMaW5rcy5zdHJlYW0oKS5maWx0ZXIoRmlsZUxpbms6OmlzUmVtb3RlKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShGaWxlTGluazo6Z2V0UmVtb3RlUGF0aCkpOworCisJCWxvbmcgdG90YWxTaXplID0gY2FsY3VsYXRlRG93bmxvYWRTaXplKGVsZW1JZCwgZ3JvdXBzKTsKKwkJZmluYWwgQXRvbWljTG9uZyB0cmFuc2ZlcnJlZCA9IG5ldyBBdG9taWNMb25nKCk7CisJCUxpc3Q8Q2FsbGFibGU8Vm9pZD4+IGRvd25sb2FkVGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChMaXN0PEZpbGVMaW5rPiBncm91cCA6IGdyb3Vwcy52YWx1ZXMoKSkgeworCQkJZG93bmxvYWRUYXNrcy5hZGQoKCkgLT4geworCQkJCUZpbGVMaW5rIGZpbGVMaW5rID0gZ3JvdXAuZ2V0KDApOworCisJCQkJZG93bmxvYWQoZWxlbUlkLCB0YXJnZXQsIGZpbGVMaW5rLCAoYiwgcCkgLT4geworCQkJCQlkb3VibGUgdHJhbmZlcnJlZEJ5dGVzID0gdHJhbnNmZXJyZWQuYWRkQW5kR2V0KGIpOworCQkJCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisJCQkJCQlwcm9ncmVzc0xpc3RlbmVyLnByb2dyZXNzKGIsIChmbG9hdCkgKHRyYW5mZXJyZWRCeXRlcyAvIHRvdGFsU2l6ZSkpOworCQkJCQl9CisJCQkJfSk7CisKKwkJCQlmb3IgKEZpbGVMaW5rIG90aGVyIDogZ3JvdXAuc3ViTGlzdCgxLCBncm91cC5zaXplKCkpKSB7CisJCQkJCW90aGVyLnNldExvY2FsU3RyZWFtKGZpbGVMaW5rLmdldExvY2FsU3RyZWFtKCkpOworCQkJCX0KKworCQkJCXJldHVybiBudWxsOworCQkJfSk7CisJCX0KKworCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChUSFJFQURfUE9PTF9TSVpFKTsKKwkJTG9jYWxUaW1lIHN0YXJ0ID0gTG9jYWxUaW1lLm5vdygpOworCQlVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCUxPR0dFUi5kZWJ1ZygiUGFyYWxsZWwgZG93bmxvYWQgb2Yge30gZmlsZShzKSB3aXRoIGlkICd7fScgc3RhcnRlZC4iLCBncm91cHMuc2l6ZSgpLCBpZCk7CisJCXRyeSB7CisJCQlMaXN0PFRocm93YWJsZT4gZXJyb3JzID0gZXhlY3V0b3JTZXJ2aWNlLmludm9rZUFsbChkb3dubG9hZFRhc2tzKS5zdHJlYW0oKS5tYXAoZnV0dXJlIC0+IHsKKwkJCQl0cnkgeworCQkJCQlmdXR1cmUuZ2V0KCk7CisJCQkJCXJldHVybiBudWxsOworCQkJCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCQkJTE9HR0VSLmVycm9yKCJEb3dubG9hZCBvZiBmYWlsZWQgZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQkJCQlyZXR1cm4gZTsKKwkJCQl9CisJCQl9KS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7CisJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEb3dubG9hZCBmYWlsZCBmb3IgJyIgKyBlcnJvcnMuc2l6ZSgpICsgIicgZmlsZXMuIik7CisJCQl9CisJCQlMT0dHRVIuZGVidWcoIlBhcmFsbGVsIGRvd25sb2FkIHdpdGggaWQgJ3t9JyBmaW5pc2hlZCBpbiB7fS4iLCBpZCwKKwkJCQkJRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSk7CisJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIGRvd25sb2FkIGZpbGVzIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRvd25sb2FkKEVudGl0eSBlbnRpdHksIFBhdGggdGFyZ2V0LCBGaWxlTGluayBmaWxlTGluaywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZG93bmxvYWQodG9FbGVtSUQoZW50aXR5KSwgdGFyZ2V0LCBmaWxlTGluaywgcHJvZ3Jlc3NMaXN0ZW5lcik7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRvd25sb2FkKEVsZW1JZCBlbGVtSWQsIFBhdGggdGFyZ2V0LCBGaWxlTGluayBmaWxlTGluaywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKEZpbGVzLmV4aXN0cyh0YXJnZXQpKSB7CisJCQlpZiAoIUZpbGVzLmlzRGlyZWN0b3J5KHRhcmdldCkpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUYXJnZXQgcGF0aCBpcyBub3QgYSBkaXJlY3RvcnkuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlGaWxlcy5jcmVhdGVEaXJlY3RvcnkodGFyZ2V0KTsKKwkJfQorCisJCXRyeSAoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBvcGVuU3RyZWFtKGVsZW1JZCwgZmlsZUxpbmssIHByb2dyZXNzTGlzdGVuZXIpKSB7CisJCQlQYXRoIGFic29sdXRlUGF0aCA9IHRhcmdldC5yZXNvbHZlKGZpbGVMaW5rLmdldEZpbGVOYW1lKCkpLnRvQWJzb2x1dGVQYXRoKCk7CisJCQlTdHJpbmcgcmVtb3RlUGF0aCA9IGZpbGVMaW5rLmdldFJlbW90ZVBhdGgoKTsKKwkJCUxPR0dFUi5kZWJ1ZygiU3RhcnRpbmcgZG93bmxvYWQgb2YgZmlsZSAne30nIHRvICd7fScuIiwgcmVtb3RlUGF0aCwgYWJzb2x1dGVQYXRoKTsKKwkJCUxvY2FsVGltZSBzdGFydCA9IExvY2FsVGltZS5ub3coKTsKKwkJCUZpbGVzLmNvcHkoaW5wdXRTdHJlYW0sIGFic29sdXRlUGF0aCk7CisJCQlMT0dHRVIuZGVidWcoIkZpbGUgJ3t9JyBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBpbiB7fSB0byAne30nLiIsIHJlbW90ZVBhdGgsCisJCQkJCUR1cmF0aW9uLmJldHdlZW4oc3RhcnQsIExvY2FsVGltZS5ub3coKSksIGFic29sdXRlUGF0aCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIElucHV0U3RyZWFtIG9wZW5TdHJlYW0oRW50aXR5IGVudGl0eSwgRmlsZUxpbmsgZmlsZUxpbmssIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXJldHVybiBvcGVuU3RyZWFtKHRvRWxlbUlEKGVudGl0eSksIGZpbGVMaW5rLCBwcm9ncmVzc0xpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIElucHV0U3RyZWFtIG9wZW5TdHJlYW0oRWxlbUlkIGVsZW1JZCwgRmlsZUxpbmsgZmlsZUxpbmssIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUlucHV0U3RyZWFtIHNvdXJjZVN0cmVhbTsKKwkJaWYgKGZpbGVMaW5rLmlzTG9jYWwoKSkgeworCQkJLy8gZmlsZSBpcyBsb2NhbGx5IGF2YWlsYWJsZSAtPiBVU0UgdGhpcyBzaG9ydGN1dCEKKwkJCXNvdXJjZVN0cmVhbSA9IGZpbGVMaW5rLmdldExvY2FsU3RyZWFtKCk7CisJCX0gZWxzZSBpZiAoZmlsZUxpbmsuaXNSZW1vdGUoKSkgeworCQkJc291cmNlU3RyZWFtID0gZmlsZVNlcnZlci5vcGVuU3RyZWFtKGZpbGVMaW5rLCBlbGVtSWQpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmlsZSBsaW5rIGlzIG5laXRoZXIgaW4gbG9jYWwgbm9yIHJlbW90ZSBzdGF0ZTogIiArIGZpbGVMaW5rKTsKKwkJfQorCisJCS8vIE5PVEU6IEFjY2VzcyB0byBpbW1lZGlhdGUgaW5wdXQgc3RyZWFtIGlzIGJ1ZmZlcmVkLgorCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlsb2FkU2l6ZShlbGVtSWQsIGZpbGVMaW5rKTsKKwkJCS8vIE5PVEU6IFByb2dyZXNzIHVwZGF0ZXMgaW1tZWRpYXRlbHkgdHJpZ2dlcmVkIGJ5IHRoZSBzdHJlYW0KKwkJCS8vIGNvbnN1bWVyLgorCQkJcmV0dXJuIG5ldyBUcmFjZWRJbnB1dFN0cmVhbShzb3VyY2VTdHJlYW0sIHByb2dyZXNzTGlzdGVuZXIsIGZpbGVMaW5rLmdldFNpemUoKSk7CisJCX0KKwkJcmV0dXJuIHNvdXJjZVN0cmVhbTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgbG9hZFNpemUoRW50aXR5IGVudGl0eSwgRmlsZUxpbmsgZmlsZUxpbmspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWxvYWRTaXplKHRvRWxlbUlEKGVudGl0eSksIGZpbGVMaW5rKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgbG9hZFNpemUoRWxlbUlkIGVsZW1JZCwgRmlsZUxpbmsgZmlsZUxpbmspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChmaWxlTGluay5nZXRTaXplKCkgPiAtMSkgeworCQkJLy8gZmlsZSBzaXplIGlzIGFscmVhZHkga25vd24KKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChmaWxlTGluay5pc1JlbW90ZSgpKSB7CisJCQlmaWxlTGluay5zZXRGaWxlU2l6ZShmaWxlU2VydmVyLmxvYWRTaXplKGZpbGVMaW5rLCBlbGVtSWQpKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpbGUgbGluayBpcyBuZWl0aGVyIGluIGxvY2FsIG5vciByZW1vdGUgc3RhdGU6ICIgKyBmaWxlTGluayk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgdXBsb2FkU2VxdWVudGlhbChFbnRpdHkgZW50aXR5LCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXVwbG9hZFNlcXVlbnRpYWwodG9FbGVtSUQoZW50aXR5KSwgZmlsZUxpbmtzLCBwcm9ncmVzc0xpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBsb2FkU2VxdWVudGlhbChFbGVtSWQgZWxlbUlkLCBDb2xsZWN0aW9uPEZpbGVMaW5rPiBmaWxlTGlua3MsIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCU1hcDxJbnB1dFN0cmVhbSwgTGlzdDxGaWxlTGluaz4+IGdyb3VwcyA9IGZpbGVMaW5rcy5zdHJlYW0oKS5maWx0ZXIoRmlsZUxpbms6OmlzTG9jYWwpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KEZpbGVMaW5rOjpnZXRMb2NhbFN0cmVhbSkpOworCisJCWxvbmcgdG90YWxTaXplID0gZ3JvdXBzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChsIC0+IGwuZ2V0KDApKS5tYXBUb0xvbmcoRmlsZUxpbms6OmdldFNpemUpLnN1bSgpOworCQlmaW5hbCBBdG9taWNMb25nIHRyYW5zZmVycmVkID0gbmV3IEF0b21pY0xvbmcoKTsKKwkJTG9jYWxUaW1lIHN0YXJ0ID0gTG9jYWxUaW1lLm5vdygpOworCQlVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCUxPR0dFUi5kZWJ1ZygiU2VxdWVudGlhbCB1cGxvYWQgb2Yge30gZmlsZShzKSB3aXRoIGlkICd7fScgc3RhcnRlZC4iLCBncm91cHMuc2l6ZSgpLCBpZCk7CisJCWZvciAoTGlzdDxGaWxlTGluaz4gZ3JvdXAgOiBncm91cHMudmFsdWVzKCkpIHsKKwkJCUZpbGVMaW5rIGZpbGVMaW5rID0gZ3JvdXAuZ2V0KDApOworCisJCQl1cGxvYWQoZWxlbUlkLCBmaWxlTGluaywgKGIsIHApIC0+IHsKKwkJCQlkb3VibGUgdHJhbmZlcnJlZEJ5dGVzID0gdHJhbnNmZXJyZWQuYWRkQW5kR2V0KGIpOworCQkJCWlmIChwcm9ncmVzc0xpc3RlbmVyICE9IG51bGwpIHsKKwkJCQkJcHJvZ3Jlc3NMaXN0ZW5lci5wcm9ncmVzcyhiLCAoZmxvYXQpICh0cmFuZmVycmVkQnl0ZXMgLyB0b3RhbFNpemUpKTsKKwkJCQl9CisJCQl9KTsKKworCQkJZm9yIChGaWxlTGluayBvdGhlciA6IGdyb3VwLnN1Ykxpc3QoMSwgZ3JvdXAuc2l6ZSgpKSkgeworCQkJCW90aGVyLnNldFJlbW90ZVBhdGgoZmlsZUxpbmsuZ2V0UmVtb3RlUGF0aCgpKTsKKwkJCX0KKwkJfQorCQlMT0dHRVIuZGVidWcoIlNlcXVlbnRpYWwgdXBsb2FkIHdpdGggaWQgJ3t9JyBmaW5pc2hlZCBpbiB7fS4iLCBpZCwgRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHVwbG9hZFBhcmFsbGVsKEVudGl0eSBlbnRpdHksIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdXBsb2FkUGFyYWxsZWwodG9FbGVtSUQoZW50aXR5KSwgZmlsZUxpbmtzLCBwcm9ncmVzc0xpc3RlbmVyKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBsb2FkUGFyYWxsZWwoRWxlbUlkIGVsZW1JZCwgQ29sbGVjdGlvbjxGaWxlTGluaz4gZmlsZUxpbmtzLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8SW5wdXRTdHJlYW0sIExpc3Q8RmlsZUxpbms+PiBncm91cHMgPSBmaWxlTGlua3Muc3RyZWFtKCkuZmlsdGVyKEZpbGVMaW5rOjppc0xvY2FsKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShGaWxlTGluazo6Z2V0TG9jYWxTdHJlYW0pKTsKKworCQlsb25nIHRvdGFsU2l6ZSA9IGdyb3Vwcy52YWx1ZXMoKS5zdHJlYW0oKS5tYXAobCAtPiBsLmdldCgwKSkubWFwVG9Mb25nKEZpbGVMaW5rOjpnZXRTaXplKS5zdW0oKTsKKwkJZmluYWwgQXRvbWljTG9uZyB0cmFuc2ZlcnJlZCA9IG5ldyBBdG9taWNMb25nKCk7CisJCUxpc3Q8Q2FsbGFibGU8Vm9pZD4+IGRvd25sb2FkVGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChMaXN0PEZpbGVMaW5rPiBncm91cCA6IGdyb3Vwcy52YWx1ZXMoKSkgeworCQkJZG93bmxvYWRUYXNrcy5hZGQoKCkgLT4geworCQkJCUZpbGVMaW5rIGZpbGVMaW5rID0gZ3JvdXAuZ2V0KDApOworCisJCQkJdXBsb2FkKGVsZW1JZCwgZmlsZUxpbmssIChiLCBwKSAtPiB7CisJCQkJCWRvdWJsZSB0cmFuZmVycmVkQnl0ZXMgPSB0cmFuc2ZlcnJlZC5hZGRBbmRHZXQoYik7CisJCQkJCWlmIChwcm9ncmVzc0xpc3RlbmVyICE9IG51bGwpIHsKKwkJCQkJCXByb2dyZXNzTGlzdGVuZXIucHJvZ3Jlc3MoYiwgKGZsb2F0KSAodHJhbmZlcnJlZEJ5dGVzIC8gdG90YWxTaXplKSk7CisJCQkJCX0KKwkJCQl9KTsKKworCQkJCWZvciAoRmlsZUxpbmsgb3RoZXIgOiBncm91cC5zdWJMaXN0KDEsIGdyb3VwLnNpemUoKSkpIHsKKwkJCQkJb3RoZXIuc2V0UmVtb3RlUGF0aChmaWxlTGluay5nZXRSZW1vdGVQYXRoKCkpOworCQkJCX0KKworCQkJCXJldHVybiBudWxsOworCQkJfSk7CisJCX0KKworCQlFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChUSFJFQURfUE9PTF9TSVpFKTsKKwkJTG9jYWxUaW1lIHN0YXJ0ID0gTG9jYWxUaW1lLm5vdygpOworCQlVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisJCUxPR0dFUi5kZWJ1ZygiUGFyYWxsZWwgdXBsb2FkIG9mIHt9IGZpbGUocykgd2l0aCBpZCAne30nIHN0YXJ0ZWQuIiwgZ3JvdXBzLnNpemUoKSwgaWQpOworCQl0cnkgeworCQkJTGlzdDxUaHJvd2FibGU+IGVycm9ycyA9IGV4ZWN1dG9yU2VydmljZS5pbnZva2VBbGwoZG93bmxvYWRUYXNrcykuc3RyZWFtKCkubWFwKGZ1dHVyZSAtPiB7CisJCQkJdHJ5IHsKKwkJCQkJZnV0dXJlLmdldCgpOworCQkJCQlyZXR1cm4gbnVsbDsKKwkJCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQkJCUxPR0dFUi5lcnJvcigiVXBsb2FkIG9mIGZhaWxlZCBkdWUgdG86ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQkJCXJldHVybiBlOworCQkJCX0KKwkJCX0pLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisJCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVwbG9hZCBmYWlsZCBmb3IgJyIgKyBlcnJvcnMuc2l6ZSgpICsgIicgZmlsZXMuIik7CisJCQl9CisJCQlMT0dHRVIuZGVidWcoIlBhcmFsbGVsIHVwbG9hZCB3aXRoIGlkICd7fScgZmluaXNoZWQgaW4ge30uIiwgaWQsIER1cmF0aW9uLmJldHdlZW4oc3RhcnQsIExvY2FsVGltZS5ub3coKSkpOworCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byB1cGxvYWQgZmlsZXMgZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9IGZpbmFsbHkgeworCQkJZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVsZXRlKEVudGl0eSBlbnRpdHksIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcykgeworCQlkZWxldGUodG9FbGVtSUQoZW50aXR5KSwgZmlsZUxpbmtzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZGVsZXRlKEVsZW1JZCBlbGVtSWQsIENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcykgeworCQlmaWxlTGlua3Muc3RyZWFtKCkuZmlsdGVyKEZpbGVMaW5rOjppc1JlbW90ZSkKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KEZpbGVMaW5rOjpnZXRSZW1vdGVQYXRoLCByZWR1Y2luZygoZmwxLCBmbDIpIC0+IGZsMSkpKS52YWx1ZXMoKS5zdHJlYW0oKQorCQkJCS5maWx0ZXIoT3B0aW9uYWw6OmlzUHJlc2VudCkubWFwKE9wdGlvbmFsOjpnZXQpLmZvckVhY2goZmwgLT4gZGVsZXRlKGVsZW1JZCwgZmwpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGVsZXRlKEVudGl0eSBlbnRpdHksIEZpbGVMaW5rIGZpbGVMaW5rKSB7CisJCWRlbGV0ZSh0b0VsZW1JRChlbnRpdHkpLCBmaWxlTGluayk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZShFbGVtSWQgZWxlbUlkLCBGaWxlTGluayBmaWxlTGluaykgeworCQlpZiAoIWZpbGVMaW5rLmlzUmVtb3RlKCkpIHsKKwkJCS8vIG5vdGhpbmcgdG8gZG8KKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlmaWxlU2VydmVyLmRlbGV0ZShmaWxlTGluaywgZWxlbUlkKTsKKwkJCUxPR0dFUi5kZWJ1ZygiRmlsZSAne30nIHN1Y2Vzc2Z1bGx5IGRlbGV0ZWQuIiwgZmlsZUxpbmsuZ2V0UmVtb3RlUGF0aCgpKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLndhcm4oIkZhaWxlZCB0byBkZWxldGUgcmVtb3RlIGZpbGUuIiwgZSk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQorCS8qKgorCSAqIFVwbG9hZHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfS4gVGhlIHVwbG9hZCBwcm9ncmVzcyBtYXkgYmUgdHJhY2VkIHdpdGggYQorCSAqIHByb2dyZXNzIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIGVsZW1JZCAgICAgICAgICAgVXNlZCBmb3Igc2VjdXJpdHkgY2hlY2tzLgorCSAqIEBwYXJhbSBmaWxlTGluayAgICAgICAgIFRoZSB7QGNvZGUgRmlsZUxpbmt9IHRvIHVwbG9hZC4KKwkgKiBAcGFyYW0gcHJvZ3Jlc3NMaXN0ZW5lciBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBmaWxlLgorCSAqLworCXByaXZhdGUgdm9pZCB1cGxvYWQoRWxlbUlkIGVsZW1JZCwgRmlsZUxpbmsgZmlsZUxpbmssIFByb2dyZXNzTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaWYgKGZpbGVMaW5rLmlzUmVtb3RlKCkpIHsKKwkJCS8vIG5vdGhpbmcgdG8gZG8KKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmICghZmlsZUxpbmsuaXNMb2NhbCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWxlIGxpbmsgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHBhdGguIik7CisJCX0KKworCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBmaWxlTGluay5nZXRMb2NhbFN0cmVhbSgpOworCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7CisJCQlzb3VyY2VTdHJlYW0gPSBuZXcgVHJhY2VkSW5wdXRTdHJlYW0oc291cmNlU3RyZWFtLCBwcm9ncmVzc0xpc3RlbmVyLCBmaWxlTGluay5nZXRTaXplKCkpOworCQl9CisKKwkJTE9HR0VSLmRlYnVnKCJTdGFydGluZyB1cGxvYWQgb2YgZmlsZSAne30nLiIsIGZpbGVMaW5rLmdldEZpbGVOYW1lKCkpOworCQlMb2NhbFRpbWUgc3RhcnQgPSBMb2NhbFRpbWUubm93KCk7CisJCWZpbGVTZXJ2ZXIudXBsb2FkU3RyZWFtKHNvdXJjZVN0cmVhbSwgZmlsZUxpbmssIGVsZW1JZCk7CisJCUxPR0dFUi5kZWJ1ZygiRmlsZSAne30nIHN1Y2Nlc3NmdWxseSB1cGxvYWRlZCBpbiB7fSB0byAne30nLiIsIGZpbGVMaW5rLmdldEZpbGVOYW1lKCksCisJCQkJRHVyYXRpb24uYmV0d2VlbihzdGFydCwgTG9jYWxUaW1lLm5vdygpKSwgZmlsZUxpbmsuZ2V0UmVtb3RlUGF0aCgpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIE9EUyBlbnRpdHkgaWRlbnRpdHkge0BsaW5rIEVsZW1JZH0gb2JqZWN0IGZvciBnaXZlbgorCSAqIHtAbGluayBFbnRpdHl9LgorCSAqCisJICogQHBhcmFtIGVudGl0eSBUaGUge0Bjb2RlIEVudGl0eX0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgRWxlbUlkfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIEVsZW1JZCB0b0VsZW1JRChFbnRpdHkgZW50aXR5KSB7CisJCXJldHVybiBuZXcgRWxlbUlkKCgoT0RTRW50aXR5VHlwZSkgbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoZW50aXR5KSkuZ2V0T0RTSUQoKSwKKwkJCQlPRFNDb252ZXJ0ZXIudG9PRFNJRChlbnRpdHkuZ2V0SUQoKSkpOworCX0KKworCS8qKgorCSAqIENhbGN1bGF0ZXMgdGhlIHRvdGFsIGRvd25sb2FkIHNpemUgZm9yIGdpdmVuIHtAbGluayBGaWxlTGlua30gZ3JvdXBzLgorCSAqCisJICogQHBhcmFtIGVudGl0eSBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIGdyb3VwcyBUaGUge0Bjb2RlIEZpbGVMaW5rfSBncm91cHMuCisJICogQHJldHVybiBUaGUgdG90YWwgZG93bmxvYWQgc2l6ZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCB0aGUgZmlsZSBzaXplLgorCSAqLworCXByaXZhdGUgbG9uZyBjYWxjdWxhdGVEb3dubG9hZFNpemUoRWxlbUlkIGVsZW1JZCwgTWFwPFN0cmluZywgTGlzdDxGaWxlTGluaz4+IGdyb3VwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJTGlzdDxGaWxlTGluaz4gbGlua3MgPSBncm91cHMudmFsdWVzKCkuc3RyZWFtKCkubWFwKGwgLT4gbC5nZXQoMCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCWxvbmcgdG90YWxTaXplID0gMDsKKwkJZm9yIChGaWxlTGluayBmaWxlTGluayA6IGxpbmtzKSB7CisJCQlsb2FkU2l6ZShlbGVtSWQsIGZpbGVMaW5rKTsKKwkJCS8vIG92ZXJmbG93IG1heSBvY2N1ciBpbiBjYXNlIG9mIHRvdGFsIHNpemUgZXhjZWVkcyA5MjIzIFBCIQorCQkJdG90YWxTaXplID0gTWF0aC5hZGRFeGFjdCh0b3RhbFNpemUsIGZpbGVMaW5rLmdldFNpemUoKSk7CisJCX0KKworCQlyZXR1cm4gdG90YWxTaXplOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2ZpbGV0cmFuc2Zlci9UcmFjZWRJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2ZpbGV0cmFuc2Zlci9UcmFjZWRJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzQxODQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvZmlsZXRyYW5zZmVyL1RyYWNlZElucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuZmlsZS5GaWxlU2VydmljZS5Qcm9ncmVzc0xpc3RlbmVyOworCisvKioKKyAqIFRoaXMgaXMgYW4ge0BsaW5rIElucHV0U3RyZWFtfSB3cmFwcGVyIGltcGxlbWVudGF0aW9uIHRvIHRyYWNlIHRoZSBwcm9ncmVzcworICogb2YgYW4ge0Bjb2RlIElucHV0U3RyZWFtfS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgVHJhY2VkSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXI7CisJcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKKwlwcml2YXRlIGZpbmFsIGxvbmcgc2l6ZTsKKworCXByaXZhdGUgZG91YmxlIHRyYW5zZmVycmVkID0gMDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSAgICAgIFRoZSB0cmFjZWQge0BsaW5rIElucHV0U3RyZWFtfS4KKwkgKiBAcGFyYW0gcHJvZ3Jlc3NMaXN0ZW5lciBUaGUgbGlzdGVuZXIgd2lsbCBiZSB1c2VkIHRvIGZpcmUgdXBkYXRlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9ucy4KKwkgKiBAcGFyYW0gbGVuZ3RoICAgICAgICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBjb25zdW1lZCB7QGNvZGUgSW5wdXRTdHJlYW19LgorCSAqLworCVRyYWNlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIsIGxvbmcgbGVuZ3RoKSB7CisJCXRoaXMucHJvZ3Jlc3NMaXN0ZW5lciA9IHByb2dyZXNzTGlzdGVuZXI7CisJCXRoaXMuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKKwkJc2l6ZSA9IGxlbmd0aDsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGlucHV0U3RyZWFtLnJlYWQoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCByZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWludCByZWFkID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIsIG9mZnNldCwgbGVuZ3RoKTsKKwkJaWYgKHJlYWQgPiAtMSkgeworCQkJdHJhbnNmZXJyZWQgKz0gcmVhZDsKKwkJCXByb2dyZXNzTGlzdGVuZXIucHJvZ3Jlc3MocmVhZCwgKGZsb2F0KSAodHJhbnNmZXJyZWQgLyBzaXplKSk7CisJCX0KKwkJcmV0dXJuIHJlYWQ7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvVHJhbnNmZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9maWxldHJhbnNmZXIvVHJhbnNmZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU4NTUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2ZpbGV0cmFuc2Zlci9UcmFuc2Zlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuZmlsZXRyYW5zZmVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBUcmFuc2ZlciB0eXBlIGVudW1lcmF0aW9uLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZW51bSBUcmFuc2ZlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gRW51bSBjb25zdGFudHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBTaW1wbGUge0BsaW5rIElucHV0U3RyZWFtfXMgYXJlIHVzZWQgZm9yIHVwLSBhbmQgZG93bmxvYWRzLgorCSAqLworCVNUUkVBTSwKKworCS8qKgorCSAqIFNvY2tldCB7QGxpbmsgSW5wdXRTdHJlYW19cyBhcmUgdXNlZCBmb3IgdXAtIGFuZCBkb3dubG9hZHMuCisJICovCisJU09DS0VUOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyB0cmFuc2ZlciBpcyB7QGxpbmsgI1NUUkVBTX0uCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgaW5zdGFuY2UgaXMge0BsaW5rICNTVFJFQU19LgorCSAqLworCWJvb2xlYW4gaXNTdHJlYW0oKSB7CisJCXJldHVybiBTVFJFQU0gPT0gdGhpczsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIHRyYW5zZmVyIGlzIHtAbGluayAjU09DS0VUfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSBpcyB7QGxpbmsgI1NPQ0tFVH0uCisJICovCisJYm9vbGVhbiBpc1NvY2tldCgpIHsKKwkJcmV0dXJuIFNPQ0tFVCA9PSB0aGlzOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTI2NGIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9DYWNoZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKKworLyoqCisgKiBVc2VkIHRvIHRlbXBvcmFyaWx5IGNhY2hlIHtAbGluayBFbnRpdHlSZXN1bHR9cyBmb3JlIHJldXNlIGluIHN1YnNlcXVlbnQKKyAqIHtAbGluayBFbnRpdHlSZXF1ZXN0fXMuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIENhY2hlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxFbnRpdHlDb25maWc8Pz4sIEVudGl0eVJlc3VsdDw/Pj4gY2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDYWNoZXMgZ2l2ZW4ge0BsaW5rIEVudGl0eVJlc3VsdH0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5UmVzdWx0IFRoZSB7QGxpbmsgRW50aXR5UmVzdWx0fS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGQoRW50aXR5UmVzdWx0PD8+IGVudGl0eVJlc3VsdCkgeworCQljYWNoZS5wdXQoZW50aXR5UmVzdWx0LnJlcXVlc3QuZW50aXR5Q29uZmlnLCBlbnRpdHlSZXN1bHQpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNhY2hlZCB7QGxpbmsgRW50aXR5UmVzdWx0fSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDb25maWcgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlSZXN1bHR9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiByZXF1ZXN0ZWQge0Bjb2RlCisJICogCQlFbnRpdHlSZXN1bHR9ICAgICAgICAgICAgbm90IGZvdW5kLgorCSAqLworCXB1YmxpYyBFbnRpdHlSZXN1bHQ8Pz4gZ2V0KEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJRW50aXR5UmVzdWx0PD8+IGVudGl0eVJlc3VsdCA9IGNhY2hlLmdldChlbnRpdHlDb25maWcpOworCQlpZiAoZW50aXR5UmVzdWx0ID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudGl0eSByZXN1bHQgbm90IGZvdW5kIik7CisJCX0KKworCQlyZXR1cm4gZW50aXR5UmVzdWx0OworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9DaGlsZFJlcXVlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvQ2hpbGRSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxYTI0YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvQ2hpbGRSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uU3RyZWFtLmNvbmNhdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbXBhcmlzb25PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKKworLyoqCisgKiBFeHRlbmRzIHtAbGluayBFbnRpdHlSZXF1ZXN0fSB0byBsb2FkIGNoaWxkcmVuIGZvciBhIGdpdmVuCisgKiB7QGxpbmsgRW50aXR5UmVxdWVzdH0uCisgKgorICogQHBhcmFtIDxUPiBUaGUgZW50aXR5IHR5cGUuCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgQ2hpbGRSZXF1ZXN0PFQgZXh0ZW5kcyBEZWxldGFibGU+IGV4dGVuZHMgRW50aXR5UmVxdWVzdDxUPiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlSZXF1ZXN0PD8+IHBhcmVudDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRSZXF1ZXN0IFRoZSBwYXJlbnQge0BsaW5rIEVudGl0eVJlcXVlc3R9LgorCSAqIEBwYXJhbSBlbnRpdHlDb25maWcgIFRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlDaGlsZFJlcXVlc3QoRW50aXR5UmVxdWVzdDw/PiBwYXJlbnRSZXF1ZXN0LCBFbnRpdHlDb25maWc8VD4gZW50aXR5Q29uZmlnKSB7CisJCXN1cGVyKHBhcmVudFJlcXVlc3QsIGVudGl0eUNvbmZpZyk7CisJCXBhcmVudCA9IHBhcmVudFJlcXVlc3Q7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgYWxsIHJlbGF0ZWQgY2hpbGQgZW50aXRpZXMuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHF1ZXJpZWQge0Bjb2RlIEVudGl0eVJlc3VsdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCBlbnRpdGllcy4KKwkgKi8KKwlwdWJsaWMgRW50aXR5UmVzdWx0PFQ+IGxvYWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWZpbHRlcmVkID0gcGFyZW50LmZpbHRlcmVkOworCisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCk7CisJCVJlbGF0aW9uIHBhcmVudFJlbGF0aW9uID0gZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKS5nZXRSZWxhdGlvbihwYXJlbnQuZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSk7CisJCVJlbGF0aW9uIHJlZmxleGl2ZVJlbGF0aW9uID0gZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkgPyBlbnRpdHlUeXBlLmdldFJlbGF0aW9uKGVudGl0eVR5cGUpIDogbnVsbDsKKworCQlRdWVyeSBxdWVyeSA9IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSgpCisJCQkJLy8gc2VsZWN0IGVudGl0eSBhdHRyaWJ1dGVzCisJCQkJLnNlbGVjdEFsbChlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpKQorCQkJCS8vIHNlbGVjdCBwYXJlbnQgZW50aXR5IElECisJCQkJLnNlbGVjdChwYXJlbnRSZWxhdGlvbi5nZXRBdHRyaWJ1dGUoKSk7CisKKwkJaWYgKGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpKSB7CisJCQlxdWVyeS5zZWxlY3QocmVmbGV4aXZlUmVsYXRpb24uZ2V0QXR0cmlidXRlKCkpOworCQkJLy8gZW50aXRpZXMgd2l0aCBjaGlsZHJlbiBoYXZlIHRvIGJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlaXIKKwkJCS8vIGNoaWxkcmVuIQorCQkJcXVlcnkub3JkZXIoZW50aXR5VHlwZS5nZXRJREF0dHJpYnV0ZSgpKTsKKwkJfQorCisJCS8vIHByZXBhcmUgcmVsYXRpb25zIHNlbGVjdCBzdGF0ZW1lbnRzCisJCUxpc3Q8UmVsYXRpb25Db25maWc+IG9wdGlvbmFsUmVsYXRpb25zID0gc2VsZWN0UmVsYXRpb25zKHF1ZXJ5LCBlbnRpdHlDb25maWcuZ2V0T3B0aW9uYWxDb25maWdzKCksIGZhbHNlKTsKKwkJTGlzdDxSZWxhdGlvbkNvbmZpZz4gbWFuZGF0b3J5UmVsYXRpb25zID0gc2VsZWN0UmVsYXRpb25zKHF1ZXJ5LCBlbnRpdHlDb25maWcuZ2V0TWFuZGF0b3J5Q29uZmlncygpLCB0cnVlKTsKKwkJTGlzdDxSZWxhdGlvbkNvbmZpZz4gaW5oZXJpdGVkUmVsYXRpb25zID0gc2VsZWN0UmVsYXRpb25zKHF1ZXJ5LCBlbnRpdHlDb25maWcuZ2V0SW5oZXJpdGVkQ29uZmlncygpLCB0cnVlKTsKKworCQkvLyBjb25maWd1cmUgZmlsdGVyCisJCUZpbHRlciBhZGp1c3RlZEZpbHRlciA9IEZpbHRlci5vcigpOworCQlpZiAoZmlsdGVyZWQpIHsKKwkJCS8vIHByZXNlcnZlIGN1cnJlbnQgY29uZGl0aW9ucworCQkJYWRqdXN0ZWRGaWx0ZXIuaWRzKHBhcmVudFJlbGF0aW9uLCBwYXJlbnQuZW50aXR5UmVzdWx0LmdldElEcygpKTsKKwkJCWlmIChlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSkgeworCQkJCS8vIGV4dGVuZCB0byByZXRyaWV2ZSBhbGwgcmVmbGV4aXZlIGNoaWxkIGNhbmRpZGF0ZXMKKwkJCQlhZGp1c3RlZEZpbHRlci5hZGQoQ29tcGFyaXNvbk9wZXJhdG9yLklTX05PVF9OVUxMLmNyZWF0ZShyZWZsZXhpdmVSZWxhdGlvbi5nZXRBdHRyaWJ1dGUoKSwgMEwpKTsKKwkJCX0KKwkJfQorCisJCS8vIGxvYWQgZW50aXRpZXMgYW5kIHByZXBhcmUgbWFwcGluZ3MgZm9yIHJlcXVpcmVkIHJlbGF0ZWQgZW50aXRpZXMKKwkJTGlzdDxFbnRpdHlSZWNvcmQ8Pz4+IHBhcmVudFJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChSZWNvcmQgcmVjb3JkIDogY29sbGVjdFJlY29yZHMocXVlcnkuZmV0Y2goYWRqdXN0ZWRGaWx0ZXIpKSkgeworCQkJT3B0aW9uYWw8U3RyaW5nPiBwYXJlbnRJRCA9IHJlY29yZC5nZXRJRChwYXJlbnRSZWxhdGlvbik7CisJCQlPcHRpb25hbDxTdHJpbmc+IHJlZmxleGl2ZVBhcmVudElEID0gT3B0aW9uYWwuZW1wdHkoKTsKKwkJCWlmIChlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSkgeworCQkJCXJlZmxleGl2ZVBhcmVudElEID0gcmVjb3JkLmdldElEKHJlZmxleGl2ZVJlbGF0aW9uKTsKKwkJCX0KKwkJCUVudGl0eVJlY29yZDxUPiBlbnRpdHlSZWNvcmQ7CisKKwkJCWlmIChwYXJlbnRJRC5pc1ByZXNlbnQoKSkgeworCQkJCUVudGl0eVJlc3VsdDw/PiBwYXJlbnRSZXN1bHQgPSBwYXJlbnQuZW50aXR5UmVzdWx0OworCQkJCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKKwkJCQlPcHRpb25hbDxFbnRpdHlSZWNvcmQ8Pz4+IHBhcmVudFJlY29yZCA9IChPcHRpb25hbCkgcGFyZW50UmVzdWx0LmdldChwYXJlbnRJRC5nZXQoKSk7CisJCQkJaWYgKCFwYXJlbnRSZWNvcmQuaXNQcmVzZW50KCkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJZW50aXR5UmVjb3JkID0gZW50aXR5UmVzdWx0LmFkZChwYXJlbnRSZWNvcmQuZ2V0KCksIHJlY29yZCk7CisJCQkJcGFyZW50UmVjb3Jkcy5hZGQocGFyZW50UmVjb3JkLmdldCgpKTsKKwkJCX0gZWxzZSBpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkgJiYgcmVmbGV4aXZlUGFyZW50SUQuaXNQcmVzZW50KCkpIHsKKwkJCQlPcHRpb25hbDxFbnRpdHlSZWNvcmQ8VD4+IHBhcmVudFJlY29yZCA9IGVudGl0eVJlc3VsdC5nZXQocmVmbGV4aXZlUGFyZW50SUQuZ2V0KCkpOworCQkJCWlmICghcGFyZW50UmVjb3JkLmlzUHJlc2VudCgpKSB7CisJCQkJCS8vIHRoaXMgZW50aXR5J3MgcGFyZW50IHdhcyBub3QgbG9hZGVkIC0+IHNraXAKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8vIHJlZmxleGl2ZSBjaGlsZAorCQkJCWVudGl0eVJlY29yZCA9IGVudGl0eVJlc3VsdC5hZGQocGFyZW50UmVjb3JkLmdldCgpLCByZWNvcmQpOworCQkJCXBhcmVudFJlY29yZHMuYWRkKHBhcmVudFJlY29yZC5nZXQoKSk7CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVudGl0eSB3aXRob3V0IHBhcmVudCBmb3VuZCIpOworCQkJfQorCisJCQkvLyBjb2xsZWN0IHJlbGF0ZWQgaW5zdGFuY2UgSURzCisJCQljb25jYXQoY29uY2F0KG9wdGlvbmFsUmVsYXRpb25zLnN0cmVhbSgpLCBtYW5kYXRvcnlSZWxhdGlvbnMuc3RyZWFtKCkpLCBpbmhlcml0ZWRSZWxhdGlvbnMuc3RyZWFtKCkpCisJCQkJCS5mb3JFYWNoKHJjIC0+IHJjLmFkZChlbnRpdHlSZWNvcmQsIHJlY29yZCkpOworCQl9CisKKwkJaWYgKGVudGl0eVJlc3VsdC5pc0VtcHR5KCkpIHsKKwkJCS8vIG5vIGVudGl0aWVzIGZvdW5kIC0+IG5laXRoZXIgcmVsYXRlZCBub3IgY2hpbGQgZW50aXRpZXMgcmVxdWlyZWQKKwkJCXJldHVybiBlbnRpdHlSZXN1bHQ7CisJCX0KKworCQkvLyBsb2FkIGFuZCBtYXAgcmVsYXRlZCBlbnRpdGllcworCQlsb2FkUmVsYXRlZEVudGl0aWVzKG9wdGlvbmFsUmVsYXRpb25zKTsKKwkJbG9hZFJlbGF0ZWRFbnRpdGllcyhtYW5kYXRvcnlSZWxhdGlvbnMpOworCQlhc3NpZ25SZWxhdGVkRW50aXRpZXMoaW5oZXJpdGVkUmVsYXRpb25zKTsKKworCQkvLyBzb3J0IGNoaWxkcmVuIG9mIHBhcmVudAorCQlmb3IgKEVudGl0eVJlY29yZDw/PiBlbnRpdHlSZWNvcmQgOiBwYXJlbnRSZWNvcmRzKSB7CisJCQllbnRpdHlSZWNvcmQuY29yZS5nZXRDaGlsZHJlblN0b3JlKCkuc29ydChlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKSwgZW50aXR5Q29uZmlnLmdldENvbXBhcmF0b3IoKSk7CisJCX0KKworCQkvLyBsb2FkIGNoaWxkcmVuCisJCWZvciAoRW50aXR5Q29uZmlnPD8gZXh0ZW5kcyBEZWxldGFibGU+IGNoaWxkQ29uZmlnIDogZW50aXR5Q29uZmlnLmdldENoaWxkQ29uZmlncygpKSB7CisJCQljYWNoZS5hZGQobmV3IENoaWxkUmVxdWVzdDw+KHRoaXMsIGNoaWxkQ29uZmlnKS5sb2FkKCkpOworCQl9CisKKwkJcmV0dXJuIGVudGl0eVJlc3VsdDsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTWFwcyByZWxhdGVkIGVudGl0aWVzIGZvciBlYWNoIGdpdmVuIHtAbGluayBSZWxhdGlvbkNvbmZpZ30gdXNpbmcgdGhlCisJICogZW50aXRpZXMgbG9hZGVkIGluIHByZXZpb3VzIHtAbGluayBFbnRpdHlSZXF1ZXN0fS4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGlvbkNvbmZpZ3MgVGhlIHtAY29kZSBSZWxhdGlvbkNvbmZpZ31zLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgcmVsYXRlZCBlbnRpdGllcy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYXNzaWduUmVsYXRlZEVudGl0aWVzKExpc3Q8UmVsYXRpb25Db25maWc+IHJlbGF0aW9uQ29uZmlncykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlmb3IgKFJlbGF0aW9uQ29uZmlnIHJlbGF0aW9uQ29uZmlnIDogcmVsYXRpb25Db25maWdzKSB7CisJCQlFbnRpdHlDb25maWc8Pz4gcmVsYXRlZENvbmZpZyA9IHJlbGF0aW9uQ29uZmlnLmVudGl0eUNvbmZpZzsKKworCQkJYm9vbGVhbiBpc0NvbnRleHRUeXBlRGVmaW5lZCA9IGVudGl0eUNvbmZpZy5nZXRDb250ZXh0VHlwZSgpLmlzUHJlc2VudCgpOworCQkJZm9yIChFbnRpdHkgcmVsYXRlZEVudGl0eSA6IGNhY2hlLmdldChyZWxhdGVkQ29uZmlnKS5nZXRFbnRpdGllcygpKSB7CisJCQkJYm9vbGVhbiBzZXRCeUNvbnRleHRUeXBlID0gIWlzQ29udGV4dFR5cGVEZWZpbmVkICYmIHJlbGF0ZWRDb25maWcuZ2V0Q29udGV4dFR5cGUoKS5pc1ByZXNlbnQoKTsKKwkJCQlMaXN0PEVudGl0eVJlY29yZDw/Pj4gZW50aXR5UmVjb3JkcyA9IHJlbGF0aW9uQ29uZmlnLmRlcGVuZGFudHMucmVtb3ZlKHJlbGF0ZWRFbnRpdHkuZ2V0SUQoKSk7CisJCQkJZW50aXR5UmVjb3JkcyA9IGVudGl0eVJlY29yZHMgPT0gbnVsbCA/IG5ldyBBcnJheUxpc3Q8RW50aXR5UmVjb3JkPD8+PigpIDogZW50aXR5UmVjb3JkczsKKwkJCQlmb3IgKEVudGl0eVJlY29yZDw/PiBlbnRpdHlSZWNvcmQgOiBlbnRpdHlSZWNvcmRzKSB7CisJCQkJCXNldFJlbGF0ZWRFbnRpdHkoZW50aXR5UmVjb3JkLCByZWxhdGVkRW50aXR5LAorCQkJCQkJCXNldEJ5Q29udGV4dFR5cGUgPyByZWxhdGVkQ29uZmlnLmdldENvbnRleHRUeXBlKCkuZ2V0KCkgOiBudWxsKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghcmVsYXRpb25Db25maWcuZGVwZW5kYW50cy5pc0VtcHR5KCkpIHsKKwkJCQkvLyB0aGlzIG1heSBvY2N1ciBpZiB0aGUgaW5zdGFuY2UgaWQgb2YgdGhlIHJlbGF0ZWQgZW50aXR5CisJCQkJLy8gaXMgZGVmaW5lZCwgYnV0IHRoZSBlbnRpdHkgaXRzZWxmIGRvZXMgbm90IGV4aXN0CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGxvYWQgcmVsYXRlZCBlbnRpdGllcy4iKTsKKwkJCX0KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvRW50aXR5TG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjN2EzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworCisvKioKKyAqIExvYWRzIGNvbXBsZXRlIHtAbGluayBFbnRpdHl9cyBieSB1c2luZyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gaWRlbnRpZmllZAorICogYnkgZ2l2ZW4ge0BsaW5rIEtleX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlMb2FkZXIgeworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXI7CisJcHJpdmF0ZSBmaW5hbCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVGhlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9LgorCSAqLworCXB1YmxpYyBFbnRpdHlMb2FkZXIoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSkgeworCQl0aGlzLm1vZGVsTWFuYWdlciA9IG1vZGVsTWFuYWdlcjsKKwkJdGhpcy5xdWVyeVNlcnZpY2UgPSBxdWVyeVNlcnZpY2U7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgdGhlIGVudGl0eSB3aXRoIGdpdmVuIGluc3RhbmNlIElELgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgICAgICAgIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZW50aXR5IGNvbmZpZ3VyYXRpb24uCisJICogQHBhcmFtIGluc3RhbmNlSUQgVGhlIGluc3RhbmNlIElELgorCSAqIEByZXR1cm4gVGhlIHF1ZXJpZWQge0Bjb2RlIEVudGl0eX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCBlbnRpdGllcy4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgbG9hZChLZXk8VD4ga2V5LCBTdHJpbmcgaW5zdGFuY2VJRCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PFQ+IGVudGl0aWVzID0gbG9hZEFsbChrZXksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoaW5zdGFuY2VJRCkpOworCQlpZiAoZW50aXRpZXMuc2l6ZSgpICE9IDEpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9hZCBlbnRpdHkgYnkgaW5zdGFuY2UgSUQuIik7CisJCX0KKwkJcmV0dXJuIGVudGl0aWVzLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyBhbGwgZW50aXRpZXMgbWF0Y2hpbmcgZ2l2ZW4gbmFtZSBwYXR0ZXJuLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgICAgIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZW50aXR5IGNvbmZpZ3VyYXRpb24uCisJICogQHBhcmFtIHBhdHRlcm4gSXMgYWx3YXlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBtYXkgY29udGFpbiB3aWxkY2FyZCBjaGFyYWN0ZXJzCisJICogICAgICAgICAgICAgICAgYXMgZm9sbG93czogIj8iIGZvciBvbmUgbWF0Y2hpbmcgY2hhcmFjdGVyIGFuZCAiKiIgZm9yIGEKKwkgKiAgICAgICAgICAgICAgICBzZXF1ZW5jZSBvZiBtYXRjaGluZyBjaGFyYWN0ZXJzLgorCSAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gd2l0aCBxdWVyaWVkIGVudGl0aWVzIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgZW50aXRpZXMuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRBbGwoS2V5PFQ+IGtleSwgU3RyaW5nIHBhdHRlcm4pIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZVJlcXVlc3Qoa2V5KS5sb2FkQWxsKHBhdHRlcm4pOworCX0KKworCS8qKgorCSAqIExvYWRzIGFsbCBlbnRpdGllcyBtYXRjaGluZyBnaXZlbiBpbnN0YW5jZSBJRHMuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgICAgICAgICBVc2VkIHRvIHJlc29sdmUgdGhlIGVudGl0eSBjb25maWd1cmF0aW9uLgorCSAqIEBwYXJhbSBpbnN0YW5jZUlEcyBUaGUgaW5zdGFuY2UgSURzLgorCSAqIEByZXR1cm4gQSB7QGxpbmsgTGlzdH0gd2l0aCBxdWVyaWVkIGVudGl0aWVzIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgZW50aXRpZXMuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGxvYWRBbGwoS2V5PFQ+IGtleSwgQ29sbGVjdGlvbjxTdHJpbmc+IGluc3RhbmNlSURzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBjcmVhdGVSZXF1ZXN0KGtleSkubG9hZEFsbChpbnN0YW5jZUlEcyk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEVudGl0eVJlcXVlc3R9IGZvciBnaXZlbiB7QGxpbmsgS2V5fS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCB0byByZXNvbHZlIHRoZSBlbnRpdHkgY29uZmlndXJhdGlvbi4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBFbnRpdHlSZXF1ZXN0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlSZXF1ZXN0PFQ+IGNyZWF0ZVJlcXVlc3QoS2V5PFQ+IGtleSkgeworCQkvKgorCQkgKiBUT0RPOiBhZGQgY3VzdG9tIHJlcXVlc3QgaW1wbGVtZW50YXRpb25zIGhlcmUhCisJCSAqLworCQlyZXR1cm4gbmV3IEVudGl0eVJlcXVlc3Q8Pihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwga2V5KTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvRW50aXR5UmVjb3JkLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlY29yZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOGU4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlY29yZC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMjAgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gZ3JvdXAge0BsaW5rIEVudGl0eX0gYW5kIGl0cyB7QGxpbmsgQ29yZX0uCisgKgorICogQHBhcmFtIDxUPiBUaGUgZW50aXR5IHR5cGUuCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudGl0eVJlY29yZDxUIGV4dGVuZHMgRW50aXR5PiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJZmluYWwgQ29yZSBjb3JlOworCWZpbmFsIFQgZW50aXR5OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGVudGl0eSBUaGUge0BsaW5rIEVudGl0eX0uCisJICogQHBhcmFtIGNvcmUgICBUaGUge0BsaW5rIENvcmV9IG9mIHRoZSB7QGNvZGUgRW50aXR5fS4KKwkgKi8KKwlFbnRpdHlSZWNvcmQoVCBlbnRpdHksIENvcmUgY29yZSkgeworCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKKwkJdGhpcy5jb3JlID0gY29yZTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiAKKwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiAiRW50aXR5UmVjb3JkIFtjb3JlPSIgKyBjb3JlICsgIiwgZW50aXR5PSIgKyBlbnRpdHkgKyAiXSI7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlcXVlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvRW50aXR5UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2N2RhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDMzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXA7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFNlbnNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Db21wYXJpc29uT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVjb3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZy5LZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKKworLyoqCisgKiBSZWN1cnNpdmVseSBsb2FkcyBlbnRpdGllcyBmb3IgYSBnaXZlbiB7QGxpbmsgRW50aXR5Q29uZmlnfSB3aXRoIGFsbCByZXNvbHZlZAorICogZGVwZW5kZW5jaWVzIChvcHRpb25hbCwgbWFuZGF0b3J5IGNoaWxkcmVuKS4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoZSBlbnRpdHkgdHlwZS4KKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgY2xhc3MgRW50aXR5UmVxdWVzdDxUIGV4dGVuZHMgRW50aXR5PiB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG9kc01vZGVsTWFuYWdlcjsKKwlmaW5hbCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCWZpbmFsIEVudGl0eUNvbmZpZzxUPiBlbnRpdHlDb25maWc7CisJZmluYWwgRW50aXR5UmVzdWx0PFQ+IGVudGl0eVJlc3VsdCA9IG5ldyBFbnRpdHlSZXN1bHQ8Pih0aGlzKTsKKworCWZpbmFsIENhY2hlIGNhY2hlOworCisJYm9vbGVhbiBmaWx0ZXJlZDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVGhlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9LgorCSAqIEBwYXJhbSBjb25maWcgICAgICAgVGhlIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqLworCXB1YmxpYyBFbnRpdHlSZXF1ZXN0KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIEtleTxUPiBrZXkpIHsKKwkJdGhpcy5vZHNNb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlOworCQl0aGlzLmVudGl0eUNvbmZpZyA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlDb25maWcoa2V5KTsKKwkJY2FjaGUgPSBuZXcgQ2FjaGUoKTsKKwl9CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBwYXJlbnRSZXF1ZXN0IFRoZSBwYXJlbnQge0BsaW5rIEVudGl0eVJlcXVlc3R9LgorCSAqIEBwYXJhbSBlbnRpdHlDb25maWcgIFRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlwcm90ZWN0ZWQgRW50aXR5UmVxdWVzdChFbnRpdHlSZXF1ZXN0PD8+IHBhcmVudFJlcXVlc3QsIEVudGl0eUNvbmZpZzxUPiBlbnRpdHlDb25maWcpIHsKKwkJb2RzTW9kZWxNYW5hZ2VyID0gcGFyZW50UmVxdWVzdC5vZHNNb2RlbE1hbmFnZXI7CisJCXF1ZXJ5U2VydmljZSA9IHBhcmVudFJlcXVlc3QucXVlcnlTZXJ2aWNlOworCQljYWNoZSA9IHBhcmVudFJlcXVlc3QuY2FjaGU7CisJCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIExvYWRzIGFsbCBlbnRpdGllcyBtYXRjaGluZyBnaXZlbiBuYW1lIHBhdHRlcm4uCisJICoKKwkgKiBAcGFyYW0gcGF0dGVybiBJcyBhbHdheXMgY2FzZSBzZW5zaXRpdmUgYW5kIG1heSBjb250YWluIHdpbGRjYXJkIGNoYXJhY3RlcnMKKwkgKiAgICAgICAgICAgICAgICBhcyBmb2xsb3dzOiAiPyIgZm9yIG9uZSBtYXRjaGluZyBjaGFyYWN0ZXIgYW5kICIqIiBmb3IgYQorCSAqICAgICAgICAgICAgICAgIHNlcXVlbmNlIG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMuCisJICogQHJldHVybiBBIHNvcnRlZCB7QGxpbmsgTGlzdH0gd2l0aCBxdWVyaWVkIGVudGl0aWVzIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgZW50aXRpZXMuCisJICovCisJcHVibGljIExpc3Q8VD4gbG9hZEFsbChTdHJpbmcgcGF0dGVybikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbG9hZChGaWx0ZXIubmFtZU9ubHkoZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSwgcGF0dGVybikpLmdldFNvcnRlZEVudGl0aWVzKCk7CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIGVudGl0aWVzIG1hdGNoaW5nIGdpdmVuIGluc3RhbmNlIElEcy4KKwkgKgorCSAqIEBwYXJhbSBpbnN0YW5jZUlEcyBUaGUgaW5zdGFuY2UgSURzLgorCSAqIEByZXR1cm4gQSBzb3J0ZWQge0BsaW5rIExpc3R9IHdpdGggcXVlcmllZCBlbnRpdGllcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIGVudGl0aWVzLgorCSAqLworCXB1YmxpYyBMaXN0PFQ+IGxvYWRBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGluc3RhbmNlSURzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChpbnN0YW5jZUlEcy5pc0VtcHR5KCkpIHsKKwkJCS8vIGp1c3QgdG8gYmUgc3VyZS4uLgorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJcmV0dXJuIGxvYWQoRmlsdGVyLmlkc09ubHkoZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSwgaW5zdGFuY2VJRHMpKS5nZXRTb3J0ZWRFbnRpdGllcygpOworCX0KKworCXB1YmxpYyBPRFNNb2RlbE1hbmFnZXIgZ2V0T0RTTW9kZWxNYW5hZ2VyKCkgeworCQlyZXR1cm4gb2RzTW9kZWxNYW5hZ2VyOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcm90ZWN0ZWQgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZm9yZWlnbiBrZXkgc2VsZWN0IHN0YXRlbWVudHMgdG8gZ2l2ZW4ge0BsaW5rIFF1ZXJ5fSBmb3IgZWFjaCBnaXZlbgorCSAqIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIHF1ZXJ5ICAgICAgICAgIFRoZSB7QGxpbmsgUXVlcnl9LgorCSAqIEBwYXJhbSByZWxhdGVkQ29uZmlncyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ31zLgorCSAqIEBwYXJhbSBtYW5kYXRvcnkgICAgICBGbGFnIGluZGljYXRlcyB3aGV0aGVyIGdpdmVuIHtAY29kZSBFbnRpdHlDb25maWd9cyBhcmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgbWFuZGF0b3J5IG9yIG5vdC4KKwkgKiBAcmV0dXJuIEZvciBlYWNoIHtAY29kZSBFbnRpdHlDb25maWd9IGEgY29ycmVzcG9uZGluZyB7QGNvZGUKKwkgKiAJCVJlbGF0aW9uQ29uZmlnfSBpcyByZXR1cm5lZCBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxSZWxhdGlvbkNvbmZpZz4gc2VsZWN0UmVsYXRpb25zKFF1ZXJ5IHF1ZXJ5LCBMaXN0PEVudGl0eUNvbmZpZzw/Pj4gcmVsYXRlZENvbmZpZ3MsCisJCQlib29sZWFuIG1hbmRhdG9yeSkgeworCQlMaXN0PFJlbGF0aW9uQ29uZmlnPiByZWxhdGlvbkNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKTsKKwkJZm9yIChFbnRpdHlDb25maWc8Pz4gcmVsYXRlZEVudGl0eUNvbmZpZyA6IHJlbGF0ZWRDb25maWdzKSB7CisJCQlSZWxhdGlvbkNvbmZpZyByZWxhdGlvbkNvbmZpZyA9IG5ldyBSZWxhdGlvbkNvbmZpZyhlbnRpdHlUeXBlLCByZWxhdGVkRW50aXR5Q29uZmlnLCBtYW5kYXRvcnkpOworCQkJcXVlcnkuc2VsZWN0KHJlbGF0aW9uQ29uZmlnLnJlbGF0aW9uLmdldEF0dHJpYnV0ZSgpKTsKKwkJCXJlbGF0aW9uQ29uZmlncy5hZGQocmVsYXRpb25Db25maWcpOworCQl9CisKKwkJcmV0dXJuIHJlbGF0aW9uQ29uZmlnczsKKwl9CisKKwkvKioKKwkgKiBDb252ZW5pZW5jZSBtZXRob2QgY29sbGVjdHMgdGhlIHF1ZXJpZWQge0BsaW5rIFJlY29yZH0gZnJvbSBlYWNoCisJICoge0BsaW5rIFJlc3VsdH0uCisJICoKKwkgKiBAcGFyYW0gcmVzdWx0cyBUaGUge0Bjb2RlIFJlc3VsdH1zLgorCSAqIEByZXR1cm4gVGhlIHF1ZXJpZWQge0BsaW5rIFJlY29yZH1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcm90ZWN0ZWQgTGlzdDxSZWNvcmQ+IGNvbGxlY3RSZWNvcmRzKExpc3Q8UmVzdWx0PiByZXN1bHRzKSB7CisJCXJldHVybiByZXN1bHRzLnN0cmVhbSgpLm1hcChyIC0+IHIuZ2V0UmVjb3JkKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCkpKS5jb2xsZWN0KHRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyBhbmQgbWFwcyByZWxhdGVkIGVudGl0aWVzIGZvciBlYWNoIGdpdmVuIHtAbGluayBSZWxhdGlvbkNvbmZpZ30uCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb25Db25maWdzIFRoZSB7QGNvZGUgUmVsYXRpb25Db25maWd9cy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIHJlbGF0ZWQgZW50aXRpZXMuCisJICovCisJcHJvdGVjdGVkIHZvaWQgbG9hZFJlbGF0ZWRFbnRpdGllcyhMaXN0PFJlbGF0aW9uQ29uZmlnPiByZWxhdGlvbkNvbmZpZ3MpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJZm9yIChSZWxhdGlvbkNvbmZpZyByZWxhdGlvbkNvbmZpZyA6IHJlbGF0aW9uQ29uZmlncykgeworCQkJRW50aXR5Q29uZmlnPD8+IHJlbGF0ZWRDb25maWcgPSByZWxhdGlvbkNvbmZpZy5lbnRpdHlDb25maWc7CisKKwkJCWJvb2xlYW4gaXNDb250ZXh0VHlwZURlZmluZWQgPSBlbnRpdHlDb25maWcuZ2V0Q29udGV4dFR5cGUoKS5pc1ByZXNlbnQoKTsKKwkJCWZvciAoRW50aXR5IHJlbGF0ZWRFbnRpdHkgOiBuZXcgRW50aXR5UmVxdWVzdDw+KHRoaXMsIHJlbGF0ZWRDb25maWcpCisJCQkJCS5sb2FkQWxsKHJlbGF0aW9uQ29uZmlnLmRlcGVuZGFudHMua2V5U2V0KCkpKSB7CisJCQkJYm9vbGVhbiBzZXRCeUNvbnRleHRUeXBlID0gIWlzQ29udGV4dFR5cGVEZWZpbmVkICYmIHJlbGF0ZWRDb25maWcuZ2V0Q29udGV4dFR5cGUoKS5pc1ByZXNlbnQoKTsKKwkJCQlmb3IgKEVudGl0eVJlY29yZDw/PiBlbnRpdHlSZWNvcmQgOiByZWxhdGlvbkNvbmZpZy5kZXBlbmRhbnRzLnJlbW92ZShyZWxhdGVkRW50aXR5LmdldElEKCkpKSB7CisJCQkJCXNldFJlbGF0ZWRFbnRpdHkoZW50aXR5UmVjb3JkLCByZWxhdGVkRW50aXR5LAorCQkJCQkJCXNldEJ5Q29udGV4dFR5cGUgPyByZWxhdGVkQ29uZmlnLmdldENvbnRleHRUeXBlKCkuZ2V0KCkgOiBudWxsKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmICghcmVsYXRpb25Db25maWcuZGVwZW5kYW50cy5pc0VtcHR5KCkpIHsKKwkJCQkvLyB0aGlzIG1heSBvY2N1ciBpZiB0aGUgaW5zdGFuY2UgaWQgb2YgdGhlIHJlbGF0ZWQgZW50aXR5CisJCQkJLy8gaXMgZGVmaW5lZCwgYnV0IHRoZSBlbnRpdHkgaXRzZWxmIGRvZXMgbm90IGV4aXN0CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKwkJCQkJCSJVbmFibGUgdG8gbG9hZCByZWxhdGVkIGVudGl0aWVzOiAiICsgcmVsYXRpb25Db25maWcuZGVwZW5kYW50cy50b1N0cmluZygpKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIEFzc2lnbnMgZ2l2ZW4gcmVsYXRlZCB7QGxpbmsgRW50aXR5fSB0byBnaXZlbiB7QGxpbmsgRW50aXR5UmVjb3JkfS4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlSZWNvcmQgIFRoZSB7QGNvZGUgRW50aXR5UmVjb3JkfSB3aGljaCByZWZlcmVuY2VzIGdpdmVuCisJICogICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eX0uCisJICogQHBhcmFtIHJlbGF0ZWRFbnRpdHkgVGhlIHJlbGF0ZWQge0Bjb2RlIEVudGl0eX0uCisJICogQHBhcmFtIGNvbnRleHRUeXBlICAgVXNlZCBhcyBxdWFsaWZpZXIgZm9yIHJlbGF0aW9uIGFzc2lnbm1lbnQuCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2V0UmVsYXRlZEVudGl0eShFbnRpdHlSZWNvcmQ8Pz4gZW50aXR5UmVjb3JkLCBFbnRpdHkgcmVsYXRlZEVudGl0eSwgQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJaWYgKGNvbnRleHRUeXBlID09IG51bGwpIHsKKwkJCWVudGl0eVJlY29yZC5jb3JlLmdldE11dGFibGVTdG9yZSgpLnNldChyZWxhdGVkRW50aXR5KTsKKwkJfSBlbHNlIHsKKwkJCWVudGl0eVJlY29yZC5jb3JlLmdldE11dGFibGVTdG9yZSgpLnNldChyZWxhdGVkRW50aXR5LCBjb250ZXh0VHlwZSk7CisJCX0KKworCQlMaXN0PFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZUF0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJaWYgKGVudGl0eVJlY29yZC5lbnRpdHkgaW5zdGFuY2VvZiBDb250ZXh0Q29tcG9uZW50ICYmIHJlbGF0ZWRFbnRpdHkgaW5zdGFuY2VvZiBUZW1wbGF0ZUNvbXBvbmVudCkgeworCQkJdGVtcGxhdGVBdHRyaWJ1dGVzLmFkZEFsbCgoKFRlbXBsYXRlQ29tcG9uZW50KSByZWxhdGVkRW50aXR5KS5nZXRUZW1wbGF0ZUF0dHJpYnV0ZXMoKSk7CisJCX0gZWxzZSBpZiAoZW50aXR5UmVjb3JkLmVudGl0eSBpbnN0YW5jZW9mIENvbnRleHRTZW5zb3IgJiYgcmVsYXRlZEVudGl0eSBpbnN0YW5jZW9mIFRlbXBsYXRlU2Vuc29yKSB7CisJCQl0ZW1wbGF0ZUF0dHJpYnV0ZXMuYWRkQWxsKCgoVGVtcGxhdGVTZW5zb3IpIHJlbGF0ZWRFbnRpdHkpLmdldFRlbXBsYXRlQXR0cmlidXRlcygpKTsKKwkJfQorCisJCWlmICghdGVtcGxhdGVBdHRyaWJ1dGVzLmlzRW1wdHkoKSkgeworCQkJLy8gaGlkZSBWYWx1ZSBjb250YWluZXJzIHRoYXQgYXJlIG1pc3NpbmcgaW4gdGhlIHRlbXBsYXRlCisJCQlTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PD4oZW50aXR5UmVjb3JkLmNvcmUuZ2V0VmFsdWVzKCkua2V5U2V0KCkpOworCQkJbmFtZXMucmVtb3ZlKEVudGl0eS5BVFRSX05BTUUpOworCQkJbmFtZXMucmVtb3ZlKEVudGl0eS5BVFRSX01JTUVUWVBFKTsKKwkJCXRlbXBsYXRlQXR0cmlidXRlcy5zdHJlYW0oKS5tYXAoRW50aXR5OjpnZXROYW1lKS5mb3JFYWNoKG5hbWVzOjpyZW1vdmUpOworCQkJZW50aXR5UmVjb3JkLmNvcmUuaGlkZVZhbHVlcyhuYW1lcyk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogTG9hZHMgYWxsIGVudGl0aWVzIG1hdGNoaW5nIGdpdmVuIHtAbGluayBGaWx0ZXJ9IGluY2x1ZGluZyBhbGwgb2YgcmVsYXRlZAorCSAqIGVudGl0aWVzIChvcHRpb25hbCwgbWFuZGF0b3J5IGFuZCBjaGlsZHJlbikuCisJICoKKwkgKiBAcGFyYW0gZmlsdGVyIFRoZSB7QGxpbmsgRmlsdGVyfS4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHF1ZXJpZWQge0Bjb2RlIEVudGl0eVJlc3VsdH0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gbG9hZCBlbnRpdGllcy4KKwkgKi8KKwlwcml2YXRlIEVudGl0eVJlc3VsdDxUPiBsb2FkKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJZmlsdGVyZWQgPSAhZmlsdGVyLmlzRW10cHR5KCkgfHwgZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCk7CisKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKTsKKwkJUmVsYXRpb24gcmVmbGV4aXZlUmVsYXRpb24gPSBlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSA/IGVudGl0eVR5cGUuZ2V0UmVsYXRpb24oZW50aXR5VHlwZSkgOiBudWxsOworCisJCVF1ZXJ5IHF1ZXJ5ID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0QWxsKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCkpOworCisJCWlmIChlbnRpdHlDb25maWcuaXNSZWZsZXhpdmUoKSkgeworCQkJcXVlcnkuc2VsZWN0KHJlZmxleGl2ZVJlbGF0aW9uLmdldEF0dHJpYnV0ZSgpKTsKKwkJCS8vIGVudGl0aWVzIHdpdGggY2hpbGRyZW4gaGF2ZSB0byBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZWlyCisJCQkvLyBjaGlsZHJlbiEKKwkJCXF1ZXJ5Lm9yZGVyKGVudGl0eVR5cGUuZ2V0SURBdHRyaWJ1dGUoKSk7CisJCX0KKworCQkvLyBwcmVwYXJlIHJlbGF0aW9ucyBzZWxlY3Qgc3RhdGVtZW50cworCQlMaXN0PFJlbGF0aW9uQ29uZmlnPiBvcHRpb25hbFJlbGF0aW9ucyA9IHNlbGVjdFJlbGF0aW9ucyhxdWVyeSwgZW50aXR5Q29uZmlnLmdldE9wdGlvbmFsQ29uZmlncygpLCBmYWxzZSk7CisJCUxpc3Q8UmVsYXRpb25Db25maWc+IG1hbmRhdG9yeVJlbGF0aW9ucyA9IHNlbGVjdFJlbGF0aW9ucyhxdWVyeSwgZW50aXR5Q29uZmlnLmdldE1hbmRhdG9yeUNvbmZpZ3MoKSwgdHJ1ZSk7CisKKwkJLy8gY29uZmlndXJlIGZpbHRlcgorCQlGaWx0ZXIgYWRqdXN0ZWRGaWx0ZXIgPSBGaWx0ZXIub3IoKTsKKwkJaWYgKGZpbHRlcmVkKSB7CisJCQkvLyBwcmVzZXJ2ZSBjdXJyZW50IGNvbmRpdGlvbnMKKwkJCWFkanVzdGVkRmlsdGVyLm1lcmdlKGZpbHRlcik7CisJCQlpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkpIHsKKwkJCQkvLyBleHRlbmQgdG8gcmV0cmlldmUgYWxsIHJlZmxleGl2ZSBjaGlsZCBjYW5kaWRhdGVzCisJCQkJYWRqdXN0ZWRGaWx0ZXIuYWRkKENvbXBhcmlzb25PcGVyYXRvci5JU19OT1RfTlVMTC5jcmVhdGUocmVmbGV4aXZlUmVsYXRpb24uZ2V0QXR0cmlidXRlKCksIDBMKSk7CisJCQl9CisJCX0KKworCQkvLyBsb2FkIGVudGl0aWVzIGFuZCBwcmVwYXJlIG1hcHBpbmdzIGZvciByZXF1aXJlZCByZWxhdGVkIGVudGl0aWVzCisJCUxpc3Q8RW50aXR5UmVjb3JkPD8+PiBwYXJlbnRSZWNvcmRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoUmVjb3JkIHJlY29yZCA6IGNvbGxlY3RSZWNvcmRzKHF1ZXJ5LmZldGNoKGFkanVzdGVkRmlsdGVyKSkpIHsKKwkJCU9wdGlvbmFsPFN0cmluZz4gcmVmbGV4aXZlUGFyZW50SUQgPSBPcHRpb25hbC5lbXB0eSgpOworCQkJaWYgKGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpKSB7CisJCQkJcmVmbGV4aXZlUGFyZW50SUQgPSByZWNvcmQuZ2V0SUQocmVmbGV4aXZlUmVsYXRpb24pOworCQkJfQorCQkJRW50aXR5UmVjb3JkPFQ+IGVudGl0eVJlY29yZDsKKworCQkJaWYgKGVudGl0eUNvbmZpZy5pc1JlZmxleGl2ZSgpICYmIHJlZmxleGl2ZVBhcmVudElELmlzUHJlc2VudCgpKSB7CisJCQkJT3B0aW9uYWw8RW50aXR5UmVjb3JkPFQ+PiBwYXJlbnRSZWNvcmQgPSBlbnRpdHlSZXN1bHQuZ2V0KHJlZmxleGl2ZVBhcmVudElELmdldCgpKTsKKwkJCQlpZiAoIXBhcmVudFJlY29yZC5pc1ByZXNlbnQoKSkgeworCQkJCQkvLyB0aGlzIGVudGl0eSdzIHBhcmVudCB3YXMgbm90IGxvYWRlZCAtPiBza2lwCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWVudGl0eVJlY29yZCA9IGVudGl0eVJlc3VsdC5hZGQocGFyZW50UmVjb3JkLmdldCgpLCByZWNvcmQpOworCQkJCXBhcmVudFJlY29yZHMuYWRkKHBhcmVudFJlY29yZC5nZXQoKSk7CisJCQl9IGVsc2UgeworCQkJCWVudGl0eVJlY29yZCA9IGVudGl0eVJlc3VsdC5hZGQocmVjb3JkKTsKKwkJCX0KKworCQkJLy8gY29sbGVjdCByZWxhdGVkIGluc3RhbmNlIElEcworCQkJU3RyZWFtLmNvbmNhdChvcHRpb25hbFJlbGF0aW9ucy5zdHJlYW0oKSwgbWFuZGF0b3J5UmVsYXRpb25zLnN0cmVhbSgpKQorCQkJCQkuZm9yRWFjaChyYyAtPiByYy5hZGQoZW50aXR5UmVjb3JkLCByZWNvcmQpKTsKKwkJfQorCisJCWlmIChlbnRpdHlSZXN1bHQuaXNFbXB0eSgpKSB7CisJCQkvLyBubyBlbnRpdGllcyBmb3VuZCAtPiBuZWl0aGVyIHJlbGF0ZWQgbm9yIGNoaWxkIGVudGl0aWVzIHJlcXVpcmVkCisJCQlyZXR1cm4gZW50aXR5UmVzdWx0OworCQl9CisKKwkJLy8gbG9hZCBhbmQgbWFwIHJlbGF0ZWQgZW50aXRpZXMKKwkJbG9hZFJlbGF0ZWRFbnRpdGllcyhvcHRpb25hbFJlbGF0aW9ucyk7CisJCWxvYWRSZWxhdGVkRW50aXRpZXMobWFuZGF0b3J5UmVsYXRpb25zKTsKKworCQkvLyBzb3J0IGNoaWxkcmVuIG9mIHBhcmVudAorCQlpZiAoZW50aXR5Q29uZmlnLmlzUmVmbGV4aXZlKCkpIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCQkJRW50aXR5Q29uZmlnPERlbGV0YWJsZT4gY2hpbGRDb25maWcgPSAoRW50aXR5Q29uZmlnPERlbGV0YWJsZT4pIGVudGl0eUNvbmZpZzsKKwkJCWZvciAoRW50aXR5UmVjb3JkPD8+IGVudGl0eVJlY29yZCA6IHBhcmVudFJlY29yZHMpIHsKKwkJCQllbnRpdHlSZWNvcmQuY29yZS5nZXRDaGlsZHJlblN0b3JlKCkuc29ydChjaGlsZENvbmZpZy5nZXRFbnRpdHlDbGFzcygpLCBjaGlsZENvbmZpZy5nZXRDb21wYXJhdG9yKCkpOworCQkJfQorCQl9CisKKwkJLy8gbG9hZCBjaGlsZHJlbgorCQlmb3IgKEVudGl0eUNvbmZpZzw/IGV4dGVuZHMgRGVsZXRhYmxlPiBjaGlsZENvbmZpZyA6IGVudGl0eUNvbmZpZy5nZXRDaGlsZENvbmZpZ3MoKSkgeworCQkJY2FjaGUuYWRkKG5ldyBDaGlsZFJlcXVlc3Q8Pih0aGlzLCBjaGlsZENvbmZpZykubG9hZCgpKTsKKwkJfQorCisJCXJldHVybiBlbnRpdHlSZXN1bHQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL0VudGl0eVJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzE3NjUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9FbnRpdHlSZXN1bHQuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGUuVkFUVFJfRU5VTUVSQVRJT05fTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGUuVkFUVFJfU0NBTEFSX1RZUEU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlLlZBVFRSX1NFUVVFTkNFOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRGVmYXVsdENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1SZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bWVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5RmFjdG9yeTsKKworLyoqCisgKiBDb250YWluZXIgZm9yIGVudGl0aWVzIGJ5IGV4ZWN1dGluZyBhbiB7QGxpbmsgRW50aXR5UmVxdWVzdH0uCisgKgorICogQHBhcmFtIDxUPiBUaGUgZW50aXR5IHR5cGUuCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgRW50aXR5UmVzdWx0PFQgZXh0ZW5kcyBFbnRpdHk+IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEVudGl0eVJlY29yZDxUPj4gZW50aXR5UmVjb3JkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8VD4gZW50aXRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCWZpbmFsIEVudGl0eVJlcXVlc3Q8VD4gcmVxdWVzdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSByZXF1ZXN0IFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlSZXF1ZXN0fS4KKwkgKi8KKwlFbnRpdHlSZXN1bHQoRW50aXR5UmVxdWVzdDxUPiByZXF1ZXN0KSB7CisJCXRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eVJlY29yZH0gaWRlbnRpZmllZCBieSBnaXZlbiBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSBpZCBUaGUgaW5zdGFuY2UgSUQuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBFbnRpdHlSZWNvcmR9IG5vdCBmb3VuZC4KKwkgKi8KKwlwdWJsaWMgT3B0aW9uYWw8RW50aXR5UmVjb3JkPFQ+PiBnZXQoU3RyaW5nIGlkKSB7CisJCXJldHVybiBPcHRpb25hbC5vZk51bGxhYmxlKGVudGl0eVJlY29yZHMuZ2V0KGlkKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiB7QGxpbmsgRW50aXR5UmVjb3JkfSBmb3IgZ2l2ZW4ge0BsaW5rIFJlY29yZH0gYW5kIG1hcHBzIGl0CisJICogaW50ZXJuYWxseSBieSBpdHMgaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gcmVjb3JkIFRoZSB7QGNvZGUgUmVjb3JkfS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBFbnRpdHlSZWNvcmR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBFbnRpdHlSZWNvcmQ8VD4gYWRkKFJlY29yZCByZWNvcmQpIHsKKwkJcmV0dXJuIGNyZWF0ZShuZXcgRGVmYXVsdENvcmUocmVjb3JkKSk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiB7QGxpbmsgRW50aXR5UmVjb3JkfSBmb3IgZ2l2ZW4ge0BsaW5rIFJlY29yZH0gdXNpbmcgZ2l2ZW4gcGFyZW50CisJICoge0Bjb2RlIEVudGl0eVJlY29yZH0gYW5kIG1hcHMgaXQgaW50ZXJuYWxseSBieSBpdHMgaW5zdGFuY2UgSUQuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50UmVjb3JkIFRoZSBjcmVhdGVkIHtAY29kZSBFbnRpdHlSZWNvcmR9IHdpbGwgYmUgcmVsYXRlZCBhcyBhCisJICogICAgICAgICAgICAgICAgICAgICBjaGlsZCB3aXRoIHRoaXMgb25lLgorCSAqIEBwYXJhbSByZWNvcmQgICAgICAgVGhlIHtAY29kZSBSZWNvcmR9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIEVudGl0eVJlY29yZH0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEVudGl0eVJlY29yZDxUPiBhZGQoRW50aXR5UmVjb3JkPD8+IHBhcmVudFJlY29yZCwgUmVjb3JkIHJlY29yZCkgeworCQlDb3JlIGNvcmUgPSBuZXcgRGVmYXVsdENvcmUocmVjb3JkKTsKKworCQlpZiAoQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcy5lcXVhbHMocmVxdWVzdC5lbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKSkpIHsKKwkJCS8vIGFkZCByZWFkIG9ubHkgcHJvcGVydGllcyBmcm9tIGFwcGxpY2F0aW9uIG1vZGVsCisJCQlhZGp1c3RDYXRhbG9nQXR0cmlidXRlQ29yZShwYXJlbnRSZWNvcmQuZW50aXR5LCBjb3JlKTsKKwkJfQorCisJCUVudGl0eVJlY29yZDxUPiBjaGlsZFJlY29yZCA9IGNyZWF0ZShjb3JlKTsKKwkJY2hpbGRSZWNvcmQuY29yZS5nZXRQZXJtYW5lbnRTdG9yZSgpLnNldChwYXJlbnRSZWNvcmQuZW50aXR5KTsKKwkJcGFyZW50UmVjb3JkLmNvcmUuZ2V0Q2hpbGRyZW5TdG9yZSgpLmFkZCgoRGVsZXRhYmxlKSBjaGlsZFJlY29yZC5lbnRpdHkpOworCQlyZXR1cm4gY2hpbGRSZWNvcmQ7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eX1zIG9mIHRoaXMgZW50aXR5IHJlc3VsdC4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJuZWQge0Bjb2RlIENvbGxlY3Rpb259IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxUPiBnZXRFbnRpdGllcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoZW50aXRpZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHl9cyBvZiB0aGlzIGVudGl0eSByZXN1bHQgc29ydGVkLgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBMaXN0PFQ+IGdldFNvcnRlZEVudGl0aWVzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKKwkJCQllbnRpdGllcy5zdHJlYW0oKS5zb3J0ZWQocmVxdWVzdC5lbnRpdHlDb25maWcuZ2V0Q29tcGFyYXRvcigpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBpbnN0YW5jZSBJRHMgb2YgdGhlIGVudGl0aWVzIGhlbGQgYnkgdGhpcyBlbnRpdHkgcmVzdWx0LgorCSAqCisJICogQHJldHVybiBSZXR1cm5lZCB7QGNvZGUgQ29sbGVjdGlvbn0gaXMgdW5tb2RpZmlhYmxlLgorCSAqLworCXB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SURzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihlbnRpdHlSZWNvcmRzLmtleVNldCgpKTsKKwl9CisKKwkvKioKKwkgKiBDaGVja3Mgd2hldGhlciB0aGlzIGVudGl0eSByZXN1bHQgaG9sZHMgZW50aXRpZXMgb3IgaXMgZW1wdHkuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgZW50aXR5IHJlc3VsdCBoYXMgbm8gZW50aXRpZXMuCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuIGVudGl0aWVzLmlzRW1wdHkoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBmdXJ0aGVyIG1ldGEgZGF0YSB0byB0aGUgZ2l2ZW4ge0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9IHtAbGluayBDb3JlfS4KKwkgKgorCSAqIEBwYXJhbSBjYXRhbG9nQ29tcG9uZW50ICAgICBUaGUgcGFyZW50IHtAbGluayBDYXRhbG9nQ29tcG9uZW50fS4KKwkgKiBAcGFyYW0gY2F0YWxvZ0F0dHJpYnV0ZUNvcmUgVGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfSB7QGNvZGUgQ29yZX0uCisJICovCisJcHJpdmF0ZSB2b2lkIGFkanVzdENhdGFsb2dBdHRyaWJ1dGVDb3JlKEVudGl0eSBjYXRhbG9nQ29tcG9uZW50LCBDb3JlIGNhdGFsb2dBdHRyaWJ1dGVDb3JlKSB7CisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IHJlcXVlc3Qub2RzTW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoY2F0YWxvZ0NvbXBvbmVudC5nZXROYW1lKCkpOworCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gZW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoY2F0YWxvZ0F0dHJpYnV0ZUNvcmUuZ2V0VmFsdWVzKCkuZ2V0KEVudGl0eS5BVFRSX05BTUUpLmV4dHJhY3QoKSk7CisKKwkJTWFwPFN0cmluZywgVmFsdWU+IHZhbHVlcyA9IGNhdGFsb2dBdHRyaWJ1dGVDb3JlLmdldFZhbHVlcygpOworCQlWYWx1ZSBlbnVtZXJhdGlvbk5hbWUgPSBWYWx1ZVR5cGUuU1RSSU5HLmNyZWF0ZShWQVRUUl9FTlVNRVJBVElPTl9OQU1FKTsKKwkJdmFsdWVzLnB1dChWQVRUUl9FTlVNRVJBVElPTl9OQU1FLCBlbnVtZXJhdGlvbk5hbWUpOworCQlpZiAoYXR0cmlidXRlLmdldFZhbHVlVHlwZSgpLmlzRW51bWVyYXRpb25UeXBlKCkpIHsKKwkJCWVudW1lcmF0aW9uTmFtZS5zZXQoYXR0cmlidXRlLmdldEVudW1PYmooKS5nZXROYW1lKCkpOworCQl9CisKKwkJRW51bWVyYXRpb248Pz4gc2NhbGFyVHlwZU9iaiA9IEVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiU2NhbGFyVHlwZSIpOworCQlWYWx1ZSBzY2FsYXJUeXBlID0gVmFsdWVUeXBlLkVOVU1FUkFUSU9OLmNyZWF0ZShzY2FsYXJUeXBlT2JqLCBWQVRUUl9TQ0FMQVJfVFlQRSk7CisJCXNjYWxhclR5cGUuc2V0KHNjYWxhclR5cGVPYmoudmFsdWVPZihhdHRyaWJ1dGUuZ2V0VmFsdWVUeXBlKCkudG9TaW5nbGVUeXBlKCkubmFtZSgpKSk7CisJCXZhbHVlcy5wdXQoVkFUVFJfU0NBTEFSX1RZUEUsIHNjYWxhclR5cGUpOworCisJCXZhbHVlcy5wdXQoVkFUVFJfU0VRVUVOQ0UsIFZhbHVlVHlwZS5CT09MRUFOLmNyZWF0ZShWQVRUUl9TRVFVRU5DRSwgYXR0cmlidXRlLmdldFZhbHVlVHlwZSgpLmlzU2VxdWVuY2UoKSkpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEVudGl0eVJlY29yZH0gaW5zdGFuY2UgZm9yIGdpdmVuIHtAbGluayBDb3JlfS4gVGhlCisJICoge0BsaW5rIEVudGl0eVJlY29yZH0gaXMgaW50ZXJuYWxseSBtYXBwZWQgdGhlIGl0cyBpbnN0YW5jZSBJRC4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGNvZGUgQ29yZX0uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGxpbmsgRW50aXR5UmVjb3JkfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIEVudGl0eVJlY29yZDxUPiBjcmVhdGUoQ29yZSBjb3JlKSB7CisJCU9EU0VudGl0eUZhY3Rvcnkgb2RzRW50aXR5RmFjdG9yeSA9IG5ldyBPRFNFbnRpdHlGYWN0b3J5KHJlcXVlc3QuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIG51bGwpOworCQlFbnRpdHlSZWNvcmQ8VD4gZW50aXR5UmVjb3JkID0gbmV3IEVudGl0eVJlY29yZDw+KAorCQkJCW9kc0VudGl0eUZhY3RvcnkuY3JlYXRlRW50aXR5KHJlcXVlc3QuZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCksIGNvcmUpLCBjb3JlKTsKKwkJZW50aXR5UmVjb3Jkcy5wdXQoY29yZS5nZXRJRCgpLCBlbnRpdHlSZWNvcmQpOworCQllbnRpdGllcy5hZGQoZW50aXR5UmVjb3JkLmVudGl0eSk7CisJCXJldHVybiBlbnRpdHlSZWNvcmQ7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL1JlbGF0aW9uQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL1JlbGF0aW9uQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE0ZjhjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvUmVsYXRpb25Db25maWcuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWc7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBjb2xsZWN0IHtAbGluayBFbnRpdHlSZWNvcmR9IHJlZmVyZW5jaW5nIGVudGl0aWVzIG9mIHRoZQorICogc2FtZSB0eXBlIHNwZWNpZmllZCBieSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVsYXRpb25Db25maWcgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCWZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8RW50aXR5UmVjb3JkPD8+Pj4gZGVwZW5kYW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlmaW5hbCBFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnOworCWZpbmFsIFJlbGF0aW9uIHJlbGF0aW9uOworCWZpbmFsIGJvb2xlYW4gbWFuZGF0b3J5OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHNvdXJjZSAgICAgICBUaGUgc291cmNlIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnIFRoZSB0YXJnZXQge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICogQHBhcmFtIG1hbmRhdG9yeSAgICBGbGFnIGluZGljYXRlcyB3aGV0aGVyIGEgcmVsYXRlZCBtdXN0IGV4aXN0IG9yIG5vdC4KKwkgKi8KKwlwdWJsaWMgUmVsYXRpb25Db25maWcoRW50aXR5VHlwZSBzb3VyY2UsIEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcsIGJvb2xlYW4gbWFuZGF0b3J5KSB7CisJCXRoaXMuZW50aXR5Q29uZmlnID0gZW50aXR5Q29uZmlnOworCQlyZWxhdGlvbiA9IHNvdXJjZS5nZXRSZWxhdGlvbihlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpKTsKKwkJdGhpcy5tYW5kYXRvcnkgPSBtYW5kYXRvcnk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogR2l2ZW4ge0BsaW5rIEVudGl0eVJlY29yZH0gZGVwZW5kcyBvbiB7QGxpbmsgRW50aXR5fXMgd2hpY2ggYXJlIGxvYWRlZCBieQorCSAqIHByb2Nlc3NpbmcgdGhpcyByZWxhdGlvbiBjb25maWcuIFRoZXJlZm9yZSBnaXZlbiB7QGNvZGUgRW50aXR5UmVjb3JkfSBjYWNoZWQKKwkgKiBhbmQgc2F0aXNmaWVkIGFzIHNvb24gYXMgdGhlIGNvcnJlc3BvbmRpbmcgZW50aXRpZXMgYXJlIGxvYWRlZC4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlSZWNvcmQgVGhlIGRlcGVuZGFudCB7QGNvZGUgRW50aXR5UmVjb3JkfS4KKwkgKiBAcGFyYW0gcmVjb3JkICAgICAgIFRoZSB7QGxpbmsgUmVjb3JkfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4KKwkgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBFbnRpdHlSZWNvcmR9LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZChFbnRpdHlSZWNvcmQ8Pz4gZW50aXR5UmVjb3JkLCBSZWNvcmQgcmVjb3JkKSB7CisJCU9wdGlvbmFsPFN0cmluZz4gcmVsYXRlZEVudGl0eUlEID0gcmVjb3JkLmdldElEKHJlbGF0aW9uKTsKKwkJaWYgKHJlbGF0ZWRFbnRpdHlJRC5pc1ByZXNlbnQoKSkgeworCQkJZGVwZW5kYW50cy5jb21wdXRlSWZBYnNlbnQocmVsYXRlZEVudGl0eUlELmdldCgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQoZW50aXR5UmVjb3JkKTsKKwkJfSBlbHNlIGlmIChtYW5kYXRvcnkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1hbmRhdG9yeSByZWxhdGlvbiB1bnNhdGlzZmllZCBmb3IgcmVsYXRpb24gIiArIHJlbGF0aW9uLmdldE5hbWUoKSk7CisJCX0KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0RlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9EZWZhdWx0RW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmU4MzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9EZWZhdWx0RW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMzcwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDIwIENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFNlbnNvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlBhcmFtZXRlclNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGh5c2ljYWxEaW1lbnNpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlF1YW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Tb3J0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNsYXNzaWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Eb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkV4dFN5c3RlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuRXh0U3lzdGVtQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5NRE1BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3REb21haW47CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuU3lzdGVtUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0U3RlcFVzYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Vc2VyUGFyYW1ldGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5WYWx1ZUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlZhbHVlTGlzdFZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5WZXJzaW9uYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBEZWZhdWx0RW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlciBpbXBsZW1lbnRzIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmNsYXNzKTsKKworCUVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgZW50aXR5Q29uZmlnUmVwb3NpdG9yeTsKKworCXB1YmxpYyBEZWZhdWx0RW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcigpIHsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ31zLgorCSAqIAorCSAqIEByZXR1cm4KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5Q29uZmlnUmVwb3NpdG9yeSBsb2FkRW50aXR5Q29uZmlndXJhdGlvbnMoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcikgeworCQlMT0dHRVIuZGVidWcoIkxvYWRpbmcgZW50aXR5IGNvbmZpZ3VyYXRpb25zLi4uIik7CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5ID0gbmV3IEVudGl0eUNvbmZpZ1JlcG9zaXRvcnkoKTsKKworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihSb2xlLmNsYXNzKSwgIlJvbGUiLCBmYWxzZSkpOworCisJCS8vIEVudmlyb25tZW50IHwgUHJvamVjdCB8IFBvb2wgfCBQaHlzaWNhbERpbWVuc2lvbiB8IFVzZXIgfCBNZWFzdXJlbWVudAorCQkvLyB8IENoYW5uZWxHcm91cAorCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihFbnZpcm9ubWVudC5jbGFzcyksICJFbnZpcm9ubWVudCIsIGZhbHNlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFByb2plY3QuY2xhc3MpLCAiUHJvamVjdCIsIGZhbHNlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFBvb2wuY2xhc3MpLCAiU3RydWN0dXJlTGV2ZWwiLCB0cnVlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkKKwkJCQkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFBoeXNpY2FsRGltZW5zaW9uLmNsYXNzKSwgIlBoeXNEaW1lbnNpb24iLCBmYWxzZSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihVc2VyLmNsYXNzKSwgIlVzZXIiLCBmYWxzZSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihNZWFzdXJlbWVudC5jbGFzcyksICJNZWFSZXN1bHQiLCBmYWxzZSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihDaGFubmVsR3JvdXAuY2xhc3MpLCAiU3ViTWF0cml4IiwgZmFsc2UpKTsKKworCQkvLyBVbml0CisJCUVudGl0eUNvbmZpZzxVbml0PiB1bml0Q29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFVuaXQuY2xhc3MpLCAiVW5pdCIsIGZhbHNlKTsKKwkJdW5pdENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oUGh5c2ljYWxEaW1lbnNpb24uY2xhc3MpKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIodW5pdENvbmZpZyk7CisKKwkJLy8gUXVhbnRpdHkKKwkJRW50aXR5Q29uZmlnPFF1YW50aXR5PiBxdWFudGl0eUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihRdWFudGl0eS5jbGFzcyksICJRdWFudGl0eSIsIGZhbHNlKTsKKwkJcXVhbnRpdHlDb25maWcuYWRkTWFuZGF0b3J5KGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFVuaXQuY2xhc3MpKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIocXVhbnRpdHlDb25maWcpOworCisJCS8vIENoYW5uZWwKKwkJRW50aXR5Q29uZmlnPENoYW5uZWw+IGNoYW5uZWxDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oQ2hhbm5lbC5jbGFzcyksICJNZWFRdWFudGl0eSIsIGZhbHNlKTsKKwkJY2hhbm5lbENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVW5pdC5jbGFzcykpKTsKKwkJY2hhbm5lbENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oUXVhbnRpdHkuY2xhc3MpKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY2hhbm5lbENvbmZpZyk7CisKKwkJLy8gVmFsdWVMaXN0CisJCUVudGl0eUNvbmZpZzxWYWx1ZUxpc3RWYWx1ZT4gdmFsdWVMaXN0VmFsdWVDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oVmFsdWVMaXN0VmFsdWUuY2xhc3MpLAorCQkJCSJWYWx1ZUxpc3RWYWx1ZSIsIHRydWUpOworCQl2YWx1ZUxpc3RWYWx1ZUNvbmZpZy5zZXRDb21wYXJhdG9yKFNvcnRhYmxlLkNPTVBBUkFUT1IpOworCQlFbnRpdHlDb25maWc8VmFsdWVMaXN0PiB2YWx1ZUxpc3RDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oVmFsdWVMaXN0LmNsYXNzKSwgIlZhbHVlTGlzdCIsIHRydWUpOworCQl2YWx1ZUxpc3RDb25maWcuYWRkQ2hpbGQodmFsdWVMaXN0VmFsdWVDb25maWcpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKHZhbHVlTGlzdENvbmZpZyk7CisKKwkJLy8gUGFyYW1ldGVyU2V0CisJCUVudGl0eUNvbmZpZzxQYXJhbWV0ZXI+IHBhcmFtZXRlckNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihQYXJhbWV0ZXIuY2xhc3MpLCAiUmVzdWx0UGFyYW1ldGVyIiwKKwkJCQl0cnVlKTsKKwkJcGFyYW1ldGVyQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFVuaXQuY2xhc3MpKSk7CisJCUVudGl0eUNvbmZpZzxQYXJhbWV0ZXJTZXQ+IHBhcmFtZXRlclNldENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihQYXJhbWV0ZXJTZXQuY2xhc3MpLAorCQkJCSJSZXN1bHRQYXJhbWV0ZXJTZXQiLCB0cnVlKTsKKwkJcGFyYW1ldGVyU2V0Q29uZmlnLmFkZENoaWxkKHBhcmFtZXRlckNvbmZpZyk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIocGFyYW1ldGVyU2V0Q29uZmlnKTsKKworCQkvLyBDYXRhbG9nQ29tcG9uZW50cworCQlyZWdpc3RlckNhdGFsb2dDb21wb25lbnQobW9kZWxNYW5hZ2VyLCBDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKTsKKwkJcmVnaXN0ZXJDYXRhbG9nQ29tcG9uZW50KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKTsKKwkJcmVnaXN0ZXJDYXRhbG9nQ29tcG9uZW50KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJLy8gVGVtcGxhdGVSb290cworCQlyZWdpc3RlclRlbXBsYXRlUm9vdChtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpOworCQlyZWdpc3RlclRlbXBsYXRlUm9vdChtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlLlRFU1RTRVFVRU5DRSk7CisJCXJlZ2lzdGVyVGVtcGxhdGVSb290KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJLy8gVGVtcGxhdGVUZXN0U3RlcAorCQlFbnRpdHlDb25maWc8VGVtcGxhdGVUZXN0U3RlcD4gdGVtcGxhdGVUZXN0U3RlcENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihUZW1wbGF0ZVRlc3RTdGVwLmNsYXNzKSwKKwkJCQkiVHBsVGVzdFN0ZXAiLCB0cnVlKTsKKwkJdGVtcGxhdGVUZXN0U3RlcENvbmZpZworCQkJCS5hZGRPcHRpb25hbChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihUZW1wbGF0ZVJvb3QuY2xhc3MsIENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpKSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBDb25maWcKKwkJCQkuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVSb290LmNsYXNzLCBDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UpKSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBDb25maWcKKwkJCQkuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVSb290LmNsYXNzLCBDb250ZXh0VHlwZS5URVNURVFVSVBNRU5UKSkpOworCQl0ZW1wbGF0ZVRlc3RTdGVwQ29uZmlnLnNldENvbXBhcmF0b3IoVmVyc2lvbmFibGUuQ09NUEFSQVRPUik7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIodGVtcGxhdGVUZXN0U3RlcENvbmZpZyk7CisKKwkJLy8gU3RhdHVzCisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFN0YXR1cy5jbGFzcyksICJTdGF0dXMiLCBmYWxzZSkpOworCisJCS8vIFByb2plY3REb21haW4KKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3RlcihjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oUHJvamVjdERvbWFpbi5jbGFzcyksICJQcm9qZWN0RG9tYWluIiwgZmFsc2UpKTsKKworCQkvLyBEb21haW4KKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3RlcihjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oRG9tYWluLmNsYXNzKSwgIkRvbWFpbiIsIGZhbHNlKSk7CisKKwkJLy8gQ2xhc3NpZmljYXRpb24KKwkJRW50aXR5Q29uZmlnPENsYXNzaWZpY2F0aW9uPiBjbGFzc2lmaWNhdGlvbkNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihDbGFzc2lmaWNhdGlvbi5jbGFzcyksCisJCQkJIkNsYXNzaWZpY2F0aW9uIiwgZmFsc2UpOworCQljbGFzc2lmaWNhdGlvbkNvbmZpZy5hZGRPcHRpb25hbChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihTdGF0dXMuY2xhc3MpKSk7CisJCWNsYXNzaWZpY2F0aW9uQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFByb2plY3REb21haW4uY2xhc3MpKSk7CisJCWNsYXNzaWZpY2F0aW9uQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KERvbWFpbi5jbGFzcykpKTsKKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3RlcihjbGFzc2lmaWNhdGlvbkNvbmZpZyk7CisKKwkJLy8gVGVzdFN0ZXAKKwkJRW50aXR5Q29uZmlnPFRlc3RTdGVwPiB0ZXN0U3RlcENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihUZXN0U3RlcC5jbGFzcyksICJUZXN0U3RlcCIsIHRydWUpOworCQkvLyB0ZXN0U3RlcENvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcKKwkJLy8gS2V5PD4oU3RhdHVzLmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpKTsKKwkJdGVzdFN0ZXBDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVUZXN0U3RlcC5jbGFzcykpKTsKKwkJdGVzdFN0ZXBDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oQ2xhc3NpZmljYXRpb24uY2xhc3MpKSk7CisJCXRlc3RTdGVwQ29uZmlnLnNldENvbXBhcmF0b3IoU29ydGFibGUuQ09NUEFSQVRPUik7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIodGVzdFN0ZXBDb25maWcpOworCisJCS8vIFRlbXBsYXRlVGVzdAorCQlFbnRpdHlDb25maWc8VGVtcGxhdGVUZXN0U3RlcFVzYWdlPiB0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLAorCQkJCW5ldyBLZXk8PihUZW1wbGF0ZVRlc3RTdGVwVXNhZ2UuY2xhc3MpLCAiVHBsVGVzdFN0ZXBVc2FnZSIsIHRydWUpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VDb25maWcuYWRkTWFuZGF0b3J5KHRlbXBsYXRlVGVzdFN0ZXBDb25maWcpOworCQl0ZW1wbGF0ZVRlc3RTdGVwVXNhZ2VDb25maWcuc2V0Q29tcGFyYXRvcihTb3J0YWJsZS5DT01QQVJBVE9SKTsKKwkJRW50aXR5Q29uZmlnPFRlbXBsYXRlVGVzdD4gdGVtcGxhdGVUZXN0Q29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFRlbXBsYXRlVGVzdC5jbGFzcyksICJUcGxUZXN0IiwKKwkJCQl0cnVlKTsKKwkJdGVtcGxhdGVUZXN0Q29uZmlnLmFkZENoaWxkKHRlbXBsYXRlVGVzdFN0ZXBVc2FnZUNvbmZpZyk7CisJCXRlbXBsYXRlVGVzdENvbmZpZy5zZXRDb21wYXJhdG9yKFZlcnNpb25hYmxlLkNPTVBBUkFUT1IpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKHRlbXBsYXRlVGVzdENvbmZpZyk7CisKKwkJLy8gU3RhdHVzIFRlc3QKKwkJLy8gVE9ETyBjaGVjayBNSU1FIHR5cGUgZ2VucmF0aW9uCisJCS8vIGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG5ldyBLZXk8PihTdGF0dXMuY2xhc3MsCisJCS8vIFRlc3QuY2xhc3MpLCAiU3RhdHVzVGVzdCIsIHRydWUpKTsKKworCQkvLyBUZXN0CisJCUVudGl0eUNvbmZpZzxUZXN0PiB0ZXN0Q29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFRlc3QuY2xhc3MpLCAiVGVzdCIsIHRydWUpOworCQl0ZXN0Q29uZmlnLmFkZE1hbmRhdG9yeShlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihVc2VyLmNsYXNzKSkpOworCQkvLyB0ZXN0Q29uZmlnLmFkZE1hbmRhdG9yeShlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldworCQkvLyBLZXk8PihTdGF0dXMuY2xhc3MsIFRlc3QuY2xhc3MpKSk7CisJCXRlc3RDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVGVtcGxhdGVUZXN0LmNsYXNzKSkpOworCQl0ZXN0Q29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KENsYXNzaWZpY2F0aW9uLmNsYXNzKSkpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKHRlc3RDb25maWcpOworCisJCS8vIENvbnRleHRSb290cworCQlyZWdpc3RlckNvbnRleHRSb290KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVU5JVFVOREVSVEVTVCk7CisJCXJlZ2lzdGVyQ29udGV4dFJvb3QobW9kZWxNYW5hZ2VyLCBDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UpOworCQlyZWdpc3RlckNvbnRleHRSb290KG1vZGVsTWFuYWdlciwgQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCk7CisKKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeQorCQkJCS5yZWdpc3RlcihjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oU3lzdGVtUGFyYW1ldGVyLmNsYXNzKSwgIlN5c3RlbVBhcmFtZXRlciIsIGZhbHNlKSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KFVzZXJQYXJhbWV0ZXIuY2xhc3MpLCAiVXNlclBhcmFtZXRlciIsIGZhbHNlKSk7CisKKwkJLy8gTURNQXR0ciBmb3IgZXh0ZXJuYWwgc3lzdGVtcworCQlFbnRpdHlDb25maWc8TURNQXR0cmlidXRlPiBtZG1BdHRyQ29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwgbmV3IEtleTw+KE1ETUF0dHJpYnV0ZS5jbGFzcyksICJNRE1BdHRyIiwgdHJ1ZSk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIobWRtQXR0ckNvbmZpZyk7CisJCS8vIEV4dFN5c3RlbUF0dHIgZm9yIGV4dGVybmFsIHN5c3RlbXMKKwkJRW50aXR5Q29uZmlnPEV4dFN5c3RlbUF0dHJpYnV0ZT4gZXh0U3lzdGVtQXR0ckNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihFeHRTeXN0ZW1BdHRyaWJ1dGUuY2xhc3MpLCAiRXh0U3lzdGVtQXR0ciIsIHRydWUpOworCQlleHRTeXN0ZW1BdHRyQ29uZmlnLmFkZENoaWxkKG1kbUF0dHJDb25maWcpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGV4dFN5c3RlbUF0dHJDb25maWcpOworCQkvLyBUaGUgZXh0ZXJuYWwgc3lzdGVtcyB0aGVtc2VsdmVzCisJCUVudGl0eUNvbmZpZzxFeHRTeXN0ZW0+IGV4dFN5c3RlbUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihFeHRTeXN0ZW0uY2xhc3MpLCAiRXh0U3lzdGVtIiwgZmFsc2UpOworCQllbnRpdHlDb25maWdSZXBvc2l0b3J5LnJlZ2lzdGVyKGV4dFN5c3RlbUNvbmZpZyk7CisKKwkJTE9HR0VSLmRlYnVnKCJFbnRpdHkgY29uZmlndXJhdGlvbnMgbG9hZGVkIGluIHt9IG1zLiIsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnQpOworCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeTsKKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ31zIHJlcXVpcmVkIGZvciB7QGxpbmsgQ29udGV4dFJvb3R9IHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqLworCXByaXZhdGUgdm9pZCByZWdpc3RlckNvbnRleHRSb290KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCUVudGl0eUNvbmZpZzxDb250ZXh0Um9vdD4gY29udGV4dFJvb3RDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oQ29udGV4dFJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSwKKwkJCQlPRFNVdGlscy5DT05URVhUVFlQRVMuZ2V0KGNvbnRleHRUeXBlKSwgdHJ1ZSk7CisJCWNvbnRleHRSb290Q29uZmlnLmFkZE1hbmRhdG9yeShlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRSb290KG5ldyBLZXk8PihUZW1wbGF0ZVJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSkpOworCQlmb3IgKFJlbGF0aW9uIGNvbnRleHRDb21wb25lbnRSZWxhdGlvbiA6IGNvbnRleHRSb290Q29uZmlnLmdldEVudGl0eVR5cGUoKS5nZXRDaGlsZFJlbGF0aW9ucygpKSB7CisJCQlFbnRpdHlUeXBlIGNvbnRleHRDb21wb25lbnRFbnRpdHlUeXBlID0gY29udGV4dENvbXBvbmVudFJlbGF0aW9uLmdldFRhcmdldCgpOworCQkJRW50aXR5Q29uZmlnPENvbnRleHRDb21wb25lbnQ+IGNvbnRleHRDb21wb25lbnRDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLAorCQkJCQluZXcgS2V5PD4oQ29udGV4dENvbXBvbmVudC5jbGFzcywgY29udGV4dFR5cGUpLCBjb250ZXh0Q29tcG9uZW50RW50aXR5VHlwZS5nZXROYW1lKCksIHRydWUpOworCQkJY29udGV4dENvbXBvbmVudENvbmZpZworCQkJCQkuYWRkSW5oZXJpdGVkKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZEltcGxpY2l0KG5ldyBLZXk8PihUZW1wbGF0ZUNvbXBvbmVudC5jbGFzcywgY29udGV4dFR5cGUpKSk7CisJCQljb250ZXh0Um9vdENvbmZpZy5hZGRDaGlsZChjb250ZXh0Q29tcG9uZW50Q29uZmlnKTsKKwkJCWlmIChjb250ZXh0VHlwZS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJCWZvciAoUmVsYXRpb24gY29udGV4dFNlbnNvclJlbGF0aW9uIDogY29udGV4dENvbXBvbmVudEVudGl0eVR5cGUuZ2V0Q2hpbGRSZWxhdGlvbnMoKSkgeworCQkJCQlFbnRpdHlUeXBlIGNvbnRleHRTZW5zb3JFbnRpdHlUeXBlID0gY29udGV4dFNlbnNvclJlbGF0aW9uLmdldFRhcmdldCgpOworCQkJCQlFbnRpdHlDb25maWc8Q29udGV4dFNlbnNvcj4gY29udGV4dFNlbnNvckNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJCQkJbmV3IEtleTw+KENvbnRleHRTZW5zb3IuY2xhc3MpLCBjb250ZXh0U2Vuc29yRW50aXR5VHlwZS5nZXROYW1lKCksIHRydWUpOworCQkJCQljb250ZXh0U2Vuc29yQ29uZmlnCisJCQkJCQkJLmFkZEluaGVyaXRlZChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRJbXBsaWNpdChuZXcgS2V5PD4oVGVtcGxhdGVTZW5zb3IuY2xhc3MpKSk7CisJCQkJCWNvbnRleHRDb21wb25lbnRDb25maWcuYWRkQ2hpbGQoY29udGV4dFNlbnNvckNvbmZpZyk7CisJCQkJfQorCQkJfQorCQl9CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY29udGV4dFJvb3RDb25maWcpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfXMgcmVxdWlyZWQgZm9yIHtAbGluayBUZW1wbGF0ZVJvb3R9IHdpdGggZ2l2ZW4KKwkgKiB7QGxpbmsgQ29udGV4dFR5cGV9LgorCSAqCisJICogQHBhcmFtIGNvbnRleHRUeXBlIFRoZSB7QGNvZGUgQ29udGV4dFR5cGV9LgorCSAqLworCXByaXZhdGUgdm9pZCByZWdpc3RlclRlbXBsYXRlUm9vdChPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBDb250ZXh0VHlwZSBjb250ZXh0VHlwZSkgeworCQlTdHJpbmcgb2RzTmFtZSA9IE9EU1V0aWxzLkNPTlRFWFRUWVBFUy5nZXQoY29udGV4dFR5cGUpOworCQlFbnRpdHlDb25maWc8VGVtcGxhdGVBdHRyaWJ1dGU+IHRlbXBsYXRlQXR0cmlidXRlQ29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwKKwkJCQluZXcgS2V5PD4oVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MsIGNvbnRleHRUeXBlKSwgIlRwbCIgKyBvZHNOYW1lICsgIkF0dHIiLCB0cnVlKTsKKwkJdGVtcGxhdGVBdHRyaWJ1dGVDb25maWcKKwkJCQkuYWRkSW5oZXJpdGVkKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZEltcGxpY2l0KG5ldyBLZXk8PihDYXRhbG9nQXR0cmlidXRlLmNsYXNzLCBjb250ZXh0VHlwZSkpKTsKKwkJdGVtcGxhdGVBdHRyaWJ1dGVDb25maWcuc2V0Q29tcGFyYXRvcihUZW1wbGF0ZUF0dHJpYnV0ZS5DT01QQVJBVE9SKTsKKwkJRW50aXR5Q29uZmlnPFRlbXBsYXRlQ29tcG9uZW50PiB0ZW1wbGF0ZUNvbXBvbmVudENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJbmV3IEtleTw+KFRlbXBsYXRlQ29tcG9uZW50LmNsYXNzLCBjb250ZXh0VHlwZSksICJUcGwiICsgb2RzTmFtZSArICJDb21wIiwgdHJ1ZSk7CisJCXRlbXBsYXRlQ29tcG9uZW50Q29uZmlnLmFkZENoaWxkKHRlbXBsYXRlQXR0cmlidXRlQ29uZmlnKTsKKwkJdGVtcGxhdGVDb21wb25lbnRDb25maWcKKwkJCQkuYWRkTWFuZGF0b3J5KGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KENhdGFsb2dDb21wb25lbnQuY2xhc3MsIGNvbnRleHRUeXBlKSkpOworCQl0ZW1wbGF0ZUNvbXBvbmVudENvbmZpZy5hZGRDaGlsZCh0ZW1wbGF0ZUNvbXBvbmVudENvbmZpZyk7CisJCXRlbXBsYXRlQ29tcG9uZW50Q29uZmlnLnNldENvbXBhcmF0b3IoU29ydGFibGUuQ09NUEFSQVRPUik7CisJCWlmIChjb250ZXh0VHlwZS5pc1Rlc3RFcXVpcG1lbnQoKSkgeworCQkJRW50aXR5Q29uZmlnPFRlbXBsYXRlQXR0cmlidXRlPiB0ZW1wbGF0ZVNlbnNvckF0dHJpYnV0ZUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJCW5ldyBLZXk8PihUZW1wbGF0ZUF0dHJpYnV0ZS5jbGFzcyksICJUcGxTZW5zb3JBdHRyIiwgdHJ1ZSk7CisJCQl0ZW1wbGF0ZVNlbnNvckF0dHJpYnV0ZUNvbmZpZy5zZXRDb21wYXJhdG9yKFRlbXBsYXRlQXR0cmlidXRlLkNPTVBBUkFUT1IpOworCQkJdGVtcGxhdGVTZW5zb3JBdHRyaWJ1dGVDb25maWcKKwkJCQkJLmFkZEluaGVyaXRlZChlbnRpdHlDb25maWdSZXBvc2l0b3J5LmZpbmRJbXBsaWNpdChuZXcgS2V5PD4oQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcykpKTsKKwkJCUVudGl0eUNvbmZpZzxUZW1wbGF0ZVNlbnNvcj4gdGVtcGxhdGVTZW5zb3JDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oVGVtcGxhdGVTZW5zb3IuY2xhc3MpLAorCQkJCQkiVHBsU2Vuc29yIiwgdHJ1ZSk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5hZGRDaGlsZCh0ZW1wbGF0ZVNlbnNvckF0dHJpYnV0ZUNvbmZpZyk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5hZGRNYW5kYXRvcnkoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oUXVhbnRpdHkuY2xhc3MpKSk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5hZGRJbmhlcml0ZWQoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kSW1wbGljaXQobmV3IEtleTw+KENhdGFsb2dTZW5zb3IuY2xhc3MpKSk7CisJCQl0ZW1wbGF0ZVNlbnNvckNvbmZpZy5zZXRDb21wYXJhdG9yKFNvcnRhYmxlLkNPTVBBUkFUT1IpOworCQkJdGVtcGxhdGVDb21wb25lbnRDb25maWcuYWRkQ2hpbGQodGVtcGxhdGVTZW5zb3JDb25maWcpOworCQl9CisJCUVudGl0eUNvbmZpZzxUZW1wbGF0ZVJvb3Q+IHRlbXBsYXRlUm9vdENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsIG5ldyBLZXk8PihUZW1wbGF0ZVJvb3QuY2xhc3MsIGNvbnRleHRUeXBlKSwKKwkJCQkiVHBsIiArIG9kc05hbWUgKyAiUm9vdCIsIHRydWUpOworCQl0ZW1wbGF0ZVJvb3RDb25maWcuYWRkQ2hpbGQodGVtcGxhdGVDb21wb25lbnRDb25maWcpOworCQl0ZW1wbGF0ZVJvb3RDb25maWcuc2V0Q29tcGFyYXRvcihWZXJzaW9uYWJsZS5DT01QQVJBVE9SKTsKKwkJZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5yZWdpc3Rlcih0ZW1wbGF0ZVJvb3RDb25maWcpOworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfXMgcmVxdWlyZWQgZm9yIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSB3aXRoCisJICogZ2l2ZW4ge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0Bjb2RlIENvbnRleHRUeXBlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJDYXRhbG9nQ29tcG9uZW50KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCVN0cmluZyBvZHNOYW1lID0gT0RTVXRpbHMuQ09OVEVYVFRZUEVTLmdldChjb250ZXh0VHlwZSk7CisJCUVudGl0eUNvbmZpZzxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlQ29uZmlnID0gY3JlYXRlKG1vZGVsTWFuYWdlciwKKwkJCQluZXcgS2V5PD4oQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcywgY29udGV4dFR5cGUpLCAiQ2F0IiArIG9kc05hbWUgKyAiQXR0ciIsIHRydWUpOworCQljYXRhbG9nQXR0cmlidXRlQ29uZmlnLmFkZE9wdGlvbmFsKGVudGl0eUNvbmZpZ1JlcG9zaXRvcnkuZmluZFJvb3QobmV3IEtleTw+KFZhbHVlTGlzdC5jbGFzcykpKTsKKwkJY2F0YWxvZ0F0dHJpYnV0ZUNvbmZpZy5zZXRDb21wYXJhdG9yKFNvcnRhYmxlLkNPTVBBUkFUT1IpOworCQlFbnRpdHlDb25maWc8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudENvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJbmV3IEtleTw+KENhdGFsb2dDb21wb25lbnQuY2xhc3MsIGNvbnRleHRUeXBlKSwgIkNhdCIgKyBvZHNOYW1lICsgIkNvbXAiLCB0cnVlKTsKKwkJY2F0YWxvZ0NvbXBvbmVudENvbmZpZy5hZGRDaGlsZChjYXRhbG9nQXR0cmlidXRlQ29uZmlnKTsKKwkJaWYgKGNvbnRleHRUeXBlLmlzVGVzdEVxdWlwbWVudCgpKSB7CisJCQlFbnRpdHlDb25maWc8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ1NlbnNvckF0dHJpYnV0ZUNvbmZpZyA9IGNyZWF0ZShtb2RlbE1hbmFnZXIsCisJCQkJCW5ldyBLZXk8PihDYXRhbG9nQXR0cmlidXRlLmNsYXNzKSwgIkNhdFNlbnNvckF0dHIiLCB0cnVlKTsKKwkJCWNhdGFsb2dTZW5zb3JBdHRyaWJ1dGVDb25maWcuYWRkT3B0aW9uYWwoZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChuZXcgS2V5PD4oVmFsdWVMaXN0LmNsYXNzKSkpOworCQkJRW50aXR5Q29uZmlnPENhdGFsb2dTZW5zb3I+IGNhdGFsb2dTZW5zb3JDb25maWcgPSBjcmVhdGUobW9kZWxNYW5hZ2VyLCBuZXcgS2V5PD4oQ2F0YWxvZ1NlbnNvci5jbGFzcyksCisJCQkJCSJDYXRTZW5zb3IiLCB0cnVlKTsKKwkJCWNhdGFsb2dTZW5zb3JDb25maWcuYWRkQ2hpbGQoY2F0YWxvZ1NlbnNvckF0dHJpYnV0ZUNvbmZpZyk7CisJCQljYXRhbG9nQ29tcG9uZW50Q29uZmlnLmFkZENoaWxkKGNhdGFsb2dTZW5zb3JDb25maWcpOworCQl9CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkucmVnaXN0ZXIoY2F0YWxvZ0NvbXBvbmVudENvbmZpZyk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRW50aXR5Q29uZmlnfS4KKwkgKgorCSAqIEBwYXJhbSAgICAgICAgICAgIDxUPiBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGtleSAgICAgICAgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEBwYXJhbSB0eXBlTmFtZSAgIE5hbWUgb2YgdGhlIGFzc29jaWF0ZWQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBhcHBlbmROYW1lIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gYXBwZW5kIHRoZSBlbnRpdHkgdHlwZXMgYmFzZSBuYW1lCisJICogICAgICAgICAgICAgICAgICAgdG8gdGhlIE1JTUUgdHlwZS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IEVudGl0eUNvbmZpZzxUPiBjcmVhdGUoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgS2V5PFQ+IGtleSwgU3RyaW5nIHR5cGVOYW1lLAorCQkJYm9vbGVhbiBhcHBlbmROYW1lKSB7CisJCUVudGl0eUNvbmZpZzxUPiBlbnRpdHlDb25maWcgPSBuZXcgRW50aXR5Q29uZmlnPD4oa2V5KTsKKwkJT0RTRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gKE9EU0VudGl0eVR5cGUpIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKHR5cGVOYW1lKTsKKwkJZW50aXR5Q29uZmlnLnNldEVudGl0eVR5cGUoZW50aXR5VHlwZSk7CisJCWVudGl0eUNvbmZpZy5zZXRNaW1lVHlwZShidWlsZERlZmF1bHRNaW1lVHlwZShlbnRpdHlUeXBlLCBhcHBlbmROYW1lKSk7CisJCXJldHVybiBlbnRpdHlDb25maWc7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIGRlZmF1bHQgTUlNRSB0eXBlIGZvciBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBhcHBlbmROYW1lIEZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gYXBwZW5kIHRoZSBlbnRpdHkgdHlwZXMgYmFzZSBuYW1lCisJICogICAgICAgICAgICAgICAgICAgdG8gdGhlIE1JTUUgdHlwZS4KKwkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIE1JTUUgdHlwZSB7QGNvZGUgU3RyaW5nfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRNaW1lVHlwZShPRFNFbnRpdHlUeXBlIGVudGl0eVR5cGUsIGJvb2xlYW4gYXBwZW5kTmFtZSkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJc2IuYXBwZW5kKCJhcHBsaWNhdGlvbi94LWFzYW0uIik7CisJCXNiLmFwcGVuZChlbnRpdHlUeXBlLmdldEJhc2VOYW1lKCkudG9Mb3dlckNhc2UoTG9jYWxlLlJPT1QpKTsKKwkJaWYgKGFwcGVuZE5hbWUpIHsKKwkJCXNiLmFwcGVuZCgnLicpLmFwcGVuZChlbnRpdHlUeXBlLmdldE5hbWUoKS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCkpOworCQl9CisJCXJldHVybiBzYi50b1N0cmluZygpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0VudGl0eUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRW50aXR5Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5NWIzNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0VudGl0eUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzcyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlN0YXR1c0F0dGFjaGFibGU7CisKKy8qKgorICogRGVzY3JpYmVzIHRoZSBjb21wb3NpdGlvbiBvZiBhbiB7QGxpbmsgRW50aXR5fSB3aXRoIGl0cyBtYW5kYXRvcnksIG9wdGlvbmFsCisgKiBhbmQgY2hpbGQgcmVsYXRpb25zLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlDb25maWc8VCBleHRlbmRzIEVudGl0eT4geworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgTGlzdDxFbnRpdHlDb25maWc8PyBleHRlbmRzIERlbGV0YWJsZT4+IGNoaWxkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJcHJpdmF0ZSBmaW5hbCBMaXN0PEVudGl0eUNvbmZpZzw/Pj4gaW5oZXJpdGVkQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxFbnRpdHlDb25maWc8Pz4+IG1hbmRhdG9yeUNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8RW50aXR5Q29uZmlnPD8+PiBvcHRpb25hbENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgQ29tcGFyYXRvcjw/IHN1cGVyIFQ+IGNvbXBhcmF0b3IgPSBFbnRpdHkuQ09NUEFSQVRPUjsKKworCXByaXZhdGUgZmluYWwgS2V5PFQ+IGtleTsKKworCXByaXZhdGUgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJcHJpdmF0ZSBib29sZWFuIHJlZmxleGl2ZTsKKwlwcml2YXRlIFN0cmluZyBtaW1lVHlwZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBrZXkgVGhlIHtAbGluayBLZXl9IHRoaXMgZW50aXR5IGNvbmZpZyBpcyBib3VuZCB0by4KKwkgKi8KKwlwdWJsaWMgRW50aXR5Q29uZmlnKEtleTxUPiBrZXkpIHsKKwkJdGhpcy5rZXkgPSBrZXk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEtleX0gdGhpcyBlbnRpdHkgY29uZmlnIGlzIGJvdW5kIHRvLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEtleX0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEtleTxUPiBnZXRLZXkoKSB7CisJCXJldHVybiBrZXk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eX0gY2xhc3MuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgRW50aXR5fSBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgQ2xhc3M8VD4gZ2V0RW50aXR5Q2xhc3MoKSB7CisJCXJldHVybiBrZXkuZW50aXR5Q2xhc3M7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9IGNsYXNzLgorCSAqCisJICogQHJldHVybiBPcHRpb25hbCBpcyBlbXB0eSBpZiB7QGNvZGUgU3RhdHVzQXR0YWNoYWJsZX0gaXMgdW5kZWZpbmVkLgorCSAqLworCXB1YmxpYyBPcHRpb25hbDxDbGFzczw/IGV4dGVuZHMgU3RhdHVzQXR0YWNoYWJsZT4+IGdldFN0YXR1c0F0dGFjaGFibGVDbGFzcygpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoa2V5LnN0YXR1c0F0dGFjaGFibGVDbGFzcyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIENvbnRleHRUeXBlfS4KKwkgKgorCSAqIEByZXR1cm4gT3B0aW9uYWwgaXMgZW1wdHkge0Bjb2RlIENvbnRleHRUeXBlfSBpcyB1bmRlZmluZWQuCisJICovCisJcHVibGljIE9wdGlvbmFsPENvbnRleHRUeXBlPiBnZXRDb250ZXh0VHlwZSgpIHsKKwkJcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoa2V5LmNvbnRleHRUeXBlKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29tcGFyYXRvcn0gZm9yIHtAbGluayBFbnRpdHl9cyBhc3NvY2lhdGVkIHdpdGggdGhpcworCSAqIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQ29tcGFyYXRvcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIENvbXBhcmF0b3I8PyBzdXBlciBUPiBnZXRDb21wYXJhdG9yKCkgeworCQlyZXR1cm4gY29tcGFyYXRvcjsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5VHlwZX0gb2YgdGhpcyBlbnRpdHkgY29uZmlnLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eVR5cGV9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKSB7CisJCXJldHVybiBlbnRpdHlUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgTUlNRSB0eXBlIGZvciBhIG5ld2x5IGNyZWF0ZWQge0BsaW5rIEVudGl0eX0gYXNzb2NpYXRlZAorCSAqIHdpdGggdGhpcyBlbnRpdHkgY29uZmlnLgorCSAqCisJICogQHJldHVybiBUaGUgZGVmYXVsdCBNSU1FIHR5cGUgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZSgpIHsKKwkJcmV0dXJuIG1pbWVUeXBlOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlbGF0ZWQgY2hpbGQgY29uZmlncy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8RW50aXR5Q29uZmlnPD8gZXh0ZW5kcyBEZWxldGFibGU+PiBnZXRDaGlsZENvbmZpZ3MoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNoaWxkQ29uZmlncyk7CisJfQorCisJLyoqCisJICogUmV0dXJucyBhbGwgcmVsYXRlZCBpbmhlcml0ZWQgY29uZmlncy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8RW50aXR5Q29uZmlnPD8+PiBnZXRJbmhlcml0ZWRDb25maWdzKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChpbmhlcml0ZWRDb25maWdzKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGFsbCByZWxhdGVkIG1hbmRhdG9yeSBjb25maWdzLgorCSAqCisJICogQHJldHVybiBUaGUgcmV0dXJuZWQge0Bjb2RlIExpc3R9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTGlzdDxFbnRpdHlDb25maWc8Pz4+IGdldE1hbmRhdG9yeUNvbmZpZ3MoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1hbmRhdG9yeUNvbmZpZ3MpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYWxsIHJlbGF0ZWQgb3B0aW9uYWwgY29uZmlncy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIExpc3Q8RW50aXR5Q29uZmlnPD8+PiBnZXRPcHRpb25hbENvbmZpZ3MoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG9wdGlvbmFsQ29uZmlncyk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIge0BsaW5rIEVudGl0eX1zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudGl0eSBjb25maWcgbWF5IGhhdmUKKwkgKiBjaGlsZHJlbiBvZiB0aGUgc2FtZSB0eXBlLgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGVudGl0eSBjb25maWcgaXMgcmVmbGV4aXZlLgorCSAqLworCXB1YmxpYyBib29sZWFuIGlzUmVmbGV4aXZlKCkgeworCQlyZXR1cm4gcmVmbGV4aXZlOworCX0KKworCS8qKgorCSAqIFNldHMgYSBuZXcge0BsaW5rIENvbXBhcmF0b3J9IGZvciB0aGlzIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcGFyYW0gY29tcGFyYXRvciBUaGUgbmV3IHtAY29kZSBDb21wYXJhdG9yfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3I8PyBzdXBlciBUPiBjb21wYXJhdG9yKSB7CisJCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7CisJfQorCisJLyoqCisJICogU2V0cyB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGZvciB0aGlzIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUge0Bjb2RlIEVudGl0eVR5cGV9LgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgRW50aXR5VHlwZX0gaXMgYWxyZWFkeQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0RW50aXR5VHlwZShFbnRpdHlUeXBlIGVudGl0eVR5cGUpIHsKKwkJaWYgKHRoaXMuZW50aXR5VHlwZSAhPSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBvdmVycmlkZSB0aGUgZW50aXR5IHR5cGUuIik7CisJCX0KKworCQl0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGRlZmF1bHQgTUlNRSB0eXBlIGZvciBuZXdseSBjcmVhdGVkIHtAbGluayBFbnRpdHl9cyBhc3NvY2lhdGVkIHdpdGgKKwkgKiB0aGlzIGVudGl0eSBjb25maWcuCisJICoKKwkgKiBAcGFyYW0gbWltZVR5cGUgVGhlIGRlZmF1bHQgTUlNRSB0eXBlLgorCSAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIFRocm93biBpZiBkZWZhdWx0IE1JTUUgdHlwZSBpcyBhbHJlYWR5IGRlZmluZWQuCisJICovCisJcHVibGljIHZvaWQgc2V0TWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7CisJCWlmICh0aGlzLm1pbWVUeXBlICE9IG51bGwgJiYgIXRoaXMubWltZVR5cGUuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBNSU1FIHR5cGUuIik7CisJCX0KKworCQl0aGlzLm1pbWVUeXBlID0gbWltZVR5cGU7CisJfQorCisJLyoqCisJICogQWRkcyBhIHJlbGF0ZWQgaW5oZXJpdGVkIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIHZvaWQgYWRkSW5oZXJpdGVkKEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJaW5oZXJpdGVkQ29uZmlncy5hZGQoZW50aXR5Q29uZmlnKTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGEgcmVsYXRlZCBtYW5kYXRvcnkge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnIFRoZSB7QGNvZGUgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRNYW5kYXRvcnkoRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZykgeworCQltYW5kYXRvcnlDb25maWdzLmFkZChlbnRpdHlDb25maWcpOworCX0KKworCS8qKgorCSAqIEFkZHMgYSByZWxhdGVkIG9wdGlvbmFsIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIHZvaWQgYWRkT3B0aW9uYWwoRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZykgeworCQlvcHRpb25hbENvbmZpZ3MuYWRkKGVudGl0eUNvbmZpZyk7CisJfQorCisJLyoqCisJICogQWRkcyBhIHJlbGF0ZWQgY2hpbGQge0BsaW5rIEVudGl0eUNvbmZpZ30uCisJICoKKwkgKiBAcGFyYW0gY2hpbGRDb25maWcgVGhlIHtAY29kZSBFbnRpdHlDb25maWd9LgorCSAqLworCXB1YmxpYyB2b2lkIGFkZENoaWxkKEVudGl0eUNvbmZpZzw/IGV4dGVuZHMgRGVsZXRhYmxlPiBjaGlsZENvbmZpZykgeworCQlpZiAodGhpcyA9PSBjaGlsZENvbmZpZykgeworCQkJcmVmbGV4aXZlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWNoaWxkQ29uZmlncy5hZGQoY2hpbGRDb25maWcpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIElubmVyIGNsYXNzZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVc2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIHtAbGluayBFbnRpdHlDb25maWd9cy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgS2V5PFQgZXh0ZW5kcyBFbnRpdHk+IHsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJZmluYWwgQ2xhc3M8PyBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHN0YXR1c0F0dGFjaGFibGVDbGFzczsKKwkJZmluYWwgQ2xhc3M8VD4gZW50aXR5Q2xhc3M7CisJCWZpbmFsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUaGUge0BsaW5rIEVudGl0eX0gY2xhc3MuCisJCSAqLworCQlwdWJsaWMgS2V5KENsYXNzPFQ+IGVudGl0eUNsYXNzKSB7CisJCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCQlzdGF0dXNBdHRhY2hhYmxlQ2xhc3MgPSBudWxsOworCQkJY29udGV4dFR5cGUgPSBudWxsOworCQl9CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgICAgICAgICAgIFRoZSB7QGxpbmsgRW50aXR5fSBjbGFzcy4KKwkJICogQHBhcmFtIHN0YXR1c0F0dGFjaGFibGVDbGFzcyBUaGUge0BsaW5rIFN0YXR1c0F0dGFjaGFibGV9IGNsYXNzLgorCQkgKi8KKwkJcHVibGljIEtleShDbGFzczxUPiBlbnRpdHlDbGFzcywgQ2xhc3M8PyBleHRlbmRzIFN0YXR1c0F0dGFjaGFibGU+IHN0YXR1c0F0dGFjaGFibGVDbGFzcykgeworCQkJdGhpcy5zdGF0dXNBdHRhY2hhYmxlQ2xhc3MgPSBzdGF0dXNBdHRhY2hhYmxlQ2xhc3M7CisJCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCQljb250ZXh0VHlwZSA9IG51bGw7CisJCX0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUaGUge0BsaW5rIEVudGl0eX0gY2xhc3MuCisJCSAqIEBwYXJhbSBjb250ZXh0VHlwZSBUaGUge0BsaW5rIENvbnRleHRUeXBlfS4KKwkJICovCisJCXB1YmxpYyBLZXkoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCQl0aGlzLmNvbnRleHRUeXBlID0gY29udGV4dFR5cGU7CisJCQlzdGF0dXNBdHRhY2hhYmxlQ2xhc3MgPSBudWxsOworCQl9CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQdWJsaWMgbWV0aG9kcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworCQkJcmV0dXJuIE9iamVjdHMuaGFzaChlbnRpdHlDbGFzcywgc3RhdHVzQXR0YWNoYWJsZUNsYXNzLCBjb250ZXh0VHlwZSk7CisJCX0KKworCQkvKioKKwkJICoge0Bpbmhlcml0RG9jfQorCQkgKi8KKwkJQE92ZXJyaWRlCisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCQkvLyByZWZlcmVuY2UgY2hlY2sgKHRoaXMgPT0gb2JqZWN0KSBvbWl0dGVkCisJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgS2V5KSB7CisJCQkJS2V5PD8+IG90aGVyID0gKEtleTw/Pikgb2JqZWN0OworCQkJCXJldHVybiBPYmplY3RzLmVxdWFscyhlbnRpdHlDbGFzcywgb3RoZXIuZW50aXR5Q2xhc3MpCisJCQkJCQkmJiBPYmplY3RzLmVxdWFscyhzdGF0dXNBdHRhY2hhYmxlQ2xhc3MsIG90aGVyLnN0YXR1c0F0dGFjaGFibGVDbGFzcykKKwkJCQkJCSYmIE9iamVjdHMuZXF1YWxzKGNvbnRleHRUeXBlLCBvdGhlci5jb250ZXh0VHlwZSk7CisJCQl9CisKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qKgorCQkgKiB7QGluaGVyaXREb2N9CisJCSAqLworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihlbnRpdHlDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworCisJCQlpZiAoc3RhdHVzQXR0YWNoYWJsZUNsYXNzICE9IG51bGwpIHsKKwkJCQlzYi5hcHBlbmQoJ18nKS5hcHBlbmQoc3RhdHVzQXR0YWNoYWJsZUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisJCQl9CisKKwkJCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7CisJCQkJc2IuYXBwZW5kKCdfJykuYXBwZW5kKGNvbnRleHRUeXBlKTsKKwkJCX0KKworCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRW50aXR5Q29uZmlnUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL2xvb2t1cC9jb25maWcvRW50aXR5Q29uZmlnUmVwb3NpdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDc5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9FbnRpdHlDb25maWdSZXBvc2l0b3J5LmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFJvb3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworCisvKioKKyAqIFJlcG9zaXRvcnkgZm9yIHtAbGluayBFbnRpdHlDb25maWd9cy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8vIHJvb3QgdHlwZXMKKwlwcml2YXRlIGZpbmFsIE1hcDxLZXk8Pz4sIEVudGl0eUNvbmZpZzw/Pj4gZW50aXR5Q29uZmlncyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCS8vIGNoaWxkIHR5cGVzIChpbXBsaWNpdCBsb2FkIG9ubHkhKQorCXByaXZhdGUgZmluYWwgTWFwPEtleTw/PiwgRW50aXR5Q29uZmlnPD8+PiBjaGlsZENvbmZpZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFbnRpdHlDb25maWc8Pz4+IGNvbnRleHRDb25maWdzID0gbmV3IEhhc2hNYXA8PigpOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBLZXl9LiBUaGlzCisJICogbWV0aG9kIHRyaWVzIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIEVudGl0eUNvbmZpZ30gaW4gdGhlIHJvb3QKKwkgKiBjb25maWd1cmF0aW9ucy4gSWYgaXQgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGVuIGl0IHRyaWVzIHRvIGZpbmQgaXQgaW4gdGhlCisJICogY2hpbGQge0Bjb2RlIEVudGl0eUNvbmZpZ31zLgorCSAqCisJICogQHBhcmFtIDxUPiBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGtleSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBmaW5kIGFzc29jaWF0ZWQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgRW50aXR5Q29uZmlnfS4KKwkgKi8KKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IEVudGl0eUNvbmZpZzxUPiBmaW5kKEtleTxUPiBrZXkpIHsKKwkJT3B0aW9uYWw8RW50aXR5Q29uZmlnPFQ+PiBlbnRpdHlDb25maWcgPSBnZXQoZW50aXR5Q29uZmlncywga2V5KTsKKwkJaWYgKGVudGl0eUNvbmZpZy5pc1ByZXNlbnQoKSkgeworCQkJcmV0dXJuIGVudGl0eUNvbmZpZy5nZXQoKTsKKwkJfQorCisJCXJldHVybiBnZXQoY2hpbGRDb25maWdzLCBrZXkpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudGl0eSBjb25maWd1cmF0aW9uIG5vdCBmb3VuZC4iKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBLZXl9LiBUaGlzCisJICogbWV0aG9kIHRyaWVzIHRvIGZpbmQgdGhlIGFzc29jaWF0ZWQge0Bjb2RlIEVudGl0eUNvbmZpZ30gaW4gdGhlIHJvb3QKKwkgKiBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZmluZCBhc3NvY2lhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlDb25maWc8VD4gZmluZFJvb3QoS2V5PFQ+IGtleSkgeworCQlyZXR1cm4gZ2V0KGVudGl0eUNvbmZpZ3MsIGtleSkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kLiIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEtleX0uIFRoaXMKKwkgKiBtZXRob2QgdHJpZXMgdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB7QGNvZGUgRW50aXR5Q29uZmlnfSBpbiB0aGUgY2hpbGQKKwkgKiBjb25maWd1cmF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZmluZCBhc3NvY2lhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlDb25maWc8VD4gZmluZEltcGxpY2l0KEtleTxUPiBrZXkpIHsKKwkJcmV0dXJuIGdldChjaGlsZENvbmZpZ3MsIGtleSkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvbmZpZ3VyYXRpb24gbm90IGZvdW5kLiIpKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfSBhc3NvY2lhdGVkIHdpdGggZ2l2ZW4ge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgSXRzIG5hbWUgaXMgdXNlZCBhcyBpZGVudGlmaWVyLgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gZmluZCBhc3NvY2lhdGVkCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICovCisJcHVibGljIEVudGl0eUNvbmZpZzw/PiBmaW5kKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlPcHRpb25hbDxFbnRpdHlDb25maWc8Pz4+IGVudGl0eUNvbmZpZyA9IGVudGl0eUNvbmZpZ3MudmFsdWVzKCkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKGVjIC0+IGVjLmdldEVudGl0eVR5cGUoKS5lcXVhbHMoZW50aXR5VHlwZSkpLmZpbmRGaXJzdCgpOworCQlpZiAoZW50aXR5Q29uZmlnLmlzUHJlc2VudCgpKSB7CisJCQkvLyBlbnRpdHkgY29uZmlnIGlzIGEgcm9vdCB0eXBlCisJCQlyZXR1cm4gZW50aXR5Q29uZmlnLmdldCgpOworCQl9CisKKwkJZW50aXR5Q29uZmlnID0gY2hpbGRDb25maWdzLnZhbHVlcygpLnN0cmVhbSgpLmZpbHRlcihlYyAtPiBlYy5nZXRFbnRpdHlUeXBlKCkuZXF1YWxzKGVudGl0eVR5cGUpKS5maW5kRmlyc3QoKTsKKwkJaWYgKGVudGl0eUNvbmZpZy5pc1ByZXNlbnQoKSkgeworCQkJLy8gZW50aXR5IGNvbmZpZyBpcyBhbiBpbXBsaWNpdGx5IGxvYWRlZCBjaGlsZCB0eXBlCisJCQlyZXR1cm4gZW50aXR5Q29uZmlnLmdldCgpOworCQl9CisKKwkJRW50aXR5Q29uZmlnPD8+IGNvbmZpZyA9IGNvbnRleHRDb25maWdzLmdldChlbnRpdHlUeXBlLmdldE5hbWUoKSk7CisJCWlmIChjb25maWcgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvbmZpZ3VyYXRpb24gZm9yIHR5cGUgJyIgKyBlbnRpdHlUeXBlICsgIicgbm90IGZvdW5kLiIpOworCQl9CisKKwkJLy8gY29uZmlnIGlzIGVpdGhlciBhIGNvbnRleHQgY29tcG9uZW50IG9yIGNvbnRleHQgc2Vuc29yIHR5cGUKKwkJcmV0dXJuIGNvbmZpZzsKKwl9CisKKwkvKioKKwkgKiBTdG9yZXMgZ2l2ZW4ge0BsaW5rIEVudGl0eUNvbmZpZ30gaW4gdGhpcyByZXBvc2l0b3J5LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGF0dGVtcHQgdG8gb3ZlcndyaXRlIGFuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmVjb3JkZWQuCisJICovCisJcHVibGljIHZvaWQgcmVnaXN0ZXIoRW50aXR5Q29uZmlnPD8+IGVudGl0eUNvbmZpZykgeworCQlyZWdpc3RlckNoaWxkQ29uZmlncyhlbnRpdHlDb25maWcpOworCisJCUVudGl0eUNvbmZpZzw/PiBjdXJyZW50QnlDbGFzcyA9IGVudGl0eUNvbmZpZ3MucHV0KGVudGl0eUNvbmZpZy5nZXRLZXkoKSwgZW50aXR5Q29uZmlnKTsKKwkJaWYgKGN1cnJlbnRCeUNsYXNzICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkl0IGlzIG5vdCBhbGxvd2VkIHRvIG92ZXJ3cml0ZSBleGlzdGluZyBjb25maWd1cmF0aW9ucy4iKTsKKwkJfQorCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZWN1cnNpdmVseSByZWdpc3RlcnMgYWxsIGNoaWxkIGNvbmZpZ3VyYXRpb25zIG9mIGdpdmVuIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqCisJICogQHBhcmFtIGVudGl0eUNvbmZpZyBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30uCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGFuIGF0dGVtcHQgdG8gb3ZlcndyaXRlIGFuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmVjb3JkZWQuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyQ2hpbGRDb25maWdzKEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MgPSBlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKTsKKwkJaWYgKENvbnRleHRSb290LmNsYXNzLmVxdWFscyhlbnRpdHlDbGFzcykgfHwgQ29udGV4dENvbXBvbmVudC5jbGFzcy5lcXVhbHMoZW50aXR5Q2xhc3MpKSB7CisJCQlmb3IgKEVudGl0eUNvbmZpZzw/PiBjaGlsZENvbmZpZyA6IGVudGl0eUNvbmZpZy5nZXRDaGlsZENvbmZpZ3MoKSkgeworCQkJCWlmIChjb250ZXh0Q29uZmlncy5wdXQoY2hpbGRDb25maWcuZ2V0RW50aXR5VHlwZSgpLmdldE5hbWUoKSwgY2hpbGRDb25maWcpICE9IG51bGwpIHsKKwkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSXQgaXMgbm90IGFsbG93ZWQgdG8gb3ZlcndyaXRlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb25zLiIpOworCQkJCX0KKworCQkJCXJlZ2lzdGVyQ2hpbGRDb25maWdzKGNoaWxkQ29uZmlnKTsKKwkJCX0KKworCQkJcmV0dXJuOworCQl9CisJCWZvciAoRW50aXR5Q29uZmlnPD8+IGNoaWxkQ29uZmlnIDogZW50aXR5Q29uZmlnLmdldENoaWxkQ29uZmlncygpKSB7CisJCQlpZiAoY2hpbGRDb25maWdzLnB1dChjaGlsZENvbmZpZy5nZXRLZXkoKSwgY2hpbGRDb25maWcpICE9IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJdCBpcyBub3QgYWxsb3dlZCB0byBvdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlndXJhdGlvbnMuIik7CisJCQl9CisKKwkJCXJlZ2lzdGVyQ2hpbGRDb25maWdzKGNoaWxkQ29uZmlnKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIEVudGl0eUNvbmZpZ30gYXNzb2NpYXRlZCB3aXRoIGdpdmVuIHtAbGluayBLZXl9IGZyb20KKwkgKiBnaXZlbiB7QGNvZGUgTWFwfS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gICAgICAgICAgIFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlncyBVc2VkIHRvIHJldHJpZXZlIHJlcXVlc3RlZCB7QGNvZGUgRW50aXR5Q29uZmlnfS4KKwkgKiBAcGFyYW0ga2V5ICAgICAgICAgICBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiB7QGNvZGUgT3B0aW9uYWx9IGlzIGVtcHR5IGlmIHtAY29kZSBFbnRpdHlDb25maWd9IG5vdCBmb3VuZC4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIEVudGl0eT4gT3B0aW9uYWw8RW50aXR5Q29uZmlnPFQ+PiBnZXQoTWFwPEtleTw/PiwgRW50aXR5Q29uZmlnPD8+PiBlbnRpdHlDb25maWdzLAorCQkJS2V5PFQ+IGtleSkgeworCQlyZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZSgoRW50aXR5Q29uZmlnPFQ+KSBlbnRpdHlDb25maWdzLmdldChrZXkpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9FbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbG9va3VwL2NvbmZpZy9FbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRjNTIxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9sb29rdXAvY29uZmlnL0VudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworCitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgeworCisJLyoqCisJICogTG9hZHMgdGhlIHtAbGluayBFbnRpdHlDb25maWdSZXBvc2l0b3J5fS4KKwkgKiAKKwkgKiBAcmV0dXJuCisJICovCisJRW50aXR5Q29uZmlnUmVwb3NpdG9yeSBsb2FkRW50aXR5Q29uZmlndXJhdGlvbnMoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcik7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL05vdGlmaWNhdGlvbkVudGl0eUxvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FbnRpdHlMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTM1Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9Ob3RpZmljYXRpb25FbnRpdHlMb2FkZXIuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0RGVzY3JpYmFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQ29tcGFyaXNvbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkpvaW5UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBOb3RpZmljYXRpb25FbnRpdHlMb2FkZXIgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5vdGlmaWNhdGlvbkVudGl0eUxvYWRlci5jbGFzcyk7CisKKwlwcml2YXRlIGZpbmFsIE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXI7CisJcHJpdmF0ZSBmaW5hbCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCXByaXZhdGUgZmluYWwgRW50aXR5TG9hZGVyIGxvYWRlcjsKKworCXByaXZhdGUgYm9vbGVhbiBsb2FkQ29udGV4dERlc2NyaWJhYmxlOworCisJcHVibGljIE5vdGlmaWNhdGlvbkVudGl0eUxvYWRlcihPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLAorCQkJYm9vbGVhbiBsb2FkQ29udGV4dERlc2NyaWJhYmxlKSB7CisJCXRoaXMubW9kZWxNYW5hZ2VyID0gbW9kZWxNYW5hZ2VyOworCQl0aGlzLnF1ZXJ5U2VydmljZSA9IHF1ZXJ5U2VydmljZTsKKwkJdGhpcy5sb2FkZXIgPSBuZXcgRW50aXR5TG9hZGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlKTsKKwkJdGhpcy5sb2FkQ29udGV4dERlc2NyaWJhYmxlID0gbG9hZENvbnRleHREZXNjcmliYWJsZTsKKwl9CisKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgbG9hZChLZXk8VD4ga2V5LCBTdHJpbmcgdXNlcklkKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBsb2FkZXIubG9hZChrZXksIHVzZXJJZCk7CisJfQorCisJcHVibGljIExpc3Q8PyBleHRlbmRzIEVudGl0eT4gbG9hZEVudGl0aWVzKFN0cmluZyBhaWQsIExpc3Q8U3RyaW5nPiBpZHMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGxvYWRFbnRpdGllcyhtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShhaWQpLCBpZHMpOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIGVudGl0eSB0eXBlIG9mIHRoZSBlbnRpdGllcyB0byBsb2FkLgorCSAqIEBwYXJhbSBpZHMgICAgICAgIElEcyBvZiB0aGUgZW50aXRpZXMgdG8gbG9hZC4KKwkgKiBAcmV0dXJuIGxvYWRlZCBlbnRpdGllcy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3cgaWYgdGhlIGVudGl0aWVzIGNhbm5vdCBiZSBsb2FkZWQuCisJICovCisJcHVibGljIExpc3Q8PyBleHRlbmRzIEVudGl0eT4gbG9hZEVudGl0aWVzKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgTGlzdDxTdHJpbmc+IGlkcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCisJCWlmIChpZHMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCX0KKworCQlFbnRpdHlDb25maWc8Pz4gY29uZmlnID0gZ2V0RW50aXR5Q29uZmlnKGVudGl0eVR5cGUpOworCisJCWlmIChjb25maWcgPT0gbnVsbCB8fCBpc0xvYWRDb250ZXh0RGVzY3JpYmFibGUoY29uZmlnKSkgeworCQkJLy8gZW50aXR5VHlwZSBub3QgbW9kZWxsZWQgaW4gTURNLCB0cnkgdG8gbG9hZCBpdHMKKwkJCS8vIENvbnRleHREZXNjcmliYWJsZSBpZiBpdCBpcyBhIENvbnRleHRSb290L0NvbnRleHRDb21wb25lbnQKKwkJCWZpbmFsIEVudGl0eVR5cGUgdGVzdFN0ZXAgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShUZXN0U3RlcC5jbGFzcyk7CisJCQlmaW5hbCBFbnRpdHlUeXBlIG1lYXN1cmVtZW50ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoTWVhc3VyZW1lbnQuY2xhc3MpOworCisJCQlpZiAoaGFzUmVsYXRpb25UbyhlbnRpdHlUeXBlLCB0ZXN0U3RlcCwgbWVhc3VyZW1lbnQpKSB7CisJCQkJcmV0dXJuIGxvYWRFbnRpdHlGb3JDb250ZXh0Um9vdChlbnRpdHlUeXBlLCBpZHMpOworCQkJfSBlbHNlIGlmIChoYXNSZWxhdGlvblRvKGVudGl0eVR5cGUsIG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKCJVbml0VW5kZXJUZXN0IiksCisJCQkJCW1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKCJUZXN0U2VxdWVuY2UiKSwgbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoIlRlc3RFcXVpcG1lbnQiKSkpIHsKKwkJCQlyZXR1cm4gbG9hZEVudGl0eUZvckNvbnRleHRDb21wb25lbnQoZW50aXR5VHlwZSwgaWRzKTsKKwkJCX0gZWxzZSB7CisJCQkJTE9HR0VSLmRlYnVnKCJDYW5ub3QgbG9hZCBlbnRpdGlzIGZvciBlbnRpdHlUeXBlICIgKyBlbnRpdHlUeXBlICsgIiBhbmQgaWRzICIgKyBpZHMpOworCQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBsb2FkZXIubG9hZEFsbChjb25maWcuZ2V0S2V5KCksIGlkcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBMb2FkcyB0aGUgQ29udGV4dERlc2NyaWJhYmxlcyB0byB0aGUgZ2l2ZW4gY29udGV4dCByb290IGluc3RhbmNlcworCSAqIAorCSAqIEBwYXJhbSBjb250ZXh0Um9vdCBlbnRpdHlUeXBlIG9mIHRoZSBjb250ZXh0IHJvb3QKKwkgKiBAcGFyYW0gaWRzICAgICAgICAgSURzIG9mIHRoZSBjb250ZXh0IHJvb3RzLgorCSAqIEByZXR1cm4gdGhlIGxvYWRlZCBDb250ZXh0RGVzY3JpYmFibGVzCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93IGlmIHRoZSBDb250ZXh0RGVzY3JpYmFibGVzIGNhbm5vdCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuCisJICovCisJcHJpdmF0ZSBMaXN0PENvbnRleHREZXNjcmliYWJsZT4gbG9hZEVudGl0eUZvckNvbnRleHRSb290KEVudGl0eVR5cGUgY29udGV4dFJvb3QsIExpc3Q8U3RyaW5nPiBpZHMpCisJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJZmluYWwgRW50aXR5VHlwZSB0ZXN0U3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKwkJZmluYWwgRW50aXR5VHlwZSBtZWFzdXJlbWVudCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKworCQlMaXN0PFN0cmluZz4gdGVzdFN0ZXBJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRCh0ZXN0U3RlcCkKKwkJCQkuam9pbih0ZXN0U3RlcC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5mZXRjaChGaWx0ZXIuYW5kKCkuYWRkKAorCQkJCQkJQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUoY29udGV4dFJvb3QuZ2V0SURBdHRyaWJ1dGUoKSwgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQodGVzdFN0ZXApKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PFN0cmluZz4gbWVhc3VyZW1lbnRJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtZWFzdXJlbWVudCkKKwkJCQkuam9pbihtZWFzdXJlbWVudC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5mZXRjaChGaWx0ZXIuYW5kKCkuYWRkKAorCQkJCQkJQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUoY29udGV4dFJvb3QuZ2V0SURBdHRyaWJ1dGUoKSwgaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQobWVhc3VyZW1lbnQpKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PENvbnRleHREZXNjcmliYWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oVGVzdFN0ZXAuY2xhc3MpLCB0ZXN0U3RlcElEcykpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oTWVhc3VyZW1lbnQuY2xhc3MpLCBtZWFzdXJlbWVudElEcykpOworCisJCXJldHVybiBsaXN0OworCX0KKworCS8qKgorCSAqIExvYWRzIHRoZSBDb250ZXh0RGVzY3JpYmFibGVzIHRvIHRoZSBnaXZlbiBjb250ZXh0IGNvbXBvbmVudCBpbnN0YW5jZXMKKwkgKiAKKwkgKiBAcGFyYW0gY29udGV4dENvbXBvbmVudCBlbnRpdHlUeXBlIG9mIHRoZSBjb250ZXh0IGNvbXBvbmVudAorCSAqIEBwYXJhbSBpZHMgICAgICAgICAgICAgIElEcyBvZiB0aGUgY29udGV4dENvbXBvbmVudHMgdG8gbG9hZC4KKwkgKiBAcmV0dXJuIHRoZSBsb2FkZWQgQ29udGV4dERlc2NyaWJhYmxlcworCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvdyBpZiB0aGUgQ29udGV4dERlc2NyaWJhYmxlcyBjYW5ub3QgYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLgorCSAqLworCXByaXZhdGUgTGlzdDxDb250ZXh0RGVzY3JpYmFibGU+IGxvYWRFbnRpdHlGb3JDb250ZXh0Q29tcG9uZW50KEVudGl0eVR5cGUgY29udGV4dENvbXBvbmVudCwgTGlzdDxTdHJpbmc+IGlkcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKworCQkvLyBDb250ZXh0Q29tcG9uZW50IGNhbiBvbmx5IGhhdmUgb25lIHBhcmVudAorCQlmaW5hbCBFbnRpdHlUeXBlIGNvbnRleHRSb290ID0gY29udGV4dENvbXBvbmVudC5nZXRQYXJlbnRSZWxhdGlvbnMoKS5nZXQoMCkuZ2V0VGFyZ2V0KCk7CisKKwkJZmluYWwgRW50aXR5VHlwZSB0ZXN0U3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKwkJZmluYWwgRW50aXR5VHlwZSBtZWFzdXJlbWVudCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKworCQlMaXN0PFN0cmluZz4gdGVzdFN0ZXBJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRCh0ZXN0U3RlcCkKKwkJCQkuam9pbih0ZXN0U3RlcC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5qb2luKGNvbnRleHRSb290LmdldFJlbGF0aW9uKGNvbnRleHRDb21wb25lbnQpLCBKb2luVHlwZS5PVVRFUikKKwkJCQkuZmV0Y2goRmlsdGVyLmFuZCgpCisJCQkJCQkuYWRkKENvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQuY3JlYXRlKGNvbnRleHRDb21wb25lbnQuZ2V0SURBdHRyaWJ1dGUoKSwKKwkJCQkJCQkJaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQodGVzdFN0ZXApKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PFN0cmluZz4gbWVhc3VyZW1lbnRJRHMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtZWFzdXJlbWVudCkKKwkJCQkuam9pbihtZWFzdXJlbWVudC5nZXRSZWxhdGlvbihjb250ZXh0Um9vdCksIEpvaW5UeXBlLk9VVEVSKQorCQkJCS5qb2luKGNvbnRleHRSb290LmdldFJlbGF0aW9uKGNvbnRleHRDb21wb25lbnQpLCBKb2luVHlwZS5PVVRFUikKKwkJCQkuZmV0Y2goRmlsdGVyLmFuZCgpCisJCQkJCQkuYWRkKENvbXBhcmlzb25PcGVyYXRvci5JTl9TRVQuY3JlYXRlKGNvbnRleHRDb21wb25lbnQuZ2V0SURBdHRyaWJ1dGUoKSwKKwkJCQkJCQkJaWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKSkKKwkJCQkuc3RyZWFtKCkubWFwKHIgLT4gci5nZXRSZWNvcmQobWVhc3VyZW1lbnQpKS5tYXAoUmVjb3JkOjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQlMaXN0PENvbnRleHREZXNjcmliYWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oVGVzdFN0ZXAuY2xhc3MpLCB0ZXN0U3RlcElEcykpOworCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4oTWVhc3VyZW1lbnQuY2xhc3MpLCBtZWFzdXJlbWVudElEcykpOworCQlyZXR1cm4gbGlzdDsKKwl9CisKKwkvKioKKwkgKiBAcGFyYW0gZW50aXR5Q29uZmlnCisJICogQHJldHVybiB0cnVlLCBpZiB0aGUgZW50aXR5Q29uZmlnIGJlbG9uZ3MgdG8gYSBjb250ZXh0IHJvb3Qgb3IgY29udGV4dAorCSAqICAgICAgICAgY29tcG9uZW50IGFuZCB0aGUgb3B0aW9uIGxvYWRDb250ZXh0RGVzY3JpYmFibGUKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNMb2FkQ29udGV4dERlc2NyaWJhYmxlKEVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcpIHsKKwkJcmV0dXJuIGxvYWRDb250ZXh0RGVzY3JpYmFibGUgJiYgKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oQ29udGV4dFJvb3QuY2xhc3MpCisJCQkJfHwgZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCkuaXNBc3NpZ25hYmxlRnJvbShDb250ZXh0Q29tcG9uZW50LmNsYXNzKSk7CisJfQorCisJLyoqCisJICogQ2hlY2tzIGlmIGEgcmVsYXRpb24gYmV0d2VlbiBzb3VyY2VFbnRpdHlUeXBlIGFuZCBhdCBsZWFzdCBvbmUgZW50aXR5IHR5cGUgaW4KKwkgKiB0YXJnZXRFbnRpdHlUeXBlIGV4aXN0cy4KKwkgKiAKKwkgKiBAcGFyYW0gc291cmNlRW50aXR5VHlwZSAgc291cmNlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSB0YXJnZXRFbnRpdHlUeXBlcyBsaXN0IG9mIHRhcmdldCBlbml0aXR5IHR5cGVzLgorCSAqIEByZXR1cm4gdHJ1ZSwgaWYgcmVsYXRpb24gYmV0d2VlbiBzb3VyY2UgZW50aXR5IHR5cGUgYW5kIGF0IGxlYXN0IG9uZSB0YXJnZXQKKwkgKiAgICAgICAgIGVudGl0eSB0eXBlIGV4aXN0cy4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaGFzUmVsYXRpb25UbyhFbnRpdHlUeXBlIHNvdXJjZUVudGl0eVR5cGUsIEVudGl0eVR5cGUuLi4gdGFyZ2V0RW50aXR5VHlwZXMpIHsKKwkJZm9yIChFbnRpdHlUeXBlIGUgOiB0YXJnZXRFbnRpdHlUeXBlcykgeworCQkJdHJ5IHsKKwkJCQlzb3VyY2VFbnRpdHlUeXBlLmdldFJlbGF0aW9uKGUpOworCQkJCXJldHVybiB0cnVlOworCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlIGVudGl0eSB0eXBlIHRoZSB7QGxpbmsgRW50aXR5Q29uZmlnfSBpcyByZXF1ZXN0ZWQgZm9yCisJICogQHJldHVybiB7QGxpbmsgRW50aXR5Q29uZmlnfSBvciBudWxsIGlmIG5vdCBjb25maWcgd2FzIGZvdW5kIGZvciB0aGUKKwkgKiAgICAgICAgIHNwZWNpZmllZCBlbnRpdHkgdHlwZQorCSAqLworCXByaXZhdGUgRW50aXR5Q29uZmlnPD8+IGdldEVudGl0eUNvbmZpZyhFbnRpdHlUeXBlIGVudGl0eVR5cGUpIHsKKwkJdHJ5IHsKKwkJCXJldHVybiBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5Q29uZmlnKGVudGl0eVR5cGUpOworCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL09EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL09EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhMzBhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5hdmFsb24uQXZhbG9uTm90aWZpY2F0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLnBlYWsuUGVha05vdGlmaWNhdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGEgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworcHVibGljIGNsYXNzIE9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5IHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkuY2xhc3MpOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fU0VSVkVSX1RZUEUgPSAiZnJlZXRleHQubm90aWZpY2F0aW9uVHlwZSI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVVJMID0gImZyZWV0ZXh0Lm5vdGlmaWNhdGlvblVybCI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fUE9MTElOR19JTlRFUlZBTCA9ICJmcmVldGV4dC5wb2xsaW5nSW50ZXJ2YWwiOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1RZUEVfUEVBSyA9ICJwZWFrIjsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfVFlQRV9BVkFMT04gPSAiYXZhbG9uIjsKKworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05BTUVTRVJWSUNFX1VSTCA9ICJuYW1lc2VydmljZVVSTCI7CisKKwlwdWJsaWMgTm90aWZpY2F0aW9uU2VydmljZSBjcmVhdGUoQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKKwkJCXRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHR5cGUgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fU0VSVkVSX1RZUEUpOworCisJCU1vZGVsTWFuYWdlciBtbSA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihNb2RlbE1hbmFnZXIuY2xhc3MpKTsKKworCQlRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKFF1ZXJ5U2VydmljZS5jbGFzcykpOworCisJCWlmICghT0RTTW9kZWxNYW5hZ2VyLmNsYXNzLmlzSW5zdGFuY2UobW0pKSB7CisJCQl0aHJvdyBuZXcgQ29ubmVjdGlvbkV4Y2VwdGlvbigiTW9kZWxNYW5hZ2VyIGlzIG5vdCBhIE9EU01vZGVsTWFuYWdlciEiKTsKKwkJfQorCisJCWlmIChTRVJWRVJfVFlQRV9QRUFLLmVxdWFsc0lnbm9yZUNhc2UodHlwZSkpIHsKKwkJCVN0cmluZyB1cmwgPSBnZXRQYXJhbWV0ZXIocGFyYW1ldGVycywgUEFSQU1fVVJMKTsKKworCQkJTE9HR0VSLmluZm8oIkNvbm5lY3RpbmcgdG8gUGVhayBOb3RpZmljYXRpb24gU2VydmVyIC4uLiIpOworCQkJTE9HR0VSLmluZm8oIlVSTDoge30iLCB1cmwpOworCisJCQl0cnkgeworCQkJCXJldHVybiBuZXcgUGVha05vdGlmaWNhdGlvbk1hbmFnZXIoKE9EU01vZGVsTWFuYWdlcikgbW0sIHF1ZXJ5U2VydmljZSwgdXJsLCB0cnVlKTsKKwkJCX0gY2F0Y2ggKE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisJCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjb25uZWN0IHRvIG5vdGlmaWNhdGlvbiBzZXJ2aWNlISIsIGUpOworCQkJfQorCQl9IGVsc2UgaWYgKFNFUlZFUl9UWVBFX0FWQUxPTi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSB7CisKKwkJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJzLCBPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRSk7CisJCQlzZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lLnJlcGxhY2UoIi5BU0FNLU9EUyIsICIiKTsKKwkJCVN0cmluZyBuYW1lU2VydmljZVVSTCA9IGdldFBhcmFtZXRlcihwYXJhbWV0ZXJzLCBPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRSk7CisKKwkJCUxPR0dFUi5pbmZvKCJDb25uZWN0aW5nIHRvIEF2YWxvbiBOb3RpZmljYXRpb24gU2VydmVyIC4uLiIpOworCQkJTE9HR0VSLmluZm8oIk5hbWUgc2VydmljZSBVUkw6IHt9IiwgbmFtZVNlcnZpY2VVUkwpOworCQkJTE9HR0VSLmluZm8oIlNlcnZpY2UgbmFtZToge30iLCBzZXJ2aWNlTmFtZSk7CisKKwkJCWxvbmcgcG9sbGluZ0ludGVydmFsID0gNTAwTDsKKwkJCXRyeSB7CisJCQkJcG9sbGluZ0ludGVydmFsID0gTG9uZy5wYXJzZUxvbmcoZ2V0UGFyYW1ldGVyKHBhcmFtZXRlcnMsIFBBUkFNX1BPTExJTkdfSU5URVJWQUwpKTsKKwkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiB8IENvbm5lY3Rpb25FeGNlcHRpb24gZSkgeworCQkJCUxPR0dFUi53YXJuKCJDb3VsZCBub3QgcGFyc2UgcGFyc2UgcGFyYW1ldGVyIHBvbGxpbmdJbnRlcnZhbC4gVXNpbmcgZGVmYXVsdCB2YWx1ZTogIiArIHBvbGxpbmdJbnRlcnZhbCwKKwkJCQkJCWUpOworCQkJfQorCisJCQlyZXR1cm4gbmV3IEF2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIoKE9EU01vZGVsTWFuYWdlcikgbW0sIHF1ZXJ5U2VydmljZSwgc2VydmljZU5hbWUsIG5hbWVTZXJ2aWNlVVJMLCB0cnVlLAorCQkJCQlwb2xsaW5nSW50ZXJ2YWwpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkludmFsaWQgc2VydmVyIHR5cGUuIEV4cGVjdGVkIG9uIG9mOiAncGVhayciKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBTdHJpbmcgZ2V0UGFyYW1ldGVyKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgU3RyaW5nIG5hbWUpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7CisJCWlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IENvbm5lY3Rpb25FeGNlcHRpb24oIkNvbm5lY3Rpb24gcGFyYW1ldGVyIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBpcyBlaXRoZXIgbWlzc2luZyBvciBlbXB0eS4iKTsKKwkJfQorCisJCXJldHVybiB2YWx1ZTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL2F2YWxvbi9BdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL2F2YWxvbi9BdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVmNTFhYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vYXZhbG9uL0F2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24uYXZhbG9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dENvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dERlc2NyaWJhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkZpbHRlci5Nb2RpZmljYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfREVMRVRFOworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfSU5TRVJUOworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfTU9ESUZZUklHSFRTOworaW1wb3J0IGNvbS5oaWdocXNvZnQuYXZhbG9uQ29yYmFOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uLk1PREVfUkVQTEFDRTsKKworLyoqCisgKiBOb3RpZmljYXRpb24gbWFuYWdlciBmb3IgaGFuZGxpbmcgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBBdmFsb24gTm90aWZpY2F0aW9uCisgKiBTZXJ2aWNlCisgKiAKKyAqIE1vZGlmaWNhdGlvblR5cGUuTU9ERUxfTU9ESUZJRUQgaXMgbm90IHN1cHBvcnRlZCEKKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKgorICovCitwdWJsaWMgY2xhc3MgQXZhbG9uTm90aWZpY2F0aW9uTWFuYWdlciBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcnZpY2UgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEF2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFdmVudFByb2Nlc3Nvcj4gZXZlbnRQcm9jZXNzb3JzID0gbmV3IEhhc2hNYXA8PigpOworCisJcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgxKTsKKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lU2VydmljZVVSTDsKKwlwcml2YXRlIGxvbmcgcG9sbGluZ0ludGVydmFsID0gNTAwTDsKKwlwcml2YXRlIGZpbmFsIE5vdGlmaWNhdGlvbkVudGl0eUxvYWRlciBsb2FkZXI7CisKKwlwcml2YXRlIGZpbmFsIE9SQiBvcmIgPSBPUkIuaW5pdChuZXcgU3RyaW5nW10ge30sIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpOworCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBBdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyLgorCSAqIAorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgICAgICAgICAgIE9EU01vZGVsTWFuYWdlciB1c2VkIHRvIGxhb2QgZW50aXRpZXMuCisJICogQHBhcmFtIHNlcnZpY2VOYW1lICAgICAgICAgICAgbmFtZSBvZiB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisJICogQHBhcmFtIG5hbWVTZXJ2aWNlVVJMICAgICAgICAgVVJMIG9mIHRoZSBuYW1lIHNlcnZpY2UuCisJICogQHBhcmFtIGxvYWRDb250ZXh0RGVzY3JpYmFibGUgaWYgdHJ1ZSwgbm90aWZpY2F0aW9ucyBmb3Ige0BsaW5rIENvbnRleHRSb290fQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB7QGxpbmsgQ29udGV4dENvbXBvbmVudH0gd2lsbCBsb2FkIHRoZWlyCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IHtAbGluayBDb250ZXh0RGVzY3JpYmFibGV9LgorCSAqIEBwYXJhbSBwb2xsaW5nSW50ZXJ2YWwgICAgICAgIHBvbGxpbmcgaW50ZXJ2YWwgaW4gbWlsbGVzZWNvbmRzCisJICovCisJcHVibGljIEF2YWxvbk5vdGlmaWNhdGlvbk1hbmFnZXIoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwgU3RyaW5nIHNlcnZpY2VOYW1lLAorCQkJU3RyaW5nIG5hbWVTZXJ2aWNlVVJMLCBib29sZWFuIGxvYWRDb250ZXh0RGVzY3JpYmFibGUsIGxvbmcgcG9sbGluZ0ludGVydmFsKSB7CisJCXRoaXMubW9kZWxNYW5hZ2VyID0gbW9kZWxNYW5hZ2VyOworCQl0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisJCXRoaXMubmFtZVNlcnZpY2VVUkwgPSBuYW1lU2VydmljZVVSTDsKKwkJdGhpcy5wb2xsaW5nSW50ZXJ2YWwgPSBwb2xsaW5nSW50ZXJ2YWw7CisJCWxvYWRlciA9IG5ldyBOb3RpZmljYXRpb25FbnRpdHlMb2FkZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIGxvYWRDb250ZXh0RGVzY3JpYmFibGUpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKFN0cmluZyByZWdpc3RyYXRpb24sIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsIGZpbmFsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQorCQkJdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlFdmVudFByb2Nlc3NvciBjb25zdW1lciA9IG5ldyBFdmVudFByb2Nlc3NvcihvcmIsIGxpc3RlbmVyLCB0aGlzLCBuYW1lU2VydmljZVVSTCwgc2VydmljZU5hbWUpOworCisJCQlMaXN0PFN0cmluZz4gYWlkcyA9IGZpbHRlci5nZXRFbnRpdHlUeXBlcygpLnN0cmVhbSgpLm1hcChlIC0+IGUuZ2V0SWQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworCQkJU2V0PE1vZGlmaWNhdGlvblR5cGU+IG1vZGVzID0gZmlsdGVyLmdldFR5cGVzKCkuc3RyZWFtKCkKKwkJCQkJLmZpbHRlcihtIC0+ICFNb2RpZmljYXRpb25UeXBlLk1PREVMX01PRElGSUVELmVxdWFscyhtKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisJCQljb25zdW1lci5jb25uZWN0KCk7CisJCQljb25zdW1lci5zZXRGaWx0ZXIoYWlkcywgbW9kZXMpOworCisJCQlTY2hlZHVsZWRGdXR1cmU8Pz4gZnV0dXJlID0gZXhlY3V0b3Iuc2NoZWR1bGVBdEZpeGVkUmF0ZShjb25zdW1lciwgMCwgcG9sbGluZ0ludGVydmFsLAorCQkJCQlUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCQkJY29uc3VtZXIuc2V0RnV0dXJlKGZ1dHVyZSk7CisKKwkJCWV2ZW50UHJvY2Vzc29ycy5wdXQocmVnaXN0cmF0aW9uLCBjb25zdW1lcik7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJFeGNlcHRpb24gY3JlYXRpbmcgbm90aWZpY2F0aW9uIGxpc3RlbmVyIHJlZ2lzdHJhdGlvbiEiLCBlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbikgeworCQlFdmVudFByb2Nlc3NvciBwcm9jZXNzb3IgPSBldmVudFByb2Nlc3NvcnMuZ2V0KHJlZ2lzdHJhdGlvbik7CisJCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkgeworCQkJcHJvY2Vzc29yLmRpc2Nvbm5lY3QoKTsKKwkJCWV2ZW50UHJvY2Vzc29ycy5yZW1vdmUocmVnaXN0cmF0aW9uKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKGJvb2xlYW4gaXNEZXJlZ2lzdGVyQWxsKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJTE9HR0VSLmluZm8oIkNsb3NpbmcgTm90aWZpY2F0aW9uTWFuYWdlci4uLiIpOworCisJCWZvciAoU3RyaW5nIHJlZ2lzdHJhdGlvbiA6IGV2ZW50UHJvY2Vzc29ycy5rZXlTZXQoKSkgeworCQkJTE9HR0VSLmRlYnVnKCJEaXNjb25uZWN0aW5nIHJlZ2lzdHJhdGlvbiAnIiArIHJlZ2lzdHJhdGlvbiArICInLiIpOworCQkJZGVyZWdpc3RlcihyZWdpc3RyYXRpb24pOworCQl9CisKKwkJdHJ5IHsKKwkJCWV4ZWN1dG9yLnNodXRkb3duKCk7CisJCQlib29sZWFuIHRlcm1pbmF0ZWQgPSBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKwkJCWlmICghdGVybWluYXRlZCkgeworCQkJCXRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkNvdWxkIG5vdCBjbG9zZSBhbGwgcmVnaXN0cmF0aW9ucyEiKTsKKwkJCX0KKwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNsb3NlIGFsbCByZWdpc3RyYXRpb25zISIsIGUpOworCQl9CisJfQorCisJdm9pZCBwcm9jZXNzRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7CisJCUxPR0dFUi5lcnJvcigiRXhjZXB0aW9uIGR1cmluZyBub3RpZmljYXRpb24gcHJvY2Vzc2luZyEiLCBlKTsKKwl9CisKKwl2b2lkIHByb2Nlc3NOb3RpZmljYXRpb24oc2hvcnQgbW9kZSwgVF9MT05HTE9ORyBhZUlkLCBUX0xPTkdMT05HIGllSWQsIFRfTE9OR0xPTkcgdXNlcklkLCBTdHJpbmcgdGltZXN0YW1wLAorCQkJTm90aWZpY2F0aW9uTGlzdGVuZXIgbm90aWZpY2F0aW9uTGlzdGVuZXIpIHsKKworCQl0cnkgeworCQkJVXNlciB1c2VyID0gbG9hZGVyLmxvYWQobmV3IEtleTw+KFVzZXIuY2xhc3MpLCBMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyh1c2VySWQpKSk7CisJCQlMT0dHRVIuZGVidWcoIlVzZXIgbG9hZGVkIik7CisKKwkJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlQnlJZChMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhhZUlkKSkpOworCQkJTGlzdDxTdHJpbmc+IGlkcyA9IEFycmF5cy5hc0xpc3QoTG9uZy50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoaWVJZCkpKTsKKworCQkJaWYgKExPR0dFUi5pc1RyYWNlRW5hYmxlZCgpKSB7CisJCQkJTE9HR0VSLnRyYWNlKCJOb3RpZmljYXRpb24gZXZlbnQgd2l0aDogZW50aXR5VHlwZT0iICsgZW50aXR5VHlwZSArICIsIHVzZXI9IiArIHVzZXIpOworCQkJfQorCisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2UgTU9ERV9JTlNFUlQudmFsdWU6CisJCQkJbm90aWZpY2F0aW9uTGlzdGVuZXIuaW5zdGFuY2VDcmVhdGVkKGxvYWRlci5sb2FkRW50aXRpZXMoZW50aXR5VHlwZSwgaWRzKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVfUkVQTEFDRS52YWx1ZToKKwkJCQlub3RpZmljYXRpb25MaXN0ZW5lci5pbnN0YW5jZU1vZGlmaWVkKGxvYWRlci5sb2FkRW50aXRpZXMoZW50aXR5VHlwZSwgaWRzKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVfREVMRVRFLnZhbHVlOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLmluc3RhbmNlRGVsZXRlZChlbnRpdHlUeXBlLCBpZHMsIHVzZXIpOworCQkJCWJyZWFrOworCQkJY2FzZSBNT0RFX01PRElGWVJJR0hUUy52YWx1ZToKKwkJCQlub3RpZmljYXRpb25MaXN0ZW5lci5zZWN1cml0eU1vZGlmaWVkKGVudGl0eVR5cGUsIGlkcywgdXNlcik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByb2Nlc3NFeGNlcHRpb24obmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiSW52YWxpZCBub3RpZmljYXRpb24gdHlwZSEiKSk7CisJCQl9CisJCX0gY2F0Y2ggKERhdGFBY2Nlc3NFeGNlcHRpb24gZSkgeworCQkJcHJvY2Vzc0V4Y2VwdGlvbihuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBkYXRhIGZvciBub3RpZmljYXRpb24hIiwgZSkpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9hdmFsb24vRXZlbnRQcm9jZXNzb3IuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vYXZhbG9uL0V2ZW50UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhlMzQyNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vYXZhbG9uL0V2ZW50UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLmF2YWxvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyLk1vZGlmaWNhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25MaXN0ZW5lcjsKK2ltcG9ydCBvcmcub21nLkNPUkJBLk9SQjsKK2ltcG9ydCBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0RXh0OworaW1wb3J0IG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRIZWxwZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZmljYXRpb24uU3RydWN0dXJlZEV2ZW50OworaW1wb3J0IG9yZy5vbWcuQ29zTm90aWZpY2F0aW9uLl9FdmVudFR5cGU7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDaGFubmVsQWRtaW4uQ2xpZW50VHlwZTsKK2ltcG9ydCBvcmcub21nLkNvc05vdGlmeUNoYW5uZWxBZG1pbi5FdmVudENoYW5uZWw7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDaGFubmVsQWRtaW4uRXZlbnRDaGFubmVsSGVscGVyOworaW1wb3J0IG9yZy5vbWcuQ29zTm90aWZ5Q2hhbm5lbEFkbWluLlN0cnVjdHVyZWRQcm94eVB1bGxTdXBwbGllcjsKK2ltcG9ydCBvcmcub21nLkNvc05vdGlmeUNoYW5uZWxBZG1pbi5TdHJ1Y3R1cmVkUHJveHlQdWxsU3VwcGxpZXJIZWxwZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDb21tLkludmFsaWRFdmVudFR5cGU7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlDb21tLlN0cnVjdHVyZWRQdWxsQ29uc3VtZXJQT0E7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlGaWx0ZXIuQ29uc3RyYWludEV4cDsKK2ltcG9ydCBvcmcub21nLkNvc05vdGlmeUZpbHRlci5GaWx0ZXI7CitpbXBvcnQgb3JnLm9tZy5Db3NOb3RpZnlGaWx0ZXIuRmlsdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmhpZ2hxc29mdC5hdmFsb25Db3JiYU5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb24uQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudDsKK2ltcG9ydCBjb20uaGlnaHFzb2Z0LmF2YWxvbkNvcmJhTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbi5BdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50SGVscGVyOworCisvKioKKyAqIEV2ZW50IHByb2Nlc3NvciByZXNwb25zaWJsZSBmb3IgcmVjZWl2aW5nIGF2YWxvbiBldmVudHMgZnJvbSB0aGUgbm90aWZpY2F0aW9uCisgKiBzZXJ2aWNlIGFuZCByZWRpcmVjdCB0aGVtIHRvIHRoZSBtYW5hZ2VyLgorICogCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFByb2Nlc3NvciBleHRlbmRzIFN0cnVjdHVyZWRQdWxsQ29uc3VtZXJQT0EgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXZlbnRQcm9jZXNzb3IuY2xhc3MpOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGV2ZW50RG9tYWluTmFtZSA9ICJBVkFMT04iOworCisJcHJpdmF0ZSBmaW5hbCBPUkIgb3JiOworCXByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXI7CisJcHJpdmF0ZSBmaW5hbCBBdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyIG1hbmFnZXI7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZXNlcnZpY2VVcmw7CisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWU7CisKKwlwcml2YXRlIEV2ZW50Q2hhbm5lbCBldmVudENoYW5uZWw7CisJcHJpdmF0ZSBTdHJ1Y3R1cmVkUHJveHlQdWxsU3VwcGxpZXIgcHJveHlQdWxsU3VwcGxpZXI7CisKKwlwcml2YXRlIGJvb2xlYW4gY29ubmVjdGVkID0gZmFsc2U7CisKKwlwcml2YXRlIFNjaGVkdWxlZEZ1dHVyZTw/PiBmdXR1cmU7CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGV2ZW50IHByb2Nlc3Nvci4KKwkgKiAKKwkgKiBAcGFyYW0gb3JiICAgICAgICAgQ09SQkEgb3JiIHRvIHVzZQorCSAqIEBwYXJhbSBsaXN0ZW5lciAgICBub3RpZmljYXRpb24gbGlzdGVuZXIgY29uc3VtaW5nIHRoZSByZWNlaXZlZCBldmVudHMKKwkgKiBAcGFyYW0gbWFuYWdlciAgICAgbm90aWZpY2F0aW9uIG1hbmFnZXIgcmVzcG9uc2libGUgZm9yIHByb2Nlc3NpbmcgdGhlIGV2ZW50cworCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBzZXJ2aWNlIG5hbWUgb2YgdGhlIENPUkJBIG5vdGlmaWNhdGlvbiBzZXJ2aWNlCisJICovCisJcHVibGljIEV2ZW50UHJvY2Vzc29yKE9SQiBvcmIsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLCBBdmFsb25Ob3RpZmljYXRpb25NYW5hZ2VyIG1hbmFnZXIsCisJCQlTdHJpbmcgbmFtZXNlcnZpY2VVcmwsIFN0cmluZyBzZXJ2aWNlTmFtZSkgeworCQl0aGlzLm9yYiA9IG9yYjsKKwkJdGhpcy5uYW1lc2VydmljZVVybCA9IG5hbWVzZXJ2aWNlVXJsOworCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CisJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7CisJCXRoaXMuc2VydmljZU5hbWUgPSBTdHJpbmcuZm9ybWF0KCJjb20vaGlnaHFzb2Z0L2F2YWxvbi9ub3RpZmljYXRpb24vJXMuTm90aWZpY2F0aW9uIiwgc2VydmljZU5hbWUpOworCX0KKworCS8qKgorCSAqIENvbm5lY3QgdGhlIGV2ZW50IHByb2Nlc3NvciB0byB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UuCisJICogCisJICogQHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24gaW4gY2FzZSB0aGUgbm90aWZpY2F0aW9uIHNlcnZpY2UgY2Fubm90IGJlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkLgorCSAqLworCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KCkgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChpc0Nvbm5lY3RlZCgpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQl0cnkgeworCQkJTmFtaW5nQ29udGV4dEV4dCBuYyA9IE5hbWluZ0NvbnRleHRFeHRIZWxwZXIubmFycm93KG9yYi5zdHJpbmdfdG9fb2JqZWN0KG5hbWVzZXJ2aWNlVXJsKSk7CisKKwkJCWV2ZW50Q2hhbm5lbCA9IEV2ZW50Q2hhbm5lbEhlbHBlci5uYXJyb3cobmMucmVzb2x2ZShuYy50b19uYW1lKHNlcnZpY2VOYW1lKSkpOworCisJCQlwcm94eVB1bGxTdXBwbGllciA9IFN0cnVjdHVyZWRQcm94eVB1bGxTdXBwbGllckhlbHBlci5uYXJyb3coZXZlbnRDaGFubmVsLmRlZmF1bHRfY29uc3VtZXJfYWRtaW4oKQorCQkJCQkub2J0YWluX25vdGlmaWNhdGlvbl9wdWxsX3N1cHBsaWVyKENsaWVudFR5cGUuU1RSVUNUVVJFRF9FVkVOVCwgbmV3IG9yZy5vbWcuQ09SQkEuSW50SG9sZGVyKCkpKTsKKworCQkJcHJveHlQdWxsU3VwcGxpZXIuY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfY29uc3VtZXIodGhpcy5fdGhpcyhvcmIpKTsKKwkJCWNvbm5lY3RlZCA9IHRydWU7CisJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJDYW5ub3QgY29ubmVjdCB0byBub3RpZmljYXRpb24gc2VydmljZSEiLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERpc2Nvbm5lY3QgdGhlIGV2ZW50IHByb2Nlc3NvciBmcm9tIHRoZSBub3RpZmljYXRpb24gc2VydmljZS4KKwkgKi8KKwlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKKwkJaWYgKGlzQ29ubmVjdGVkKCkpIHsKKwkJCWlmIChmdXR1cmUgIT0gbnVsbCkgeworCQkJCWZ1dHVyZS5jYW5jZWwoZmFsc2UpOworCQkJfQorCisJCQlwcm94eVB1bGxTdXBwbGllciA9IG51bGw7CisKKwkJCWV2ZW50Q2hhbm5lbC5fcmVsZWFzZSgpOworCQkJZXZlbnRDaGFubmVsID0gbnVsbDsKKworCQkJY29ubmVjdGVkID0gZmFsc2U7CisJCX0KKwl9CisKKwkvKioKKwkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHByb2Nlc3NvciBpcyBjb25uZWN0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvbiBzZXJ2aWNlCisJICovCisJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzQ29ubmVjdGVkKCkgeworCQlyZXR1cm4gY29ubmVjdGVkOworCX0KKworCS8qKgorCSAqIFNldHMgdGhlIGV2ZW50IGZpbHRlci4KKwkgKiAKKwkgKiBAcGFyYW0gYWlkcyAgICAgICAgICAgICAgTGlzdCB3aXRoIGFwcGxpY2F0aW9uIGVsZW1lbnQgSURzIHRvIGZpbHRlciBmb3IuCisJICogICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5IGxpc3QgbWVhbnMgbm8gYWxsLgorCSAqIEBwYXJhbSBtb2RpZmljYXRpb25UeXBlcyBDb2xsZWN0aW9uIG9mIG1vZGlmaWNhdGlvbiB0eXBlcyB0byBmaWx0ZXIgZm9yLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIGlmIHRoZSBmaWx0ZXIgY2Fubm90IGJlIHNldAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbHRlcihMaXN0PFN0cmluZz4gYWlkcywgU2V0PE1vZGlmaWNhdGlvblR5cGU+IG1vZGlmaWNhdGlvblR5cGVzKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKCFpc0Nvbm5lY3RlZCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGZpbHRlciB3aGVuIGRpc2Nvbm5lY3RlZC4gUGxlYXNlIGNvbm5lY3QgZmlyc3QuIik7CisJCX0KKworCQl0cnkgeworCQkJRmlsdGVyRmFjdG9yeSBmaWx0ZXJGYWN0b3J5ID0gZXZlbnRDaGFubmVsLmRlZmF1bHRfZmlsdGVyX2ZhY3RvcnkoKTsKKwkJCWlmIChmaWx0ZXJGYWN0b3J5ID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJObyBkZWZhdWx0IGZpbHRlciBmYWN0b3J5IGZvdW5kISIpOworCQkJfQorCisJCQlGaWx0ZXIgZmlsdGVyID0gZmlsdGVyRmFjdG9yeS5jcmVhdGVfZmlsdGVyKCJFWFRFTkRFRF9UQ0wiKTsKKwkJCWZpbHRlci5hZGRfY29uc3RyYWludHMobmV3IENvbnN0cmFpbnRFeHBbXSB7CisJCQkJCW5ldyBDb25zdHJhaW50RXhwKGdldEV2ZW50VHlwZXMobW9kaWZpY2F0aW9uVHlwZXMpLCBnZXRDb25zdHJhaW50RmlsdGVyKGFpZHMpKSB9KTsKKwkJCXByb3h5UHVsbFN1cHBsaWVyLmFkZF9maWx0ZXIoZmlsdGVyKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGVuIGNyZWF0aW5nIGZpbHRlci4iLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFNldHMgdGhlIFNjaGVkdWxlZEZ1dHVyZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdG9wIHRoZSBldmVudCBwcm9jZXNzb3IgdGFzay4KKwkgKiAKKwkgKiBAcGFyYW0gZnV0dXJlIFNjaGVkdWxlZEZ1dHVyZQorCSAqLworCXB1YmxpYyB2b2lkIHNldEZ1dHVyZShTY2hlZHVsZWRGdXR1cmU8Pz4gZnV0dXJlKSB7CisJCXRoaXMuZnV0dXJlID0gZnV0dXJlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBydW4oKSB7CisJCWlmIChpc0Nvbm5lY3RlZCgpKSB7CisJCQlvcmcub21nLkNPUkJBLkJvb2xlYW5Ib2xkZXIgYmggPSBuZXcgb3JnLm9tZy5DT1JCQS5Cb29sZWFuSG9sZGVyKCk7CisKKwkJCXRyeSB7CisJCQkJTE9HR0VSLnRyYWNlKCJMb29raW5nIGZvciBzdHJ1Y3R1cmVkIGV2ZW50cy4uLi4iKTsKKwkJCQkvLyB0cnkgdG8gcHVsbCBhbiBldmVudAorCQkJCVN0cnVjdHVyZWRFdmVudCBldmVudCA9IHByb3h5UHVsbFN1cHBsaWVyLnRyeV9wdWxsX3N0cnVjdHVyZWRfZXZlbnQoYmgpOworCQkJCWlmIChiaC52YWx1ZSkgeworCQkJCQlBdmFsb25Ob3RpZmljYXRpb25Db3JiYUV2ZW50IGV2ID0gQXZhbG9uTm90aWZpY2F0aW9uQ29yYmFFdmVudEhlbHBlcgorCQkJCQkJCS5leHRyYWN0KGV2ZW50LnJlbWFpbmRlcl9vZl9ib2R5KTsKKwkJCQkJbWFuYWdlci5wcm9jZXNzTm90aWZpY2F0aW9uKGV2Lm1vZGUsIGV2LmFlSWQsIGV2LmllSWQsIGV2LnVzZXJJZCwgZXYudGltZXN0YW1wLCBsaXN0ZW5lcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJTE9HR0VSLnRyYWNlKCJObyBzdHJ1Y3R1cmVkIGV2ZW50cyBmb3VuZC4iKTsKKwkJCQl9CisJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJCW1hbmFnZXIucHJvY2Vzc0V4Y2VwdGlvbihlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxPR0dFUi53YXJuKCJEaXNjb25uZWN0ZWQuIik7CisJCQltYW5hZ2VyLnByb2Nlc3NFeGNlcHRpb24obmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiTm90IGNvbm5lY3RlZCIpKTsKKwkJCWlmIChmdXR1cmUgIT0gbnVsbCkgeworCQkJCWZ1dHVyZS5jYW5jZWwoZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZGlzY29ubmVjdF9zdHJ1Y3R1cmVkX3B1bGxfY29uc3VtZXIoKSB7CisJCUxPR0dFUi5pbmZvKCJEaXNjb25uZWN0ZWQhIik7CisJCWNvbm5lY3RlZCA9IGZhbHNlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIG9mZmVyX2NoYW5nZShfRXZlbnRUeXBlW10gYWRkZWQsIF9FdmVudFR5cGVbXSByZW1vdmVkKSB0aHJvd3MgSW52YWxpZEV2ZW50VHlwZSB7CisJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKKworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdHMgYSBjb25zdHJhaW50IGZpbHRlci4KKwkgKiAKKwkgKiBAcGFyYW0gYWlkcyBBcHBsaWNhdGlvbiBFbGVtZW50IElEcyB1c2VkIGZvciBmaWx0ZXJpbmcuIEVtcHR5IGxpc3QgbWVhbnMgbm8KKwkgKiAgICAgICAgICAgICBmaWx0ZXIuCisJICogQHJldHVybiBDb25zdHJhaW50IGZpbHRlciBjb250YWluaW5nIHRoZSBnaXZlbiBhaWRzCisJICovCisJcHJpdmF0ZSBTdHJpbmcgZ2V0Q29uc3RyYWludEZpbHRlcihMaXN0PFN0cmluZz4gYWlkcykgeworCQlpZiAoYWlkcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiAiVFJVRSI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gYWlkcy5zdHJlYW0oKS5tYXAoYWlkIC0+IFN0cmluZy5mb3JtYXQoIiQuZmlsdGVyYWJsZV9kYXRhKCVzKSA9PSAlcyIsICJBcHBsaWNhdGlvbkVsZW1lbnQiLCBhaWQpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiBvciAiKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBNb2RpZmljYXRpb25UeXBlcyBpbiBFdmVudFR5cGVzLgorCSAqIAorCSAqIEBwYXJhbSBtb2RpZmljYXRpb25UeXBlcworCSAqIEByZXR1cm4gQXJyYXkgd2l0aCBFdmVudFR5cGVzCisJICovCisJcHJpdmF0ZSBfRXZlbnRUeXBlW10gZ2V0RXZlbnRUeXBlcyhTZXQ8TW9kaWZpY2F0aW9uVHlwZT4gbW9kaWZpY2F0aW9uVHlwZXMpIHsKKwkJaWYgKG1vZGlmaWNhdGlvblR5cGVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIG5ldyBfRXZlbnRUeXBlWzBdOworCQl9IGVsc2UgeworCQkJcmV0dXJuIG1vZGlmaWNhdGlvblR5cGVzLnN0cmVhbSgpLm1hcChzIC0+IG5ldyBfRXZlbnRUeXBlKGV2ZW50RG9tYWluTmFtZSwgdG9BdmFsb25TdHJpbmcocykpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KG5ldyBfRXZlbnRUeXBlWzBdKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEge0BsaW5rIE1vZGlmaWNhdGlvblR5cGV9IGVudW0gdmFsdWUgdG8gYSBldmVudCB0eXBlIG5hbWUgZm9yIHRoZQorCSAqIENPUkJBIG5vdGlmaWNhdGlvbiBzZXJ2aWNlLgorCSAqIAorCSAqIEBwYXJhbSB0IGEgbW9kaWZpY2F0aW9uIHR5cGUKKwkgKiBAcmV0dXJuIGV2ZW50IHR5cGUgbmFtZQorCSAqLworCXByaXZhdGUgU3RyaW5nIHRvQXZhbG9uU3RyaW5nKE1vZGlmaWNhdGlvblR5cGUgdCkgeworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBJTlNUQU5DRV9DUkVBVEVEOgorCQkJcmV0dXJuICJJTlNFUlQiOworCQljYXNlIElOU1RBTkNFX01PRElGSUVEOgorCQkJcmV0dXJuICJSRVBMQUNFIjsKKwkJY2FzZSBJTlNUQU5DRV9ERUxFVEVEOgorCQkJcmV0dXJuICJERUxFVEUiOworCQljYXNlIFNFQ1VSSVRZX01PRElGSUVEOgorCQkJcmV0dXJuICJNT0RJRllSSUdIVFMiOworCQljYXNlIE1PREVMX01PRElGSUVEOgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0Lm5hbWUoKSArICIgbm90IHN1cHBvcnRlZCEiKTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW51bSB2YWx1ZSEiKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9FdmVudFByb2Nlc3Nvci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL0V2ZW50UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyY2YyYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9FdmVudFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5wZWFrOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50SW5wdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkluYm91bmRFdmVudDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Ob3RpZmljYXRpb247CisKKy8qKgorICogRXZlbnQgcHJvY2Vzc29yIHJlc3BvbnNpYmxlIGZvciByZWNlaXZpbmcgbm90aWZpY2F0aW9uIGV2ZW50cyBmcm9tIHRoZQorICogbm90aWZpY2F0aW9uIHNlcnZlciBhbmQgcmVkaXJlY3QgdGhlbSB0byB0aGUgbWFuYWdlci4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKgorICovCitwdWJsaWMgY2xhc3MgRXZlbnRQcm9jZXNzb3IgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRXZlbnRQcm9jZXNzb3IuY2xhc3MpOworCisJcHJpdmF0ZSBFdmVudElucHV0IGV2ZW50SW5wdXQ7CisJcHJpdmF0ZSBOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcjsKKwlwcml2YXRlIFBlYWtOb3RpZmljYXRpb25NYW5hZ2VyIG9kc05vdGlmaWNhdGlvbk1hbmFnZXI7CisJcHJpdmF0ZSBNZWRpYVR5cGUgZXZlbnRNZWRpYVR5cGU7CisJcHJpdmF0ZSBib29sZWFuIGNsb3NlSW52b2tlZCA9IGZhbHNlOworCXByaXZhdGUgYm9vbGVhbiBkaXNjb25uZWN0ZWQgPSBmYWxzZTsKKworCXB1YmxpYyBFdmVudFByb2Nlc3NvcihFdmVudElucHV0IGV2ZW50SW5wdXQsIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLAorCQkJUGVha05vdGlmaWNhdGlvbk1hbmFnZXIgb2RzTm90aWZpY2F0aW9uTWFuYWdlciwgTWVkaWFUeXBlIGV2ZW50TWVkaWFUeXBlKSB7CisJCXRoaXMuZXZlbnRJbnB1dCA9IGV2ZW50SW5wdXQ7CisJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKwkJdGhpcy5vZHNOb3RpZmljYXRpb25NYW5hZ2VyID0gb2RzTm90aWZpY2F0aW9uTWFuYWdlcjsKKwkJdGhpcy5ldmVudE1lZGlhVHlwZSA9IGV2ZW50TWVkaWFUeXBlOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIHJ1bigpIHsKKworCQl3aGlsZSAoIWV2ZW50SW5wdXQuaXNDbG9zZWQoKSkgeworCisJCQlmaW5hbCBJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50ID0gZXZlbnRJbnB1dC5yZWFkKCk7CisKKwkJCWlmIChpbmJvdW5kRXZlbnQgPT0gbnVsbCkgeworCQkJCWlmICghY2xvc2VJbnZva2VkKSB7CisJCQkJCW9kc05vdGlmaWNhdGlvbk1hbmFnZXIKKwkJCQkJCQkucHJvY2Vzc0V4Y2VwdGlvbihuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJJbmJvdW5kIGV2ZW50IGlucHV0IHN0cmVhbSBjbG9zZWQhIikpOworCQkJCX0KKwkJCQlkaXNjb25uZWN0ZWQgPSB0cnVlOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJdHJ5IHsKKwkJCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCQkJTE9HR0VSLnRyYWNlKCJSZWNlaXZlZCBldmVudDogIiArIGluYm91bmRFdmVudCk7CisJCQkJfQorCQkJCU5vdGlmaWNhdGlvbiBuID0gaW5ib3VuZEV2ZW50LnJlYWREYXRhKE5vdGlmaWNhdGlvbi5jbGFzcywgZXZlbnRNZWRpYVR5cGUpOworCQkJCW9kc05vdGlmaWNhdGlvbk1hbmFnZXIucHJvY2Vzc05vdGlmaWNhdGlvbihuLCBnZXRMaXN0ZW5lcigpKTsKKwkJCX0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworCQkJCW9kc05vdGlmaWNhdGlvbk1hbmFnZXIKKwkJCQkJCS5wcm9jZXNzRXhjZXB0aW9uKG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkNhbm5vdCBkZXNlcmlhbGl6ZSBub3RpZmljYXRpb24gZXZlbnQhIiwgZSkpOworCQkJCWRpc2Nvbm5lY3RlZCA9IHRydWU7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisKKwkJZGlzY29ubmVjdGVkID0gdHJ1ZTsKKwl9CisKKwlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpIHsKKwkJcmV0dXJuIGRpc2Nvbm5lY3RlZDsKKwl9CisKKwlwdWJsaWMgdm9pZCBzdG9wKCkgeworCQljbG9zZUludm9rZWQgPSB0cnVlOworCQkvLyBFdmVudElucHV0IGlzIGNsb3NlZCBieSB0aGUgc2VydmVyIHNpZGUgYWZ0ZXIgaW52b2tpbmcgREVMRVRFCisJCS8vIC9ldmVudHMve3JlZ2lzdHJhdGlvbk5hbWV9LiBPdGhlcndpc2Ugd2UgcnVuIGludG8gYSBkZWFkbG9jayB3aXRoCisJCS8vIGV2ZW50SW5wdXQjcmVhZCgpCisJfQorCisJcHVibGljIE5vdGlmaWNhdGlvbkxpc3RlbmVyIGdldExpc3RlbmVyKCkgeworCQlyZXR1cm4gbGlzdGVuZXI7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL0pzb25NZXNzYWdlQm9keVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvSnNvbk1lc3NhZ2VCb2R5UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjk0MDVjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL0pzb25NZXNzYWdlQm9keVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5ub3RpZmljYXRpb24ucGVhazsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlVjM7CitpbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlOworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uRm9ybWF0OworaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uRm9ybWF0LlBhcnNlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwuSnNvbkZvcm1hdC5QcmludGVyOworCisvKioKKyAqIE1lc3NhZ2VCb2R5UHJvdmlkZXIgZm9yIGhhbmRsaW5nIGpzb24gcGF5bG9hZHMuCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworQFByb3ZpZGVyCitAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitwdWJsaWMgY2xhc3MgSnNvbk1lc3NhZ2VCb2R5UHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNZXNzYWdlPiwgTWVzc2FnZUJvZHlXcml0ZXI8TWVzc2FnZT4geworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldHMuVVRGXzg7CisJcHJpdmF0ZSBQcmludGVyIGpzb25QcmludGVyID0gSnNvbkZvcm1hdC5wcmludGVyKCk7CisJcHJpdmF0ZSBQYXJzZXIganNvblBhcnNlciA9IEpzb25Gb3JtYXQucGFyc2VyKCk7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKwkJCWZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKwkJcmV0dXJuIE1lc3NhZ2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTWVzc2FnZSByZWFkRnJvbShmaW5hbCBDbGFzczxNZXNzYWdlPiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisJCQlmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKwkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQlmaW5hbCBNZXRob2QgbmV3QnVpbGRlciA9IHR5cGUuZ2V0TWV0aG9kKCJuZXdCdWlsZGVyIik7CisJCQlmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlVjMuQnVpbGRlcjw/PiBidWlsZGVyID0gKEdlbmVyYXRlZE1lc3NhZ2VWMy5CdWlsZGVyPD8+KSBuZXdCdWlsZGVyLmludm9rZSh0eXBlKTsKKwkJCWpzb25QYXJzZXIubWVyZ2UobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eVN0cmVhbSwgY2hhcnNldCksIGJ1aWxkZXIpOworCQkJcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihlKTsKKwkJfQorCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTWVzc2FnZSBtLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisJCQlmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisJCQlmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisJCXJldHVybiBNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBNZXNzYWdlIG0sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKwkJCWZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKwkJCWZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWVudGl0eVN0cmVhbS53cml0ZShqc29uUHJpbnRlci5wcmludChtKS5nZXRCeXRlcyhjaGFyc2V0KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL1BlYWtOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUGVha05vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmQxZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL1BlYWtOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLnBlYWs7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnLktleTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRJbnB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Ob3RpZmljYXRpb247CisKKy8qKgorICogTm90aWZpY2F0aW9uIG1hbmFnZXIgZm9yIGhhbmRsaW5nIG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgUGVhayBPRFMgU2VydmVyCisgKiBOb3RpZmljYXRpb24gUGx1Z2luCisgKiAKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBNYXR0aGlhcyBLb2xsZXIsIFBlYWsgU29sdXRpb24gR21iSAorICoKKyAqLworcHVibGljIGNsYXNzIFBlYWtOb3RpZmljYXRpb25NYW5hZ2VyIGltcGxlbWVudHMgTm90aWZpY2F0aW9uU2VydmljZSB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGVha05vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MpOworCisJcHJpdmF0ZSBmaW5hbCBDbGllbnQgY2xpZW50OworCXByaXZhdGUgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50OworCisJcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFdmVudFByb2Nlc3Nvcj4gcHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwPD4oKTsKKworCXByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKworCXByaXZhdGUgZmluYWwgTm90aWZpY2F0aW9uRW50aXR5TG9hZGVyIGxvYWRlcjsKKworCS8qKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIKKwkgKiBAcGFyYW0gdXJsICAgICAgICAgICAgICAgICAgICBVUkwgb2YgdGhlIG5vdGlmaWNhdGlvbiBwbHVnaW4KKwkgKiBAcGFyYW0gbG9hZENvbnRleHREZXNjcmliYWJsZSBpZiB0cnVlLCB0aGUgY29ycmVzcG9uZGluZyBjb250ZXh0IGRlc2NyaWJhYmxlCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbG9hZGVkIGlmIGEgbm90aWZpY2F0aW9uIGZvciBhIGNvbnRleHQgcm9vdAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNvbnRleHQgY29tcG9uZW50IGlzIHJlY2VpdmVkLgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIFRocm93biBpZiB0aGUgbWFuYWdlciBjYW5ub3QgY29ubmVjdCB0byB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24gc2VydmVyLgorCSAqLworCXB1YmxpYyBQZWFrTm90aWZpY2F0aW9uTWFuYWdlcihPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBTdHJpbmcgdXJsLAorCQkJYm9vbGVhbiBsb2FkQ29udGV4dERlc2NyaWJhYmxlKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCWxvYWRlciA9IG5ldyBOb3RpZmljYXRpb25FbnRpdHlMb2FkZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIGxvYWRDb250ZXh0RGVzY3JpYmFibGUpOworCisJCXRyeSB7CisJCQljbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihKc29uTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcykKKwkJCQkJLmJ1aWxkKCk7CisKKwkJCWVuZHBvaW50ID0gY2xpZW50LnRhcmdldCh1cmwpLnBhdGgoImV2ZW50cyIpOworCisJCQlFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbCgxKS5zY2hlZHVsZUF0Rml4ZWRSYXRlKCgpIC0+IHJlY29ubmVjdCgpLCAxMCwgMTAsIFRpbWVVbml0LlNFQ09ORFMpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSAiICsgUGVha05vdGlmaWNhdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpICsgIiEiLCBlKTsKKwkJfQorCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25NYW5hZ2VyI3JlZ2lzdGVyKGphdmEuCisJICogbGFuZy5TdHJpbmcsIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uRmlsdGVyLAorCSAqIG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uTGlzdGVuZXIpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbiwgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCisJCQl0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uIHsKKwkJTE9HR0VSLmluZm8oIlN0YXJ0aW5nIHJlZ2lzdHJhdGlvbiBmb3Igd2l0aCBuYW1lOiB7fSIsIHJlZ2lzdHJhdGlvbik7CisKKwkJUmVzcG9uc2UgcmVzcG9uc2UgPSBlbmRwb2ludC5wYXRoKHJlZ2lzdHJhdGlvbikucmVxdWVzdCgpLnBvc3QoCisJCQkJamF2YXgud3MucnMuY2xpZW50LkVudGl0eS5lbnRpdHkoUHJvdG9idWZDb252ZXJ0ZXIuZnJvbShmaWx0ZXIpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSk7CisKKwkJaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkgPT0gU3RhdHVzLkNPTkZMSUNULmdldFN0YXR1c0NvZGUoKSkgeworCQkJaWYgKExPR0dFUi5pc0luZm9FbmFibGVkKCkpIHsKKwkJCQlMT0dHRVIuaW5mbygiQSByZWdpc3RyYXRpb24gd2l0aCB0aGUgbmFtZSBhbHJlYWR5IGV4aXN0czoge30iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCQkJCUxPR0dFUi5pbmZvKCJUcnlpbmcgdG8gcmVyZWdpc3Rlci4uLiIpOworCQkJfQorCQkJZGVyZWdpc3RlcihyZWdpc3RyYXRpb24pOworCQkJTE9HR0VSLmluZm8oIkRlcmVnaXN0ZXJhdGlvbiBzdWNjZXNzZnVsLiIpOworCQkJcmVnaXN0ZXIocmVnaXN0cmF0aW9uLCBmaWx0ZXIsIGxpc3RlbmVyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChyZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpICE9IFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpIHsKKwkJCXRocm93IG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oCisJCQkJCSJDb3VsZCBub3QgY3JlYXRlIHJlZ2lzdHJhdGlvbiBhdCBub3RpZmljYXRpb24gc2VydmljZTogIiArIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisJCX0KKworCQlyZWNyZWF0ZUV2ZW50U3RyZWFtKHJlZ2lzdHJhdGlvbiwgbGlzdGVuZXIpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIAorCSAqIEBzZWUKKwkgKiBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbk1hbmFnZXIjZGVyZWdpc3RlcihqYXZhCisJICogLmxhbmcuU3RyaW5nKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGRlcmVnaXN0ZXIoU3RyaW5nIHJlZ2lzdHJhdGlvbikgeworCQlpZiAocHJvY2Vzc29ycy5jb250YWluc0tleShyZWdpc3RyYXRpb24pKSB7CisJCQljbG9zZShyZWdpc3RyYXRpb24pOworCQl9CisKKwkJZW5kcG9pbnQucGF0aChyZWdpc3RyYXRpb24pLnJlcXVlc3QoKS5kZWxldGUoKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjbG9zZShib29sZWFuIGlzRGVyZWdpc3RlckFsbCkgdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiB7CisJCUxPR0dFUi5pbmZvKCJDbG9zaW5nIE5vdGlmaWNhdGlvbk1hbmFnZXIuLi4iKTsKKworCQlmb3IgKFN0cmluZyByZWdpc3RyYXRpb24gOiBwcm9jZXNzb3JzLmtleVNldCgpKSB7CisJCQlpZiAoaXNEZXJlZ2lzdGVyQWxsKSB7CisJCQkJTE9HR0VSLmRlYnVnKCJEZXJlZ2lzdGVyaW5nICd7fScuIiwgcmVnaXN0cmF0aW9uKTsKKwkJCQlkZXJlZ2lzdGVyKHJlZ2lzdHJhdGlvbik7CisJCQl9IGVsc2UgeworCQkJCUxPR0dFUi5kZWJ1ZygiRGlzY29ubmVjdGluZyAne30nLiIsIHJlZ2lzdHJhdGlvbik7CisJCQkJY2xvc2UocmVnaXN0cmF0aW9uKTsKKwkJCX0KKwkJfQorCX0KKworCS8qKgorCSAqIFJlY3JlYXRlcyB0aGUge0BsaW5rIEV2ZW50SW5wdXR9LCBhdHRhY2hlcyBhbiB7QGxpbmsgRXZlbnRQcm9jZXNzb3J9IHRvIGl0CisJICogYW5kIHN0b3JlcyB0aGUge0BsaW5rIEV2ZW50UHJvY2Vzc29yfSBpbiB0aGUgcHJvY2Vzc29ycyBtYXAuCisJICogCisJICogQHBhcmFtIHJlZ2lzdHJhdGlvbgorCSAqIEBwYXJhbSBsaXN0ZW5lcgorCSAqIEB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uCisJICovCisJcHJpdmF0ZSB2b2lkIHJlY3JlYXRlRXZlbnRTdHJlYW0oU3RyaW5nIHJlZ2lzdHJhdGlvbiwgTm90aWZpY2F0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBOb3RpZmljYXRpb25FeGNlcHRpb24geworCQl0cnkgeworCQkJTE9HR0VSLmluZm8oIlJlcXVlc3RpbmcgZXZlbnQgaW5wdXQgZm9yIHt9IiwgcmVnaXN0cmF0aW9uKTsKKwkJCUV2ZW50SW5wdXQgZXZlbnRJbnB1dCA9IGVuZHBvaW50LnBhdGgocmVnaXN0cmF0aW9uKS5yZXF1ZXN0KFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTX1RZUEUpCisJCQkJCS5nZXQoRXZlbnRJbnB1dC5jbGFzcyk7CisKKwkJCUxPR0dFUi5pbmZvKCJSZWNlaXZlZCBldmVudCBpbnB1dCwgc3RhcnRpbmcgZXZlbnQgcHJvY2Vzc29yLiIpOworCQkJRXZlbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEV2ZW50UHJvY2Vzc29yKGV2ZW50SW5wdXQsIGxpc3RlbmVyLCB0aGlzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKworCQkJZXhlY3V0b3Iuc3VibWl0KHByb2Nlc3Nvcik7CisKKwkJCXByb2Nlc3NvcnMucHV0KHJlZ2lzdHJhdGlvbiwgcHJvY2Vzc29yKTsKKwkJCUxPR0dFUi5pbmZvKCJFdmVudCBwcm9jZXNzb3Igc3RhcnRlZC4iKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCXRyeSB7CisJCQkJZGVyZWdpc3RlcihyZWdpc3RyYXRpb24pOworCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisJCQkJTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gdXBvbiBkZXJlZ2lzdGVyaW5nISIpOworCQkJfQorCQkJdGhyb3cgbmV3IE5vdGlmaWNhdGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBldmVudCBpbnB1dCBzdHJlYW0hIiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDaGVja3MgaWYgYW55IHJlZ2lzdGVyZWQgZXZlbnQgcHJvY2Vzc29yIGdvdCBkaXNjb25uZWN0ZWQgYW5kIHRyaWVzIHRvCisJICogcmVjcmVhdGUgdGhlIGV2ZW50IHN0cmVhbSwgaWYgbmVjZXNzYXJ5LgorCSAqLworCXByaXZhdGUgdm9pZCByZWNvbm5lY3QoKSB7CisKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBFdmVudFByb2Nlc3Nvcj4gZW50cnkgOiBwcm9jZXNzb3JzLmVudHJ5U2V0KCkpIHsKKwkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpLmlzRGlzY29ubmVjdGVkKCkpIHsKKwkJCQl0cnkgeworCQkJCQlMT0dHRVIudHJhY2UoIlJlZ2lzdHJhdGlvbiAne30nIHdhcyBkaXNjb25uZWN0ZWQgYW5kIHdpbGwgYmUgcmVjcmVhdGVkLiIsIGVudHJ5LmdldEtleSgpKTsKKwkJCQkJcmVjcmVhdGVFdmVudFN0cmVhbShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS5nZXRMaXN0ZW5lcigpKTsKKwkJCQl9IGNhdGNoIChOb3RpZmljYXRpb25FeGNlcHRpb24gZSkgeworCQkJCQlMT0dHRVIud2FybigiQ2Fubm90IHJlY3JlYXRlIGV2ZW50IHN0cmVhbSBmb3IgcmVnaXN0cmF0aW9uICIgKyBlbnRyeS5nZXRLZXkoKSwgZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNsb3NlKFN0cmluZyByZWdpc3RyYXRpb24pIHsKKwkJaWYgKHByb2Nlc3NvcnMuY29udGFpbnNLZXkocmVnaXN0cmF0aW9uKSkgeworCQkJRXZlbnRQcm9jZXNzb3IgcHJvY2Vzc29yID0gcHJvY2Vzc29ycy5nZXQocmVnaXN0cmF0aW9uKTsKKwkJCXByb2Nlc3Nvci5zdG9wKCk7CisJCQlwcm9jZXNzb3JzLnJlbW92ZShyZWdpc3RyYXRpb24pOworCQl9CisJfQorCisJLyoqCisJICogSGFuZGxlciBmb3IgRXhjZXB0aW9ucyBkdXJpbmcgZXZlbnQgcHJvY2Vzc2luZy4KKwkgKiAKKwkgKiBAcGFyYW0gZSBFeGNlcHRpb24gd2hpY2ggb2NjdXJlZCBkdXJpbmcgZXZlbnQgcHJvY2Vzc2luZy4KKwkgKi8KKwl2b2lkIHByb2Nlc3NFeGNlcHRpb24oRXhjZXB0aW9uIGUpIHsKKwkJTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gZHVyaW5nIG5vdGlmaWNhdGlvbiBwcm9jZXNzaW5nISIsIGUpOworCX0KKworCS8qKgorCSAqIEhhbmRsZXIgZm9yIG5vdGlmaWNhdGlvbnMuCisJICogCisJICogQHBhcmFtIG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbiB0byBwcm9jZXNzLgorCSAqIEBwYXJhbSBub3RpZmljYXRpb25MaXN0ZW5lciBub3RpZmljYXRpb24gbGlzdGVuZXIgZm9yIGhhbmRsaW5nIHRoZQorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uCisJICovCisJdm9pZCBwcm9jZXNzTm90aWZpY2F0aW9uKE5vdGlmaWNhdGlvbiBuLCBOb3RpZmljYXRpb25MaXN0ZW5lciBub3RpZmljYXRpb25MaXN0ZW5lcikgeworCQlpZiAoTE9HR0VSLmlzRGVidWdFbmFibGVkKCkpIHsKKwkJCUxPR0dFUi5kZWJ1ZygiUHJvY2Vzc2luZyBub3RpZmljYXRpb24gZXZlbnQ6ICIgKyBuKTsKKwkJfQorCisJCXRyeSB7CisJCQlVc2VyIHVzZXIgPSBsb2FkZXIubG9hZChuZXcgS2V5PD4oVXNlci5jbGFzcyksIExvbmcudG9TdHJpbmcobi5nZXRVc2VySWQoKSkpOworCisJCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZUJ5SWQoTG9uZy50b1N0cmluZyhuLmdldEFpZCgpKSk7CisKKwkJCWlmIChMT0dHRVIuaXNUcmFjZUVuYWJsZWQoKSkgeworCQkJCUxPR0dFUi50cmFjZSgiTm90aWZpY2F0aW9uIGV2ZW50IHdpdGg6IGVudGl0eVR5cGU9IiArIGVudGl0eVR5cGUgKyAiLCB1c2VyPSIgKyB1c2VyKTsKKwkJCX0KKwkJCXN3aXRjaCAobi5nZXRUeXBlKCkpIHsKKwkJCWNhc2UgTkVXOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLmluc3RhbmNlQ3JlYXRlZChsb2FkZXIubG9hZEVudGl0aWVzKGVudGl0eVR5cGUsIG4uZ2V0SWlkTGlzdCgpLnN0cmVhbSgpCisJCQkJCQkubWFwKGlkIC0+IGlkLnRvU3RyaW5nKCkpLmZpbHRlcihPRFNVdGlsczo6aXNWYWxpZElEKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PRElGWToKKwkJCQlub3RpZmljYXRpb25MaXN0ZW5lci5pbnN0YW5jZU1vZGlmaWVkKGxvYWRlci5sb2FkRW50aXRpZXMoZW50aXR5VHlwZSwgbi5nZXRJaWRMaXN0KCkuc3RyZWFtKCkKKwkJCQkJCS5tYXAoaWQgLT4gaWQudG9TdHJpbmcoKSkuZmlsdGVyKE9EU1V0aWxzOjppc1ZhbGlkSUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpLCB1c2VyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgREVMRVRFOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLmluc3RhbmNlRGVsZXRlZChlbnRpdHlUeXBlLCBuLmdldElpZExpc3QoKS5zdHJlYW0oKS5tYXAoaWQgLT4gaWQudG9TdHJpbmcoKSkKKwkJCQkJCS5maWx0ZXIoT0RTVXRpbHM6OmlzVmFsaWRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIE1PREVMOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLm1vZGVsTW9kaWZpZWQoZW50aXR5VHlwZSwgdXNlcik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNFQ1VSSVRZOgorCQkJCW5vdGlmaWNhdGlvbkxpc3RlbmVyLnNlY3VyaXR5TW9kaWZpZWQoZW50aXR5VHlwZSwgbi5nZXRJaWRMaXN0KCkuc3RyZWFtKCkubWFwKGlkIC0+IGlkLnRvU3RyaW5nKCkpCisJCQkJCQkuZmlsdGVyKE9EU1V0aWxzOjppc1ZhbGlkSUQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSksIHVzZXIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcm9jZXNzRXhjZXB0aW9uKG5ldyBOb3RpZmljYXRpb25FeGNlcHRpb24oIkludmFsaWQgbm90aWZpY2F0aW9uIHR5cGUhIikpOworCQkJfQorCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJcHJvY2Vzc0V4Y2VwdGlvbihuZXcgTm90aWZpY2F0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgcHJvY2VzcyBub3RpZmljYXRpb24hIiwgZSkpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUHJvdG9idWZDb252ZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9ub3RpZmljYXRpb24vcGVhay9Qcm90b2J1ZkNvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWE2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUHJvdG9idWZDb252ZXJ0ZXIuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLm5vdGlmaWNhdGlvbi5wZWFrOworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm5vdGlmaWNhdGlvbi5Ob3RpZmljYXRpb25GaWx0ZXIuTW9kaWZpY2F0aW9uVHlwZTsKKworaW1wb3J0IGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuUmVnaXN0cmF0aW9uOworaW1wb3J0IGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuUmVnaXN0cmF0aW9uLk5vdGlmaWNhdGlvbk1vZGU7CisKKy8qKgorICogSGVscGVyIGNsYXNzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gcHJvdG9idWYgYW5kIG1kbSB0eXBlcy4KKyAqIAorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIE1hdHRoaWFzIEtvbGxlciwgUGVhayBTb2x1dGlvbiBHbWJICisgKgorICovCitwdWJsaWMgY2xhc3MgUHJvdG9idWZDb252ZXJ0ZXIgeworCisJLyoqCisJICogQ29udmVydCBhIG5vdGlmaWNhdGlvbiBmaWx0ZXIgdG8gYSByZWdpc3RyYXRpb24uCisJICogCisJICogQHBhcmFtIGZpbHRlciBub3RpZmljYXRpb24gZmlsdGVyLgorCSAqIEByZXR1cm4gcmVnaXN0cmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZpbHRlci4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlZ2lzdHJhdGlvbiBmcm9tKE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIpIHsKKwkJcmV0dXJuIFJlZ2lzdHJhdGlvbi5uZXdCdWlsZGVyKCkuc2V0TW9kZShOb3RpZmljYXRpb25Nb2RlLlBVU0gpCisJCQkJLmFkZEFsbEFpZCgKKwkJCQkJCWZpbHRlci5nZXRFbnRpdHlUeXBlcygpLnN0cmVhbSgpLm1hcChlIC0+IExvbmcudmFsdWVPZihlLmdldElkKCkpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKQorCQkJCS5hZGRBbGxUeXBlKGZpbHRlci5nZXRUeXBlcygpLnN0cmVhbSgpLm1hcCh0IC0+IFByb3RvYnVmQ29udmVydGVyLmZyb20odCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpCisJCQkJLmJ1aWxkKCk7CisJfQorCisJLyoqCisJICogQHBhcmFtIHQgbWRtIG1vZGlmaWNhdGlvbiB0eXBlLgorCSAqIEByZXR1cm4gcHJvdG9idWYgbm90aWZpY2F0aW9uIHR5cGUuCisJICovCisJcHVibGljIHN0YXRpYyBjb20ucGVha3NvbHV0aW9uLm9kcy5ub3RpZmljYXRpb24ucHJvdG9idWYuTm90aWZpY2F0aW9uUHJvdG9zLk1vZGlmaWNhdGlvblR5cGUgZnJvbSgKKwkJCU1vZGlmaWNhdGlvblR5cGUgdCkgeworCQlzd2l0Y2ggKHQpIHsKKwkJY2FzZSBJTlNUQU5DRV9DUkVBVEVEOgorCQkJcmV0dXJuIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZS5ORVc7CisJCWNhc2UgSU5TVEFOQ0VfTU9ESUZJRUQ6CisJCQlyZXR1cm4gY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Nb2RpZmljYXRpb25UeXBlLk1PRElGWTsKKwkJY2FzZSBJTlNUQU5DRV9ERUxFVEVEOgorCQkJcmV0dXJuIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZS5ERUxFVEU7CisJCWNhc2UgTU9ERUxfTU9ESUZJRUQ6CisJCQlyZXR1cm4gY29tLnBlYWtzb2x1dGlvbi5vZHMubm90aWZpY2F0aW9uLnByb3RvYnVmLk5vdGlmaWNhdGlvblByb3Rvcy5Nb2RpZmljYXRpb25UeXBlLk1PREVMOworCQljYXNlIFNFQ1VSSVRZX01PRElGSUVEOgorCQkJcmV0dXJuIGNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZS5TRUNVUklUWTsKKwkJZGVmYXVsdDoKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZW51bSB2YWx1ZSEiKTsgLy8gVE9ETworCQl9CisJfQorCisJLyoqCisJICogQHBhcmFtIHQgcHJvdG9idWYgbm90aWZpY2F0aW9uIHR5cGUKKwkgKiBAcmV0dXJuIG1kbSBub3RpZmljYXRpb24gdHlwZQorCSAqLworCXB1YmxpYyBzdGF0aWMgTW9kaWZpY2F0aW9uVHlwZSB0bygKKwkJCWNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1Zi5Ob3RpZmljYXRpb25Qcm90b3MuTW9kaWZpY2F0aW9uVHlwZSB0KSB7CisJCXN3aXRjaCAodCkgeworCQljYXNlIE5FVzoKKwkJCXJldHVybiBNb2RpZmljYXRpb25UeXBlLklOU1RBTkNFX0NSRUFURUQ7CisJCWNhc2UgTU9ESUZZOgorCQkJcmV0dXJuIE1vZGlmaWNhdGlvblR5cGUuSU5TVEFOQ0VfTU9ESUZJRUQ7CisJCWNhc2UgREVMRVRFOgorCQkJcmV0dXJuIE1vZGlmaWNhdGlvblR5cGUuSU5TVEFOQ0VfREVMRVRFRDsKKwkJY2FzZSBNT0RFTDoKKwkJCXJldHVybiBNb2RpZmljYXRpb25UeXBlLk1PREVMX01PRElGSUVEOworCQljYXNlIFNFQ1VSSVRZOgorCQkJcmV0dXJuIE1vZGlmaWNhdGlvblR5cGUuU0VDVVJJVFlfTU9ESUZJRUQ7CisJCWRlZmF1bHQ6CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVudW0gdmFsdWUhIik7IC8vIFRPRE8KKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNBdHRyaWJ1dGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmU0ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Mb25nU3RyZWFtOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxBdHRyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTVXRpbHM7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQXR0cmlidXRlfSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBjbGFzcyBPRFNBdHRyaWJ1dGUgaW1wbGVtZW50cyBBdHRyaWJ1dGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248Pz4gZW51bU9iajsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCXByaXZhdGUgZmluYWwgU3RyaW5nIHVuaXQ7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlUeXBlIGVudGl0eVR5cGU7CisJcHJpdmF0ZSBmaW5hbCBWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlOworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0lkQXR0cmlidXRlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIHBhcmVudCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGFwcGxBdHRyICAgVGhlIE9EUyBtZXRhIGRhdGEgZm9yIHRoaXMgYXR0cmlidXRlLgorCSAqIEBwYXJhbSB1bml0ICAgICAgIFRoZSB1bml0IG5hbWUuCisJICogQHBhcmFtIGVudW1PYmogICAgVGhlIGVudW1lcmF0aW9uIGNsYXNzLCBtYXkgYmUgbnVsbC4KKwkgKi8KKwlPRFNBdHRyaWJ1dGUoRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBBcHBsQXR0ciBhcHBsQXR0ciwgU3RyaW5nIHVuaXQsIEVudW1lcmF0aW9uPD8+IGVudW1PYmopIHsKKwkJdGhpcy5lbnRpdHlUeXBlID0gZW50aXR5VHlwZTsKKwkJbmFtZSA9IGFwcGxBdHRyLmFhTmFtZTsKKwkJdGhpcy51bml0ID0gdW5pdCA9PSBudWxsID8gIiIgOiB1bml0OworCisJCWlmIChpc0lEQXR0cmlidXRlKGVudGl0eVR5cGUsIGFwcGxBdHRyKSkgeworCQkJdmFsdWVUeXBlID0gVmFsdWVUeXBlLlNUUklORzsKKwkJCWlzSWRBdHRyaWJ1dGUgPSB0cnVlOworCQl9IGVsc2UgeworCQkJdmFsdWVUeXBlID0gT0RTVXRpbHMuVkFMVUVUWVBFUy5pbnZlcnNlKCkuZ2V0KGFwcGxBdHRyLmRUeXBlKTsKKwkJCWlzSWRBdHRyaWJ1dGUgPSBmYWxzZTsKKwkJfQorCisJCWlmICh2YWx1ZVR5cGUuaXNFbnVtZXJhdGlvblR5cGUoKSAmJiBlbnVtT2JqID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisJCQkJCSJBIG1vZGVsZWQgYXR0cmlidXRlIHdpdGggYW4gZW51bWVyYXRpb24gdmFsdWUgdHlwZSBtdXN0IGhhdmUgYW4gIiArICJlbnVtZXJhdGlvbiBkZWZpbml0aW9uLiIpOworCQl9CisKKwkJdGhpcy5lbnVtT2JqID0gZW51bU9iajsKKwl9CisKKwlwcml2YXRlIGJvb2xlYW4gaXNJREF0dHJpYnV0ZShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIEFwcGxBdHRyIGFwcGxBdHRyKSB7CisJCWZvciAoUmVsYXRpb24gciA6IGVudGl0eVR5cGUuZ2V0UmVsYXRpb25zKCkpIHsKKwkJCWlmIChhcHBsQXR0ci5hYU5hbWUuZXF1YWxzSWdub3JlQ2FzZShyLmdldE5hbWUoKSkpIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gImlkIi5lcXVhbHNJZ25vcmVDYXNlKGFwcGxBdHRyLmJhTmFtZSk7CisJfQorCisJcHVibGljIGJvb2xlYW4gaXNJZEF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIGlzSWRBdHRyaWJ1dGU7CisJfQorCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldFVuaXQoKSB7CisJCXJldHVybiB1bml0OworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5VHlwZSBnZXRFbnRpdHlUeXBlKCkgeworCQlyZXR1cm4gZW50aXR5VHlwZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFZhbHVlVHlwZTw/PiBnZXRWYWx1ZVR5cGUoKSB7CisJCXJldHVybiB2YWx1ZVR5cGU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnVtZXJhdGlvbjw/PiBnZXRFbnVtT2JqKCkgeworCQlpZiAoZ2V0VmFsdWVUeXBlKCkuaXNFbnVtZXJhdGlvblR5cGUoKSkgeworCQkJcmV0dXJuIGVudW1PYmo7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgdmFsdWUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYW4gZW51bWVyYXRpb24gdHlwZS4iKTsKKwl9CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVmFsdWUgY3JlYXRlVmFsdWUoU3RyaW5nIHVuaXQsIGJvb2xlYW4gdmFsaWQsIE9iamVjdCBpbnB1dCkgeworCQlyZXR1cm4gQXR0cmlidXRlLnN1cGVyLmNyZWF0ZVZhbHVlKHVuaXQsIHZhbGlkLCBjb252ZXJ0SW5wdXRGb3JJZEF0dHJpYnV0ZShpbnB1dCkpOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBWYWx1ZSBjcmVhdGVWYWx1ZVNlcShTdHJpbmcgdW5pdCwgT2JqZWN0IGlucHV0KSB7CisJCXJldHVybiBBdHRyaWJ1dGUuc3VwZXIuY3JlYXRlVmFsdWVTZXEodW5pdCwgY29udmVydElucHV0Rm9ySWRBdHRyaWJ1dGUoaW5wdXQpKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyB0aGUgaW5wdXQgb2JqZWN0IGZyb20gbG9uZy9sb25nLWFycmF5L2ludC9pbnQtYXJyYXkgdG8gYQorCSAqIFN0cmluZy9TdHJpbmctYXJyYXkKKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIGlucHV0IHRvIGNvbnZlcnQKKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQgaW5wdXQKKwkgKi8KKwlwcml2YXRlIE9iamVjdCBjb252ZXJ0SW5wdXRGb3JJZEF0dHJpYnV0ZShPYmplY3QgaW5wdXQpIHsKKwkJaWYgKGlzSWRBdHRyaWJ1dGUpIHsKKwkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIExvbmcgfHwgaW5wdXQgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisJCQkJcmV0dXJuIGlucHV0LnRvU3RyaW5nKCk7CisJCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgbG9uZ1tdKSB7CisJCQkJcmV0dXJuIExvbmdTdHJlYW0ub2YoKGxvbmdbXSkgaW5wdXQpLm1hcFRvT2JqKExvbmc6OnRvU3RyaW5nKS50b0FycmF5KFN0cmluZ1tdOjpuZXcpOworCQkJfSBlbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIGludFtdKSB7CisJCQkJcmV0dXJuIEludFN0cmVhbS5vZigoaW50W10pIGlucHV0KS5tYXBUb09iaihJbnRlZ2VyOjp0b1N0cmluZykudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBpbnB1dDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIE9iamVjdHMuaGFzaChnZXRFbnRpdHlUeXBlKCksIGdldE5hbWUoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBPRFNBdHRyaWJ1dGUpIHsKKwkJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlKSBvYmplY3Q7CisJCQlyZXR1cm4gZ2V0RW50aXR5VHlwZSgpLmVxdWFscyhhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpKSAmJiBnZXROYW1lKCkuZXF1YWxzKGF0dHJpYnV0ZS5nZXROYW1lKCkpOworCQl9CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gZ2V0TmFtZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNFbnRpdHlGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTRW50aXR5RmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWJmYzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTRW50aXR5RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5OworCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlLlZBVFRSX0VOVU1FUkFUSU9OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlLlZBVFRSX1NDQUxBUl9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0F0dHJpYnV0ZS5WQVRUUl9TRVFVRU5DRTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5DaGlsZHJlblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRGVmYXVsdENvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkF4aXNUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvblZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5JbnRlcnBvbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TY2FsYXJUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5TZXF1ZW5jZVJlcHJlc2VudGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UeXBlU3BlY2lmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WZXJzaW9uU3RhdGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkVudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZy5LZXk7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgRW50aXR5RmFjdG9yeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRFNFbnRpdHlGYWN0b3J5IGV4dGVuZHMgRW50aXR5RmFjdG9yeSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPj4gRU5VTV9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8PigpOworCisJc3RhdGljIHsKKwkJRU5VTV9DTEFTU0VTLmFkZChTY2FsYXJUeXBlLmNsYXNzKTsKKwkJRU5VTV9DTEFTU0VTLmFkZChWZXJzaW9uU3RhdGUuY2xhc3MpOworCQlFTlVNX0NMQVNTRVMuYWRkKEludGVycG9sYXRpb24uY2xhc3MpOworCQlFTlVNX0NMQVNTRVMuYWRkKEF4aXNUeXBlLmNsYXNzKTsKKwkJRU5VTV9DTEFTU0VTLmFkZChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmNsYXNzKTsKKwkJRU5VTV9DTEFTU0VTLmFkZChUeXBlU3BlY2lmaWNhdGlvbi5jbGFzcyk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIE9wdGlvbmFsPFVzZXI+IGxvZ2dlZEluVXNlcjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBjcmVhdGUge0BsaW5rIENvcmV9cy4KKwkgKiBAcGFyYW0gbG9nZ2VkSW5Vc2VyIFRoZSBsb2dnZWQgaW4ge0BsaW5rIFVzZXJ9LgorCSAqLworCXB1YmxpYyBPRFNFbnRpdHlGYWN0b3J5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIE9wdGlvbmFsPFVzZXI+IGxvZ2dlZEluVXNlcikgeworCQl0aGlzLm1vZGVsTWFuYWdlciA9IG1vZGVsTWFuYWdlcjsKKwkJdGhpcy5sb2dnZWRJblVzZXIgPSBsb2dnZWRJblVzZXI7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogRXh0cmFjdHMgdGhlIHtAbGluayBDb3JlfSBmcm9tIGFuIHtAbGluayBFbnRpdHl9IGluc3RhbmNlLiBUaGlzIG1ldGhvZAorCSAqIGVmZmVjdGl2ZWx5IG1ha2VzIGFjY2VzcyB0byB0aGUgQ29yZSBvZiBhIEJhc2VFbnRpdHkgcHVibGljbHkgYXZhaWxhYmxlIChieQorCSAqIGNhbGxpbmcgdGhlIGNvcnJlc3BvbmRpbmcgcHJvdGVjdGVkIG1ldGhvZCBvZiBCYXNlRW50aXR5RmFjdG9yeSwgd2hpY2ggaXMKKwkgKiB0aGlzIGNsYXNzJ3Mgc3VwZXJjbGFzcykgdG8gdXNlcnMgb2YgT0RTRW50aXR5RmFjdG9yeS4KKwkgKiAKKwkgKiBAcGFyYW0gZW50aXR5IFRoZSB7QGxpbmsgRW50aXR5fSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgdGhlIHtAbGluayBDb3JlfS4KKwkgKiBAcmV0dXJuIFRoZSBlbnRpdHkncyB7QGxpbmsgQ29yZX0uCisJICovCisJcHVibGljIHN0YXRpYyBDb3JlIGV4dHJhY3QoRW50aXR5IGVudGl0eSkgeworCQlpZiAoZW50aXR5IGluc3RhbmNlb2YgQmFzZUVudGl0eSkgeworCQkJcmV0dXJuIGdldENvcmUoKEJhc2VFbnRpdHkpIGVudGl0eSk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgb2YgdHlwZSAnIiArIGVudGl0eS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKQorCQkJCQkrICInIGRvZXMgbm90IGV4dGVuZCAnIiArIEJhc2VFbnRpdHkuY2xhc3MuZ2V0TmFtZSgpICsgIiciKTsKKwkJfQorCX0KKworCS8qKgorCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIEVudGl0eX0gaW50ZXJmYWNlIHdpdGgKKwkgKiBjb3JlIGFzIHRoZSBpbnN0YW5jZSdzIHtAbGluayBDb3JlfS4gVGhpcyBtZXRob2QgZWZmZWN0aXZlbHkgbWFrZXMgdGhlCisJICogcHJvdGVjdGVkIEJhc2VFbnRpdHkgY29uc3RydWN0b3IgcHVibGljbHkgYXZhaWxhYmxlIChieSBjYWxsaW5nIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgcHJvdGVjdGVkIG1ldGhvZCBvZiBCYXNlRW50aXR5RmFjdG9yeSwgd2hpY2ggaXMgdGhpcyBjbGFzcydzCisJICogc3VwZXJjbGFzcykgdG8gdXNlcnMgb2YgT0RTRW50aXR5RmFjdG9yeS4KKwkgKiAKKwkgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlLCBtdXN0IGltcGxlbWVudCB0aGUge0BsaW5rIEVudGl0eX0KKwkgKiAgICAgICAgICAgICAgaW50ZXJmYWNlLgorCSAqIEBwYXJhbSBjb3JlICBUaGUge0BsaW5rIENvcmV9IHRvIHVzZSBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2UuCisJICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IFQgY3JlYXRlRW50aXR5KENsYXNzPFQ+IGNsYXp6LCBDb3JlIGNvcmUpIHsKKwkJaWYgKEJhc2VFbnRpdHkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKKwkJCXJldHVybiAoVCkgY3JlYXRlQmFzZUVudGl0eShjbGF6ei5hc1N1YmNsYXNzKEJhc2VFbnRpdHkuY2xhc3MpLCBjb3JlKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJCSJDbGFzcyAnIiArIGNsYXp6LmdldFNpbXBsZU5hbWUoKSArICInIGRvZXMgbm90IGV4dGVuZCAnIiArIEJhc2VFbnRpdHkuY2xhc3MuZ2V0TmFtZSgpICsgIiciKTsKKwkJfQorCisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBPcHRpb25hbDxVc2VyPiBnZXRMb2dnZWRJblVzZXIoKSB7CisJCXJldHVybiBsb2dnZWRJblVzZXI7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKENsYXNzPFQ+IGVudGl0eUNsYXNzKSB7CisJCXJldHVybiBjcmVhdGVDb3JlKG5ldyBLZXk8PihlbnRpdHlDbGFzcykpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShDbGFzczxUPiBlbnRpdHlDbGFzcywgQ29udGV4dFR5cGUgY29udGV4dFR5cGUpIHsKKwkJcmV0dXJuIGNyZWF0ZUNvcmUobmV3IEtleTw+KGVudGl0eUNsYXNzLCBjb250ZXh0VHlwZSkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEVudGl0eVN0b3JlIGdldE11dGFibGVTdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gRW50aXR5RmFjdG9yeS5nZXRNdXRhYmxlU3RvcmUoZW50aXR5KTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHlTdG9yZSBnZXRQZXJtYW5lbnRTdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gRW50aXR5RmFjdG9yeS5nZXRQZXJtYW5lbnRTdG9yZShlbnRpdHkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIENoaWxkcmVuU3RvcmUgZ2V0Q2hpbGRyZW5TdG9yZShCYXNlRW50aXR5IGVudGl0eSkgeworCQlyZXR1cm4gRW50aXR5RmFjdG9yeS5nZXRDaGlsZHJlblN0b3JlKGVudGl0eSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudGl0eT4gQ29yZSBjcmVhdGVDb3JlKFN0cmluZyBuYW1lLCBDbGFzczxUPiBlbnRpdHlDbGFzcykgeworCQlFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eUNvbmZpZyhtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShuYW1lKSk7CisJCWlmICghZW50aXR5Q2xhc3MuZXF1YWxzKGVudGl0eUNvbmZpZy5nZXRFbnRpdHlDbGFzcygpKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIGVudGl0eSBjbGFzcyBleHBlY3RlZCAnIiArIGVudGl0eUNsYXNzLmdldE5hbWUoKQorCQkJCQkrICInIGJ1dCBnb3QgJyIgKyBlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKS5nZXROYW1lKCkgKyAiJyIpOworCQl9CisJCUNvcmUgY29yZSA9IG5ldyBEZWZhdWx0Q29yZShlbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpKTsKKwkJY29yZS5nZXRWYWx1ZXMoKS5nZXQoRW50aXR5LkFUVFJfTUlNRVRZUEUpLnNldChlbnRpdHlDb25maWcuZ2V0TWltZVR5cGUoKSk7CisKKwkJcmV0dXJuIGNvcmU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRW51bShFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbk9iaikgeworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKwkJLy8gY2hlY2sgaWYgZW51bSBpcyBwcm9wZXJseSByZWdpc3RlcmVkCisJCWlmIChlci5nZXQoZW51bWVyYXRpb25PYmouZ2V0TmFtZSgpKSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJHaXZlbiBlbnVtIGNsYXNzICciICsgZW51bWVyYXRpb25PYmouZ2V0TmFtZSgpICsgIicgaXMgbm90IHN1cHBvcnRlZC4iKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBCYXNlRW50aXR5PiBUIGNyZWF0ZUJhc2VFbnRpdHkoQ2xhc3M8VD4gY2xhenosIENvcmUgY29yZSkgeworCQl0cnkgeworCQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBjbGF6ei5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvcmUuY2xhc3MpOworCQkJdHJ5IHsKKwkJCQlyZXR1cm4gY29uc3RydWN0b3IubmV3SW5zdGFuY2UoY29yZSk7CisJCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4YykgeworCQkJCXJldHVybiBzdXBlci5jcmVhdGVCYXNlRW50aXR5KGNsYXp6LCBjb3JlKTsKKwkJCX0KKwkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCksIGV4Yyk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ3JlYXRlcyBhIGNvbmZpZ3VyZWQge0BsaW5rIENvcmV9IGZvciBnaXZlbiB7QGxpbmsgS2V5fS4KKwkgKgorCSAqIEBwYXJhbSA8VD4gVGhlIGVudGl0eSB0eXBlLgorCSAqIEBwYXJhbSBrZXkgVXNlZCBhcyBpZGVudGlmaWVyIHRvIHJlc29sdmUgdGhlIHtAbGluayBFbnRpdHlDb25maWd9LgorCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQge0Bjb2RlIENvcmV9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IENvcmUgY3JlYXRlQ29yZShLZXk8VD4ga2V5KSB7CisJCUVudGl0eUNvbmZpZzxUPiBlbnRpdHlDb25maWcgPSBtb2RlbE1hbmFnZXIuZmluZEVudGl0eUNvbmZpZyhrZXkpOworCQlDb3JlIGNvcmUgPSBuZXcgRGVmYXVsdENvcmUoZW50aXR5Q29uZmlnLmdldEVudGl0eVR5cGUoKSk7CisJCWNvcmUuZ2V0VmFsdWVzKCkuZ2V0KEVudGl0eS5BVFRSX01JTUVUWVBFKS5zZXQoZW50aXR5Q29uZmlnLmdldE1pbWVUeXBlKCkpOworCisJCWlmIChDYXRhbG9nQXR0cmlidXRlLmNsYXNzLmVxdWFscyhlbnRpdHlDb25maWcuZ2V0RW50aXR5Q2xhc3MoKSkpIHsKKwkJCWNvcmUuZ2V0VmFsdWVzKCkucHV0KFZBVFRSX0VOVU1FUkFUSU9OX05BTUUsIFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKFZBVFRSX0VOVU1FUkFUSU9OX05BTUUpKTsKKwkJCWNvcmUuZ2V0VmFsdWVzKCkucHV0KFZBVFRSX1NDQUxBUl9UWVBFLAorCQkJCQlWYWx1ZVR5cGUuRU5VTUVSQVRJT04uY3JlYXRlKEVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiU2NhbGFyVHlwZSIpLCBWQVRUUl9TQ0FMQVJfVFlQRSkpOworCQkJY29yZS5nZXRWYWx1ZXMoKS5wdXQoVkFUVFJfU0VRVUVOQ0UsIFZhbHVlVHlwZS5CT09MRUFOLmNyZWF0ZShWQVRUUl9TRVFVRU5DRSkpOworCQl9CisKKwkJcmV0dXJuIGNvcmU7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU0VudGl0eVR5cGUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNFbnRpdHlUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlM2E0YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNFbnRpdHlUeXBlLmphdmEKQEAgLTAsMCArMSwzMjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnk7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uLmlkZW50aXR5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuZ3JvdXBpbmdCeTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTWFwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW07CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEVudGl0eVR5cGV9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9EU0VudGl0eVR5cGUgaW1wbGVtZW50cyBFbnRpdHlUeXBlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxFbnRpdHlUeXBlLCBNYXA8U3RyaW5nLCBSZWxhdGlvbj4+IHJlbGF0aW9uc0J5RW50aXR5TmFtZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxFbnRpdHlUeXBlLCBSZWxhdGlvbj4gcmVsYXRpb25zQnlFbnRpdHkgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxSZWxhdGlvblR5cGUsIExpc3Q8UmVsYXRpb24+PiByZWxhdGlvbnNCeVR5cGUgPSBuZXcgRW51bU1hcDw+KFJlbGF0aW9uVHlwZS5jbGFzcyk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PFJlbGF0aW9uPiByZWxhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQXR0cmlidXRlPiBhdHRyaWJ1dGVCeU5hbWU7CisKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lOworCXByaXZhdGUgZmluYWwgVF9MT05HTE9ORyBvZHNJRDsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlTmFtZTsKKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHNvdXJjZU5hbWUgIE5hbWUgb2YgdGhlIGRhdGEgc291cmNlLgorCSAqIEBwYXJhbSBhcHBsRWxlbSAgICBUaGUgT0RTIG1ldGEgZGF0YSBmb3IgdGhpcyBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gdW5pdHMgICAgICAgVGhlIHVuaXQge0Bjb2RlIE1hcH0gZm9yIHVuaXQgbWFwcGluZyBvZiBhdHRyaWJ1dGVzLgorCSAqIEBwYXJhbSBlbnVtQ2xhc3NlcyBUaGUgZW51bWVyYXRpb24gY2xhc3Mge0Bjb2RlIE1hcH0gZm9yIGVudW0gbWFwcGluZyBvZgorCSAqICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLgorCSAqLworCisJT0RTRW50aXR5VHlwZShTdHJpbmcgc291cmNlTmFtZSwgQXBwbEVsZW0gYXBwbEVsZW0sIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5pdHMsCisJCQlNYXA8U3RyaW5nLCBFbnVtZXJhdGlvbjw/Pj4gZW51bU9ianMpIHsKKwkJdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTsKKwkJYmFzZU5hbWUgPSBhcHBsRWxlbS5iZU5hbWU7CisJCW5hbWUgPSBhcHBsRWxlbS5hZU5hbWU7CisJCW9kc0lEID0gYXBwbEVsZW0uYWlkOworCisJCWF0dHJpYnV0ZUJ5TmFtZSA9IEFycmF5cworCQkJCS5zdHJlYW0oYXBwbEVsZW0uYXR0cmlidXRlcykubWFwKGEgLT4gbmV3IE9EU0F0dHJpYnV0ZSh0aGlzLCBhLAorCQkJCQkJdW5pdHMuZ2V0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGEudW5pdElkKSkpLCBlbnVtT2Jqcy5nZXQoYS5hYU5hbWUpKSkKKwkJCQkuY29sbGVjdCh0b01hcChBdHRyaWJ1dGU6OmdldE5hbWUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRTb3VyY2VOYW1lKCkgeworCQlyZXR1cm4gc291cmNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBPRFMgYmFzZSBuYW1lIHRoaXMgZW50aXR5IHR5cGUgaXMgZGVyaXZlZCBmcm9tLgorCSAqCisJICogQHJldHVybiBUaGUgYmFzZSBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZU5hbWUoKSB7CisJCXJldHVybiBiYXNlTmFtZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgeworCQlyZXR1cm4gbmV3IEFycmF5TGlzdDw+KGF0dHJpYnV0ZUJ5TmFtZS52YWx1ZXMoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKSB7CisJCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVCeU5hbWUuZ2V0KG5hbWUpOworCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKwkJCU9wdGlvbmFsPFJlbGF0aW9uPiByZWxhdGlvbiA9IGdldFJlbGF0aW9ucygpLnN0cmVhbSgpLmZpbHRlcihyIC0+IHIuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkuZmluZEFueSgpOworCQkJcmV0dXJuIHJlbGF0aW9uLm1hcChSZWxhdGlvbjo6Z2V0QXR0cmlidXRlKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiQXR0cmlidXRlIHdpdGggbmFtZSAnIiArIG5hbWUgKyAiJyBub3QgZm91bmQgYXQgZW50aXR5IHR5cGUgJyIgKyBnZXROYW1lKCkgKyAiJy4iKSk7CisJCX0KKwkJcmV0dXJuIGF0dHJpYnV0ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBPRFMgdHlwZSBJRCBvZiB0aGlzIGVudGl0eSB0eXBlLgorCSAqCisJICogQHJldHVybiBUaGUgT0RTIHR5cGUgSUQgaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIFRfTE9OR0xPTkcgZ2V0T0RTSUQoKSB7CisJCXJldHVybiBvZHNJRDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKwkJcmV0dXJuIExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKG9kc0lEKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVsYXRpb25zKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldFBhcmVudFJlbGF0aW9ucygpIHsKKwkJcmV0dXJuIGdldFJlbGF0aW9ucyhSZWxhdGlvblR5cGUuRkFUSEVSX0NISUxEKS5zdHJlYW0oKQorCQkJCS5maWx0ZXIociAtPiAoKE9EU1JlbGF0aW9uKSByKS5pc091dGdvaW5nKFJlbGF0aW9uVHlwZS5GQVRIRVJfQ0hJTEQpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZWxhdGlvbj4gZ2V0Q2hpbGRSZWxhdGlvbnMoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnMoUmVsYXRpb25UeXBlLkZBVEhFUl9DSElMRCkuc3RyZWFtKCkKKwkJCQkuZmlsdGVyKHIgLT4gKChPRFNSZWxhdGlvbikgcikuaXNJbmNvbWluZyhSZWxhdGlvblR5cGUuRkFUSEVSX0NISUxEKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVsYXRpb24+IGdldEluZm9SZWxhdGlvbnMoKSB7CisJCXJldHVybiBnZXRSZWxhdGlvbnMoUmVsYXRpb25UeXBlLklORk8pLnN0cmVhbSgpLmZpbHRlcihyIC0+ICgoT0RTUmVsYXRpb24pIHIpLmlzT3V0Z29pbmcoUmVsYXRpb25UeXBlLklORk8pKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZWxhdGlvbj4gZ2V0UmVsYXRpb25zKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpIHsKKwkJTGlzdDxSZWxhdGlvbj4gcmVzdWx0ID0gcmVsYXRpb25zQnlUeXBlLmdldChyZWxhdGlvblR5cGUpOworCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uIGdldFJlbGF0aW9uKEVudGl0eVR5cGUgdGFyZ2V0KSB7CisJCVJlbGF0aW9uIHJlbGF0aW9uID0gcmVsYXRpb25zQnlFbnRpdHkuZ2V0KHRhcmdldCk7CisJCWlmIChyZWxhdGlvbiA9PSBudWxsKSB7CisJCQkvLyBtdWx0aXBsZSByZWxhdGlvbnMgdG8gdGFyZ2V0IGV4aXN0LCB0cnkgdG8gdXNlIGEgZGVmYXVsdAorCQkJTWFwPFN0cmluZywgUmVsYXRpb24+IHJlbGF0aW9uc0J5TmFtZSA9IHJlbGF0aW9uc0J5RW50aXR5TmFtZS5nZXQodGFyZ2V0KTsKKwkJCWlmIChyZWxhdGlvbnNCeU5hbWUgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlbGF0aW9ucyB0byAnIiArIHRhcmdldCArICInIG5vdCBmb3VuZCEiKTsKKwkJCX0KKworCQkJcmVsYXRpb24gPSByZWxhdGlvbnNCeU5hbWUuZ2V0KHRhcmdldC5nZXROYW1lKCkpOworCQl9CisJCXJldHVybiByZWxhdGlvbiA9PSBudWxsID8gZ2V0UGFyZW50UmVsYXRpb24odGFyZ2V0KSA6IHJlbGF0aW9uOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVsYXRpb24gZ2V0UmVsYXRpb24oRW50aXR5VHlwZSB0YXJnZXQsIFN0cmluZyBuYW1lKSB7CisJCU1hcDxTdHJpbmcsIFJlbGF0aW9uPiByZWxhdGlvbnNCeU5hbWUgPSByZWxhdGlvbnNCeUVudGl0eU5hbWUuZ2V0KHRhcmdldCk7CisJCWlmIChyZWxhdGlvbnNCeU5hbWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb25zIHRvICciICsgdGFyZ2V0ICsgIicgbm90IGZvdW5kISIpOworCQl9CisKKwkJUmVsYXRpb24gcmVsYXRpb24gPSByZWxhdGlvbnNCeU5hbWUuZ2V0KG5hbWUpOworCQlpZiAocmVsYXRpb24gPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb24gdG8gJyIgKyB0YXJnZXQgKyAiJyB3aXRoIG5hbWUgJyIgKyBuYW1lICsgIicgbm90IGZvdW5kISIpOworCQl9CisJCXJldHVybiByZWxhdGlvbjsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGludCBoYXNoQ29kZSgpIHsKKwkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgT0RTRW50aXR5VHlwZSkgeworCQkJcmV0dXJuIGdldE5hbWUoKS5lcXVhbHMoKChFbnRpdHlUeXBlKSBvYmplY3QpLmdldE5hbWUoKSk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBnZXROYW1lKCk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFBhY2thZ2UgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEFkZHMgZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufXMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb25zIHtAY29kZSBSZWxhdGlvbn1zIHdoaWNoIHdpbGwgYmUgYWRkZWQuCisJICovCisJdm9pZCBzZXRSZWxhdGlvbnMoTGlzdDxSZWxhdGlvbj4gcmVsYXRpb25zKSB7CisJCU1hcDxFbnRpdHlUeXBlLCBMaXN0PFJlbGF0aW9uPj4gZW50aXR5UmVsYXRpb25zQnlUYXJnZXQgPSByZWxhdGlvbnMuc3RyZWFtKCkuZGlzdGluY3QoKQorCQkJCS5maWx0ZXIociAtPiBlcXVhbHMoci5nZXRTb3VyY2UoKSkpLmNvbGxlY3QoZ3JvdXBpbmdCeShSZWxhdGlvbjo6Z2V0VGFyZ2V0KSk7CisKKwkJZm9yIChFbnRyeTxFbnRpdHlUeXBlLCBMaXN0PFJlbGF0aW9uPj4gZW50cnkgOiBlbnRpdHlSZWxhdGlvbnNCeVRhcmdldC5lbnRyeVNldCgpKSB7CisJCQlMaXN0PFJlbGF0aW9uPiBlbnRpdHlUeXBlUmVsYXRpb25zID0gZW50cnkuZ2V0VmFsdWUoKTsKKwkJCUVudGl0eVR5cGUgdGFyZ2V0ID0gZW50cnkuZ2V0S2V5KCk7CisKKwkJCWVudGl0eVR5cGVSZWxhdGlvbnMuZm9yRWFjaCh0aGlzOjphZGRSZWxhdGlvbik7CisKKwkJCWlmIChlbnRpdHlUeXBlUmVsYXRpb25zLnNpemUoKSA+IDEpIHsKKwkJCQlyZWxhdGlvbnNCeUVudGl0eU5hbWUucHV0KHRhcmdldCwKKwkJCQkJCWVudGl0eVR5cGVSZWxhdGlvbnMuc3RyZWFtKCkuY29sbGVjdCh0b01hcChSZWxhdGlvbjo6Z2V0TmFtZSwgaWRlbnRpdHkoKSkpKTsKKwkJCX0gZWxzZSB7CisJCQkJcmVsYXRpb25zQnlFbnRpdHkucHV0KHRhcmdldCwgZW50aXR5VHlwZVJlbGF0aW9ucy5nZXQoMCkpOworCQkJfQorCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFRyaWVzIHRvIGZpbmQgYSBwYXJlbnQge0BsaW5rIFJlbGF0aW9ufSB0byBnaXZlbiB0YXJnZXQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKiBAcmV0dXJuIFRoZSByZXF1ZXN0ZWQgcGFyZW50IHtAY29kZSBSZWxhdGlvbn0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIG5vIHN1Y2gge0Bjb2RlIFJlbGF0aW9ufSBleGlzdHMuCisJICovCisJcHJpdmF0ZSBSZWxhdGlvbiBnZXRQYXJlbnRSZWxhdGlvbihFbnRpdHlUeXBlIHRhcmdldCkgeworCQlyZXR1cm4gZ2V0UGFyZW50UmVsYXRpb25zKCkuc3RyZWFtKCkuZmlsdGVyKGV0IC0+IGV0LmdldFRhcmdldCgpLmVxdWFscyh0YXJnZXQpKS5maW5kQW55KCkub3JFbHNlVGhyb3coCisJCQkJKCkgLT4gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRpb24gdG8gZW50aXR5IHR5cGUgJyIgKyB0YXJnZXQgKyAiJyBkb2VzIG5vdCBleGlzdC4iKSk7CisJfQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgUmVsYXRpb259LgorCSAqCisJICogQHBhcmFtIHJlbGF0aW9uIHtAY29kZSBSZWxhdGlvbn0gd2hpY2ggd2lsbCBiZSBhZGRlZC4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkUmVsYXRpb24oUmVsYXRpb24gcmVsYXRpb24pIHsKKwkJcmVsYXRpb25zQnlUeXBlLmNvbXB1dGVJZkFic2VudChyZWxhdGlvbi5nZXRSZWxhdGlvblR5cGUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkuYWRkKHJlbGF0aW9uKTsKKwkJcmVsYXRpb25zLmFkZChyZWxhdGlvbik7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTTW9kZWxNYW5hZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTTW9kZWxNYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmOTkxNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNNb2RlbE1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDQ0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuZ3JvdXBpbmdCeTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5BSUROYW1lOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BZ2dyRnVuYzsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW07CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxFbGVtQWNjZXNzOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsUmVsOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvblN0cnVjdHVyZVZhbHVlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtUmVzdWx0U2V0RXh0OworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbnVtZXJhdGlvbkF0dHJpYnV0ZVN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRW51bWVyYXRpb25JdGVtU3RydWN0dXJlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbnVtZXJhdGlvblN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuSm9pbkRlZjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuUXVlcnlTdHJ1Y3R1cmVFeHQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbEFJRE5hbWVVbml0SWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbEl0ZW07CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbE9yZGVyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudW1lcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkRlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZ1JlcG9zaXRvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNFbnVtZXJhdGlvbnM7CitpbXBvcnQgb3JnLm9tZy5DT1JCQS5PUkI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBPRFMgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNb2RlbE1hbmFnZXJ9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU01vZGVsTWFuYWdlciBpbXBsZW1lbnRzIE1vZGVsTWFuYWdlciB7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT0RTTW9kZWxNYW5hZ2VyLmNsYXNzKTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRW50aXR5VHlwZT4gZW50aXR5VHlwZXNCeU5hbWUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIE9SQiBvcmI7CisKKwlwcml2YXRlIGZpbmFsIExvY2sgd3JpdGU7CisJcHJpdmF0ZSBmaW5hbCBMb2NrIHJlYWQ7CisKKwlwcml2YXRlIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgZW50aXR5Q29uZmlnUmVwb3NpdG9yeTsKKwlwcml2YXRlIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcjsKKworCXByaXZhdGUgQXBwbEVsZW1BY2Nlc3MgYXBwbEVsZW1BY2Nlc3M7CisJcHJpdmF0ZSBBb1Nlc3Npb24gYW9TZXNzaW9uOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gb3JiICAgICAgIFVzZWQgdG8gYWN0aXZhdGUgQ09SQkEgc2VydmljZSBvYmplY3RzLgorCSAqIEBwYXJhbSBhb1Nlc3Npb24gVGhlIHVuZGVybHlpbmcgT0RTIHNlc3Npb24uCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBPRFNNb2RlbE1hbmFnZXIoT1JCIG9yYiwgQW9TZXNzaW9uIGFvU2Vzc2lvbikgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJdGhpcyhvcmIsIGFvU2Vzc2lvbiwgbmV3IERlZmF1bHRFbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyKCkpOworCX0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG9yYiAgICAgICBVc2VkIHRvIGFjdGl2YXRlIENPUkJBIHNlcnZpY2Ugb2JqZWN0cy4KKwkgKiBAcGFyYW0gYW9TZXNzaW9uIFRoZSB1bmRlcmx5aW5nIE9EUyBzZXNzaW9uLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgT0RTTW9kZWxNYW5hZ2VyKE9SQiBvcmIsIEFvU2Vzc2lvbiBhb1Nlc3Npb24sIEVudGl0eUNvbmZpZ1JlcG9zaXRvcnlMb2FkZXIgZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcikKKwkJCXRocm93cyBBb0V4Y2VwdGlvbiB7CisJCXRoaXMuYW9TZXNzaW9uID0gYW9TZXNzaW9uOworCQl0aGlzLm9yYiA9IG9yYjsKKwkJYXBwbEVsZW1BY2Nlc3MgPSBhb1Nlc3Npb24uZ2V0QXBwbEVsZW1BY2Nlc3MoKTsKKwkJdGhpcy5lbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyID0gZW50aXR5Q29uZmlnUmVwb3NpdG9yeUxvYWRlcjsKKworCQkvLyBzZXR1cCBsb2NrcworCQlSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHJlZW50cmFudFJlYWRXcml0ZUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCQl3cml0ZSA9IHJlZW50cmFudFJlYWRXcml0ZUxvY2sud3JpdGVMb2NrKCk7CisJCXJlYWQgPSByZWVudHJhbnRSZWFkV3JpdGVMb2NrLnJlYWRMb2NrKCk7CisKKwkJaW5pdGlhbGl6ZSgpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPUkJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9SQn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIE9SQiBnZXRPUkIoKSB7CisJCXJldHVybiBvcmI7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbm9uIHJvb3Qge0BsaW5rIEVudGl0eUNvbmZpZ30gZm9yIGdpdmVuIHtAbGluayBLZXl9LgorCSAqCisJICogQHBhcmFtIDxUPiBUaGUgY29uY3JldGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIGtleSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUgbm9uIHJvb3Qge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBFbnRpdHlDb25maWc8VD4gZmluZEVudGl0eUNvbmZpZyhLZXk8VD4ga2V5KSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kKGtleSk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcm9vdCB7QGxpbmsgRW50aXR5Q29uZmlnfSBmb3IgZ2l2ZW4ge0BsaW5rIEtleX0uCisJICoKKwkgKiBAcGFyYW0gPFQ+IFRoZSBjb25jcmV0ZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0ga2V5IFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSByb290IHtAY29kZSBFbnRpdHlDb25maWd9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gRW50aXR5Q29uZmlnPFQ+IGdldEVudGl0eUNvbmZpZyhLZXk8VD4ga2V5KSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kUm9vdChrZXkpOworCQl9IGZpbmFsbHkgeworCQkJcmVhZC51bmxvY2soKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBFbnRpdHlDb25maWd9IGFzc29jaWF0ZWQgd2l0aCBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICoKKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBVc2VkIGFzIGlkZW50aWZpZXIuCisJICogQHJldHVybiBUaGUge0Bjb2RlIEVudGl0eUNvbmZpZ30gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEVudGl0eUNvbmZpZzw/PiBnZXRFbnRpdHlDb25maWcoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZW50aXR5Q29uZmlnUmVwb3NpdG9yeS5maW5kKGVudGl0eVR5cGUpOworCQl9IGZpbmFsbHkgeworCQkJcmVhZC51bmxvY2soKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxFbnRpdHlUeXBlPiBsaXN0RW50aXR5VHlwZXMoKSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PD4oZW50aXR5VHlwZXNCeU5hbWUudmFsdWVzKCkpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWQudW5sb2NrKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZShDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcykgeworCQlyZWFkLmxvY2soKTsKKworCQl0cnkgeworCQkJcmV0dXJuIGdldEVudGl0eUNvbmZpZyhuZXcgS2V5PD4oZW50aXR5Q2xhc3MpKS5nZXRFbnRpdHlUeXBlKCk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCXJlYWQubG9jaygpOworCisJCXRyeSB7CisJCQlyZXR1cm4gZ2V0RW50aXR5Q29uZmlnKG5ldyBLZXk8PihlbnRpdHlDbGFzcywgY29udGV4dFR5cGUpKS5nZXRFbnRpdHlUeXBlKCk7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoU3RyaW5nIG5hbWUpIHsKKwkJcmVhZC5sb2NrKCk7CisKKwkJdHJ5IHsKKwkJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IGVudGl0eVR5cGVzQnlOYW1lLmdldChuYW1lKTsKKwkJCWlmIChlbnRpdHlUeXBlID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgd2l0aCBuYW1lICciICsgbmFtZSArICInIG5vdCBmb3VuZC4iKTsKKwkJCX0KKworCQkJcmV0dXJuIGVudGl0eVR5cGU7CisJCX0gZmluYWxseSB7CisJCQlyZWFkLnVubG9jaygpOworCQl9CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEVudGl0eVR5cGUgZ2V0RW50aXR5VHlwZUJ5SWQoU3RyaW5nIGlkKSB7CisJCU9wdGlvbmFsPEVudGl0eVR5cGU+IGVudGl0eVR5cGUgPSBsaXN0RW50aXR5VHlwZXMoKS5zdHJlYW0oKS5maWx0ZXIoZXQgLT4gZXQuZ2V0SWQoKS5lcXVhbHMoaWQpKS5maW5kRmlyc3QoKTsKKwkJaWYgKCFlbnRpdHlUeXBlLmlzUHJlc2VudCgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnRpdHkgd2l0aCBpZCAnIiArIGlkICsgIicgbm90IGZvdW5kLiIpOworCQl9CisKKwkJcmV0dXJuIGVudGl0eVR5cGUuZ2V0KCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEFvU2Vzc2lvbn0gb2YgdGhpcyBtb2RlbCBtYW5hZ2VyLgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEFvU2Vzc2lvbn0gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIEFvU2Vzc2lvbiBnZXRBb1Nlc3Npb24oKSB7CisJCXdyaXRlLmxvY2soKTsKKworCQl0cnkgeworCQkJcmV0dXJuIGFvU2Vzc2lvbjsKKwkJfSBmaW5hbGx5IHsKKwkJCXdyaXRlLnVubG9jaygpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEFwcGxFbGVtQWNjZXNzfSBvZiB0aGlzIG1vZGVsIG1hbmFnZXIuCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgQXBwbEVsZW1BY2Nlc3N9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBBcHBsRWxlbUFjY2VzcyBnZXRBcHBsRWxlbUFjY2VzcygpIHsKKwkJcmVhZC5sb2NrKCk7CisKKwkJdHJ5IHsKKwkJCXJldHVybiBhcHBsRWxlbUFjY2VzczsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWQudW5sb2NrKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIE9EUyBjb25uZWN0aW9uLgorCSAqCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJcmVhZC5sb2NrKCk7CisKKwkJdHJ5IHsKKwkJCWFwcGxFbGVtQWNjZXNzLl9yZWxlYXNlKCk7CisJCQlhb1Nlc3Npb24uY2xvc2UoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCXJlYWQudW5sb2NrKCk7CisJCQlhb1Nlc3Npb24uX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbG9hZHMgdGhlIGNvbXBsZXRlIHNlc3Npb24gY29udGV4dC4KKwkgKi8KKwlwdWJsaWMgdm9pZCByZWxvYWRBcHBsaWNhdGlvbk1vZGVsKCkgeworCQl3cml0ZS5sb2NrKCk7CisKKwkJQW9TZXNzaW9uIGFvU2Vzc2lvbk9sZCA9IGFvU2Vzc2lvbjsKKwkJQXBwbEVsZW1BY2Nlc3MgYXBwbEVsZW1BY2Nlc3NPbGQgPSBhcHBsRWxlbUFjY2VzczsKKwkJdHJ5IHsKKwkJCWVudGl0eVR5cGVzQnlOYW1lLmNsZWFyKCk7CisKKwkJCWFvU2Vzc2lvbiA9IGFvU2Vzc2lvbi5jcmVhdGVDb1Nlc3Npb24oKTsKKwkJCWFwcGxFbGVtQWNjZXNzID0gYW9TZXNzaW9uLmdldEFwcGxFbGVtQWNjZXNzKCk7CisJCQlpbml0aWFsaXplKCk7CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCUxPR0dFUi5lcnJvcigiVW5hYmxlIHRvIHJlbG9hZCB0aGUgYXBwbGljYXRpb24gbW9kZWwgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9IGZpbmFsbHkgeworCQkJd3JpdGUudW5sb2NrKCk7CisJCX0KKworCQl0cnkgeworCQkJYXBwbEVsZW1BY2Nlc3NPbGQuX3JlbGVhc2UoKTsKKwkJCWFvU2Vzc2lvbk9sZC5jbG9zZSgpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQlMT0dHRVIuZGVidWcoIlVuYWJsZSB0byBjbG9zZSByZXBsYWNlZCBzZXNzaW9uIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWFvU2Vzc2lvbk9sZC5fcmVsZWFzZSgpOworCQl9CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhpcyBtb2RlbCBtYW5hZ2VyIGJ5IGNhY2hpbmcgdGhlIGFwcGxpY2F0aW9uIG1vZGVsIGFuZCBsb2FkaW5nCisJICogdGhlIHtAbGluayBFbnRpdHlDb25maWd9cy4KKwkgKgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCWxvYWRBcHBsaWNhdGlvbk1vZGVsKCk7CisJCWVudGl0eUNvbmZpZ1JlcG9zaXRvcnkgPSBlbnRpdHlDb25maWdSZXBvc2l0b3J5TG9hZGVyLmxvYWRFbnRpdHlDb25maWd1cmF0aW9ucyh0aGlzKTsKKwl9CisKKwkvKioKKwkgKiBDYWNoZXMgdGhlIHdob2xlIGFwcGxpY2F0aW9uIG1vZGVsIGFzIHByb3ZpZGVkIGJ5IHRoZSBPRFMgc2Vzc2lvbi4KKwkgKgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgbG9hZEFwcGxpY2F0aW9uTW9kZWwoKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlMT0dHRVIuZGVidWcoIlJlYWRpbmcgdGhlIGFwcGxpY2F0aW9uIG1vZGVsLi4uIik7CisKKwkJTWFwPFN0cmluZywgTWFwPFN0cmluZywgRW51bWVyYXRpb248Pz4+PiBlbnVtQ2xhc3NNYXAgPSBsb2FkT0RTRW51bWVyYXRpb25zKCk7CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlBcHBsaWNhdGlvblN0cnVjdHVyZVZhbHVlIGFwcGxpY2F0aW9uU3RydWN0dXJlVmFsdWUgPSBhb1Nlc3Npb24uZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZSgpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHVuaXRzID0gZ2V0VW5pdE1hcHBpbmcoYXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZS5hcHBsRWxlbXMpOworCisJCS8vIGNyZWF0ZSBlbnRpdHkgdHlwZXMgKGluY2wuIGF0dHJpYnV0ZXMpCisJCU1hcDxTdHJpbmcsIE9EU0VudGl0eVR5cGU+IGVudGl0eVR5cGVzQnlJRCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJU3RyaW5nIHNvdXJjZU5hbWUgPSBhb1Nlc3Npb24uZ2V0TmFtZSgpOworCQlmb3IgKEFwcGxFbGVtIGFwcGxFbGVtIDogYXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZS5hcHBsRWxlbXMpIHsKKwkJCVN0cmluZyBvZHNJRCA9IExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGFwcGxFbGVtLmFpZCkpOworCQkJTWFwPFN0cmluZywgRW51bWVyYXRpb248Pz4+IGVudGl0eUVudW1NYXAgPSBlbnVtQ2xhc3NNYXAuZ2V0T3JEZWZhdWx0KG9kc0lELCBuZXcgSGFzaE1hcDw+KCkpOworCisJCQlPRFNFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBuZXcgT0RTRW50aXR5VHlwZShzb3VyY2VOYW1lLCBhcHBsRWxlbSwgdW5pdHMsIGVudGl0eUVudW1NYXApOworCQkJZW50aXR5VHlwZXNCeU5hbWUucHV0KGFwcGxFbGVtLmFlTmFtZSwgZW50aXR5VHlwZSk7CisJCQllbnRpdHlUeXBlc0J5SUQucHV0KG9kc0lELCBlbnRpdHlUeXBlKTsKKwkJfQorCisJCS8vIGNyZWF0ZSByZWxhdGlvbnMKKwkJTGlzdDxSZWxhdGlvbj4gcmVsYXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoQXBwbFJlbCBhcHBsUmVsIDogYXBwbGljYXRpb25TdHJ1Y3R1cmVWYWx1ZS5hcHBsUmVscykgeworCQkJRW50aXR5VHlwZSBzb3VyY2UgPSBlbnRpdHlUeXBlc0J5SUQuZ2V0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGFwcGxSZWwuZWxlbTEpKSk7CisJCQlFbnRpdHlUeXBlIHRhcmdldCA9IGVudGl0eVR5cGVzQnlJRC5nZXQoTG9uZy50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoYXBwbFJlbC5lbGVtMikpKTsKKwkJCXJlbGF0aW9ucy5hZGQobmV3IE9EU1JlbGF0aW9uKGFwcGxSZWwsIHNvdXJjZSwgdGFyZ2V0KSk7CisJCX0KKworCQkvLyBhc3NpZ24gcmVsYXRpb25zIHRvIHRoZWlyIHNvdXJjZSBlbnRpdHkgdHlwZXMKKwkJcmVsYXRpb25zLnN0cmVhbSgpLmNvbGxlY3QoZ3JvdXBpbmdCeShSZWxhdGlvbjo6Z2V0U291cmNlKSkKKwkJCQkuZm9yRWFjaCgoZSwgcikgLT4gKChPRFNFbnRpdHlUeXBlKSBlKS5zZXRSZWxhdGlvbnMocikpOworCisJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlMT0dHRVIuZGVidWcoInt9IGVudGl0eSB0eXBlcyB3aXRoIHt9IHJlbGF0aW9ucyBmb3VuZCBpbiB7fSBtcy4iLCBlbnRpdHlUeXBlc0J5TmFtZS5zaXplKCksIHJlbGF0aW9ucy5zaXplKCksCisJCQkJc3RvcCAtIHN0YXJ0KTsKKwl9CisKKwlwcml2YXRlIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEVudW1lcmF0aW9uPD8+Pj4gbG9hZE9EU0VudW1lcmF0aW9ucygpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCUxPR0dFUi5kZWJ1ZygiTG9hZGluZyBPRFMgZW51bWVyYXRpb25zLi4uIik7CisJCWxvbmcgdDEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQkvLyBlbnVtZXJhdGlvbiBtYXBwaW5ncyAoYWVJRCAtPiAoYWFOYW1lIC0+IGVudW1DbGFzcykpCisJCU1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEVudW1lcmF0aW9uPD8+Pj4gZW51bUNsYXNzTWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKworCQlNYXA8U3RyaW5nLCBFbnVtZXJhdGlvbkl0ZW1TdHJ1Y3R1cmVbXT4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKEVudW1lcmF0aW9uU3RydWN0dXJlIGVzIDogYW9TZXNzaW9uLmdldEVudW1lcmF0aW9uU3RydWN0dXJlKCkpIHsKKwkJCW1hcC5wdXQoZXMuZW51bU5hbWUsIGVzLml0ZW1zKTsKKwkJfQorCisJCWZvciAoRW51bWVyYXRpb25BdHRyaWJ1dGVTdHJ1Y3R1cmUgZWFzIDogYW9TZXNzaW9uLmdldEVudW1lcmF0aW9uQXR0cmlidXRlcygpKSB7CisKKwkJCS8vIG1ha2Ugc3VyZSB0aGUgZW51bWVyYXRpb24gaXMgZm91bmQKKwkJCWlmIChPRFNFbnVtZXJhdGlvbnMuZ2V0RW51bU9iaihlYXMuZW51bU5hbWUpID09IG51bGwpIHsKKwkJCQlFbnVtZXJhdGlvbjxPRFNFbnVtPiBlbnVtZHluID0gbmV3IEVudW1lcmF0aW9uPD4oT0RTRW51bS5jbGFzcywgZWFzLmVudW1OYW1lKTsKKwkJCQlmb3IgKEVudW1lcmF0aW9uSXRlbVN0cnVjdHVyZSBlbnVtSXRlbVN0cnVjdCA6IG1hcC5nZXQoZWFzLmVudW1OYW1lKSkgeworCQkJCQlMT0dHRVIudHJhY2UoInt9Ont9Ont9IiwgZWFzLmVudW1OYW1lLCBlbnVtSXRlbVN0cnVjdC5pdGVtTmFtZSwgZW51bUl0ZW1TdHJ1Y3QuaW5kZXgpOworCQkJCQllbnVtZHluLmFkZFZhbHVlKG5ldyBPRFNFbnVtKGVudW1JdGVtU3RydWN0Lml0ZW1OYW1lLCBlbnVtSXRlbVN0cnVjdC5pbmRleCkpOworCQkJCX0KKwkJCQllci5hZGQoZWFzLmVudW1OYW1lLCBlbnVtZHluKTsKKwkJCX0KKworCQkJZW51bUNsYXNzTWFwLmNvbXB1dGVJZkFic2VudChMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhlYXMuYWlkKSksIGsgLT4gbmV3IEhhc2hNYXA8PigpKQorCQkJCQkucHV0KGVhcy5hYU5hbWUsIE9EU0VudW1lcmF0aW9ucy5nZXRFbnVtT2JqKGVhcy5lbnVtTmFtZSkpOworCQl9CisJCUxPR0dFUi5kZWJ1ZygiTG9hZGluZyBlbnVtZXJhdGlvbnMgdG9vayB7fW1zIiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0MSk7CisJCXJldHVybiBlbnVtQ2xhc3NNYXA7CisJfQorCisJLyoqCisJICogTG9hZHMgYWxsIGF2YWlsYWJsZSB7QGxpbmsgVW5pdH0gbmFtZXMgbWFwcGVkIGJ5IHRoZWlyIGluc3RhbmNlIElEcy4KKwkgKgorCSAqIEBwYXJhbSBhcHBsRWxlbXMgVGhlIGFwcGxpY2F0aW9uIGVsZW1lbnQgbWV0YSBkYXRhIGluc3RhbmNlcy4KKwkgKiBAcmV0dXJuIFRoZSB1bml0IG5hbWVzIG1hcHBlZCBieSB0aGUgY29ycmVzcG9uZGluZyBpbnN0YW5jZSBJRHMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIGxvYWQgdGhlIHVuaXQgbWFwcGluZ3MuCisJICovCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFVuaXRNYXBwaW5nKEFwcGxFbGVtW10gYXBwbEVsZW1zKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlBcHBsRWxlbSB1bml0RWxlbSA9IFN0cmVhbS5vZihhcHBsRWxlbXMpLmZpbHRlcihhZSAtPiBhZS5iZU5hbWUuZXF1YWxzKCJBb1VuaXQiKSkuZmluZEFueSgpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFwcGxpY2F0aW9uIGVsZW1lbnQgJ1VuaXQnIGlzIG5vdCBkZWZpbmVkLiIpKTsKKworCQlRdWVyeVN0cnVjdHVyZUV4dCBxc2UgPSBuZXcgUXVlcnlTdHJ1Y3R1cmVFeHQoKTsKKwkJcXNlLmFudVNlcSA9IG5ldyBTZWxBSUROYW1lVW5pdElkW10geworCQkJCW5ldyBTZWxBSUROYW1lVW5pdElkKG5ldyBBSUROYW1lKHVuaXRFbGVtLmFpZCwgIklkIiksIG5ldyBUX0xPTkdMT05HKCksIEFnZ3JGdW5jLk5PTkUpLAorCQkJCW5ldyBTZWxBSUROYW1lVW5pdElkKG5ldyBBSUROYW1lKHVuaXRFbGVtLmFpZCwgIk5hbWUiKSwgbmV3IFRfTE9OR0xPTkcoKSwgQWdnckZ1bmMuTk9ORSkgfTsKKwkJcXNlLmNvbmRTZXEgPSBuZXcgU2VsSXRlbVswXTsKKwkJcXNlLmdyb3VwQnkgPSBuZXcgQUlETmFtZVswXTsKKwkJcXNlLmpvaW5TZXEgPSBuZXcgSm9pbkRlZlswXTsKKwkJcXNlLm9yZGVyQnkgPSBuZXcgU2VsT3JkZXJbMF07CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiB1bml0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJRWxlbVJlc3VsdFNldEV4dCB1bml0UmVzdWx0U2V0RXh0ID0gZ2V0QXBwbEVsZW1BY2Nlc3MoKS5nZXRJbnN0YW5jZXNFeHQocXNlLCAwKVswXS5maXJzdEVsZW1zWzBdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXRSZXN1bHRTZXRFeHQudmFsdWVzWzBdLnZhbHVlLmZsYWcubGVuZ3RoOyBpKyspIHsKKwkJCVN0cmluZyB1bml0SUQgPSBMb25nCisJCQkJCS50b1N0cmluZyhPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcodW5pdFJlc3VsdFNldEV4dC52YWx1ZXNbMF0udmFsdWUudS5sb25nbG9uZ1ZhbCgpW2ldKSk7CisJCQlTdHJpbmcgdW5pdE5hbWUgPSB1bml0UmVzdWx0U2V0RXh0LnZhbHVlc1sxXS52YWx1ZS51LnN0cmluZ1ZhbCgpW2ldOworCQkJdW5pdHMucHV0KHVuaXRJRCwgdW5pdE5hbWUpOworCQl9CisKKwkJcmV0dXJuIHVuaXRzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU1F1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNWQwMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNTU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5BSUROYW1lOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BSUROYW1lVW5pdElkOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW1BY2Nlc3M7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkVsZW1SZXN1bHRTZXRFeHQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkpvaW5EZWY7CitpbXBvcnQgb3JnLmFzYW0ub2RzLk5hbWVWYWx1ZVNlcVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuUXVlcnlTdHJ1Y3R1cmVFeHQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlJlc3VsdFNldEV4dDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsQUlETmFtZVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsSXRlbTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsT3JkZXI7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbFZhbHVlRXh0OworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLlJlbGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbmRpdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Kb2luVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUXVlcnl9IGludGVyZmFjZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGNsYXNzIE9EU1F1ZXJ5IGltcGxlbWVudHMgUXVlcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihPRFNRdWVyeS5jbGFzcyk7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfTkFNRSA9ICJuYW1lIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfQUdHUkZVTkMgPSAiYWdncmZ1bmMiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gQUdHUkVHQVRJT05fTkFNRV9QQVRURVJOID0gUGF0dGVybgorCQkJLmNvbXBpbGUoIig/PCIgKyBHUk9VUF9BR0dSRlVOQyArICI+XFxTKylcXCgoPzwiICsgR1JPVVBfTkFNRSArICI+XFxTKylcXCkiKTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEVudGl0eVR5cGU+IGVudGl0eVR5cGVzQnlJRCA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIFNldDxFbnRpdHlUeXBlPiBxdWVyaWVkRW50aXR5VHlwZXMgPSBuZXcgSGFzaFNldDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PFNlbEFJRE5hbWVVbml0SWQ+IGFudVNlcSA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxKb2luRGVmPiBqb2luU2VxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBMaXN0PEFJRE5hbWU+IGdyb3VwQnkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8U2VsT3JkZXI+IG9yZGVyQnkgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgQXBwbEVsZW1BY2Nlc3MgYXBwbEVsZW1BY2Nlc3M7CisKKwlwcml2YXRlIGludCBsaW1pdDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBhcHBsRWxlbUFjY2VzcyBVc2VkIHRvIGV4ZWN1dGUgdGhlIHF1ZXJ5LgorCSAqLworCU9EU1F1ZXJ5KEFwcGxFbGVtQWNjZXNzIGFwcGxFbGVtQWNjZXNzKSB7CisJCXRoaXMuYXBwbEVsZW1BY2Nlc3MgPSBhcHBsRWxlbUFjY2VzczsKKwkJbGltaXQgPSAwOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc1F1ZXJpZWQoRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCXJldHVybiBxdWVyaWVkRW50aXR5VHlwZXMuY29udGFpbnMoZW50aXR5VHlwZSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBRdWVyeSBsaW1pdChpbnQgbGltaXQpIHsKKwkJdGhpcy5saW1pdCA9IGxpbWl0OworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFF1ZXJ5IHNlbGVjdChBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbikgeworCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpOworCQllbnRpdHlUeXBlc0J5SUQucHV0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKCgoT0RTRW50aXR5VHlwZSkgZW50aXR5VHlwZSkuZ2V0T0RTSUQoKSkpLAorCQkJCWVudGl0eVR5cGUpOworCQlxdWVyaWVkRW50aXR5VHlwZXMuYWRkKGVudGl0eVR5cGUpOworCQlhbnVTZXEuYWRkKGNyZWF0ZVNlbGVjdChhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uKSk7CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUXVlcnkgam9pbihSZWxhdGlvbiByZWxhdGlvbiwgSm9pblR5cGUgam9pbikgeworCQlxdWVyaWVkRW50aXR5VHlwZXMuYWRkKHJlbGF0aW9uLmdldFNvdXJjZSgpKTsKKwkJcXVlcmllZEVudGl0eVR5cGVzLmFkZChyZWxhdGlvbi5nZXRUYXJnZXQoKSk7CisJCWpvaW5TZXEuYWRkKGNyZWF0ZUpvaW4ocmVsYXRpb24sIGpvaW4pKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBRdWVyeSBncm91cChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcykgeworCQlmb3IgKEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBhdHRyaWJ1dGVzKSB7CisJCQlncm91cChhdHRyaWJ1dGUpOworCQl9CisJCXJldHVybiB0aGlzOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUXVlcnkgZ3JvdXAoQXR0cmlidXRlIGF0dHJpYnV0ZSkgeworCQlncm91cEJ5LmFkZChjcmVhdGVBSUROYW1lKGF0dHJpYnV0ZSkpOworCQlyZXR1cm4gdGhpczsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFF1ZXJ5IG9yZGVyKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIGJvb2xlYW4gYXNjZW5kaW5nKSB7CisJCW9yZGVyQnkuYWRkKGNyZWF0ZU9yZGVyQnkoYXR0cmlidXRlLCBhc2NlbmRpbmcpKTsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPcHRpb25hbDxSZXN1bHQ+IGZldGNoU2luZ2xldG9uKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTGlzdDxSZXN1bHQ+IHJlc3VsdHMgPSBmZXRjaChmaWx0ZXIpOworCQlpZiAocmVzdWx0cy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybiBPcHRpb25hbC5lbXB0eSgpOworCQl9IGVsc2UgaWYgKHJlc3VsdHMuc2l6ZSgpID4gMSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIk11bHRpcGxlIHJlc3VsdHMgZm91bmQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzaW5nbGV0b24gcXVlcnkhIik7CisJCX0KKworCQlyZXR1cm4gT3B0aW9uYWwub2YocmVzdWx0cy5nZXQoMCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxSZXN1bHQ+IGZldGNoKEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKworCQkJTGlzdDxTZWxJdGVtPiBjb25kU2VxID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlpbnQgY29uZENvdW50ID0gMDsKKwkJCWZvciAoRmlsdGVySXRlbSBjb25kaXRpb25JdGVtIDogZmlsdGVyKSB7CisJCQkJU2VsSXRlbSBzZWxJdGVtID0gbmV3IFNlbEl0ZW0oKTsKKwkJCQlpZiAoY29uZGl0aW9uSXRlbS5pc0NvbmRpdGlvbigpKSB7CisJCQkJCXNlbEl0ZW0udmFsdWUoY3JlYXRlQ29uZGl0aW9uKGNvbmRpdGlvbkl0ZW0uZ2V0Q29uZGl0aW9uKCkpKTsKKwkJCQl9IGVsc2UgaWYgKGNvbmRpdGlvbkl0ZW0uaXNCcmFja2V0T3BlcmF0b3IoKSkgeworCQkJCQlzZWxJdGVtLl9vcGVyYXRvcihPRFNVdGlscy5CUkFDS0VUT1BFUkFUT1JTLmdldChjb25kaXRpb25JdGVtLmdldEJyYWNrZXRPcGVyYXRvcigpKSk7CisJCQkJfSBlbHNlIGlmIChjb25kaXRpb25JdGVtLmlzQm9vbGVhbk9wZXJhdG9yKCkpIHsKKwkJCQkJc2VsSXRlbS5fb3BlcmF0b3IoT0RTVXRpbHMuT1BFUkFUT1JTLmdldChjb25kaXRpb25JdGVtLmdldEJvb2xlYW5PcGVyYXRvcigpKSk7CisJCQkJCWNvbmRDb3VudCsrOworCQkJCX0gZWxzZSB7CisJCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhc3NlZCBmaWx0ZXIgaXRlbSBpcyBuZWl0aGVyIGFuIG9wZXJhdG9yIG5vciBhIGNvbmRpdGlvbi4iKTsKKwkJCQl9CisKKwkJCQljb25kU2VxLmFkZChzZWxJdGVtKTsKKwkJCX0KKworCQkJUXVlcnlTdHJ1Y3R1cmVFeHQgcXNlID0gbmV3IFF1ZXJ5U3RydWN0dXJlRXh0KCk7CisJCQlxc2UuYW51U2VxID0gYW51U2VxLnRvQXJyYXkobmV3IFNlbEFJRE5hbWVVbml0SWRbYW51U2VxLnNpemUoKV0pOworCQkJcXNlLmNvbmRTZXEgPSBjb25kU2VxLnRvQXJyYXkobmV3IFNlbEl0ZW1bY29uZFNlcS5zaXplKCldKTsKKwkJCXFzZS5ncm91cEJ5ID0gZ3JvdXBCeS50b0FycmF5KG5ldyBBSUROYW1lW2dyb3VwQnkuc2l6ZSgpXSk7CisJCQlxc2Uuam9pblNlcSA9IGpvaW5TZXEudG9BcnJheShuZXcgSm9pbkRlZltqb2luU2VxLnNpemUoKV0pOworCQkJcXNlLm9yZGVyQnkgPSBvcmRlckJ5LnRvQXJyYXkobmV3IFNlbE9yZGVyW29yZGVyQnkuc2l6ZSgpXSk7CisKKwkJCUxpc3Q8UmVzdWx0PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCQlmb3IgKFJlc3VsdCByZXN1bHQgOiBuZXcgUmVzdWx0RmFjdG9yeShlbnRpdHlUeXBlc0J5SUQsIGFwcGxFbGVtQWNjZXNzLmdldEluc3RhbmNlc0V4dChxc2UsIGxpbWl0KVswXSkpIHsKKwkJCQlyZXN1bHRzLmFkZChyZXN1bHQpOworCQkJfQorCQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJCUxPR0dFUi5kZWJ1ZygiUXVlcnkgZXhlY3V0ZWQgaW4ge30gbXMgYW5kIHJldHJpZXZlZCB7fSByZXN1bHQgcm93cyAoe30gc2VsZWN0aW9ucywge30gY29uZGl0aW9ucywgIgorCQkJCQkrICJ7fSBqb2lucykuIiwgc3RvcCAtIHN0YXJ0LCByZXN1bHRzLnNpemUoKSwgYW51U2VxLnNpemUoKSwgY29uZENvdW50LCBqb2luU2VxLnNpemUoKSk7CisJCQlyZXR1cm4gcmVzdWx0czsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gYW9lKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbihhb2UucmVhc29uLCBhb2UpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9IGFuZCB7QGxpbmsgQWdncmVnYXRpb259IHRvIGFuIE9EUworCSAqIHtAbGluayBTZWxBSUROYW1lVW5pdElkfS4KKwkgKgorCSAqIEBwYXJhbSBhdHRyaWJ1dGUgICBUaGUge0Bjb2RlIEF0dHJpYnV0ZX0uCisJICogQHBhcmFtIGFnZ3JlZ2F0aW9uIFRoZSB7QGNvZGUgQWdncmVnYXRpb259LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlbEFJRE5hbWVVbml0SWR9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgU2VsQUlETmFtZVVuaXRJZCBjcmVhdGVTZWxlY3QoQXR0cmlidXRlIGF0dHJpYnV0ZSwgQWdncmVnYXRpb24gYWdncmVnYXRpb24pIHsKKwkJU2VsQUlETmFtZVVuaXRJZCBzYW51ID0gbmV3IFNlbEFJRE5hbWVVbml0SWQoKTsKKworCQlzYW51LmFnZ3JlZ2F0ZSA9IE9EU1V0aWxzLkFHR1JFR0FUSU9OUy5nZXQoYWdncmVnYXRpb24pOworCQlzYW51LmF0dHIgPSBjcmVhdGVBSUROYW1lKGF0dHJpYnV0ZSk7CisJCXNhbnUudW5pdElkID0gbmV3IFRfTE9OR0xPTkcoKTsKKworCQlyZXR1cm4gc2FudTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgQ29uZGl0aW9ufSB0byBhbiBPRFMge0BsaW5rIFNlbFZhbHVlRXh0fS4KKwkgKgorCSAqIEBwYXJhbSBjb25kaXRpb24gVGhlIHtAY29kZSBDb25kaXRpb259LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlbFZhbHVlRXh0fSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXByaXZhdGUgU2VsVmFsdWVFeHQgY3JlYXRlQ29uZGl0aW9uKENvbmRpdGlvbiBjb25kaXRpb24pIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJU2VsVmFsdWVFeHQgc3ZlID0gbmV3IFNlbFZhbHVlRXh0KCk7CisKKwkJc3ZlLm9wZXIgPSBPRFNVdGlscy5PUEVSQVRJT05TLmdldChjb25kaXRpb24uZ2V0Q29tcGFyaXNvbk9wZXJhdG9yKCkpOworCQlzdmUuYXR0ciA9IG5ldyBBSUROYW1lVW5pdElkKCk7CisJCXN2ZS5hdHRyLnVuaXRJZCA9IG5ldyBUX0xPTkdMT05HKCk7CisJCXN2ZS5hdHRyLmF0dHIgPSBjcmVhdGVBSUROYW1lKGNvbmRpdGlvbi5nZXRBdHRyaWJ1dGUoKSk7CisJCXN2ZS52YWx1ZSA9IE9EU0NvbnZlcnRlci50b09EU1ZhbHVlKGNvbmRpdGlvbi5nZXRBdHRyaWJ1dGUoKSwgY29uZGl0aW9uLmdldFZhbHVlKCkpOworCisJCXJldHVybiBzdmU7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFJlbGF0aW9ufSBhbmQge0BsaW5rIEpvaW5UeXBlfSB0byBhbiBPRFMKKwkgKiB7QGxpbmsgSm9pbkRlZn0uCisJICoKKwkgKiBAcGFyYW0gcmVsYXRpb24gVGhlIHtAY29kZSBSZWxhdGlvbn0uCisJICogQHBhcmFtIGpvaW4gICAgIFRoZSB7QGNvZGUgSm9pblR5cGV9LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIEpvaW5EZWZ9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgSm9pbkRlZiBjcmVhdGVKb2luKFJlbGF0aW9uIHJlbGF0aW9uLCBKb2luVHlwZSBqb2luKSB7CisJCUpvaW5EZWYgam9pbkRlZiA9IG5ldyBKb2luRGVmKCk7CisKKwkJam9pbkRlZi5mcm9tQUlEID0gKChPRFNFbnRpdHlUeXBlKSByZWxhdGlvbi5nZXRTb3VyY2UoKSkuZ2V0T0RTSUQoKTsKKwkJam9pbkRlZi50b0FJRCA9ICgoT0RTRW50aXR5VHlwZSkgcmVsYXRpb24uZ2V0VGFyZ2V0KCkpLmdldE9EU0lEKCk7CisJCWpvaW5EZWYucmVmTmFtZSA9IHJlbGF0aW9uLmdldE5hbWUoKTsKKwkJam9pbkRlZi5qb2luaW5nVHlwZSA9IE9EU1V0aWxzLkpPSU5TLmdldChqb2luKTsKKworCQlyZXR1cm4gam9pbkRlZjsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfSBhbmQgc29ydCBvcmRlciBmbGFnIHRvIGFuIE9EUworCSAqIHtAbGluayBTZWxPcmRlcn0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gYXNjZW5kaW5nIFRoZSBzb3J0IG9yZGVyLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFNlbE9yZGVyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIFNlbE9yZGVyIGNyZWF0ZU9yZGVyQnkoQXR0cmlidXRlIGF0dHJpYnV0ZSwgYm9vbGVhbiBhc2NlbmRpbmcpIHsKKwkJU2VsT3JkZXIgc2VsT3JkZXIgPSBuZXcgU2VsT3JkZXIoKTsKKworCQlzZWxPcmRlci5hdHRyID0gY3JlYXRlQUlETmFtZShhdHRyaWJ1dGUpOworCQlzZWxPcmRlci5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7CisKKwkJcmV0dXJuIHNlbE9yZGVyOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBBdHRyaWJ1dGV9IHRvIGFuIE9EUyB7QGxpbmsgQUlETmFtZX0uCisJICoKKwkgKiBAcGFyYW0gYXR0cmlidXRlIFRoZSB7QGNvZGUgQXR0cmlidXRlfS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIHtAY29kZSBBSUROYW1lfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIEFJRE5hbWUgY3JlYXRlQUlETmFtZShBdHRyaWJ1dGUgYXR0cmlidXRlKSB7CisJCUFJRE5hbWUgYWlkTmFtZSA9IG5ldyBBSUROYW1lKCk7CisKKwkJYWlkTmFtZS5haWQgPSAoKE9EU0VudGl0eVR5cGUpIGF0dHJpYnV0ZS5nZXRFbnRpdHlUeXBlKCkpLmdldE9EU0lEKCk7CisJCWFpZE5hbWUuYWFOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKKworCQlyZXR1cm4gYWlkTmFtZTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBBZ2dyZWdhdGlvbiBnZXRBZ2dyZWdhdGlvbihTdHJpbmcgb2RzQWdnckZ1bmMpIHsKKwkJc3dpdGNoIChTdHJpbmdzLm51bGxUb0VtcHR5KG9kc0FnZ3JGdW5jKS50cmltKCkudG9VcHBlckNhc2UoKSkgeworCQljYXNlICJDT1VOVCI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uQ09VTlQ7CisJCWNhc2UgIkRDT1VOVCI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uRElTVElOQ1RfQ09VTlQ7CisJCWNhc2UgIk1JTiI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uTUlOSU1VTTsKKwkJY2FzZSAiTUFYIjoKKwkJCXJldHVybiBBZ2dyZWdhdGlvbi5NQVhJTVVNOworCQljYXNlICJBVkciOgorCQkJcmV0dXJuIEFnZ3JlZ2F0aW9uLkFWRVJBR0U7CisJCWNhc2UgIlNURERFViI6CisJCQlyZXR1cm4gQWdncmVnYXRpb24uREVWSUFUSU9OOworCQljYXNlICJTVU0iOgorCQkJcmV0dXJuIEFnZ3JlZ2F0aW9uLlNVTTsKKwkJY2FzZSAiRElTVElOQ1QiOgorCQkJcmV0dXJuIEFnZ3JlZ2F0aW9uLkRJU1RJTkNUOworCQlkZWZhdWx0OgorCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKwkJCQkJIlVuc3VwcG9ydGVkIGFnZ3JlZ2F0ZSBmdW5jdGlvbiAnIiArIFN0cmluZ3MubnVsbFRvRW1wdHkob2RzQWdnckZ1bmMpLnRyaW0oKS50b1VwcGVyQ2FzZSgpICsgIichIik7CisJCX0KKworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogVHJhdmVyc2VzIHRoZSBPRFMge0BsaW5rIFJlc3VsdFNldEV4dH0gYW5kIGNyZWF0ZXMgYSB7QGxpbmsgUmVzdWx0fSBmb3IgZWFjaAorCSAqIHJvdy4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXN1bHRGYWN0b3J5IGltcGxlbWVudHMgSXRlcmFibGU8UmVzdWx0PiwgSXRlcmF0b3I8UmVzdWx0PiB7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgZmluYWwgTGlzdDxSZWNvcmRGYWN0b3J5PiByZWNvcmRGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworCQlwcml2YXRlIGludCBpbmRleDsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENvbnN0cnVjdG9ycworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gZW50aXR5VHlwZXMgIFVzZWQgdG8gYWNjZXNzIHtAbGluayBFbnRpdHlUeXBlfSBieSBpdHMgT0RTIElELgorCQkgKiBAcGFyYW0gcmVzdWx0U2V0RXh0IFRoZSBPRFMgdmFsdWVzIHNlcXVlbmNlIGNvbnRhaW5lcnMuCisJCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gY29udmVyc2lvbiBlcnJvcnMuCisJCSAqLworCQlwdWJsaWMgUmVzdWx0RmFjdG9yeShNYXA8U3RyaW5nLCBFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcywgUmVzdWx0U2V0RXh0IHJlc3VsdFNldEV4dCkKKwkJCQl0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCQlmb3IgKEVsZW1SZXN1bHRTZXRFeHQgZWxlbVJlc3VsdFNldEV4dCA6IHJlc3VsdFNldEV4dC5maXJzdEVsZW1zKSB7CisJCQkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gZW50aXR5VHlwZXMuZ2V0KExvbmcudG9TdHJpbmcoT0RTQ29udmVydGVyLmZyb21PRFNMb25nKGVsZW1SZXN1bHRTZXRFeHQuYWlkKSkpOworCQkJCXJlY29yZEZhY3Rvcmllcy5hZGQobmV3IFJlY29yZEZhY3RvcnkoZW50aXR5VHlwZSwgZWxlbVJlc3VsdFNldEV4dC52YWx1ZXMpKTsKKwkJCX0KKworCQkJbGVuZ3RoID0gcmVjb3JkRmFjdG9yaWVzLmlzRW1wdHkoKSA/IDAgOiByZWNvcmRGYWN0b3JpZXMuZ2V0KDApLmdldExlbmd0aCgpOworCQl9CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQdWJsaWMgbWV0aG9kcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworCQkJcmV0dXJuIGluZGV4IDwgbGVuZ3RoOworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgUmVzdWx0IG5leHQoKSB7CisJCQlpZiAoIWhhc05leHQoKSkgeworCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJObyBzdWNoIGVsZW1lbnQgYXZhaWxhYmxlLiIpOworCQkJfQorCQkJUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKKworCQkJZm9yIChSZWNvcmRGYWN0b3J5IHJlY29yZEZhY3RvcnkgOiByZWNvcmRGYWN0b3JpZXMpIHsKKwkJCQlyZXN1bHQuYWRkUmVjb3JkKHJlY29yZEZhY3RvcnkuY3JlYXRlUmVjb3JkKGluZGV4KSk7CisJCQl9CisKKwkJCWluZGV4Kys7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisKKwkJLyoqCisJCSAqIHtAaW5oZXJpdERvY30KKwkJICovCisJCUBPdmVycmlkZQorCQlwdWJsaWMgSXRlcmF0b3I8UmVzdWx0PiBpdGVyYXRvcigpIHsKKwkJCXJldHVybiB0aGlzOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEge0BsaW5rIFJlY29yZH0gZm9yIGdpdmVuIGluZGV4IGZyb20gdGhlIG9yaWdpbmFsIE9EUyB2YWx1ZXMKKwkgKiBzZXF1ZW5jZSBmb3IgYSBnaXZlbiB7QGxpbmsgRW50aXR5VHlwZX0uCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjb3JkRmFjdG9yeSB7CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgZmluYWwgTGlzdDxWYWx1ZUZhY3Rvcnk+IHZhbHVlRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCXByaXZhdGUgZmluYWwgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBlbnRpdHlUeXBlIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkJICogQHBhcmFtIG52c3VpcyAgICAgVGhlIE9EUyB2YWx1ZSBzZXF1ZW5jZSBjb250YWluZXJzLgorCQkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGNvbnZlcnNpb24gZXJyb3JzLgorCQkgKi8KKwkJcHJpdmF0ZSBSZWNvcmRGYWN0b3J5KEVudGl0eVR5cGUgZW50aXR5VHlwZSwgTmFtZVZhbHVlU2VxVW5pdElkW10gbnZzdWlzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCQl0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlOworCQkJZm9yIChOYW1lVmFsdWVTZXFVbml0SWQgbnZzdWkgOiBudnN1aXMpIHsKKwkJCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG52c3VpLnZhbE5hbWU7CisJCQkJQWdncmVnYXRpb24gYWdncmVnYXRpb24gPSBBZ2dyZWdhdGlvbi5OT05FOworCQkJCU1hdGNoZXIgbWF0Y2hlciA9IEFHR1JFR0FUSU9OX05BTUVfUEFUVEVSTi5tYXRjaGVyKG52c3VpLnZhbE5hbWUpOworCQkJCWlmIChtYXRjaGVyLm1hdGNoZXMoKSkgeworCQkJCQlhdHRyaWJ1dGVOYW1lID0gbWF0Y2hlci5ncm91cChHUk9VUF9OQU1FKTsKKwkJCQkJYWdncmVnYXRpb24gPSBPRFNRdWVyeS5nZXRBZ2dyZWdhdGlvbihtYXRjaGVyLmdyb3VwKEdST1VQX0FHR1JGVU5DKSk7CisJCQkJfQorCisJCQkJdmFsdWVGYWN0b3JpZXMuYWRkKG5ldyBWYWx1ZUZhY3RvcnkoZW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSksIGFnZ3JlZ2F0aW9uLCBudnN1aSkpOworCQkJfQorCQl9CisKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQkvLyBQcml2YXRlIG1ldGhvZHMKKwkJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJCXByaXZhdGUgaW50IGdldExlbmd0aCgpIHsKKwkJCXJldHVybiB2YWx1ZUZhY3Rvcmllcy5pc0VtcHR5KCkgPyAwIDogdmFsdWVGYWN0b3JpZXMuZ2V0KDApLmdldExlbmd0aCgpOworCQl9CisKKwkJcHJpdmF0ZSBSZWNvcmQgY3JlYXRlUmVjb3JkKGludCBpbmRleCkgeworCQkJUmVjb3JkIHJlY29yZCA9IG5ldyBSZWNvcmQoZW50aXR5VHlwZSk7CisJCQlmb3IgKFZhbHVlRmFjdG9yeSB2YWx1ZUZhY3RvcnkgOiB2YWx1ZUZhY3RvcmllcykgeworCQkJCXJlY29yZC5hZGRWYWx1ZSh2YWx1ZUZhY3RvcnkuY3JlYXRlVmFsdWUoaW5kZXgpKTsKKwkJCX0KKworCQkJcmV0dXJuIHJlY29yZDsKKwkJfQorCisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIHtAbGluayBWYWx1ZX0gY29udGFpbmVyIGZvciBnaXZlbiBpbmRleCBmcm9tIHRoZSBvcmlnaW5hbCBPRFMgdmFsdWUKKwkgKiBzZXF1ZW5jZSBmb3IgYSBnaXZlbiB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWYWx1ZUZhY3RvcnkgeworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQlwcml2YXRlIGZpbmFsIExpc3Q8VmFsdWU+IHZhbHVlczsKKwkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdW5pdDsKKwkJcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIGFzc29jaWF0ZWQge0BsaW5rIEF0dHJpYnV0ZX0uCisJCSAqIEBwYXJhbSBudnN1aSAgICAgVGhlIE9EUyB2YWx1ZSBzZXF1ZW5jZSBjb250YWluZXIuCisJCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gY29udmVyc2lvbiBlcnJvcnMuCisJCSAqLworCQlwcml2YXRlIFZhbHVlRmFjdG9yeShBdHRyaWJ1dGUgYXR0cmlidXRlLCBBZ2dyZWdhdGlvbiBhZ2dyZWdhdGlvbiwgTmFtZVZhbHVlU2VxVW5pdElkIG52c3VpKQorCQkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJCWxlbmd0aCA9IG52c3VpLnZhbHVlLmZsYWcubGVuZ3RoOworCQkJdW5pdCA9IGF0dHJpYnV0ZS5nZXRVbml0KCk7CisJCQl2YWx1ZXMgPSBPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIHVuaXQsIG52c3VpLnZhbHVlKTsKKwkJfQorCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gUHJpdmF0ZSBtZXRob2RzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZS4KKwkJICoKKwkJICogQHJldHVybiBMZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIHJldHVybmVkLgorCQkgKi8KKwkJcHJpdmF0ZSBpbnQgZ2V0TGVuZ3RoKCkgeworCQkJcmV0dXJuIGxlbmd0aDsKKwkJfQorCisJCS8qKgorCQkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmFsdWV9IGZvciBnaXZlbiBpbmRleC4KKwkJICoKKwkJICogQHBhcmFtIGluZGV4IEluZGV4IHdpdGhpbiB0aGUgc2VxdWVuY2UuCisJCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcge0Bjb2RlIFZhbHVlfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXByaXZhdGUgVmFsdWUgY3JlYXRlVmFsdWUoaW50IGluZGV4KSB7CisJCQlyZXR1cm4gdmFsdWVzLmdldChpbmRleCk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU1F1ZXJ5U2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3F1ZXJ5L09EU1F1ZXJ5U2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjZhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTUXVlcnlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworCitwdWJsaWMgY2xhc3MgT0RTUXVlcnlTZXJ2aWNlIGltcGxlbWVudHMgUXVlcnlTZXJ2aWNlIHsKKworCXByaXZhdGUgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKworCXB1YmxpYyBPRFNRdWVyeVNlcnZpY2UoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcikgeworCQl0aGlzLm1vZGVsTWFuYWdlciA9IG1vZGVsTWFuYWdlcjsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFF1ZXJ5IGNyZWF0ZVF1ZXJ5KCkgeworCQlyZXR1cm4gbmV3IE9EU1F1ZXJ5KG1vZGVsTWFuYWdlci5nZXRBcHBsRWxlbUFjY2VzcygpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTUmVsYXRpb24uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9xdWVyeS9PRFNSZWxhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2NiMzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvcXVlcnkvT0RTUmVsYXRpb24uamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeTsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxBdHRyOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsUmVsOworaW1wb3J0IG9yZy5hc2FtLm9kcy5EYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFJlbGF0aW9ufSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRFNSZWxhdGlvbiBpbXBsZW1lbnRzIFJlbGF0aW9uIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGU7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlUeXBlIHNvdXJjZTsKKwlwcml2YXRlIGZpbmFsIEVudGl0eVR5cGUgdGFyZ2V0OworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwlwcml2YXRlIGZpbmFsIGludCByYW5nZU1heDsKKwlwcml2YXRlIGZpbmFsIGludCBpbnZSYW5nZU1heDsKKwlwcml2YXRlIEF0dHJpYnV0ZSBhdHRyaWJ1dGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gYXBwbFJlbCBUaGUgT0RTIG1ldGEgZGF0YSBmb3IgdGhpcyByZWxhdGlvbi4KKwkgKiBAcGFyYW0gc291cmNlICBUaGUgc291cmNlIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gdGFyZ2V0ICBUaGUgdGFyZ2V0IHtAY29kZSBFbnRpdHlUeXBlfS4KKwkgKi8KKwlPRFNSZWxhdGlvbihBcHBsUmVsIGFwcGxSZWwsIEVudGl0eVR5cGUgc291cmNlLCBFbnRpdHlUeXBlIHRhcmdldCkgeworCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKwkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisJCW5hbWUgPSBhcHBsUmVsLmFyTmFtZTsKKwkJcmVsYXRpb25UeXBlID0gT0RTVXRpbHMuUkVMQVRJT05TSElQUy5pbnZlcnNlKCkuZ2V0KGFwcGxSZWwuYXJSZWxhdGlvblR5cGUpOworCQlyYW5nZU1heCA9IGFwcGxSZWwuYXJSZWxhdGlvblJhbmdlLm1heDsKKwkJaW52UmFuZ2VNYXggPSBhcHBsUmVsLmludlJlbGF0aW9uUmFuZ2UubWF4OworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJCXJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRW50aXR5VHlwZSBnZXRTb3VyY2UoKSB7CisJCXJldHVybiBzb3VyY2U7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldFRhcmdldCgpIHsKKwkJcmV0dXJuIHRhcmdldDsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlbGF0aW9uVHlwZSBnZXRSZWxhdGlvblR5cGUoKSB7CisJCXJldHVybiByZWxhdGlvblR5cGU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCkgeworCQlpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKwkJCWF0dHJpYnV0ZSA9IG5ldyBPRFNBdHRyaWJ1dGUoZ2V0U291cmNlKCksCisJCQkJCW5ldyBBcHBsQXR0cihnZXROYW1lKCksICIiLCBEYXRhVHlwZS5EVF9MT05HTE9ORywgMCwgdHJ1ZSwgZmFsc2UsIG51bGwpLCBudWxsLCBudWxsKTsKKwkJfQorCisJCXJldHVybiBhdHRyaWJ1dGU7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisJCXJldHVybiBPYmplY3RzLmhhc2goZ2V0U291cmNlKCksIGdldFRhcmdldCgpLCBnZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgT0RTUmVsYXRpb24pIHsKKwkJCVJlbGF0aW9uIHJlbGF0aW9uID0gKFJlbGF0aW9uKSBvYmplY3Q7CisJCQlyZXR1cm4gZ2V0U291cmNlKCkuZXF1YWxzKHJlbGF0aW9uLmdldFNvdXJjZSgpKSAmJiBnZXRUYXJnZXQoKS5lcXVhbHMocmVsYXRpb24uZ2V0VGFyZ2V0KCkpCisJCQkJCSYmIGdldE5hbWUoKS5lcXVhbHMocmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGdldE5hbWUoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNPdXRnb2luZyhSZWxhdGlvblR5cGUgcmVsYXRpb25UeXBlKSB7CisJCXJldHVybiByZWxhdGlvblR5cGUuZXF1YWxzKGdldFJlbGF0aW9uVHlwZSgpKSAmJiByYW5nZU1heCA9PSAxOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0luY29taW5nKFJlbGF0aW9uVHlwZSByZWxhdGlvblR5cGUpIHsKKwkJcmV0dXJuIHJlbGF0aW9uVHlwZS5lcXVhbHMoZ2V0UmVsYXRpb25UeXBlKCkpICYmIHJhbmdlTWF4ID09IC0xOworCX0KKworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGlzTnRvTSgpIHsKKwkJcmV0dXJuIHJlbGF0aW9uVHlwZSA9PSBSZWxhdGlvblR5cGUuSU5GTyAmJiByYW5nZU1heCA9PSAtMSAmJiBpbnZSYW5nZU1heCA9PSAtMTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQmFzZUVudGl0eVNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0Jhc2VFbnRpdHlTZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZmEwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0Jhc2VFbnRpdHlTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuZ3JvdXBpbmdCeTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnJlZHVjaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5BZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Kb2luVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2guSm9pblRyZWUuSm9pbk5vZGU7CisKKy8qKgorICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgZW50aXR5IHtAbGluayBTZWFyY2hRdWVyeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2Fic3RyYWN0IGNsYXNzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSBpbXBsZW1lbnRzIFNlYXJjaFF1ZXJ5IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHJvb3RFbnRpdHlDbGFzczsKKwlwcml2YXRlIGZpbmFsIEpvaW5UcmVlIGpvaW5UcmVlID0gbmV3IEpvaW5UcmVlKCk7CisJcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzczsKKworCXByaXZhdGUgZmluYWwgT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIGZpbmFsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2U7CisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciAgICBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgICAgIFRoZSBzb3VyY2UgZW50aXR5IGNsYXNzIG9mIHRoaXMgc2VhcmNoIHF1ZXJ5LgorCSAqIEBwYXJhbSByb290RW50aXR5Q2xhc3MgVGhlIHJvb3QgZW50aXR5IGNsYXNzIG9mIHRoaXMgc2VhcmNoIHF1ZXJ5LgorCSAqLworCXByb3RlY3RlZCBCYXNlRW50aXR5U2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwKKwkJCUNsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiByb290RW50aXR5Q2xhc3MpIHsKKwkJdGhpcy5tb2RlbE1hbmFnZXIgPSBtb2RlbE1hbmFnZXI7CisJCXRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlOworCQl0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisJCXRoaXMucm9vdEVudGl0eUNsYXNzID0gcm9vdEVudGl0eUNsYXNzOworCisJCUVudGl0eUNvbmZpZzw/PiBlbnRpdHlDb25maWcgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5Q29uZmlnKG5ldyBLZXk8PihlbnRpdHlDbGFzcykpOworCQlFbnRpdHlUeXBlIHNvdXJjZSA9IGVudGl0eUNvbmZpZy5nZXRFbnRpdHlUeXBlKCk7CisKKwkJZW50aXR5Q29uZmlnLmdldE9wdGlvbmFsQ29uZmlncygpLnN0cmVhbSgpLm1hcChFbnRpdHlDb25maWc6OmdldEVudGl0eVR5cGUpCisJCQkJLmZpbHRlcihldCAtPiAhIkNsYXNzaWZpY2F0aW9uIi5lcXVhbHMoZXQuZ2V0TmFtZSgpKSkuZm9yRWFjaChlbnRpdHlUeXBlIC0+IHsKKwkJCQkJam9pblRyZWUuYWRkTm9kZShzb3VyY2UsIGVudGl0eVR5cGUsIHRydWUsIEpvaW5UeXBlLk9VVEVSKTsKKwkJCQl9KTsKKworCQllbnRpdHlDb25maWcuZ2V0TWFuZGF0b3J5Q29uZmlncygpLnN0cmVhbSgpLm1hcChFbnRpdHlDb25maWc6OmdldEVudGl0eVR5cGUpLmZvckVhY2goZW50aXR5VHlwZSAtPiB7CisJCQlqb2luVHJlZS5hZGROb2RlKHNvdXJjZSwgZW50aXR5VHlwZSwgdHJ1ZSwgSm9pblR5cGUuSU5ORVIpOworCQl9KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIExpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKCkgeworCQlyZXR1cm4gam9pblRyZWUuZ2V0Tm9kZU5hbWVzKCkuc3RyZWFtKCkubWFwKG1vZGVsTWFuYWdlcjo6Z2V0RW50aXR5VHlwZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIFNlYXJjaGFibGUgZ2V0U2VhcmNoYWJsZVJvb3QoKSB7CisJCUZ1bmN0aW9uPFN0cmluZywgU2VhcmNoYWJsZU5vZGU+IGZhY3RvcnkgPSBrIC0+IHsKKwkJCXJldHVybiBuZXcgU2VhcmNoYWJsZU5vZGUobW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoaykpOworCQl9OworCisJCU1hcDxTdHJpbmcsIFNlYXJjaGFibGVOb2RlPiBub2RlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBqb2luVHJlZS5nZXRUcmVlKCkuZW50cnlTZXQoKSkgeworCQkJU2VhcmNoYWJsZU5vZGUgcGFyZW50ID0gbm9kZXMuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBmYWN0b3J5KTsKKworCQkJZm9yIChTdHJpbmcgY2hpbGROYW1lIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCXBhcmVudC5hZGRSZWxhdGVkKG5vZGVzLmNvbXB1dGVJZkFic2VudChjaGlsZE5hbWUsIGZhY3RvcnkpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBub2Rlcy5nZXQobW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUocm9vdEVudGl0eUNsYXNzKS5nZXROYW1lKCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgZmluYWwgTGlzdDxWYWx1ZT4gZ2V0RmlsdGVyVmFsdWVzKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoYXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5ESVNUSU5DVCkuZ3JvdXAoYXR0cmlidXRlKTsKKworCQkvLyBhZGQgcmVxdWlyZWQgam9pbnMKKwkJZmlsdGVyLnN0cmVhbSgpLmZpbHRlcihGaWx0ZXJJdGVtOjppc0NvbmRpdGlvbikubWFwKEZpbHRlckl0ZW06OmdldENvbmRpdGlvbikuZm9yRWFjaChjIC0+IHsKKwkJCWFkZEpvaW5zKHF1ZXJ5LCBjLmdldEF0dHJpYnV0ZSgpLmdldEVudGl0eVR5cGUoKSk7CisJCX0pOworCisJCXJldHVybiBxdWVyeS5mZXRjaChmaWx0ZXIpLnN0cmVhbSgpLm1hcChyIC0+IHIuZ2V0VmFsdWUoYXR0cmlidXRlKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGZpbmFsIExpc3Q8UmVzdWx0PiBmZXRjaENvbXBsZXRlKExpc3Q8RW50aXR5VHlwZT4gZW50aXR5VHlwZXMsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcykpOworCisJCS8vIGFkZCByZXF1aXJlZCBqb2lucworCQllbnRpdHlUeXBlcy5zdHJlYW0oKS5mb3JFYWNoKGVudGl0eVR5cGUgLT4geworCQkJYWRkSm9pbnMocXVlcnksIGVudGl0eVR5cGUpOworCQkJcXVlcnkuc2VsZWN0QWxsKGVudGl0eVR5cGUpOworCQl9KTsKKworCQlyZXR1cm4gZmV0Y2gocXVlcnksIGZpbHRlcik7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBmaW5hbCBMaXN0PFJlc3VsdD4gZmV0Y2goTGlzdDxBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMsIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJUXVlcnkgcXVlcnkgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3RJRChtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShlbnRpdHlDbGFzcykpOworCisJCS8vIGFkZCByZXF1aXJlZCBqb2lucworCQlhdHRyaWJ1dGVzLnN0cmVhbSgpLmZvckVhY2goYXR0cmlidXRlIC0+IHsKKwkJCWFkZEpvaW5zKHF1ZXJ5LCBhdHRyaWJ1dGUuZ2V0RW50aXR5VHlwZSgpKTsKKwkJCXF1ZXJ5LnNlbGVjdChhdHRyaWJ1dGUpOworCQl9KTsKKworCQlyZXR1cm4gZmV0Y2gocXVlcnksIGZpbHRlcik7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByb3RlY3RlZCBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgSm9pbkNvbmZpZ30gdG8gdGhlIGludGVybmFsbHkgbWFuYWdlZCB7QGxpbmsgSm9pblRyZWV9LgorCSAqCisJICogQHBhcmFtIGpvaW5Db25maWcgV2lsbCBiZSBhZGRlZC4KKwkgKi8KKwlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRKb2luQ29uZmlnKEpvaW5Db25maWcgam9pbkNvbmZpZykgeworCQlFbnRpdHlDb25maWc8Pz4gdGFyZ2V0RW50aXR5Q29uZmlnID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eUNvbmZpZyhuZXcgS2V5PD4oam9pbkNvbmZpZy50YXJnZXQpKTsKKwkJRW50aXR5VHlwZSB0YXJnZXQgPSB0YXJnZXRFbnRpdHlDb25maWcuZ2V0RW50aXR5VHlwZSgpOworCisJCS8vIGFkZCBkZXBlbmRlbmN5IHNvdXJjZSB0byB0YXJnZXQKKwkJam9pblRyZWUuYWRkTm9kZShtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShqb2luQ29uZmlnLnNvdXJjZSksIHRhcmdldCwgam9pbkNvbmZpZy52aWFQYXJlbnQsIEpvaW5UeXBlLklOTkVSKTsKKworCQkvLyBhZGQgdGFyZ2V0J3Mgb3B0aW9uYWwgZGVwZW5kZW5jaWVzCisJCXRhcmdldEVudGl0eUNvbmZpZy5nZXRPcHRpb25hbENvbmZpZ3MoKS5zdHJlYW0oKS5tYXAoRW50aXR5Q29uZmlnOjpnZXRFbnRpdHlUeXBlKQorCQkJCS5maWx0ZXIoZXQgLT4gISJDbGFzc2lmaWNhdGlvbiIuZXF1YWxzKGV0LmdldE5hbWUoKSkpLmZvckVhY2goZW50aXR5VHlwZSAtPiB7CisJCQkJCWpvaW5UcmVlLmFkZE5vZGUodGFyZ2V0LCBlbnRpdHlUeXBlLCB0cnVlLCBKb2luVHlwZS5PVVRFUik7CisJCQkJfSk7CisKKwkJLy8gYWRkIHRhcmdldCdzIG1hbmRhdG9yeSBkZXBlbmRlbmNpZXMKKwkJdGFyZ2V0RW50aXR5Q29uZmlnLmdldE1hbmRhdG9yeUNvbmZpZ3MoKS5zdHJlYW0oKS5tYXAoRW50aXR5Q29uZmlnOjpnZXRFbnRpdHlUeXBlKS5mb3JFYWNoKGVudGl0eVR5cGUgLT4geworCQkJam9pblRyZWUuYWRkTm9kZSh0YXJnZXQsIGVudGl0eVR5cGUsIHRydWUsIEpvaW5UeXBlLklOTkVSKTsKKwkJfSk7CisJfQorCisJLyoqCisJICogQWRkcyBqb2lucyB0byBjb250ZXh0IGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKgorCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAY29kZSBDb250ZXh0U3RhdGV9LgorCSAqLworCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEpvaW5Db25maWcoQ29udGV4dFN0YXRlIGNvbnRleHRTdGF0ZSkgeworCQlpZiAoY29udGV4dFN0YXRlID09IG51bGwpIHsKKwkJCS8vIG5vdGhpbmcgdG8gZG8KKwkJCXJldHVybjsKKwkJfQorCisJCUNsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHNvdXJjZSA9IGNvbnRleHRTdGF0ZS5pc09yZGVyZWQoKSA/IFRlc3RTdGVwLmNsYXNzIDogTWVhc3VyZW1lbnQuY2xhc3M7CisJCWZvciAoQ29udGV4dFR5cGUgY29udGV4dFR5cGUgOiBDb250ZXh0VHlwZS52YWx1ZXMoKSkgeworCQkJRW50aXR5VHlwZSByb290RW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENvbnRleHRSb290LmNsYXNzLCBjb250ZXh0VHlwZSk7CisJCQlmb3IgKFJlbGF0aW9uIGNvbXBvbmVudFJlbGF0aW9uIDogcm9vdEVudGl0eVR5cGUuZ2V0Q2hpbGRSZWxhdGlvbnMoKSkgeworCQkJCWpvaW5UcmVlLmFkZE5vZGUoY29tcG9uZW50UmVsYXRpb24uZ2V0U291cmNlKCksIGNvbXBvbmVudFJlbGF0aW9uLmdldFRhcmdldCgpLCB0cnVlLCBKb2luVHlwZS5PVVRFUik7CisKKwkJCQlmb3IgKFJlbGF0aW9uIHNlbnNvclJlbGF0aW9uIDogY29tcG9uZW50UmVsYXRpb24uZ2V0VGFyZ2V0KCkuZ2V0Q2hpbGRSZWxhdGlvbnMoKSkgeworCQkJCQlqb2luVHJlZS5hZGROb2RlKHNlbnNvclJlbGF0aW9uLmdldFNvdXJjZSgpLCBzZW5zb3JSZWxhdGlvbi5nZXRUYXJnZXQoKSwgdHJ1ZSwgSm9pblR5cGUuT1VURVIpOworCQkJCX0KKwkJCX0KKworCQkJam9pblRyZWUuYWRkTm9kZShtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShzb3VyY2UpLCByb290RW50aXR5VHlwZSwgdHJ1ZSwgSm9pblR5cGUuT1VURVIpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIEV4ZWN1dGVzIGdpdmVuIHtAbGluayBRdWVyeX0gdXNpbmcgZ2l2ZW4ge0BsaW5rIEZpbHRlcn0uIEpvaW5zIHJlcXVpcmVkIGZvcgorCSAqIHRoZSBnaXZlbiB7QGNvZGUgRmlsdGVyfSB3aWxsIGJlIGltcGxpY2l0bHkgYWRkZWQgYXMgbmVlZGVkLgorCSAqCisJICogQHBhcmFtIHF1ZXJ5ICBXaWxsIGJlIGV4ZWN1dGVkLgorCSAqIEBwYXJhbSBmaWx0ZXIgVGhlIHF1ZXJ5IGZpbHRlcmluZyBzZXF1ZW5jZS4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHtAbGluayBSZXN1bHR9cyBpbiBhIHtAY29kZSBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIGZhaWxlZCB0byBleGVjdXRlIGdpdmVuIHtAY29kZSBRdWVyeX0uCisJICovCisJcHJpdmF0ZSBMaXN0PFJlc3VsdD4gZmV0Y2goUXVlcnkgcXVlcnksIEZpbHRlciBmaWx0ZXIpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJZmlsdGVyLnN0cmVhbSgpLmZpbHRlcihGaWx0ZXJJdGVtOjppc0NvbmRpdGlvbikubWFwKEZpbHRlckl0ZW06OmdldENvbmRpdGlvbikKKwkJCQkuZm9yRWFjaChjIC0+IGFkZEpvaW5zKHF1ZXJ5LCBjLmdldEF0dHJpYnV0ZSgpLmdldEVudGl0eVR5cGUoKSkpOworCisJCUVudGl0eVR5cGUgZW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkJcmV0dXJuIHF1ZXJ5Lm9yZGVyKGVudGl0eVR5cGUuZ2V0SURBdHRyaWJ1dGUoKSkuZmV0Y2goZmlsdGVyKS5zdHJlYW0oKQorCQkJCS8vIGdyb3VwIGJ5IGluc3RhbmNlIElEIGFuZCBtZXJnZSBncm91cGVkIHJlc3VsdHMKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KHIgLT4gci5nZXRSZWNvcmQoZW50aXR5VHlwZSkuZ2V0SUQoKSwgcmVkdWNpbmcoUmVzdWx0OjptZXJnZSkpKQorCQkJCS8vIGNvbGxlY3QgbWVyZ2VkIHJlc3VsdHMKKwkJCQkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpLm1hcChPcHRpb25hbDo6Z2V0KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworCS8qKgorCSAqIEFkZHMgam9pbiBzdGF0ZW1lbnRzIHRvIGdpdmVuIHRhcmdldCB7QGxpbmsgRW50aXR5VHlwZX0gYXMgbmVlZGVkIHRvIGJlIGFibGUKKwkgKiB0byBleGVjdXRlIGdpdmVuIHtAY29kZSBRdWVyeX0uCisJICoKKwkgKiBAcGFyYW0gcXVlcnkgICAgICBUaGUge0BsaW5rIFF1ZXJ5fS4KKwkgKiBAcGFyYW0gZW50aXR5VHlwZSBUaGUgdGFyZ2V0IHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRkSm9pbnMoUXVlcnkgcXVlcnksIEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlpZiAocXVlcnkuaXNRdWVyaWVkKGVudGl0eVR5cGUpKSB7CisJCQlyZXR1cm47CisJCX0KKworCQlKb2luTm9kZSBqb2luTm9kZSA9IGpvaW5UcmVlLmdldEpvaW5Ob2RlKGVudGl0eVR5cGUuZ2V0TmFtZSgpKTsKKwkJRW50aXR5VHlwZSBzb3VyY2VFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoam9pbk5vZGUuc291cmNlKTsKKwkJYWRkSm9pbnMocXVlcnksIHNvdXJjZUVudGl0eVR5cGUpOworCQlxdWVyeS5qb2luKHNvdXJjZUVudGl0eVR5cGUuZ2V0UmVsYXRpb24oZW50aXR5VHlwZSksIGpvaW5Ob2RlLmpvaW5UeXBlKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbEdyb3VwU2VhcmNoUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbEdyb3VwU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQ5ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9DaGFubmVsR3JvdXBTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworCisvKioKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBDaGFubmVsR3JvdXB9IGFzIHNvdXJjZSBlbnRpdHkKKyAqIHR5cGUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yCisgKi8KK2ZpbmFsIGNsYXNzIENoYW5uZWxHcm91cFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlDaGFubmVsR3JvdXBTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCXN1cGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlLCBDaGFubmVsR3JvdXAuY2xhc3MsIFByb2plY3QuY2xhc3MpOworCisJCS8vIGxheWVycworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoUG9vbC5jbGFzcywgUHJvamVjdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoVGVzdC5jbGFzcywgUG9vbC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoVGVzdFN0ZXAuY2xhc3MsIFRlc3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKE1lYXN1cmVtZW50LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoQ2hhbm5lbEdyb3VwLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9DaGFubmVsU2VhcmNoUXVlcnkuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbFNlYXJjaFF1ZXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmYWNhYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ2hhbm5lbFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICoge0BsaW5rIFNlYXJjaFF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIENoYW5uZWx9IGFzIHNvdXJjZSBlbnRpdHkgdHlwZS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IganN0LCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworZmluYWwgY2xhc3MgQ2hhbm5lbFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlDaGFubmVsU2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSwgQ29udGV4dFN0YXRlIGNvbnRleHRTdGF0ZSkgeworCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgQ2hhbm5lbC5jbGFzcywgUHJvamVjdC5jbGFzcyk7CisKKwkJLy8gbGF5ZXJzCisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChQb29sLmNsYXNzLCBQcm9qZWN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0LmNsYXNzLCBQb29sLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0U3RlcC5jbGFzcywgVGVzdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoTWVhc3VyZW1lbnQuY2xhc3MsIFRlc3RTdGVwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChDaGFubmVsLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisKKwkJLy8gY29udGV4dAorCQlhZGRKb2luQ29uZmlnKGNvbnRleHRTdGF0ZSk7CisKKwkJLy8gVE9ETyBqb2luIHRvIHNlbnNvciB0YWJsZXMuLi4uIHx8IHRoaXMgd2lsbCBicmVhayB0aGUgam9pbnMgdG8KKwkJLy8gY29udGV4dCBkYXRhCisJCS8vIG11bHRpcGxlIG91dGVyIGpvaW4gdG8gdGhlIHNhbWUgdGFibGUuLi4KKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvQ29udGV4dFN0YXRlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0NvbnRleHRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGRiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL0NvbnRleHRTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CisKKy8qKgorICogQ29udGV4dCBzdGF0ZSBlbnVtZXJhdGlvbi4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZW51bSBDb250ZXh0U3RhdGUgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEVudW0gY29uc3RhbnRzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmVmZXJlbmNlcyB7QGxpbmsgQ29udGV4dFJvb3R9cyBvZiB7QGxpbmsgVGVzdFN0ZXB9cy4KKwkgKi8KKwlPUkRFUkVELAorCisJLyoqCisJICogUmVmZXJlbmNlcyB7QGxpbmsgQ29udGV4dFJvb3R9cyBvZiB7QGxpbmsgTWVhc3VyZW1lbnR9cy4KKwkgKi8KKwlNRUFTVVJFRDsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udGV4dCBzdGF0ZSBpcyB7QGxpbmsgI09SREVSRUR9LgorCSAqCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIGluc3RhbmNlIGlzIHtAbGluayAjT1JERVJFRH0uCisJICovCisJcHVibGljIGJvb2xlYW4gaXNPcmRlcmVkKCkgeworCQlyZXR1cm4gT1JERVJFRCA9PSB0aGlzOworCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgY29udGV4dCBzdGF0ZSBpcyB7QGxpbmsgI01FQVNVUkVEfS4KKwkgKgorCSAqIEByZXR1cm4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbnN0YW5jZSBpcyB7QGxpbmsgI01FQVNVUkVEfS4KKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc01lYXN1cmVkKCkgeworCQlyZXR1cm4gTUVBU1VSRUQgPT0gdGhpczsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvSm9pblRyZWUuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvSm9pblRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTJiNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Kb2luVHJlZS5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuSm9pblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHNwYW5zIGEgZGVwZW5kZW5jeSB0cmVlIGZvciBjb25kaXRpb25hbCBqb2luIHN0YXRlbWVudHMgaXMKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIEpvaW5UcmVlIHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gdHJlZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEpvaW5Ob2RlPiBqb2luTm9kZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBub2RlTmFtZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB0cmVlIGNvbmZpZ3VyYXRpb24uIEl0IG1hcHBzIGEgc291cmNlIGVudGl0eSB0eXBlIG5hbWVzIHRvCisJICogc3VwcG9ydGVkIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lcy4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHJldHVybmVkIHtAY29kZSBNYXB9IGlzIHVubW9kaWZpYWJsZS4KKwkgKi8KKwlwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRUcmVlKCkgeworCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRyZWUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgYSB7QGNvZGUgTGlzdH0gd2l0aCBkaXN0aW5jdCBlbnRpdHkgdHlwZSBuYW1lcyBjb3ZlcmVkIGJ5IHRoaXMgam9pbgorCSAqIHRyZWUuCisJICoKKwkgKiBAcmV0dXJuIFJldHVybmVkIHtAY29kZSBMaXN0fSBpcyB1bm1vZGlmaWFibGUuCisJICovCisJcHVibGljIFNldDxTdHJpbmc+IGdldE5vZGVOYW1lcygpIHsKKwkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChub2RlTmFtZXMpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBKb2luTm9kZX0gZm9yIGdpdmVuIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCSAqCisJICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IGVudGl0eSB0eXBlIG5hbWUuCisJICogQHJldHVybiBUaGUge0Bjb2RlIEpvaW5Ob2RlfSBmb3IgZ2l2ZW4gdGFyZ2V0IGVudGl0eSB0eXBlIG5hbWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIG5vIHN1Y2gge0Bjb2RlIEpvaW5Ob2RlfSBleGlzdHMuCisJICovCisJcHVibGljIEpvaW5Ob2RlIGdldEpvaW5Ob2RlKFN0cmluZyB0YXJnZXQpIHsKKwkJSm9pbk5vZGUgam9pbk5vZGUgPSBqb2luTm9kZXMuZ2V0KHRhcmdldCk7CisJCWlmIChqb2luTm9kZSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWxhdGlvbiB0byAnIiArIHRhcmdldCArICInIG5vdCBwb3NzaWJsZS4iKTsKKwkJfQorCisJCXJldHVybiBqb2luTm9kZTsKKwl9CisKKwkvKioKKwkgKiBBZGRzIGdpdmVuIGRlcGVuZGVuY3kgc2V0dXAgdG8gdGhpcyBqb2luIHRyZWUuCisJICoKKwkgKiBAcGFyYW0gc291cmNlICAgIFRoZSBzb3VyY2UgZW50aXR5IHR5cGUgbmFtZS4KKwkgKiBAcGFyYW0gdGFyZ2V0ICAgIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUgbmFtZS4KKwkgKiBAcGFyYW0gdmlhUGFyZW50IElmIHRydWUsIHRoZW4gc291cmNlIGlzIHRoZSBjb25zaWRlcmVkIHBhcmVudCBvZiB0aGUgdGFyZ2V0LgorCSAqIEBwYXJhbSBqb2luVHlwZSAgRWl0aGVyIGlubmVyIG9yIG91dGVyIGpvaW5UeXBlLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBnaXZlbiBzZXR1cCBvdmVycmlkZXMgYW4gZXhpc3RpbmcKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgKGEgdGFyZ2V0IGVudGl0eSB0eXBlIGlzIGFsbG93ZWQgdG8gYmUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luZWQgb25seSBvbmNlKS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGROb2RlKEVudGl0eVR5cGUgc291cmNlLCBFbnRpdHlUeXBlIHRhcmdldCwgYm9vbGVhbiB2aWFQYXJlbnQsIEpvaW5UeXBlIGpvaW5UeXBlKSB7CisJCVN0cmluZyBzb3VyY2VOYW1lID0gc291cmNlLmdldE5hbWUoKTsKKwkJU3RyaW5nIHRhcmdldE5hbWUgPSB0YXJnZXQuZ2V0TmFtZSgpOworCisJCWlmIChqb2luTm9kZXMucHV0KHRhcmdldE5hbWUsIG5ldyBKb2luTm9kZShzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCBqb2luVHlwZSkpICE9IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkl0IGlzIG5vdCBhbGxvd2VkIHRvIG92ZXJyaWRlIGpvaW4gbm9kZXMuIik7CisJCX0KKworCQlpZiAodmlhUGFyZW50KSB7CisJCQl0cmVlLmNvbXB1dGVJZkFic2VudChzb3VyY2VOYW1lLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQodGFyZ2V0TmFtZSk7CisJCX0gZWxzZSB7CisJCQl0cmVlLmNvbXB1dGVJZkFic2VudCh0YXJnZXROYW1lLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQoc291cmNlTmFtZSk7CisJCX0KKworCQlub2RlTmFtZXMuYWRkKHNvdXJjZU5hbWUpOworCQlub2RlTmFtZXMuYWRkKHRhcmdldE5hbWUpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbm5lciBjbGFzc2VzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQSBzaW1wbGUgam9pblR5cGUgbm9kZSBzZXR1cC4KKwkgKi8KKwlzdGF0aWMgZmluYWwgY2xhc3MgSm9pbk5vZGUgeworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQlmaW5hbCBTdHJpbmcgc291cmNlOworCQlmaW5hbCBTdHJpbmcgdGFyZ2V0OworCQlmaW5hbCBKb2luVHlwZSBqb2luVHlwZTsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIENvbnN0cnVjdG9ycworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJLyoqCisJCSAqIENvbnN0cnVjdG9yLgorCQkgKgorCQkgKiBAcGFyYW0gc291cmNlICAgVGhlIHNvdXJjZSBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcGFyYW0gdGFyZ2V0ICAgVGhlIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcGFyYW0gam9pblR5cGUgRWl0aGVyIGlubmVyIG9yIG91dGVyIHtAbGluayBKb2luVHlwZX0uCisJCSAqLworCQlwcml2YXRlIEpvaW5Ob2RlKFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQsIEpvaW5UeXBlIGpvaW5UeXBlKSB7CisJCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKKwkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OworCQkJdGhpcy5qb2luVHlwZSA9IGpvaW5UeXBlOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBBIHNpbXBsZSBqb2luVHlwZSBjb25maWd1cmF0aW9uIHNldHVwLgorCSAqLworCXN0YXRpYyBmaW5hbCBjbGFzcyBKb2luQ29uZmlnIHsKKworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCQkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkJZmluYWwgQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gc291cmNlOworCQlmaW5hbCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiB0YXJnZXQ7CisJCWZpbmFsIGJvb2xlYW4gdmlhUGFyZW50OworCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gQ29uc3RydWN0b3JzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBzb3VyY2UgICAgVGhlIHNvdXJjZSBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcGFyYW0gdGFyZ2V0ICAgIFRoZSB0YXJnZXQgZW50aXR5IHR5cGUgbmFtZS4KKwkJICogQHBhcmFtIHZpYVBhcmVudCBJZiB0cnVlLCB0aGVuIHNvdXJjZSBpcyB0aGUgY29uc2lkZXJlZCBwYXJlbnQgb2YgdGhlIHRhcmdldC4KKwkJICovCisJCXByaXZhdGUgSm9pbkNvbmZpZyhDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBzb3VyY2UsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHRhcmdldCwgYm9vbGVhbiB2aWFQYXJlbnQpIHsKKwkJCXRoaXMuc291cmNlID0gc291cmNlOworCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisJCQl0aGlzLnZpYVBhcmVudCA9IHZpYVBhcmVudDsKKwkJfQorCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkJLy8gUGFja2FnZSBtZXRob2RzCisJCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCQkvKioKKwkJICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSm9pbkNvbmZpZ30gd2hlcmUgZ2l2ZW4gc291cmNlIGlzIGNvbnNpZGVyZWQgYXMgdGhlCisJCSAqIGNoaWxkIG9mIGdpdmVuIHRhcmdldC4KKwkJICoKKwkJICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGVudGl0eSB0eXBlIG5hbWUuCisJCSAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBKb2luQ29uZmlnfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXN0YXRpYyBKb2luQ29uZmlnIHVwKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHNvdXJjZSwgQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gdGFyZ2V0KSB7CisJCQlyZXR1cm4gbmV3IEpvaW5Db25maWcoc291cmNlLCB0YXJnZXQsIGZhbHNlKTsKKwkJfQorCisJCS8qKgorCQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBKb2luQ29uZmlnfSB3aGVyZSBnaXZlbiBzb3VyY2UgaXMgY29uc2lkZXJlZCBhcyB0aGUKKwkJICogcGFyZW50IG9mIGdpdmVuIHRhcmdldC4KKwkJICoKKwkJICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIGVudGl0eSB0eXBlIG5hbWUuCisJCSAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBlbnRpdHkgdHlwZSBuYW1lLgorCQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHtAY29kZSBKb2luQ29uZmlnfSBpcyByZXR1cm5lZC4KKwkJICovCisJCXN0YXRpYyBKb2luQ29uZmlnIGRvd24oQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiB0YXJnZXQpIHsKKwkJCXJldHVybiBuZXcgSm9pbkNvbmZpZyhzb3VyY2UsIHRhcmdldCwgdHJ1ZSk7CisJCX0KKworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZWFzdXJlbWVudFNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL01lYXN1cmVtZW50U2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjE2MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZWFzdXJlbWVudFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICoge0BsaW5rIFNlYXJjaFF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIE1lYXN1cmVtZW50fSBhcyBzb3VyY2UgZW50aXR5CisgKiB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitmaW5hbCBjbGFzcyBNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIENvbnRleHRTdGF0ZSBjb250ZXh0U3RhdGUpIHsKKwkJc3VwZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIE1lYXN1cmVtZW50LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3RTdGVwLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChNZWFzdXJlbWVudC5jbGFzcywgVGVzdFN0ZXAuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWwuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZXJnZWRTZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9NZXJnZWRTZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDVjNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL01lcmdlZFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSwxMzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy5ncm91cGluZ0J5OworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMucmVkdWNpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaGFibGU7CisKKy8qKgorICogTWVyZ2VzIDIgZGlzdGluY3Qgc2VhcmNoIHF1ZXJpZXMsIHdoZXJlIG9uZSBxdWVyaWVzIGNvbnRleHQgZGF0YSBhcyBvcmRlcmVkCisgKiBhbmQgdGhlIG90aGVyIGNvbnRleHQgYXMgbWVhc3VyZWQuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIE1lcmdlZFNlYXJjaFF1ZXJ5IGltcGxlbWVudHMgU2VhcmNoUXVlcnkgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJcHJpdmF0ZSBmaW5hbCBCYXNlRW50aXR5U2VhcmNoUXVlcnkgYnlSZXN1bHQ7CisJcHJpdmF0ZSBmaW5hbCBCYXNlRW50aXR5U2VhcmNoUXVlcnkgYnlPcmRlcjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlNZXJnZWRTZWFyY2hRdWVyeShFbnRpdHlUeXBlIGVudGl0eVR5cGUsIEZ1bmN0aW9uPENvbnRleHRTdGF0ZSwgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5PiBmYWN0b3J5KSB7CisJCXRoaXMuZW50aXR5VHlwZSA9IGVudGl0eVR5cGU7CisKKwkJYnlSZXN1bHQgPSBmYWN0b3J5LmFwcGx5KENvbnRleHRTdGF0ZS5NRUFTVVJFRCk7CisJCWJ5T3JkZXIgPSBmYWN0b3J5LmFwcGx5KENvbnRleHRTdGF0ZS5PUkRFUkVEKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKCkgeworCQlyZXR1cm4gYnlPcmRlci5saXN0RW50aXR5VHlwZXMoKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFNlYXJjaGFibGUgZ2V0U2VhcmNoYWJsZVJvb3QoKSB7CisJCXJldHVybiBieU9yZGVyLmdldFNlYXJjaGFibGVSb290KCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFZhbHVlPiBnZXRGaWx0ZXJWYWx1ZXMoQXR0cmlidXRlIGF0dHJpYnV0ZSwgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PFZhbHVlPiBvcmRlclZhbHVlcyA9IGJ5T3JkZXIuZ2V0RmlsdGVyVmFsdWVzKGF0dHJpYnV0ZSwgZmlsdGVyKTsKKwkJTGlzdDxWYWx1ZT4gcmVzdWx0VmFsdWVzID0gYnlSZXN1bHQuZ2V0RmlsdGVyVmFsdWVzKGF0dHJpYnV0ZSwgZmlsdGVyKTsKKworCQlyZXR1cm4gU3RyZWFtLmNvbmNhdChvcmRlclZhbHVlcy5zdHJlYW0oKSwgcmVzdWx0VmFsdWVzLnN0cmVhbSgpKQorCQkJCS8vIGdyb3VwIGJ5IHZhbHVlIGFuZCBtZXJnZSB2YWx1ZXMKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KHYgLT4gdi5leHRyYWN0KCksIHJlZHVjaW5nKCh2MSwgdjIpIC0+IHYxKSkpCisJCQkJLy8gY29sbGVjdCBtZXJnZWQgcmVzdWx0cworCQkJCS52YWx1ZXMoKS5zdHJlYW0oKS5maWx0ZXIoT3B0aW9uYWw6OmlzUHJlc2VudCkubWFwKE9wdGlvbmFsOjpnZXQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBMaXN0PFJlc3VsdD4gZmV0Y2hDb21wbGV0ZShMaXN0PEVudGl0eVR5cGU+IGVudGl0eVR5cGVzLCBGaWx0ZXIgZmlsdGVyKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXJldHVybiBtZXJnZVJlc3VsdHMoYnlPcmRlci5mZXRjaENvbXBsZXRlKGVudGl0eVR5cGVzLCBmaWx0ZXIpLCBieVJlc3VsdC5mZXRjaENvbXBsZXRlKGVudGl0eVR5cGVzLCBmaWx0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVzdWx0PiBmZXRjaChMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcywgRmlsdGVyIGZpbHRlcikgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gbWVyZ2VSZXN1bHRzKGJ5T3JkZXIuZmV0Y2goYXR0cmlidXRlcywgZmlsdGVyKSwgYnlSZXN1bHQuZmV0Y2goYXR0cmlidXRlcywgZmlsdGVyKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIE1lcmdlcyBnaXZlbiB7QGxpbmsgUmVzdWx0fXMgdG8gb25lIHVzaW5nIHRoZSByb290IGVudGl0eSB0eXBlIG9mIHRoaXMgc2VhcmNoCisJICogcXVlcnkuCisJICoKKwkgKiBAcGFyYW0gcmVzdWx0czEgVGhlIGZpcnN0IHtAY29kZSBSZXN1bHR9LgorCSAqIEBwYXJhbSByZXN1bHRzMiBUaGUgc2Vjb25kIHtAY29kZSBSZXN1bHR9LgorCSAqIEByZXR1cm4gVGhlIG1lcmdlZCB7QGxpbmsgUmVzdWx0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIExpc3Q8UmVzdWx0PiBtZXJnZVJlc3VsdHMoTGlzdDxSZXN1bHQ+IHJlc3VsdHMxLCBMaXN0PFJlc3VsdD4gcmVzdWx0czIpIHsKKwkJcmV0dXJuIFN0cmVhbS5jb25jYXQocmVzdWx0czEuc3RyZWFtKCksIHJlc3VsdHMyLnN0cmVhbSgpKQorCQkJCS8vIGdyb3VwIGJ5IGluc3RhbmNlIElEIGFuZCBtZXJnZSBncm91cGVkIHJlc3VsdHMKKwkJCQkuY29sbGVjdChncm91cGluZ0J5KHIgLT4gci5nZXRSZWNvcmQoZW50aXR5VHlwZSkuZ2V0SUQoKSwgcmVkdWNpbmcoUmVzdWx0OjptZXJnZSkpKQorCQkJCS8vIGNvbGxlY3QgbWVyZ2VkIHJlc3VsdHMKKwkJCQkudmFsdWVzKCkuc3RyZWFtKCkuZmlsdGVyKE9wdGlvbmFsOjppc1ByZXNlbnQpLm1hcChPcHRpb25hbDo6Z2V0KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNGcmVlVGV4dFNlYXJjaC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNGcmVlVGV4dFNlYXJjaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTVmMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU0ZyZWVUZXh0U2VhcmNoLmphdmEKQEAgLTAsMCArMSwyODcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMjAgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuSHR0cE1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLkJ5dGVBcnJheVJlcXVlc3RFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5Qb3N0TWV0aG9kOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy50ZXh0LlN0cmluZ0VzY2FwZVV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OworaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk9iamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvblBhcnNlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGhhbmRsZXMgdGhlIHJlcXVlc3RzIHdoaWNoIGFyZSBzZW50IHRvIHRoZSBGcmVlVGV4dFNlYXJjaAorICogCisgKiBAYXV0aG9yIENocmlzdGlhbiBXZXllcm1hbm4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBPRFNGcmVlVGV4dFNlYXJjaCB7CisKKwkvKioKKwkgKiBUaGlzIGlzIHRoZSBwYXlsb2FkIHdoaWNoIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHRoZSBwb3N0IHRvIGFkZCBhCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVTX1BPU1REQVRBID0gIntcIl9zb3VyY2VcIjogW1wic291cmNlXCIsIFwidHlwZVwiLCBcImlkXCJdLCBcInF1ZXJ5XCI6e1wic2ltcGxlX3F1ZXJ5X3N0cmluZ1wiOntcInF1ZXJ5XCI6XCIlc1wiLFwiZGVmYXVsdF9vcGVyYXRvclwiOlwib3JcIixcImxlbmllbnRcIjpcInRydWVcIn19fSI7CisKKwkvKioKKwkgKiBtYWlubHkgbG9ncyByZXF1ZXN0cyBvbiBJTkZPCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU0ZyZWVUZXh0U2VhcmNoLmNsYXNzKTsKKworCS8qKgorCSAqIFVzZWQgdG8gZmluYWxseSBsb2FkIHRoZSBFbnRpdGVzCisJICovCisJcHJpdmF0ZSBFbnRpdHlMb2FkZXIgbG9hZGVyOworCisJLyoqCisJICogVGhlIFVSTCBpcyBoYXJkIGNvZGVkCisJICovCisJcHJpdmF0ZSBVUkkgdXJsOworCisJLyoqCisJICogVGhlIGNsaWVudCBpcyBjcmVhdGVkIG9uY2UgYW5kIHJldXNlZAorCSAqLworCXByaXZhdGUgSHR0cENsaWVudCBjbGllbnQ7CisKKwkvKioKKwkgKiBUaGlzIHdpbGwgc3RhcnQgdXAgdGhlIEZyZWVUZXh0IFNlYXJjaC4gTm8gdXBmcm9uIHF1ZXJyaWVzIGFyZSBkb25lLiBUaHVzCisJICogdGhpcyBjYW4gYmUgY2FsbGVkIGFzIG9mdGVuIGFzIGRlc2lyZWQgd2l0aG91dCBhbnkgbWFqb3IgcGVyZm9ybWFuY2UgbG9zcworCSAqIAorCSAqIEBwYXJhbSBlbnRpdHlMb2FkZXIKKwkgKiBAcGFyYW0gc291cmNlTmFtZQorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbgorCSAqLworCXB1YmxpYyBPRFNGcmVlVGV4dFNlYXJjaChFbnRpdHlMb2FkZXIgZW50aXR5TG9hZGVyLCBTdHJpbmcgc291cmNlTmFtZSwgU3RyaW5nIGhvc3QpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJdGhpcy5sb2FkZXIgPSBlbnRpdHlMb2FkZXI7CisKKwkJdXJsID0gVVJJLmNyZWF0ZShob3N0KS5yZXNvbHZlKHNvdXJjZU5hbWUudG9Mb3dlckNhc2UoKSkucmVzb2x2ZSgiL19zZWFyY2giKTsKKworCQljbGllbnQgPSBuZXcgSHR0cENsaWVudCgpOworCX0KKworCS8qKgorCSAqIEEgc2VhcmNoIHdoaWNoIGlzIGNvbXBhdGlibGUgdG8gdGhlIFNlYXJjaCBhcyBkZWZpbmVkIGluIHRoZSByZXN0IG9mIHRoZSBBUEkuCisJICogCisJICogQHBhcmFtIGlucHV0UXVlcnkKKwkgKiBAcmV0dXJuIG5ldmVyIG51bGwsIGJ1dCBtYXliZSBlbXB0eQorCSAqLworCXB1YmxpYyBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gc2VhcmNoKFN0cmluZyBpbnB1dFF1ZXJ5KSB7CisJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PFN0cmluZz4+IGluc3RhbmNlcyA9IHNlYXJjaElkcyhpbnB1dFF1ZXJ5KTsKKwkJaW5zdGFuY2VzLmtleVNldCgpLmZvckVhY2godHlwZSAtPiBjb252ZXJ0SWRzMkVudGl0aWVzKHJlc3VsdCwgaW5zdGFuY2VzLCB0eXBlKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCisJICogQSBzZWFyY2ggd2hpY2ggaXMgY29tcGF0aWJsZSB0byB0aGUgU2VhcmNoIGFzIGRlZmluZWQgaW4gdGhlIHJlc3Qgb2YgdGhlIEFQSS4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRRdWVyeQorCSAqIEByZXR1cm4gbmV2ZXIgbnVsbCwgYnV0IG1heWJlIGVtcHR5CisJICovCisJcHVibGljIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxTdHJpbmc+PiBzZWFyY2hJZHMoU3RyaW5nIGlucHV0UXVlcnkpIHsKKwkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PFN0cmluZz4+IGluc3RhbmNlSWRzID0gbmV3IEhhc2hNYXA8PigpOworCisJCUpzb25FbGVtZW50IHJvb3QgPSBxdWVyeUVsYXN0aWNTZWFyY2goaW5wdXRRdWVyeSk7CisJCWlmIChyb290ICE9IG51bGwpIHsKKwkJCUpzb25BcnJheSBoaXRzID0gcm9vdC5nZXRBc0pzb25PYmplY3QoKS5nZXQoImhpdHMiKS5nZXRBc0pzb25PYmplY3QoKS5nZXQoImhpdHMiKS5nZXRBc0pzb25BcnJheSgpOworCisJCQloaXRzLmZvckVhY2goZSAtPiBwdXQoZSwgaW5zdGFuY2VJZHMpKTsKKworCQl9CisJCXJldHVybiBpbnN0YW5jZUlkczsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBhbGwgaW5zdGFuY2VzIHRvIGVudGl0aWVzCisJICogCisJICogQHBhcmFtIGNvbnZlcnRlZE1hcCBpdCB3aWxsCisJICogQHBhcmFtIG1hcAorCSAqIEBwYXJhbSB0eXBlCisJICovCisJcHJpdmF0ZSB2b2lkIGNvbnZlcnRJZHMyRW50aXRpZXMoTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IGNvbnZlcnRlZE1hcCwKKwkJCU1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxTdHJpbmc+PiBtYXAsIENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IHR5cGUpIHsKKwkJdHJ5IHsKKwkJCUxpc3Q8RW50aXR5PiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQlsaXN0LmFkZEFsbChsb2FkZXIubG9hZEFsbChuZXcgS2V5PD4odHlwZSksIG1hcC5nZXQodHlwZSkpKTsKKworCQkJY29udmVydGVkTWFwLnB1dCh0eXBlLCBsaXN0KTsKKwkJfSBjYXRjaCAoRGF0YUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9hZCBpZHMgZnJvbSBPRFMuIFRoaXMgbWVhbnMgbm8gcmVzdWx0cyBhcmUgYXZhaWxhYmxlIiwgZSk7CisJCX0KKworCX0KKworCS8qKgorCSAqIFB1dHMgYWxsIHRoZSBoaXRzIGluIGVsYXN0aWNzZWFyY2gKKwkgKiAKKwkgKiBAcGFyYW0gaGl0IGEgaGl0IGFzIGdpdmVuIGZyb20gRWxhc3RpY1NlYXJjaAorCSAqIEBwYXJhbSBtYXAgdGhlIG1hcCBvZiBhbGwgaWRzIGZvciB0aGUgY2xhc3Mgb2YgdGhlIGVudGl0eQorCSAqLworCXByaXZhdGUgdm9pZCBwdXQoSnNvbkVsZW1lbnQgaGl0LCBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8U3RyaW5nPj4gbWFwKSB7CisJCUpzb25PYmplY3Qgb2JqZWN0ID0gaGl0LmdldEFzSnNvbk9iamVjdCgpLmdldCgiX3NvdXJjZSIpLmdldEFzSnNvbk9iamVjdCgpOworCisJCVN0cmluZyB0eXBlID0gb2JqZWN0LmdldCgidHlwZSIpLmdldEFzU3RyaW5nKCk7CisJCUNsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGNsYXp6ID0gZ2V0Q2xhc3M0VHlwZSh0eXBlKTsKKworCQlpZiAoY2xhenogIT0gbnVsbCkgeworCQkJaWYgKCFtYXAuY29udGFpbnNLZXkoY2xhenopKSB7CisJCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCQltYXAucHV0KGNsYXp6LCBsaXN0KTsKKwkJCX0KKworCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBtYXAuZ2V0KGNsYXp6KTsKKwkJCWxpc3QuYWRkKChTdHJpbmcpIG9iamVjdC5nZXQoImlkIikuZ2V0QXNTdHJpbmcoKSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiAKKwkgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBhcyBnaXZlbiBieSBlbGFzdGljc2VhcmNoCisJICogQHJldHVybiB0aGUgY2xhc3Mgb2YgZWFjaCBlbGVtZW50CisJICovCisJcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBnZXRDbGFzczRUeXBlKFN0cmluZyB0eXBlKSB7CisJCUNsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGNsYXp6OworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSAiUHJvamVjdCI6CisJCQljbGF6eiA9IFByb2plY3QuY2xhc3M7CisJCQlicmVhazsKKwkJY2FzZSAiUG9vbCI6CisJCQljbGF6eiA9IFBvb2wuY2xhc3M7CisJCQlicmVhazsKKwkJY2FzZSAiVGVzdCI6CisJCQljbGF6eiA9IFRlc3QuY2xhc3M7CisJCQlicmVhazsKKwkJY2FzZSAiVGVzdFN0ZXAiOgorCQkJY2xhenogPSBUZXN0U3RlcC5jbGFzczsKKwkJCWJyZWFrOworCQljYXNlICJNZWFzdXJlbWVudCI6CisJCQljbGF6eiA9IE1lYXN1cmVtZW50LmNsYXNzOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWNsYXp6ID0gbnVsbDsKKwkJfQorCQlyZXR1cm4gY2xheno7CisJfQorCisJLyoqCisJICogVGhpcyBtZXRob2QgYWN0dWFsbHkgcXVlcnJpZXMgRWxhc3RpY1NlYXJjaC4KKwkgKiAKKwkgKiBAcGFyYW0gaW5wdXRRdWVyeQorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEpzb25FbGVtZW50IHF1ZXJ5RWxhc3RpY1NlYXJjaChTdHJpbmcgaW5wdXRRdWVyeSkgeworCQlQb3N0TWV0aG9kIHBvc3QgPSBuZXcgUG9zdE1ldGhvZCh1cmwudG9TdHJpbmcoKSk7CisKKwkJU3RyaW5nIHJlcXVlc3RKc29uID0gYnVpbGRSZXF1ZXN0SnNvbihpbnB1dFF1ZXJ5KTsKKworCQlMT0dHRVIuaW5mbygiUE9TVDogIiArIHVybCk7CisJCUxPR0dFUi5pbmZvKCJBc2tpbmc6ICIgKyByZXF1ZXN0SnNvbik7CisJCWJ5dGVbXSBqc29uID0gcmVxdWVzdEpzb24uZ2V0Qnl0ZXMoKTsKKwkJcG9zdC5zZXRSZXF1ZXN0RW50aXR5KG5ldyBCeXRlQXJyYXlSZXF1ZXN0RW50aXR5KGpzb24sICJhcHBsaWNhdGlvbi9qc29uIikpOworCisJCUpzb25FbGVtZW50IHJlc3VsdCA9IGV4ZWN1dGUocG9zdCk7CisJCUxPR0dFUi5pbmZvKCJBbnN3ZXJlZDoiICsgcmVzdWx0KTsKKworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIEFjdHVhbGx5IGJ1aWxkcyB0aGUganNvbgorCSAqIAorCSAqIEBwYXJhbSBpbnB1dFF1ZXJ5CisJICogQHJldHVybgorCSAqLworCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVxdWVzdEpzb24oU3RyaW5nIGlucHV0UXVlcnkpIHsKKwkJU3RyaW5nIHF1ZXJ5ID0gU3RyaW5nRXNjYXBlVXRpbHMuZXNjYXBlSnNvbihpbnB1dFF1ZXJ5KTsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoRVNfUE9TVERBVEEsIHF1ZXJ5KTsKKwl9CisKKwkvKioKKwkgKiBFeGVjdXRlcyB0aGUgSFRUUCBtZXRob2QgYW5kIGV4cGVjdHMgYSBqc29uIGluIHRoZSByZXR1cm4gcGF5bG9hZCwgd2hpY2ggaXMKKwkgKiB0aGVuIHJldHVybmVkCisJICogCisJICogQHBhcmFtIG1ldGhvZAorCSAqIEByZXR1cm4KKwkgKi8KKwlwcml2YXRlIEpzb25FbGVtZW50IGV4ZWN1dGUoSHR0cE1ldGhvZCBtZXRob2QpIHsKKwkJdHJ5IHsKKwkJCWludCBzdGF0dXMgPSBjbGllbnQuZXhlY3V0ZU1ldGhvZChtZXRob2QpOworCQkJaWYgKHN0YXR1cyA9PSA0MDQpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKworCQkJY2hlY2tFcnJvcihzdGF0dXMpOworCQkJcmV0dXJuIGJ1aWxkUmVzcG9uc2VKc29uKG1ldGhvZCk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2JsZW1zIHF1ZXJ5aW5nIEVsYXN0aWNTZWFyY2guIiwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBSZWFkcyBvdXQgdGhlIGh0dHAgbWV0aG9kIGFuZCBidWlsZHMgdGhlIEpTT04gdmlhIEdTT04KKwkgKiAKKwkgKiBAcGFyYW0gbWV0aG9kCisJICogQHJldHVybgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKi8KKwlwcml2YXRlIEpzb25FbGVtZW50IGJ1aWxkUmVzcG9uc2VKc29uKEh0dHBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlKc29uRWxlbWVudCByZXMgPSBudWxsOworCisJCUlucHV0U3RyZWFtIGluID0gbWV0aG9kLmdldFJlc3BvbnNlQm9keUFzU3RyZWFtKCk7CisJCXRyeSAoSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSkgeworCQkJcmVzID0gbmV3IEpzb25QYXJzZXIoKS5wYXJzZShyZWFkZXIpOworCQl9CisKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKioKKwkgKiBJZiBhbiBlcnJvciBvY2N1cmVkIGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisJICogCisJICogQHBhcmFtIHN0YXR1cworCSAqLworCXByaXZhdGUgdm9pZCBjaGVja0Vycm9yKGludCBzdGF0dXMpIHsKKwkJU3RyaW5nIHRleHQgPSBTdHJpbmcuZm9ybWF0KCJFbGFzdGljU2VhcmNoIGFuc3dlcmVkICVkLiAiLCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgLyAxMDAgIT0gMikgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0ZXh0KTsKKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2UuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvT0RTU2VhcmNoU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZWRmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDMxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW52aXJvbm1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuRW50aXR5TG9hZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZy5LZXk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0cmluZ3M7CisKKy8qKgorICogT0RTIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU2VhcmNoU2VydmljZX0gaW50ZXJmYWNlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitwdWJsaWMgY2xhc3MgT0RTU2VhcmNoU2VydmljZSBpbXBsZW1lbnRzIFNlYXJjaFNlcnZpY2UgeworCisJcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIFNlYXJjaFF1ZXJ5PiBzZWFyY2hRdWVyaWVzID0gbmV3IEhhc2hNYXA8PigpOworCisJcHJpdmF0ZSBmaW5hbCBPRFNDb250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlMb2FkZXIgZW50aXR5TG9hZGVyOworCXByaXZhdGUgZmluYWwgU3RyaW5nIGVzSG9zdDsKKwlwcml2YXRlIE9EU0ZyZWVUZXh0U2VhcmNoIGZyZWVUZXh0U2VhcmNoOworCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fRUxBU1RJQ19TRUFSQ0hfVVJMID0gImVsYXN0aWNzZWFyY2gudXJsIjsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQgICAgICBVc2VkIHRvIHJldHJpZXZlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9LgorCSAqIEBwYXJhbSBlbnRpdHlMb2FkZXIgVXNlZCB0byBsb2FkIGNvbXBsZXRlIHtAbGluayBFbnRpdHl9cy4KKwkgKi8KKwlwdWJsaWMgT0RTU2VhcmNoU2VydmljZShPRFNDb250ZXh0IGNvbnRleHQsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIEVudGl0eUxvYWRlciBlbnRpdHlMb2FkZXIpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKwkJdGhpcy5lbnRpdHlMb2FkZXIgPSBlbnRpdHlMb2FkZXI7CisJCWVzSG9zdCA9IGNvbnRleHQuZ2V0UGFyYW1ldGVycygpLmdldChQQVJBTV9FTEFTVElDX1NFQVJDSF9VUkwpOworCisJCXJlZ2lzdGVyTWVyZ2VkU2VhcmNoUXVlcnkoUHJvamVjdC5jbGFzcywKKwkJCQljIC0+IG5ldyBQcm9qZWN0U2VhcmNoUXVlcnkoY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKSwgcXVlcnlTZXJ2aWNlLCBjKSk7CisJCXJlZ2lzdGVyTWVyZ2VkU2VhcmNoUXVlcnkoUG9vbC5jbGFzcywgYyAtPiBuZXcgUG9vbFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIHF1ZXJ5U2VydmljZSwgYykpOworCQlyZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KFRlc3QuY2xhc3MsIGMgLT4gbmV3IFRlc3RTZWFyY2hRdWVyeShjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLCBxdWVyeVNlcnZpY2UsIGMpKTsKKwkJcmVnaXN0ZXJNZXJnZWRTZWFyY2hRdWVyeShUZXN0U3RlcC5jbGFzcywKKwkJCQljIC0+IG5ldyBUZXN0U3RlcFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIHF1ZXJ5U2VydmljZSwgYykpOworCQlyZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KE1lYXN1cmVtZW50LmNsYXNzLAorCQkJCWMgLT4gbmV3IE1lYXN1cmVtZW50U2VhcmNoUXVlcnkoY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKSwgcXVlcnlTZXJ2aWNlLCBjKSk7CisJCXJlZ2lzdGVyTWVyZ2VkU2VhcmNoUXVlcnkoQ2hhbm5lbEdyb3VwLmNsYXNzLAorCQkJCWMgLT4gbmV3IENoYW5uZWxHcm91cFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIHF1ZXJ5U2VydmljZSwgYykpOworCQlyZWdpc3Rlck1lcmdlZFNlYXJjaFF1ZXJ5KENoYW5uZWwuY2xhc3MsCisJCQkJYyAtPiBuZXcgQ2hhbm5lbFNlYXJjaFF1ZXJ5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCksIHF1ZXJ5U2VydmljZSwgYykpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxDbGFzczw/IGV4dGVuZHMgRW50aXR5Pj4gbGlzdFNlYXJjaGFibGVUeXBlcygpIHsKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihzZWFyY2hRdWVyaWVzLmtleVNldCgpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8RW50aXR5VHlwZT4gbGlzdEVudGl0eVR5cGVzKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzKSB7CisJCXJldHVybiBmaW5kU2VhcmNoUXVlcnkoZW50aXR5Q2xhc3MpLmxpc3RFbnRpdHlUeXBlcygpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU2VhcmNoYWJsZSBnZXRTZWFyY2hhYmxlUm9vdChDbGFzczw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdHlDbGFzcykgeworCQlyZXR1cm4gZmluZFNlYXJjaFF1ZXJ5KGVudGl0eUNsYXNzKS5nZXRTZWFyY2hhYmxlUm9vdCgpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxWYWx1ZT4gZ2V0RmlsdGVyVmFsdWVzKENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+IGVudGl0eUNsYXNzLCBBdHRyaWJ1dGUgYXR0cmlidXRlLCBGaWx0ZXIgZmlsdGVyKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlyZXR1cm4gZmluZFNlYXJjaFF1ZXJ5KGVudGl0eUNsYXNzKS5nZXRGaWx0ZXJWYWx1ZXMoYXR0cmlidXRlLCBmaWx0ZXIpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgPFQgZXh0ZW5kcyBFbnRpdHk+IExpc3Q8VD4gZmV0Y2hDb21wbGV0ZShDbGFzczxUPiBlbnRpdHlDbGFzcywgTGlzdDxFbnRpdHlUeXBlPiBlbnRpdHlUeXBlcywgRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZVJlc3VsdChlbnRpdHlDbGFzcywgZmluZFNlYXJjaFF1ZXJ5KGVudGl0eUNsYXNzKS5mZXRjaENvbXBsZXRlKGVudGl0eVR5cGVzLCBmaWx0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiBMaXN0PFQ+IGZldGNoKENsYXNzPFQ+IGVudGl0eUNsYXNzLCBMaXN0PEF0dHJpYnV0ZT4gYXR0cmlidXRlcywgRmlsdGVyIGZpbHRlcikKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGNyZWF0ZVJlc3VsdChlbnRpdHlDbGFzcywgZmluZFNlYXJjaFF1ZXJ5KGVudGl0eUNsYXNzKS5mZXRjaChhdHRyaWJ1dGVzLCBmaWx0ZXIpKTsKKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8UmVzdWx0PiBmZXRjaFJlc3VsdHMoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsIExpc3Q8QXR0cmlidXRlPiBhdHRyaWJ1dGVzLCBGaWx0ZXIgZmlsdGVyLAorCQkJU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUZpbHRlciBtZXJnZWRGaWx0ZXIgPSBnZXRNZXJnZWRGaWx0ZXIoZmlsdGVyLCBxdWVyeSk7CisJCWlmIChtZXJnZWRGaWx0ZXIuaXNFbXRwdHkoKSkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQl9CisKKwkJRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKTsKKwkJTWFwPFN0cmluZywgUmVzdWx0PiByZWNvcmRzQnlFbnRpdHlJRCA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJZm9yIChSZXN1bHQgcmVzdWx0IDogZmluZFNlYXJjaFF1ZXJ5KGVudGl0eUNsYXNzKS5mZXRjaChhdHRyaWJ1dGVzLCBtZXJnZWRGaWx0ZXIpKSB7CisJCQlyZWNvcmRzQnlFbnRpdHlJRC5wdXQocmVzdWx0LmdldFJlY29yZChlbnRpdHlUeXBlKS5nZXRJRCgpLCByZXN1bHQpOworCQl9CisKKwkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihyZWNvcmRzQnlFbnRpdHlJRC52YWx1ZXMoKSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBmZXRjaChTdHJpbmcgcXVlcnkpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKGZyZWVUZXh0U2VhcmNoID09IG51bGwpIHsKKwkJCWluaXRGcmVldGV4dFNlYXJjaCgpOworCQl9CisKKwkJcmV0dXJuIGZyZWVUZXh0U2VhcmNoLnNlYXJjaChxdWVyeSk7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gaXNUZXh0U2VhcmNoQXZhaWxhYmxlKCkgeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgZmlsdGVyIG1lcmdlZCBmcm9tIGFuIGV4aXN0aW5nIGZpbHRlciBhbmQgYSBmaWx0ZXIgcmVzdWx0aW5nIGZyb20gYQorCSAqIGZyZWV0ZXh0IHNlYXJjaCByZXN1bHQuCisJICogCisJICogQHBhcmFtIGZpbHRlciBmaXJzdCBmaWx0ZXIgdG8gbWVyZ2UKKwkgKiBAcGFyYW0gcXVlcnkgIGZyZWV0ZXh0IHF1ZXJ5LCB3aGljaCByZXR1cm5zIHRoZSBpZHMgdG8gZ2VuZXJhdGUgdGhlIHNlY29uZAorCSAqICAgICAgICAgICAgICAgZmlsdGVyIHRvIG1lcmdlCisJICogQHJldHVybiBjb25qdW5jdGlvbiBvZiB0aGUgZmlyc3QgYW5kIHNlY29uZCBmaWx0ZXIKKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHtAbGluayBPRFNGcmVlVGV4dFNlYXJjaH0gaXMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5hdmFpbGFibGUgb3IgY2Fubm90IGV4ZWN1dGUgdGhlIHF1ZXJ5LgorCSAqLworCXByb3RlY3RlZCBGaWx0ZXIgZ2V0TWVyZ2VkRmlsdGVyKEZpbHRlciBmaWx0ZXIsIFN0cmluZyBxdWVyeSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChmaWx0ZXIsICJGaWx0ZXIgY2Fubm90IGJlIG51bGwhIik7CisKKwkJRmlsdGVyIGZyZWV0ZXh0SWRzRmlsdGVyID0gZ2V0RmlsdGVyRm9yRnJlZXRleHRRdWVyeShxdWVyeSk7CisJCS8vIElmIGZyZWV0ZXh0IHNlYXJjaCBxdWVyeSBpcyBwcm92aWRlZCBidXQgeWllbGRzIG5vIHJlc3VsdHMsIHJldHVybiBlbXB0eQorCQkvLyBmaWx0ZXIgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyBiZWhhdmlvdXI6CisJCWlmIChudWxsID09IGZyZWV0ZXh0SWRzRmlsdGVyKSB7CisJCQlyZXR1cm4gRmlsdGVyLm9yKCk7CisJCX0gZWxzZSBpZiAoZmlsdGVyLmlzRW10cHR5KCkpIHsKKwkJCXJldHVybiBmcmVldGV4dElkc0ZpbHRlcjsKKwkJfSBlbHNlIGlmIChTdHJpbmdzLmlzTnVsbE9yRW1wdHkocXVlcnkpICYmIGZyZWV0ZXh0SWRzRmlsdGVyLmlzRW10cHR5KCkpIHsKKwkJCXJldHVybiBmaWx0ZXI7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gRmlsdGVyLmFuZCgpLm1lcmdlKGZpbHRlciwgZnJlZXRleHRJZHNGaWx0ZXIpOworCQl9CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgYSBmcmVlIHRleHQgc2VhcmNoIGFuZCByZXR1cm5zIHRoZSBJRHMgb2YgdGhlIG1hdGNoaW5nIGVudGl0aWVzLgorCSAqIAorCSAqIEBwYXJhbSBxdWVyeSBzZWFyY2ggcXVlcnkKKwkgKiBAcmV0dXJuIGZvdW5kIGVudGl0eSBJRHMgZ3JvdXBlZCBieSBlbnRpdHkuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgT0RTRnJlZVRleHRTZWFyY2h9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlIG9yIGNhbm5vdCBleGVjdXRlIHRoZSBxdWVyeS4KKwkgKi8KKwlwcm90ZWN0ZWQgTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PFN0cmluZz4+IGZldGNoSWRzKFN0cmluZyBxdWVyeSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlpZiAoU3RyaW5ncy5pc051bGxPckVtcHR5KHF1ZXJ5KSkgeworCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisJCX0KKworCQlpZiAoZnJlZVRleHRTZWFyY2ggPT0gbnVsbCkgeworCQkJaW5pdEZyZWV0ZXh0U2VhcmNoKCk7CisJCX0KKworCQlyZXR1cm4gZnJlZVRleHRTZWFyY2guc2VhcmNoSWRzKHF1ZXJ5KTsKKwl9CisKKwkvKioKKwkgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIE9EU0ZyZWVUZXh0U2VhcmNofSB0byByZXRyaWV2ZSBhIG1hcCBvZiBhbGwgZW50aXR5IElEcworCSAqIGZvdW5kIGJ5IHRoZSBnaXZlbiBxdWVyeS4gV2l0aCB0aGUgcmVzdWx0cyBhIGZpbHRlciBpcyBnZW5lcmF0ZWQsIHdoaWNoIGNhbgorCSAqIGJlIHVzZWQgdG8gcXVlcnkgdGhlIGVudGl0eSBpbnN0YW5jZXMgb2YgcmVzdWx0IG9mIHRoZSBmcmVlIHRleHQgcXVlcnkuCisJICogCisJICogQHBhcmFtIHF1ZXJ5IGZ1bGx0ZXh0IHNlYXJjaCBxdWVyeQorCSAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm91bmQgZW50aXR5IElEcyBncm91cGVkIGJ5IHtAbGluayBFbnRpdHl9IGNsYXNzIG9yCisJICogICAgICAgICBudWxsIGlmIGEgcXVlcnkgd2FzIHByb3ZpZGVkIGJ1dCB5aWVsZGVkIG5vIHJlc3VsdHMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB7QGxpbmsgT0RTRnJlZVRleHRTZWFyY2h9IGlzCisJICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYXZhaWxhYmxlIG9yIGNhbm5vdCBleGVjdXRlIHRoZSBxdWVyeS4KKwkgKi8KKwlwcm90ZWN0ZWQgRmlsdGVyIGdldEZpbHRlckZvckZyZWV0ZXh0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJaWYgKFN0cmluZ3MuaXNOdWxsT3JFbXB0eShxdWVyeSkpIHsKKwkJCS8vIE5vIHF1ZXJ5IHByb3ZpZGVkID0+IHJldHVybiBlbXB0eSBmaWx0ZXIgZm9yIG1lcmdpbmcgd2l0aCBvdGhlciBmaWx0ZXJzOgorCQkJcmV0dXJuIEZpbHRlci5vcigpOworCQl9CisKKwkJRmlsdGVyIGZyZWVUZXh0UmVzdWx0c0ZpbHRlciA9IG51bGw7CisJCWZvciAoTWFwLkVudHJ5PENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PFN0cmluZz4+IGVudHJ5IDogZmV0Y2hJZHMocXVlcnkpLmVudHJ5U2V0KCkpIHsKKwkJCWlmICghZW50cnkuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpIHsKKwkJCQlpZiAobnVsbCA9PSBmcmVlVGV4dFJlc3VsdHNGaWx0ZXIpIHsKKwkJCQkJZnJlZVRleHRSZXN1bHRzRmlsdGVyID0gRmlsdGVyLm9yKCk7CisJCQkJfQorCisJCQkJZnJlZVRleHRSZXN1bHRzRmlsdGVyLmlkcyhjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoZW50cnkuZ2V0S2V5KCkpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmcmVlVGV4dFJlc3VsdHNGaWx0ZXI7IC8vIG51bGwgaWYgcXVlcnkgeWllbGRlZCBubyByZXN1bHRzCisJfQorCisJLyoqCisJICogTG9hZHMge0BsaW5rIEVudGl0eX1zIG9mIGdpdmVuIGVudGl0eSBjbGFzcyBmb3IgZ2l2ZW4ge0BsaW5rIFJlc3VsdH1zLgorCSAqCisJICogQHBhcmFtIDxUPiAgICAgICAgIFRoZSBlbnRpdHkgdHlwZS4KKwkgKiBAcGFyYW0gZW50aXR5Q2xhc3MgRW50aXR5IGNsYXNzIG9mIHRoZSBsb2FkZWQge0Bjb2RlIEVudGl0eX1zLgorCSAqIEBwYXJhbSByZXN1bHRzICAgICBUaGUgcXVlcmllZCB7QGNvZGUgUmVzdWx0fXMuCisJICogQHJldHVybiBBbGwgbG9hZGVkIGVudGl0aWVzIGFyZSByZXR1cm5lZCBhcyBhIHtAbGluayBMaXN0fS4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBsb2FkIHRoZSB7QGNvZGUgRW50aXR5fXMuCisJICovCisJcHJpdmF0ZSA8VCBleHRlbmRzIEVudGl0eT4gTGlzdDxUPiBjcmVhdGVSZXN1bHQoQ2xhc3M8VD4gZW50aXR5Q2xhc3MsIExpc3Q8UmVzdWx0PiByZXN1bHRzKQorCQkJdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlFbnRpdHlUeXBlIGVudGl0eVR5cGUgPSBjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoZW50aXR5Q2xhc3MpOworCQlNYXA8U3RyaW5nLCBSZXN1bHQ+IHJlY29yZHNCeUVudGl0eUlEID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKFJlc3VsdCByZXN1bHQgOiByZXN1bHRzKSB7CisJCQlyZWNvcmRzQnlFbnRpdHlJRC5wdXQocmVzdWx0LmdldFJlY29yZChlbnRpdHlUeXBlKS5nZXRJRCgpLCByZXN1bHQpOworCQl9CisKKwkJTWFwPFQsIFJlc3VsdD4gcmVzdWx0c0J5RW50aXR5ID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKFQgZW50aXR5IDogZW50aXR5TG9hZGVyLmxvYWRBbGwobmV3IEtleTw+KGVudGl0eUNsYXNzKSwgcmVjb3Jkc0J5RW50aXR5SUQua2V5U2V0KCkpKSB7CisJCQlyZXN1bHRzQnlFbnRpdHkucHV0KGVudGl0eSwgcmVjb3Jkc0J5RW50aXR5SUQuZ2V0KGVudGl0eS5nZXRJRCgpKSk7CisJCX0KKworCQlyZXR1cm4gbmV3IEFycmF5TGlzdDw+KHJlc3VsdHNCeUVudGl0eS5rZXlTZXQoKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFNlYXJjaFF1ZXJ5fSBmb3IgZ2l2ZW4gZW50aXR5IGNsYXNzLgorCSAqCisJICogQHBhcmFtIGVudGl0eUNsYXNzIFVzZWQgYXMgaWRlbnRpZmllci4KKwkgKiBAcmV0dXJuIFRoZSB7QGxpbmsgU2VhcmNoUXVlcnl9CisJICovCisJcHJpdmF0ZSBTZWFyY2hRdWVyeSBmaW5kU2VhcmNoUXVlcnkoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MpIHsKKwkJU2VhcmNoUXVlcnkgc2VhcmNoUXVlcnkgPSBzZWFyY2hRdWVyaWVzLmdldChlbnRpdHlDbGFzcyk7CisJCWlmIChzZWFyY2hRdWVyeSA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorCQkJCQkiU2VhcmNoIHF1ZXJ5IGZvciB0eXBlICciICsgZW50aXR5Q2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIicgbm90IGZvdW5kLiIpOworCQl9CisKKwkJcmV0dXJuIHNlYXJjaFF1ZXJ5OworCX0KKworCS8qKgorCSAqIFJlZ2lzdGVycyBhIHtAbGluayBTZWFyY2hRdWVyeX0gZm9yIGdpdmVuIGVudGl0eSBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlDbGFzcyBUaGUgZW50aXR5IGNsYXNzIHByb2R1Y2VkIGJ5IHVzaW5nIHRoaXMgcXVlcnkuCisJICogQHBhcmFtIGZhY3RvcnkgICAgIFRoZSB7QGNvZGUgU2VhcmNoUXVlcnl9IGZhY3RvcnkuCisJICovCisJcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyTWVyZ2VkU2VhcmNoUXVlcnkoQ2xhc3M8PyBleHRlbmRzIEVudGl0eT4gZW50aXR5Q2xhc3MsCisJCQlGdW5jdGlvbjxDb250ZXh0U3RhdGUsIEJhc2VFbnRpdHlTZWFyY2hRdWVyeT4gZmFjdG9yeSkgeworCQlzZWFyY2hRdWVyaWVzLnB1dChlbnRpdHlDbGFzcywKKwkJCQluZXcgTWVyZ2VkU2VhcmNoUXVlcnkoY29udGV4dC5nZXRPRFNNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGVudGl0eUNsYXNzKSwgZmFjdG9yeSkpOworCX0KKworCXByaXZhdGUgdm9pZCBpbml0RnJlZXRleHRTZWFyY2goKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8RW52aXJvbm1lbnQ+IGFsbCA9IGVudGl0eUxvYWRlci5sb2FkQWxsKG5ldyBLZXk8PihFbnZpcm9ubWVudC5jbGFzcyksICIqIik7CisJCWlmIChhbGwuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiTm8gZW52aXJvbm1lbnQgbG9hZGVkLiBTbyB0aGUgU2VhcmNoIGRvZXMgbm90IGtub3cgd2hlcmUgdG8gc2VhcmNoIik7CisJCX0KKwkJU3RyaW5nIHNvdXJjZU5hbWUgPSBhbGwuZ2V0KDApLmdldFNvdXJjZU5hbWUoKTsKKwkJZnJlZVRleHRTZWFyY2ggPSBuZXcgT0RTRnJlZVRleHRTZWFyY2goZW50aXR5TG9hZGVyLCBzb3VyY2VOYW1lLCBlc0hvc3QpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvUG9vbFNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Bvb2xTZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YThkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Bvb2xTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworCisvKioKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBQb29sfSBhcyBzb3VyY2UgZW50aXR5IHR5cGUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIGpzdCwgUGVhayBTb2x1dGlvbiBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIFBvb2xTZWFyY2hRdWVyeSBleHRlbmRzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICogQHBhcmFtIGNvbnRleHRTdGF0ZSBUaGUge0BsaW5rIENvbnRleHRTdGF0ZX0uCisJICovCisJUG9vbFNlYXJjaFF1ZXJ5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIENvbnRleHRTdGF0ZSBjb250ZXh0U3RhdGUpIHsKKwkJc3VwZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpOworCisJCS8vIGxheWVycworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoUG9vbC5jbGFzcywgUHJvamVjdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihQb29sLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKFRlc3QuY2xhc3MsIFRlc3RTdGVwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKFRlc3RTdGVwLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKE1lYXN1cmVtZW50LmNsYXNzLCBDaGFubmVsLmNsYXNzKSk7CisKKwkJLy8gY29udGV4dAorCQlhZGRKb2luQ29uZmlnKGNvbnRleHRTdGF0ZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Byb2plY3RTZWFyY2hRdWVyeS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Qcm9qZWN0U2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWI3OWQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9Qcm9qZWN0U2VhcmNoUXVlcnkuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWxHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hRdWVyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2guSm9pblRyZWUuSm9pbkNvbmZpZzsKKworLyoqCisgKiB7QGxpbmsgU2VhcmNoUXVlcnl9IGltcGxlbWVudGF0aW9uIGZvciB7QGxpbmsgUHJvamVjdH0gYXMgc291cmNlIGVudGl0eSB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitmaW5hbCBjbGFzcyBQcm9qZWN0U2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNlRW50aXR5U2VhcmNoUXVlcnkgeworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gbW9kZWxNYW5hZ2VyIFVzZWQgdG8gbG9hZCB7QGxpbmsgRW50aXR5VHlwZX1zLgorCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAbGluayBDb250ZXh0U3RhdGV9LgorCSAqLworCVByb2plY3RTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCXN1cGVyKG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlLCBQcm9qZWN0LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oUHJvamVjdC5jbGFzcywgUG9vbC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihQb29sLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKFRlc3QuY2xhc3MsIFRlc3RTdGVwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKFRlc3RTdGVwLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKE1lYXN1cmVtZW50LmNsYXNzLCBDaGFubmVsLmNsYXNzKSk7CisKKwkJLy8gY29udGV4dAorCQlhZGRKb2luQ29uZmlnKGNvbnRleHRTdGF0ZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1NlYXJjaGFibGVOb2RlLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1NlYXJjaGFibGVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4YjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvU2VhcmNoYWJsZU5vZGUuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoYWJsZTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFNlYXJjaGFibGV9IGludGVyZmFjZSBmb3IgdXNlIGluIHNlYXJjaCBxdWVyaWVzCisgKiBkZXJpdmVkIGZyb20ge0BsaW5rIEJhc2VFbnRpdHlTZWFyY2hRdWVyeX0uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIFNlYXJjaGFibGVOb2RlIGltcGxlbWVudHMgU2VhcmNoYWJsZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBMaXN0PFNlYXJjaGFibGU+IHJlbGF0ZWRTZWFyY2hhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCXByaXZhdGUgZmluYWwgRW50aXR5VHlwZSBlbnRpdHlUeXBlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGVudGl0eVR5cGUgVGhlIGFzc29jaWF0ZWQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqLworCVNlYXJjaGFibGVOb2RlKEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQl0aGlzLmVudGl0eVR5cGUgPSBlbnRpdHlUeXBlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTGlzdDxTZWFyY2hhYmxlPiBnZXRSZWxhdGVkU2VhcmNoYWJsZXMoKSB7CisJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlbGF0ZWRTZWFyY2hhYmxlcyk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBFbnRpdHlUeXBlIGdldEVudGl0eVR5cGUoKSB7CisJCXJldHVybiBlbnRpdHlUeXBlOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlNlYXJjaGFibGUoIikuYXBwZW5kKCJFbnRpdHlUeXBlID0gIikuYXBwZW5kKGVudGl0eVR5cGUpOworCisJCWlmICghaXNMZWFmKCkpIHsKKwkJCXNiLmFwcGVuZCgiLCByZWxhdGVkU2VhcmNoYWJsZXMgPSAiKQorCQkJCQkuYXBwZW5kKHJlbGF0ZWRTZWFyY2hhYmxlcy5zdHJlYW0oKS5tYXAoU2VhcmNoYWJsZTo6Z2V0RW50aXR5VHlwZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisJCX0KKworCQlyZXR1cm4gc2IuYXBwZW5kKCcpJykudG9TdHJpbmcoKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgU2VhcmNoYWJsZX0gYXMgYSBjaGlsZCB0byB0aGlzIHNlYXJjaGFibGUuCisJICoKKwkgKiBAcGFyYW0gc2VhcmNoYWJsZSBXaWxsIGJlIGFkZGVkIGEgY2hpbGQuCisJICovCisJdm9pZCBhZGRSZWxhdGVkKFNlYXJjaGFibGUgc2VhcmNoYWJsZSkgeworCQlyZWxhdGVkU2VhcmNoYWJsZXMuYWRkKHNlYXJjaGFibGUpOworCX0KKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvVGVzdFNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Rlc3RTZWFyY2hRdWVyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYzJmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Rlc3RTZWFyY2hRdWVyeS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qb29sOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Qcm9qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworCisvKioKKyAqIHtAbGluayBTZWFyY2hRdWVyeX0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBUZXN0fSBhcyBzb3VyY2UgZW50aXR5IHR5cGUuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIGpzdCwgUGVhayBTb2x1dGlvbiBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIFRlc3RTZWFyY2hRdWVyeSBleHRlbmRzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICogQHBhcmFtIGNvbnRleHRTdGF0ZSBUaGUge0BsaW5rIENvbnRleHRTdGF0ZX0uCisJICovCisJVGVzdFNlYXJjaFF1ZXJ5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIENvbnRleHRTdGF0ZSBjb250ZXh0U3RhdGUpIHsKKwkJc3VwZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIFRlc3QuY2xhc3MsIFByb2plY3QuY2xhc3MpOworCisJCS8vIGxheWVycworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoUG9vbC5jbGFzcywgUHJvamVjdC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoVGVzdC5jbGFzcywgUG9vbC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihUZXN0U3RlcC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbC5jbGFzcykpOworCisJCS8vIGNvbnRleHQKKwkJYWRkSm9pbkNvbmZpZyhjb250ZXh0U3RhdGUpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9UZXN0U3RlcFNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1Rlc3RTdGVwU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjYzMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9UZXN0U3RlcFNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnlTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICoge0BsaW5rIFNlYXJjaFF1ZXJ5fSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIFRlc3RTdGVwfSBhcyBzb3VyY2UgZW50aXR5CisgKiB0eXBlLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitmaW5hbCBjbGFzcyBUZXN0U3RlcFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIG1vZGVsTWFuYWdlciBVc2VkIHRvIGxvYWQge0BsaW5rIEVudGl0eVR5cGV9cy4KKwkgKiBAcGFyYW0gY29udGV4dFN0YXRlIFRoZSB7QGxpbmsgQ29udGV4dFN0YXRlfS4KKwkgKi8KKwlUZXN0U3RlcFNlYXJjaFF1ZXJ5KE9EU01vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIsIFF1ZXJ5U2VydmljZSBxdWVyeVNlcnZpY2UsIENvbnRleHRTdGF0ZSBjb250ZXh0U3RhdGUpIHsKKwkJc3VwZXIobW9kZWxNYW5hZ2VyLCBxdWVyeVNlcnZpY2UsIFRlc3RTdGVwLmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3RTdGVwLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKFRlc3RTdGVwLmNsYXNzLCBNZWFzdXJlbWVudC5jbGFzcykpOworCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKE1lYXN1cmVtZW50LmNsYXNzLCBDaGFubmVsLmNsYXNzKSk7CisKKwkJLy8gY29udGV4dAorCQlhZGRKb2luQ29uZmlnKGNvbnRleHRTdGF0ZSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vQmFzZVN0YXRlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0Jhc2VTdGF0ZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDkzMjZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL0Jhc2VTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxFbGVtQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5TZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKKworLyoqCisgKiBBIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIGV4ZWN1dGlvbiBzdGF0ZW1lbnRzIChDUkVBVEUsIFVQREFURSwgREVMRVRFKS4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworYWJzdHJhY3QgY2xhc3MgQmFzZVN0YXRlbWVudCB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBPRFNUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbjsKKwlwcml2YXRlIGZpbmFsIE9EU0VudGl0eVR5cGUgZW50aXR5VHlwZTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb25zdHJ1Y3RvcnMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUaGUgb3duaW5nIHtAbGluayBPRFNUcmFuc2FjdGlvbn0uCisJICogQHBhcmFtIGVudGl0eVR5cGUgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlwcm90ZWN0ZWQgQmFzZVN0YXRlbWVudChPRFNUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgRW50aXR5VHlwZSBlbnRpdHlUeXBlKSB7CisJCXRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwkJdGhpcy5lbnRpdHlUeXBlID0gKE9EU0VudGl0eVR5cGUpIGVudGl0eVR5cGU7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogRXhlY3V0ZXMgdGhpcyBzdGF0ZW1lbnQgZm9yIGdpdmVuIHtAbGluayBFbnRpdHl9cy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdGllcyBUaGUgcHJvY2Vzc2VkIHtAY29kZSBFbnRpdHl9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgYSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiBmYWlscy4KKwkgKi8KKwlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBleGVjdXRlKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcm90ZWN0ZWQgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPRFNUcmFuc2FjdGlvbn0uCisJICoKKwkgKiBAcmV0dXJuIFRoZSB7QGNvZGUgT0RTVHJhbnNhY3Rpb259IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBPRFNUcmFuc2FjdGlvbiBnZXRUcmFuc2FjdGlvbigpIHsKKwkJcmV0dXJuIHRyYW5zYWN0aW9uOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9EU01vZGVsTWFuYWdlcn0gaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIE9EU01vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7CisJCXJldHVybiB0cmFuc2FjdGlvbi5nZXRNb2RlbE1hbmFnZXIoKTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgUXVlcnlTZXJ2aWNlfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBRdWVyeVNlcnZpY2V9IGlzIHJldHVybmVkLgorCSAqLworCXByb3RlY3RlZCBRdWVyeVNlcnZpY2UgZ2V0UXVlcnlTZXJ2aWNlKCkgeworCQlyZXR1cm4gdHJhbnNhY3Rpb24uZ2V0Q29udGV4dCgpLmdldFF1ZXJ5U2VydmljZSgpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oUXVlcnlTZXJ2aWNlLmNsYXNzKSk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIEFwcGxFbGVtQWNjZXNzfS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBBcHBsRWxlbUFjY2Vzc30gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHJvdGVjdGVkIEFwcGxFbGVtQWNjZXNzIGdldEFwcGxFbGVtQWNjZXNzKCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJcmV0dXJuIHRyYW5zYWN0aW9uLmdldENvbnRleHQoKS5nZXRPRFNNb2RlbE1hbmFnZXIoKS5nZXRBcHBsRWxlbUFjY2VzcygpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGFzc29jaWF0ZWQge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqCisJICogQHJldHVybiBUaGUgYXNzb2NpYXRlZCB7QGNvZGUgRW50aXR5VHlwZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHJvdGVjdGVkIE9EU0VudGl0eVR5cGUgZ2V0RW50aXR5VHlwZSgpIHsKKwkJcmV0dXJuIGVudGl0eVR5cGU7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vQ2F0YWxvZ01hbmFnZXIuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9DYXRhbG9nTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MjFiNmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vQ2F0YWxvZ01hbmFnZXIuamF2YQpAQCAtMCwwICsxLDU2NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxpY2F0aW9uQXR0cmlidXRlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5BcHBsaWNhdGlvbkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxpY2F0aW9uUmVsYXRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxpY2F0aW9uU3RydWN0dXJlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5CYXNlQXR0cmlidXRlOworaW1wb3J0IG9yZy5hc2FtLm9kcy5CYXNlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQmFzZVN0cnVjdHVyZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlJlbGF0aW9uUmFuZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5Db21wYXJpc29uT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5U2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nQ29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5DYXRhbG9nU2Vuc29yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU0VudW1lcmF0aW9uczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTVXRpbHM7CisKKy8qKgorICogVXNlZCB0byBjcmVhdGUsIHVwZGF0ZSBvciBkZWxldGUge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LAorICoge0BsaW5rIENhdGFsb2dTZW5zb3J9IGFuZCB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0gZW50aXRpZXMuIE1vZGlmaWNhdGlvbnMgb2YKKyAqIHRoZSBsaXN0ZWQgdHlwZXMgcmVzdWx0cyBpbiBtb2RpZmljYXRpb25zIG9mIHRoZSBhcHBsaWNhdGlvbiBtb2RlbC4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgQ2F0YWxvZ01hbmFnZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIEluc3RhbmNlIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgZmluYWwgT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247CisKKwlwcml2YXRlIEFwcGxpY2F0aW9uU3RydWN0dXJlIGFwcGxpY2F0aW9uU3RydWN0dXJlOworCXByaXZhdGUgQmFzZVN0cnVjdHVyZSBiYXNlU3RydWN0dXJlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHRyYW5zYWN0aW9uIFRoZSB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqLworCUNhdGFsb2dNYW5hZ2VyKE9EU1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKSB7CisJCXRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDcmVhdGVzIGZvciBlYWNoIGdpdmVuIHtAbGluayBDYXRhbG9nQ29tcG9uZW50fSBhIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24KKwkgKiBlbGVtZW50IGluY2x1ZGluZyBhbGwgcmVxdWlyZWQgYXBwbGljYXRpb24gcmVsYXRpb25zLgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dDb21wb25lbnRzIFRoZSB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXB1YmxpYyB2b2lkIGNyZWF0ZUNhdGFsb2dDb21wb25lbnRzKENvbGxlY3Rpb248Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudHMpIHRocm93cyBBb0V4Y2VwdGlvbiB7CisJCU1hcDxDb250ZXh0VHlwZSwgTGlzdDxDYXRhbG9nQ29tcG9uZW50Pj4gY2F0YWxvZ0NvbXBvbmVudHNCeUNvbnRleHRUeXBlID0gY2F0YWxvZ0NvbXBvbmVudHMuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoQ2F0YWxvZ0NvbXBvbmVudDo6Z2V0Q29udGV4dFR5cGUpKTsKKworCQlmb3IgKEVudHJ5PENvbnRleHRUeXBlLCBMaXN0PENhdGFsb2dDb21wb25lbnQ+PiBlbnRyeSA6IGNhdGFsb2dDb21wb25lbnRzQnlDb250ZXh0VHlwZS5lbnRyeVNldCgpKSB7CisJCQlTdHJpbmcgb2RzQ29udGV4dFR5cGVOYW1lID0gT0RTVXRpbHMuQ09OVEVYVFRZUEVTLmdldChlbnRyeS5nZXRLZXkoKSk7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgY29udGV4dFJvb3RBcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpCisJCQkJCS5nZXRFbGVtZW50QnlOYW1lKG9kc0NvbnRleHRUeXBlTmFtZSk7CisJCQlCYXNlRWxlbWVudCBjb250ZXh0Um9vdEJhc2VFbGVtZW50ID0gY29udGV4dFJvb3RBcHBsaWNhdGlvbkVsZW1lbnQuZ2V0QmFzZUVsZW1lbnQoKTsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBjb250ZXh0VGVtcGxhdGVDb21wb25lbnRBcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpCisJCQkJCS5nZXRFbGVtZW50QnlOYW1lKCJUcGwiICsgb2RzQ29udGV4dFR5cGVOYW1lICsgIkNvbXAiKTsKKwkJCUJhc2VFbGVtZW50IGJhc2VFbGVtZW50ID0gZ2V0QmFzZVN0cnVjdHVyZSgpLmdldEVsZW1lbnRCeVR5cGUoIkFvIiArIG9kc0NvbnRleHRUeXBlTmFtZSArICJQYXJ0Iik7CisKKwkJCWZvciAoQ2F0YWxvZ0NvbXBvbmVudCBjYXRhbG9nQ29tcG9uZW50IDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBjcmVhdGVBcHBsaWNhdGlvbkVsZW1lbnQoY2F0YWxvZ0NvbXBvbmVudC5nZXROYW1lKCksCisJCQkJCQliYXNlRWxlbWVudCk7CisKKwkJCQkvLyByZWxhdGlvbiBjb250ZXh0IHJvb3QgdG8gY29udGV4dCBjb21wb25lbnQKKwkJCQlBcHBsaWNhdGlvblJlbGF0aW9uIGFwcGxpY2F0aW9uUmVsYXRpb24gPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmNyZWF0ZVJlbGF0aW9uKCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRFbGVtMShjb250ZXh0Um9vdEFwcGxpY2F0aW9uRWxlbWVudCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRFbGVtMihhcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0UmVsYXRpb25OYW1lKGNhdGFsb2dDb21wb25lbnQuZ2V0TmFtZSgpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEludmVyc2VSZWxhdGlvbk5hbWUob2RzQ29udGV4dFR5cGVOYW1lKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uCisJCQkJCQkuc2V0QmFzZVJlbGF0aW9uKGdldEJhc2VTdHJ1Y3R1cmUoKS5nZXRSZWxhdGlvbihjb250ZXh0Um9vdEJhc2VFbGVtZW50LCBiYXNlRWxlbWVudCkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uX3JlbGVhc2UoKTsKKworCQkJCS8vIHJlbGF0aW9uIHRlbXBsYXRlIGNvbXBvbmVudCB0byBjb250ZXh0IGNvbXBvbmVudAorCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24gPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmNyZWF0ZVJlbGF0aW9uKCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRFbGVtMShjb250ZXh0VGVtcGxhdGVDb21wb25lbnRBcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTIoYXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldFJlbGF0aW9uTmFtZShjYXRhbG9nQ29tcG9uZW50LmdldE5hbWUoKSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRJbnZlcnNlUmVsYXRpb25OYW1lKCJUcGwiICsgb2RzQ29udGV4dFR5cGVOYW1lICsgIkNvbXAiKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldFJlbGF0aW9uUmFuZ2UobmV3IFJlbGF0aW9uUmFuZ2UoKHNob3J0KSAwLCAoc2hvcnQpIC0xKSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRJbnZlcnNlUmVsYXRpb25SYW5nZShuZXcgUmVsYXRpb25SYW5nZSgoc2hvcnQpIDEsIChzaG9ydCkgMSkpOworCisJCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLl9yZWxlYXNlKCk7CisJCQl9CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQljb250ZXh0VGVtcGxhdGVDb21wb25lbnRBcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJCWNvbnRleHRSb290QXBwbGljYXRpb25FbGVtZW50Ll9yZWxlYXNlKCk7CisJCQljb250ZXh0Um9vdEJhc2VFbGVtZW50Ll9yZWxlYXNlKCk7CisJCQliYXNlRWxlbWVudC5fcmVsZWFzZSgpOworCQl9CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0gYSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uCisJICogZWxlbWVudCBpbmNsdWRpbmcgYWxsIHJlcXVpcmVkIGFwcGxpY2F0aW9uIHJlbGF0aW9ucy4KKwkgKgorCSAqIEBwYXJhbSBjYXRhbG9nU2Vuc29ycyBUaGUge0Bjb2RlIENhdGFsb2dTZW5zb3J9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjcmVhdGVDYXRhbG9nU2Vuc29ycyhDb2xsZWN0aW9uPENhdGFsb2dTZW5zb3I+IGNhdGFsb2dTZW5zb3JzKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBMaXN0PENhdGFsb2dTZW5zb3I+PiBjYXRhbG9nU2Vuc29yc0J5Q2F0YWxvZ0NvbXBvbmVudCA9IGNhdGFsb2dTZW5zb3JzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGNzIC0+IGNzLmdldENhdGFsb2dDb21wb25lbnQoKS5nZXROYW1lKCkpKTsKKworCQlBcHBsaWNhdGlvbkVsZW1lbnQgY2hhbm5lbEFwcGxpY2F0aW9uRWxlbWVudCA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkuZ2V0RWxlbWVudEJ5TmFtZSgiTWVhUXVhbnRpdHkiKTsKKwkJQmFzZUVsZW1lbnQgY2hhbm5lbEJhc2VFbGVtZW50ID0gY2hhbm5lbEFwcGxpY2F0aW9uRWxlbWVudC5nZXRCYXNlRWxlbWVudCgpOworCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhdGFsb2dTZW5zb3I+PiBlbnRyeSA6IGNhdGFsb2dTZW5zb3JzQnlDYXRhbG9nQ29tcG9uZW50LmVudHJ5U2V0KCkpIHsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBjb250ZXh0Q29tcG9uZW50QXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKQorCQkJCQkuZ2V0RWxlbWVudEJ5TmFtZShlbnRyeS5nZXRLZXkoKSk7CisJCQlCYXNlRWxlbWVudCBjb250ZXh0Q29tcG9uZW50QmFzZUVsZW1lbnQgPSBjb250ZXh0Q29tcG9uZW50QXBwbGljYXRpb25FbGVtZW50LmdldEJhc2VFbGVtZW50KCk7CisJCQlBcHBsaWNhdGlvbkVsZW1lbnQgY29udGV4dFRlbXBsYXRlU2Vuc29yQXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKQorCQkJCQkuZ2V0RWxlbWVudEJ5TmFtZSgiVHBsU2Vuc29yIik7CisJCQlCYXNlRWxlbWVudCBiYXNlRWxlbWVudCA9IGdldEJhc2VTdHJ1Y3R1cmUoKS5nZXRFbGVtZW50QnlUeXBlKCJBb1Rlc3RFcXVpcG1lbnRQYXJ0Iik7CisKKwkJCWZvciAoQ2F0YWxvZ1NlbnNvciBjYXRhbG9nU2Vuc29yIDogZW50cnkuZ2V0VmFsdWUoKSkgeworCQkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBjcmVhdGVBcHBsaWNhdGlvbkVsZW1lbnQoY2F0YWxvZ1NlbnNvci5nZXROYW1lKCksIGJhc2VFbGVtZW50KTsKKworCQkJCS8vIHJlbGF0aW9uIGNvbnRleHQgY29tcG9uZW50IHRvIGNvbnRleHQgc2Vuc29yCisJCQkJQXBwbGljYXRpb25SZWxhdGlvbiBhcHBsaWNhdGlvblJlbGF0aW9uID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5jcmVhdGVSZWxhdGlvbigpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTEoY29udGV4dENvbXBvbmVudEFwcGxpY2F0aW9uRWxlbWVudCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRFbGVtMihhcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0UmVsYXRpb25OYW1lKGNhdGFsb2dTZW5zb3IuZ2V0TmFtZSgpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEludmVyc2VSZWxhdGlvbk5hbWUoZW50cnkuZ2V0S2V5KCkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24KKwkJCQkJCS5zZXRCYXNlUmVsYXRpb24oZ2V0QmFzZVN0cnVjdHVyZSgpLmdldFJlbGF0aW9uKGNvbnRleHRDb21wb25lbnRCYXNlRWxlbWVudCwgYmFzZUVsZW1lbnQpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLl9yZWxlYXNlKCk7CisKKwkJCQkvLyByZWxhdGlvbiB0ZW1wbGF0ZSBzZW5zb3IgdG8gY29udGV4dCBzZW5zb3IKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5jcmVhdGVSZWxhdGlvbigpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTEoY29udGV4dFRlbXBsYXRlU2Vuc29yQXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEVsZW0yKGFwcGxpY2F0aW9uRWxlbWVudCk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRSZWxhdGlvbk5hbWUoY2F0YWxvZ1NlbnNvci5nZXROYW1lKCkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0SW52ZXJzZVJlbGF0aW9uTmFtZSgiVHBsU2Vuc29yIik7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRSZWxhdGlvblJhbmdlKG5ldyBSZWxhdGlvblJhbmdlKChzaG9ydCkgMCwgKHNob3J0KSAtMSkpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0SW52ZXJzZVJlbGF0aW9uUmFuZ2UobmV3IFJlbGF0aW9uUmFuZ2UoKHNob3J0KSAxLCAoc2hvcnQpIDEpKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLl9yZWxlYXNlKCk7CisKKwkJCQkvLyByZWxhdGlvbiBjaGFubmVsIHRvIGNvbnRleHQgc2Vuc29yCisJCQkJYXBwbGljYXRpb25SZWxhdGlvbiA9IGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkuY3JlYXRlUmVsYXRpb24oKTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldEVsZW0xKGNoYW5uZWxBcHBsaWNhdGlvbkVsZW1lbnQpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0RWxlbTIoYXBwbGljYXRpb25FbGVtZW50KTsKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLnNldFJlbGF0aW9uTmFtZShjYXRhbG9nU2Vuc29yLmdldE5hbWUoKSk7CisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5zZXRJbnZlcnNlUmVsYXRpb25OYW1lKCJNZWFRdWFudGl0eSIpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uc2V0QmFzZVJlbGF0aW9uKGdldEJhc2VTdHJ1Y3R1cmUoKS5nZXRSZWxhdGlvbihjaGFubmVsQmFzZUVsZW1lbnQsIGJhc2VFbGVtZW50KSk7CisKKwkJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJCWFwcGxpY2F0aW9uRWxlbWVudC5fcmVsZWFzZSgpOworCQkJCWFwcGxpY2F0aW9uUmVsYXRpb24uX3JlbGVhc2UoKTsKKwkJCX0KKworCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCWNvbnRleHRDb21wb25lbnRBcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJCWNvbnRleHRUZW1wbGF0ZVNlbnNvckFwcGxpY2F0aW9uRWxlbWVudC5fcmVsZWFzZSgpOworCQkJY29udGV4dENvbXBvbmVudEJhc2VFbGVtZW50Ll9yZWxlYXNlKCk7CisJCQliYXNlRWxlbWVudC5fcmVsZWFzZSgpOworCQl9CisKKwkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJY2hhbm5lbEFwcGxpY2F0aW9uRWxlbWVudC5fcmVsZWFzZSgpOworCQljaGFubmVsQmFzZUVsZW1lbnQuX3JlbGVhc2UoKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGZvciBlYWNoIGdpdmVuIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfSBhIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24KKwkgKiBhdHRyaWJ1dGUuCisJICoKKwkgKiBAcGFyYW0gY2F0YWxvZ0F0dHJpYnV0ZXMgVGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfXMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZXMoQ29sbGVjdGlvbjxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcykgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXRhbG9nQXR0cmlidXRlPj4gY2F0YWxvZ0F0dHJpYnV0ZXNCeUNhdGFsb2dDb21wb25lbnQgPSBjYXRhbG9nQXR0cmlidXRlcy5zdHJlYW0oKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShDYXRhbG9nTWFuYWdlcjo6Z2V0UGFyZW50TmFtZSkpOworCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhdGFsb2dBdHRyaWJ1dGU+PiBlbnRyeSA6IGNhdGFsb2dBdHRyaWJ1dGVzQnlDYXRhbG9nQ29tcG9uZW50LmVudHJ5U2V0KCkpIHsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVsZW1lbnRCeU5hbWUoZW50cnkuZ2V0S2V5KCkpOworCisJCQlmb3IgKENhdGFsb2dBdHRyaWJ1dGUgY2F0YWxvZ0F0dHJpYnV0ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKworCQkJCUFwcGxpY2F0aW9uQXR0cmlidXRlIGFwcGxpY2F0aW9uQXR0cmlidXRlID0gYXBwbGljYXRpb25FbGVtZW50LmNyZWF0ZUF0dHJpYnV0ZSgpOworCQkJCURhdGFUeXBlIGRhdGFUeXBlID0gT0RTVXRpbHMuVkFMVUVUWVBFUy5nZXQoY2F0YWxvZ0F0dHJpYnV0ZS5nZXRWYWx1ZVR5cGUoKSk7CisJCQkJYXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0RGF0YVR5cGUoZGF0YVR5cGUpOworCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLnNldE5hbWUoY2F0YWxvZ0F0dHJpYnV0ZS5nZXROYW1lKCkpOworCQkJCWlmIChkYXRhVHlwZSA9PSBEYXRhVHlwZS5EVF9FTlVNKSB7CisJCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLnNldEVudW1lcmF0aW9uRGVmaW5pdGlvbihnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVudW1lcmF0aW9uRGVmaW5pdGlvbigKKwkJCQkJCQlPRFNFbnVtZXJhdGlvbnMuZ2V0RW51bU5hbWUoY2F0YWxvZ0F0dHJpYnV0ZS5nZXRFbnVtZXJhdGlvbk9iamVjdCgpKSkpOworCQkJCX0KKwkJCQlPcHRpb25hbDxVbml0PiB1bml0ID0gY2F0YWxvZ0F0dHJpYnV0ZS5nZXRVbml0KCk7CisJCQkJaWYgKHVuaXQuaXNQcmVzZW50KCkpIHsKKwkJCQkJYXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0VW5pdChPRFNDb252ZXJ0ZXIudG9PRFNJRCh1bml0LmdldCgpLmdldElEKCkpKTsKKwkJCQl9CisKKwkJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLl9yZWxlYXNlKCk7CisJCQl9CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFVwZGF0ZXMgdGhlIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZSBmb3IgZWFjaCBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gY2F0YWxvZ0F0dHJpYnV0ZXMgVGhlIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfXMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICovCisJcHVibGljIHZvaWQgdXBkYXRlQ2F0YWxvZ0F0dHJpYnV0ZXMoTGlzdDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcykgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJTWFwPFN0cmluZywgTGlzdDxDYXRhbG9nQXR0cmlidXRlPj4gY2F0YWxvZ0F0dHJpYnV0ZXNCeUNhdGFsb2dDb21wb25lbnQgPSBjYXRhbG9nQXR0cmlidXRlcy5zdHJlYW0oKQorCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShDYXRhbG9nTWFuYWdlcjo6Z2V0UGFyZW50TmFtZSkpOworCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PENhdGFsb2dBdHRyaWJ1dGU+PiBlbnRyeSA6IGNhdGFsb2dBdHRyaWJ1dGVzQnlDYXRhbG9nQ29tcG9uZW50LmVudHJ5U2V0KCkpIHsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVsZW1lbnRCeU5hbWUoZW50cnkuZ2V0S2V5KCkpOworCisJCQlmb3IgKENhdGFsb2dBdHRyaWJ1dGUgY2F0YWxvZ0F0dHJpYnV0ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKworCQkJCUFwcGxpY2F0aW9uQXR0cmlidXRlIGFwcGxpY2F0aW9uQXR0cmlidXRlID0gYXBwbGljYXRpb25FbGVtZW50CisJCQkJCQkuZ2V0QXR0cmlidXRlQnlOYW1lKGNhdGFsb2dBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKKworCQkJCU9wdGlvbmFsPFVuaXQ+IHVuaXQgPSBjYXRhbG9nQXR0cmlidXRlLmdldFVuaXQoKTsKKwkJCQlpZiAodW5pdC5pc1ByZXNlbnQoKSkgeworCQkJCQlhcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXRVbml0KE9EU0NvbnZlcnRlci50b09EU0lEKHVuaXQuZ2V0KCkuZ2V0SUQoKSkpOworCQkJCX0KKworCQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQkJYXBwbGljYXRpb25BdHRyaWJ1dGUuX3JlbGVhc2UoKTsKKwkJCX0KKworCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCWFwcGxpY2F0aW9uRWxlbWVudC5fcmVsZWFzZSgpOworCQl9CisJfQorCisJLyoqCisJICogRGVsZXRlcyB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBlbGVtZW50IGZvciBlYWNoIGdpdmVuCisJICoge0BsaW5rIENhdGFsb2dDb21wb25lbnR9LiBEZWxldGluZyBhIHtAY29kZSBDYXRhbG9nQ29tcG9uZW50fSBpcyBvbmx5IGFsbG93ZWQKKwkgKiBpZiBpdCBpcyBub3QgdXNlZCBpbiB0ZW1wbGF0ZXMgYW5kIGFsbCBvZiBpdHMgY2hpbGRyZW4gY291bGQgYmUgZGVsZXRlZC4gU28KKwkgKiBhdCBmaXJzdCBpdCBpcyB0cmllZCB0byBkZWxldGUgaXRzIHtAbGluayBDYXRhbG9nQXR0cmlidXRlfXMgYW5kCisJICoge0BsaW5rIENhdGFsb2dTZW5zb3J9cy4gT24gc3VjY2VzcyBpdCBpcyBlbnN1cmVkIG5vbmUgb2YgdGhlIGdpdmVuIHtAY29kZQorCSAqIENhdGFsb2dDb21wb25lbnR9cyBpcyB1c2VkIGluIHRlbXBsYXRlcy4gRmluYWxseSB0aGUgY29ycmVzcG9uZGluZworCSAqIGFwcGxpY2F0aW9uIGVsZW1lbnRzIGFyZSBkZWxldGVkLgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dDb21wb25lbnRzIFRoZSB7QGNvZGUgQ2F0YWxvZ0NvbXBvbmVudH1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGVDYXRhbG9nQ29tcG9uZW50cyhDb2xsZWN0aW9uPENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzKQorCQkJdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTGlzdDxDYXRhbG9nQXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCUxpc3Q8Q2F0YWxvZ1NlbnNvcj4gc2Vuc29ycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKENhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCA6IGNhdGFsb2dDb21wb25lbnRzKSB7CisJCQlhdHRyaWJ1dGVzLmFkZEFsbChjYXRhbG9nQ29tcG9uZW50LmdldENhdGFsb2dBdHRyaWJ1dGVzKCkpOworCQkJc2Vuc29ycy5hZGRBbGwoY2F0YWxvZ0NvbXBvbmVudC5nZXRDYXRhbG9nU2Vuc29ycygpKTsKKwkJfQorCQl0cmFuc2FjdGlvbi5kZWxldGUoc2Vuc29ycyk7CisJCXRyYW5zYWN0aW9uLmRlbGV0ZShhdHRyaWJ1dGVzKTsKKworCQlpZiAoYXJlUmVmZXJlbmNlZEluVGVtcGxhdGVzKGNhdGFsb2dDb21wb25lbnRzKSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oCisJCQkJCSJVbmFibGUgdG8gZGVsZXRlIGdpdmVuIGNhdGFsb2cgY29tcG9uZW50cyBzaW5jZSBhdCBsZWFzdCAiICsgIm9uZSBpcyB1c2VkIGluIHRlbXBsYXRlcy4iKTsKKwkJfQorCisJCWZvciAoQ2F0YWxvZ0NvbXBvbmVudCBjYXRhbG9nQ29tcG9uZW50IDogY2F0YWxvZ0NvbXBvbmVudHMpIHsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpCisJCQkJCS5nZXRFbGVtZW50QnlOYW1lKGNhdGFsb2dDb21wb25lbnQuZ2V0TmFtZSgpKTsKKwkJCWZvciAoQXBwbGljYXRpb25SZWxhdGlvbiBhcHBsaWNhdGlvblJlbGF0aW9uIDogYXBwbGljYXRpb25FbGVtZW50LmdldEFsbFJlbGF0aW9ucygpKSB7CisJCQkJZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5yZW1vdmVSZWxhdGlvbihhcHBsaWNhdGlvblJlbGF0aW9uKTsKKworCQkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQkJYXBwbGljYXRpb25SZWxhdGlvbi5fcmVsZWFzZSgpOworCQkJfQorCQkJZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5yZW1vdmVFbGVtZW50KGFwcGxpY2F0aW9uRWxlbWVudCk7CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIERlbGV0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gZWxlbWVudCBmb3IgZWFjaCBnaXZlbgorCSAqIHtAbGluayBDYXRhbG9nU2Vuc29yfS4gRGVsZXRpbmcgYSB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn0gaXMgb25seSBhbGxvd2VkIGlmIGl0CisJICogaXMgbm90IHVzZWQgaW4gdGVtcGxhdGVzIGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuIGNvdWxkIGJlIGRlbGV0ZWQuIFNvIGF0CisJICogZmlyc3QgaXQgaXMgdHJpZWQgdG8gZGVsZXRlIGl0cyB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX1zLiBPbiBzdWNjZXNzIGl0IGlzCisJICogZW5zdXJlZCBub25lIG9mIHRoZSBnaXZlbiB7QGNvZGUgQ2F0YWxvZ1NlbnNvcn1zIGlzIHVzZWQgaW4gdGVtcGxhdGVzLgorCSAqIEZpbmFsbHkgdGhlIGNvcnJlc3BvbmRpbmcgYXBwbGljYXRpb24gZWxlbWVudHMgYXJlIGRlbGV0ZWQuCisJICoKKwkgKiBAcGFyYW0gY2F0YWxvZ1NlbnNvcnMgVGhlIHtAY29kZSBDYXRhbG9nU2Vuc29yfXMuCisJICogQHRocm93cyBBb0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGluIGNhc2Ugb2YgZXJyb3JzLgorCSAqLworCXB1YmxpYyB2b2lkIGRlbGV0ZUNhdGFsb2dTZW5zb3JzKENvbGxlY3Rpb248Q2F0YWxvZ1NlbnNvcj4gY2F0YWxvZ1NlbnNvcnMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCUxpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKENhdGFsb2dTZW5zb3IgY2F0YWxvZ1NlbnNvciA6IGNhdGFsb2dTZW5zb3JzKSB7CisJCQlhdHRyaWJ1dGVzLmFkZEFsbChjYXRhbG9nU2Vuc29yLmdldENhdGFsb2dBdHRyaWJ1dGVzKCkpOworCQl9CisJCXRyYW5zYWN0aW9uLmRlbGV0ZShhdHRyaWJ1dGVzKTsKKworCQlpZiAoYXJlUmVmZXJlbmNlZEluVGVtcGxhdGVzKGNhdGFsb2dTZW5zb3JzKSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oCisJCQkJCSJVbmFibGUgdG8gZGVsZXRlIGdpdmVuIGNhdGFsb2cgc2Vuc29ycyBzaW5jZSBhdCAiICsgImxlYXN0IG9uZSBpcyB1c2VkIGluIHRlbXBsYXRlcy4iKTsKKwkJfQorCisJCWZvciAoQ2F0YWxvZ1NlbnNvciBjYXRhbG9nU2Vuc29yIDogY2F0YWxvZ1NlbnNvcnMpIHsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVsZW1lbnRCeU5hbWUoY2F0YWxvZ1NlbnNvci5nZXROYW1lKCkpOworCQkJZm9yIChBcHBsaWNhdGlvblJlbGF0aW9uIGFwcGxpY2F0aW9uUmVsYXRpb24gOiBhcHBsaWNhdGlvbkVsZW1lbnQuZ2V0QWxsUmVsYXRpb25zKCkpIHsKKwkJCQlnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLnJlbW92ZVJlbGF0aW9uKGFwcGxpY2F0aW9uUmVsYXRpb24pOworCisJCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCQlhcHBsaWNhdGlvblJlbGF0aW9uLl9yZWxlYXNlKCk7CisJCQl9CisJCQlnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLnJlbW92ZUVsZW1lbnQoYXBwbGljYXRpb25FbGVtZW50KTsKKworCQkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJCWFwcGxpY2F0aW9uRWxlbWVudC5fcmVsZWFzZSgpOworCQl9CisKKwl9CisKKwkvKioKKwkgKiBEZWxldGVzIHRoZSBjb3JyZXNwb25kaW5nIGFwcGxpY2F0aW9uIGF0dHJpYnV0ZXMgZm9yIGVhY2ggZ2l2ZW4KKwkgKiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0uIERlbGV0aW5nIGEge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9IGlzIG9ubHkgYWxsb3dlZAorCSAqIGlmIGl0IGlzIG5vdCB1c2VkIGluIHRlbXBsYXRlcy4gU28gYXQgZmlyc3QgaXQgaXMgZW5zdXJlZCBub25lIG9mIHRoZSBnaXZlbgorCSAqIHtAY29kZSBDYXRhbG9nQXR0cmlidXRlfXMgaXMgdXNlZCBpbiB0ZW1wbGF0ZXMgYW5kIGZpbmFsbHkgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGFyZSBkZWxldGVkLgorCSAqCisJICogQHBhcmFtIGNhdGFsb2dBdHRyaWJ1dGVzIFRoZSB7QGNvZGUgQ2F0YWxvZ0F0dHJpYnV0ZX1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaW4gY2FzZSBvZiBlcnJvcnMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBkZWxldGVDYXRhbG9nQXR0cmlidXRlcyhDb2xsZWN0aW9uPENhdGFsb2dBdHRyaWJ1dGU+IGNhdGFsb2dBdHRyaWJ1dGVzKQorCQkJdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKGFyZVJlZmVyZW5jZWRJblRlbXBsYXRlcyhjYXRhbG9nQXR0cmlidXRlcykpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKAorCQkJCQkiVW5hYmxlIHRvIGRlbGV0ZSBnaXZlbiBjYXRhbG9nIGF0dHJpYnV0ZXMgc2luY2UgYXQgbGVhc3QgIiArICJvbmUgaXMgdXNlZCBpbiB0ZW1wbGF0ZXMuIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBMaXN0PENhdGFsb2dBdHRyaWJ1dGU+PiBjYXRhbG9nQXR0cmlidXRlc0J5UGFyZW50ID0gY2F0YWxvZ0F0dHJpYnV0ZXMuc3RyZWFtKCkKKwkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoQ2F0YWxvZ01hbmFnZXI6OmdldFBhcmVudE5hbWUpKTsKKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxDYXRhbG9nQXR0cmlidXRlPj4gZW50cnkgOiBjYXRhbG9nQXR0cmlidXRlc0J5UGFyZW50LmVudHJ5U2V0KCkpIHsKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhcHBsaWNhdGlvbkVsZW1lbnQgPSBnZXRBcHBsaWNhdGlvblN0cnVjdHVyZSgpLmdldEVsZW1lbnRCeU5hbWUoZW50cnkuZ2V0S2V5KCkpOworCisJCQlmb3IgKENhdGFsb2dBdHRyaWJ1dGUgY2F0YWxvZ0F0dHJpYnV0ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQlBcHBsaWNhdGlvbkF0dHJpYnV0ZSBhcHBsaWNhdGlvbkF0dHJpYnV0ZSA9IGFwcGxpY2F0aW9uRWxlbWVudAorCQkJCQkJLmdldEF0dHJpYnV0ZUJ5TmFtZShjYXRhbG9nQXR0cmlidXRlLmdldE5hbWUoKSk7CisJCQkJYXBwbGljYXRpb25FbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhcHBsaWNhdGlvbkF0dHJpYnV0ZSk7CisKKwkJCQkvLyByZWxlYXNlIHJlc291cmNlcworCQkJCWFwcGxpY2F0aW9uQXR0cmlidXRlLl9yZWxlYXNlKCk7CisJCQl9CisKKwkJCS8vIHJlbGVhc2UgcmVzb3VyY2VzCisJCQlhcHBsaWNhdGlvbkVsZW1lbnQuX3JlbGVhc2UoKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlbGVhc2VzIGNhY2hlZCByZXNvdXJjZXMuCisJICovCisJcHVibGljIHZvaWQgY2xlYXIoKSB7CisJCWlmIChhcHBsaWNhdGlvblN0cnVjdHVyZSAhPSBudWxsKSB7CisJCQlhcHBsaWNhdGlvblN0cnVjdHVyZS5fcmVsZWFzZSgpOworCQl9CisKKwkJaWYgKGJhc2VTdHJ1Y3R1cmUgIT0gbnVsbCkgeworCQkJYmFzZVN0cnVjdHVyZS5fcmVsZWFzZSgpOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEFwcGxpY2F0aW9uRWxlbWVudH0gd2l0aCBnaXZlbiBuYW1lIGFuZAorCSAqIHtAbGluayBCYXNlRWxlbWVudH0uIFRoZSByZXR1cm5lZCB7QGNvZGUgQXBwbGljYXRpb25FbGVtZW50fSB3aWxsIGJlIGNyZWF0ZWQKKwkgKiB3aXRoIHRoZSB0aHJlZSBtYW5kYXRvcnkge0BsaW5rIEFwcGxpY2F0aW9uQXR0cmlidXRlfXMgZm9yICdJZCcsICdOYW1lJyBhbmQKKwkgKiAnTWltZVR5cGUnLgorCSAqCisJICogQHBhcmFtIG5hbWUgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBlbGVtZW50LgorCSAqIEBwYXJhbSBiYXNlRWxlbWVudCBUaGUge0Bjb2RlIEJhc2VFbGVtZW50fSB0aGUgY3JlYXRlZCB7QGNvZGUKKwkgKiAJCUFwcGxpY2F0aW9uRWxlbWVudH0gd2lsbCBiZSBkZXJpdmVkIGZyb20uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQXBwbGljYXRpb25FbGVtZW50fSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIEFwcGxpY2F0aW9uRWxlbWVudCBjcmVhdGVBcHBsaWNhdGlvbkVsZW1lbnQoU3RyaW5nIG5hbWUsIEJhc2VFbGVtZW50IGJhc2VFbGVtZW50KSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlBcHBsaWNhdGlvbkVsZW1lbnQgYXBwbGljYXRpb25FbGVtZW50ID0gZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5jcmVhdGVFbGVtZW50KGJhc2VFbGVtZW50KTsKKwkJYXBwbGljYXRpb25FbGVtZW50LnNldE5hbWUobmFtZSk7CisKKwkJLy8gSWQKKwkJQXBwbGljYXRpb25BdHRyaWJ1dGUgaWRBcHBsaWNhdGlvbkF0dHJpYnV0ZSA9IGFwcGxpY2F0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGVCeUJhc2VOYW1lKCJpZCIpOworCQlpZEFwcGxpY2F0aW9uQXR0cmlidXRlLnNldE5hbWUoIklkIik7CisJCWlkQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0RGF0YVR5cGUoRGF0YVR5cGUuRFRfTE9OR0xPTkcpOworCQlpZEFwcGxpY2F0aW9uQXR0cmlidXRlLnNldElzQXV0b2dlbmVyYXRlZCh0cnVlKTsKKworCQkvLyBOYW1lCisJCUFwcGxpY2F0aW9uQXR0cmlidXRlIG5hbWVBcHBsaWNhdGlvbkF0dHJpYnV0ZSA9IGFwcGxpY2F0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGVCeUJhc2VOYW1lKCJuYW1lIik7CisJCW5hbWVBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXROYW1lKCJOYW1lIik7CisJCW5hbWVBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXRMZW5ndGgoNTApOworCisJCS8vIE1pbWVUeXBlCisJCUJhc2VBdHRyaWJ1dGUgbWltZVR5cGVCYXNlQXR0cmlidXRlID0gYmFzZUVsZW1lbnQuZ2V0QXR0cmlidXRlcygibWltZV90eXBlIilbMF07CisJCUFwcGxpY2F0aW9uQXR0cmlidXRlIG1pbWVUeXBlQXBwbGljYXRpb25BdHRyaWJ1dGUgPSBhcHBsaWNhdGlvbkVsZW1lbnQuY3JlYXRlQXR0cmlidXRlKCk7CisJCW1pbWVUeXBlQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0QmFzZUF0dHJpYnV0ZShtaW1lVHlwZUJhc2VBdHRyaWJ1dGUpOworCQltaW1lVHlwZUFwcGxpY2F0aW9uQXR0cmlidXRlLnNldE5hbWUoIk1pbWVUeXBlIik7CisJCW1pbWVUeXBlQXBwbGljYXRpb25BdHRyaWJ1dGUuc2V0RGF0YVR5cGUoRGF0YVR5cGUuRFRfU1RSSU5HKTsKKwkJbWltZVR5cGVBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXRMZW5ndGgoMjU2KTsKKwkJbWltZVR5cGVBcHBsaWNhdGlvbkF0dHJpYnV0ZS5zZXRJc09ibGlnYXRvcnkodHJ1ZSk7CisKKwkJLy8gcmVsZWFzZSByZXNvdXJjZXMKKwkJaWRBcHBsaWNhdGlvbkF0dHJpYnV0ZS5fcmVsZWFzZSgpOworCQluYW1lQXBwbGljYXRpb25BdHRyaWJ1dGUuX3JlbGVhc2UoKTsKKwkJbWltZVR5cGVBcHBsaWNhdGlvbkF0dHJpYnV0ZS5fcmVsZWFzZSgpOworCQltaW1lVHlwZUJhc2VBdHRyaWJ1dGUuX3JlbGVhc2UoKTsKKworCQlyZXR1cm4gYXBwbGljYXRpb25FbGVtZW50OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGNhY2hlZCB7QGxpbmsgQXBwbGljYXRpb25TdHJ1Y3R1cmV9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEFwcGxpY2F0aW9uU3RydWN0dXJlfSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gYWNjZXNzIHRoZSB7QGNvZGUKKwkgKiAJCUFwcGxpY2F0aW9uU3RydWN0dXJlfS4KKwkgKi8KKwlwcml2YXRlIEFwcGxpY2F0aW9uU3RydWN0dXJlIGdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkgdGhyb3dzIEFvRXhjZXB0aW9uIHsKKwkJaWYgKGFwcGxpY2F0aW9uU3RydWN0dXJlID09IG51bGwpIHsKKwkJCWFwcGxpY2F0aW9uU3RydWN0dXJlID0gdHJhbnNhY3Rpb24uZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKTsKKwkJfQorCisJCXJldHVybiBhcHBsaWNhdGlvblN0cnVjdHVyZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBjYWNoZWQge0BsaW5rIEJhc2VTdHJ1Y3R1cmV9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIEJhc2VTdHJ1Y3R1cmV9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBhY2Nlc3MgdGhlIHtAY29kZQorCSAqIAkJQmFzZVN0cnVjdHVyZX0uCisJICovCisJcHJpdmF0ZSBCYXNlU3RydWN0dXJlIGdldEJhc2VTdHJ1Y3R1cmUoKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQlpZiAoYmFzZVN0cnVjdHVyZSA9PSBudWxsKSB7CisJCQliYXNlU3RydWN0dXJlID0gdHJhbnNhY3Rpb24uZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0QW9TZXNzaW9uKCkuZ2V0QmFzZVN0cnVjdHVyZSgpOworCQl9CisKKwkJcmV0dXJuIGJhc2VTdHJ1Y3R1cmU7CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4ge0BsaW5rIEVudGl0eX1zIGFyZSByZWZlcmVuY2VkIGluIHRlbXBsYXRlcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdGllcyBUaGUgY2hlY2tlZCBlbnRpdGllcyAoe0BsaW5rIENhdGFsb2dDb21wb25lbnR9LAorCSAqICAgICAgICAgICAgICAgICB7QGxpbmsgQ2F0YWxvZ1NlbnNvcn0gb3Ige0BsaW5rIENhdGFsb2dBdHRyaWJ1dGV9KS4KKwkgKiBAcmV0dXJuIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGF0IGxlYXN0IG9uZSBlbnRpdHkgaXMgcmVmZXJlbmNlZCBpbiBhCisJICogICAgICAgICB0ZW1wbGF0ZS4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIG9uIGVycm9ycy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gYXJlUmVmZXJlbmNlZEluVGVtcGxhdGVzKENvbGxlY3Rpb248PyBleHRlbmRzIEVudGl0eT4gZW50aXRpZXMpCisJCQl0aHJvd3MgQW9FeGNlcHRpb24sIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNYXA8RW50aXR5VHlwZSwgTGlzdDxFbnRpdHk+PiBlbnRpdGllc0J5RW50aXR5VHlwZSA9IGVudGl0aWVzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KHRyYW5zYWN0aW9uLmdldE1vZGVsTWFuYWdlcigpOjpnZXRFbnRpdHlUeXBlKSk7CisKKwkJZm9yIChFbnRyeTxFbnRpdHlUeXBlLCBMaXN0PEVudGl0eT4+IGVudHJ5IDogZW50aXRpZXNCeUVudGl0eVR5cGUuZW50cnlTZXQoKSkgeworCQkJRW50aXR5VHlwZSBzb3VyY2UgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCUVudGl0eVR5cGUgdGFyZ2V0ID0gdHJhbnNhY3Rpb24uZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShzb3VyY2UuZ2V0TmFtZSgpLnJlcGxhY2UoIkNhdCIsICJUcGwiKSk7CisKKwkJCVF1ZXJ5IHF1ZXJ5ID0gdHJhbnNhY3Rpb24uZ2V0Q29udGV4dCgpLmdldFF1ZXJ5U2VydmljZSgpCisJCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKFF1ZXJ5U2VydmljZS5jbGFzcykpLmNyZWF0ZVF1ZXJ5KCkKKwkJCQkJLnNlbGVjdElEKHRhcmdldCkuam9pbihzb3VyY2UsIHRhcmdldCk7CisKKwkJCUxpc3Q8UmVzdWx0PiByZXN1bHRzID0gcXVlcnkuZmV0Y2goRmlsdGVyLmFuZCgpLmFkZCgKKwkJCQkJQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVC5jcmVhdGUoc291cmNlLmdldElEQXR0cmlidXRlKCksIGNvbGxlY3RJbnN0YW5jZUlEcyhlbnRyeS5nZXRWYWx1ZSgpKSkpKTsKKwkJCWlmIChyZXN1bHRzLnNpemUoKSA+IDApIHsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKioKKwkgKiBDb2xsZWN0IHRoZSBpbnN0YW5jZSBJRHMgb2YgYWxsIGdpdmVuIHtAbGluayBFbnRpdHl9cy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdGllcyBUaGUge0BsaW5rIEVudGl0eX1zLgorCSAqIEByZXR1cm4gVGhlIGluc3RhbmNlIElEcyBhIHtAY29kZSBTdHJpbmdbXX0gYXJlIHR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBjb2xsZWN0SW5zdGFuY2VJRHMoTGlzdDxFbnRpdHk+IGVudGl0aWVzKSB7CisJCVN0cmluZ1tdIGlkcyA9IG5ldyBTdHJpbmdbZW50aXRpZXMuc2l6ZSgpXTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IGlkcy5sZW5ndGg7IGkrKykgeworCQkJaWRzW2ldID0gZW50aXRpZXMuZ2V0KGkpLmdldElEKCk7CisJCX0KKworCQlyZXR1cm4gaWRzOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHBhcmVudCBuYW1lIGZvciBnaXZlbiB7QGxpbmsgQ2F0YWxvZ0F0dHJpYnV0ZX0uCisJICoKKwkgKiBAcGFyYW0gY2F0YWxvZ0F0dHJpYnV0ZSBUaGUge0Bjb2RlIENhdGFsb2dBdHRyaWJ1dGV9LgorCSAqIEByZXR1cm4gVGhlIHBhcmVudCBuYW1lIGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQYXJlbnROYW1lKENhdGFsb2dBdHRyaWJ1dGUgY2F0YWxvZ0F0dHJpYnV0ZSkgeworCQlPcHRpb25hbDxDYXRhbG9nQ29tcG9uZW50PiBjYXRhbG9nQ29tcG9uZW50ID0gY2F0YWxvZ0F0dHJpYnV0ZS5nZXRDYXRhbG9nQ29tcG9uZW50KCk7CisJCWlmIChjYXRhbG9nQ29tcG9uZW50LmlzUHJlc2VudCgpKSB7CisJCQlyZXR1cm4gY2F0YWxvZ0NvbXBvbmVudC5nZXQoKS5nZXROYW1lKCk7CisJCX0KKworCQlyZXR1cm4gY2F0YWxvZ0F0dHJpYnV0ZS5nZXRDYXRhbG9nU2Vuc29yKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGFyZW50IGVudGl0eSBpcyB1bmtub3duLiIpKS5nZXROYW1lKCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vRGVsZXRlU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vRGVsZXRlU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyMTk2NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9EZWxldGVTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI2MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNvbnRleHRSb290OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmlsZXNBdHRhY2hhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGFyYW1ldGVyU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuSm9pblR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlF1ZXJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5SZXN1bHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmxvb2t1cC5jb25maWcuRW50aXR5Q29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBEZWxldGUgc3RhdGVtZW50IGlzIHVzZWQgdG8gZGVsZXRlIGVudGl0aWVzIHdpdGggdGhlaXIgY2hpbGRyZW4uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIERlbGV0ZVN0YXRlbWVudCBleHRlbmRzIEJhc2VTdGF0ZW1lbnQgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBBVVRPX0RFTEVUQUJMRSA9IEFycmF5cy5hc0xpc3QoIk1lYVF1YW50aXR5IiwgIlN1Yk1hdHJpeCIsICJMb2NhbENvbHVtbiIsCisJCQkiRXh0ZXJuYWxDb21wb25lbnQiKTsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGVsZXRlU3RhdGVtZW50LmNsYXNzKTsKKworCXByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VBdXRvRGVsZXRlOworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIHRyYW5zYWN0aW9uICAgVGhlIG93bmluZyB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlICAgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKiBAcGFyYW0gdXNlQXV0b0RlbGV0ZSBJZiB7QGNvZGUgdHJ1ZX0gY2hpbGQgcmVsYXRpb25zIG9mIHtAbGluayBNZWFzdXJlbWVudH0KKwkgKiAgICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyBhcmUgbm90IGZvbGxvd2VkLgorCSAqLworCURlbGV0ZVN0YXRlbWVudChPRFNUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgRW50aXR5VHlwZSBlbnRpdHlUeXBlLCBib29sZWFuIHVzZUF1dG9EZWxldGUpIHsKKwkJc3VwZXIodHJhbnNhY3Rpb24sIGVudGl0eVR5cGUpOworCQl0aGlzLnVzZUF1dG9EZWxldGUgPSB1c2VBdXRvRGVsZXRlOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKGVudGl0aWVzLnN0cmVhbSgpLmZpbHRlcihlIC0+ICFlLmdldFR5cGVOYW1lKCkuZXF1YWxzKGdldEVudGl0eVR5cGUoKS5nZXROYW1lKCkpKS5maW5kQW55KCkuaXNQcmVzZW50KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0IGxlYXN0IG9uZSBnaXZlbiBlbnRpdHkgaXMgb2YgaW5jb21wYXRpYmxlIHR5cGUuIik7CisJCX0KKworCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWludCBhbW91bnQgPSBkZWxldGUoZ2V0RW50aXR5VHlwZSgpLCBlbnRpdGllcy5zdHJlYW0oKS5tYXAoRW50aXR5OjpnZXRJRCkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpLCBmYWxzZSk7CisJCUxPR0dFUi5kZWJ1Zygie30gaW5zdGFuY2VzIGRlbGV0ZWQgaW4ge30gbXMuIiwgYW1vdW50LCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmVjdXJzaXZlbHkgZm9sbG93cyBjaGlsZCByZWxhdGlvbnMgb2YgZ2l2ZW4gZW50aXRpZXMgYW5kIGRlbGV0ZXMgYWxsIGNoaWxkCisJICogZW50aXRpZXMgYmVmb3JlIGRlbGV0aW5nIHBhcmVudCBlbnRpdGllcy4KKwkgKgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlICAgICB7QGxpbmsgRW50aXR5VHlwZX0gb2YgdGhlIGRlbGV0ZWQgZW50aXRpZXMuCisJICogQHBhcmFtIGluc3RhbmNlSURzICAgIEluc3RhbmNlIElEcyBvZiBlbnRpdGllcyB3aGljaCBoYXZlIHRvIGJlIGRlbGV0ZWQuCisJICogQHBhcmFtIGlnbm9yZVNpYmxpbmdzIElzIGl0IHJlcXVpcmVkIHRvIGNoZWNrIHdoZXRoZXIge0BsaW5rIE1lYXN1cmVtZW50fQorCSAqICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5ncyBzaGFyZSBhIGNvbW1vbiB7QGxpbmsgQ29udGV4dFJvb3R9cy4KKwkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkZWxldGVkIGluc3RhbmNlcy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIHVuYWJsZSB0byBkZWxldGUgZW50aXRpZXMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gcXVlcnkgY2hpbGQgZW50aXRpZXMuCisJICovCisJcHJpdmF0ZSBpbnQgZGVsZXRlKEVudGl0eVR5cGUgZW50aXR5VHlwZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGluc3RhbmNlSURzLCBib29sZWFuIGlnbm9yZVNpYmxpbmdzKQorCQkJdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKGluc3RhbmNlSURzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlRdWVyeSBxdWVyeSA9IGdldFF1ZXJ5U2VydmljZSgpLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0SUQoZW50aXR5VHlwZSk7CisJCWZvciAoUmVsYXRpb24gcmVsYXRpb24gOiBlbnRpdHlUeXBlLmdldENoaWxkUmVsYXRpb25zKCkpIHsKKwkJCWlmICh1c2VBdXRvRGVsZXRlICYmIEFVVE9fREVMRVRBQkxFLmNvbnRhaW5zKHJlbGF0aW9uLmdldFRhcmdldCgpLmdldE5hbWUoKSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFyZWxhdGlvbi5nZXRUYXJnZXQoKS5lcXVhbHMocmVsYXRpb24uZ2V0U291cmNlKCkpKSB7CisJCQkJcXVlcnkuam9pbihyZWxhdGlvbiwgSm9pblR5cGUuT1VURVIpLnNlbGVjdElEKHJlbGF0aW9uLmdldFRhcmdldCgpKTsKKwkJCX0KKwkJfQorCisJCS8vIHNlbGVjdCBhdHRyaWJ1dGVzIGNvbnRhaW5pbmcgZmlsZSBsaW5rcyBvbmx5IGZvciBlbnRpdHkgdHlwZXMKKwkJLy8gaW1wbGVtZW50aW5nIEZpbGVzQXR0YWNoYWJsZQorCQlFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5Q29uZmlnKGVudGl0eVR5cGUpOworCQlpZiAoRmlsZXNBdHRhY2hhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCkpKSB7CisJCQllbnRpdHlUeXBlLmdldEF0dHJpYnV0ZXMoKS5zdHJlYW0oKS5maWx0ZXIoYSAtPiBhLmdldFZhbHVlVHlwZSgpLmlzRmlsZUxpbmtUeXBlKCkpLmZvckVhY2gocXVlcnk6OnNlbGVjdCk7CisJCX0KKworCQlFbnRpdHlUeXBlIHRlc3RTdGVwID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShUZXN0U3RlcC5jbGFzcyk7CisJCUVudGl0eVR5cGUgbWVhc3VyZW1lbnQgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKwkJRW50aXR5VHlwZSBjaGFubmVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShDaGFubmVsLmNsYXNzKTsKKworCQlFbnRpdHlUeXBlIHVuaXRVbmRlclRlc3QgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKENvbnRleHRSb290LmNsYXNzLCBDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKTsKKwkJRW50aXR5VHlwZSB0ZXN0U2VxdWVuY2UgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKENvbnRleHRSb290LmNsYXNzLCBDb250ZXh0VHlwZS5URVNUU0VRVUVOQ0UpOworCQlFbnRpdHlUeXBlIHRlc3RFcXVpcG1lbnQgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKENvbnRleHRSb290LmNsYXNzLCBDb250ZXh0VHlwZS5URVNURVFVSVBNRU5UKTsKKworCQkvLyB0eXBlIGluIHRoaXMgbGlzdCBtdXN0IGJlIGRlbGV0ZWQgQUZURVIgdGhpcyB0aGlzIGluc3RhbmNlcyBoYXZlIGJlZW4KKwkJLy8gZGVsZXRlZAorCQkvLyBpbmZvcm1hdGl2ZSByZWxhdGlvbiBpcyBjb25zaWRlcmVkIGFzIGEgY2hpbGQgcmVsYXRpb24KKwkJTGlzdDxFbnRpdHlUeXBlPiBkZWxheWVkRGVsZXRlID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJLy8gam9pbiBjb250ZXh0IHJvb3RzCisJCWlmIChtZWFzdXJlbWVudC5lcXVhbHMoZW50aXR5VHlwZSkgfHwgdGVzdFN0ZXAuZXF1YWxzKGVudGl0eVR5cGUpKSB7CisJCQlxdWVyeS5qb2luKGVudGl0eVR5cGUuZ2V0UmVsYXRpb24odW5pdFVuZGVyVGVzdCksIEpvaW5UeXBlLk9VVEVSKS5zZWxlY3RJRCh1bml0VW5kZXJUZXN0KTsKKwkJCXF1ZXJ5LmpvaW4oZW50aXR5VHlwZS5nZXRSZWxhdGlvbih0ZXN0U2VxdWVuY2UpLCBKb2luVHlwZS5PVVRFUikuc2VsZWN0SUQodGVzdFNlcXVlbmNlKTsKKwkJCXF1ZXJ5LmpvaW4oZW50aXR5VHlwZS5nZXRSZWxhdGlvbih0ZXN0RXF1aXBtZW50KSwgSm9pblR5cGUuT1VURVIpLnNlbGVjdElEKHRlc3RFcXVpcG1lbnQpOworCQkJZGVsYXllZERlbGV0ZS5hZGRBbGwoQXJyYXlzLmFzTGlzdCh1bml0VW5kZXJUZXN0LCB0ZXN0U2VxdWVuY2UsIHRlc3RFcXVpcG1lbnQpKTsKKwkJfQorCisJCS8vIGpvaW4gcGFyYW1ldGVyIHNldHMKKwkJaWYgKG1lYXN1cmVtZW50LmVxdWFscyhlbnRpdHlUeXBlKSB8fCBjaGFubmVsLmVxdWFscyhlbnRpdHlUeXBlKSkgeworCQkJRW50aXR5VHlwZSBwYXJhbWV0ZXJTZXQgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKFBhcmFtZXRlclNldC5jbGFzcyk7CisJCQlxdWVyeS5qb2luKGVudGl0eVR5cGUuZ2V0UmVsYXRpb24ocGFyYW1ldGVyU2V0KSwgSm9pblR5cGUuT1VURVIpLnNlbGVjdElEKHBhcmFtZXRlclNldCk7CisJCX0KKworCQlGaWx0ZXIgZmlsdGVyID0gRmlsdGVyLm9yKCkuaWRzKGVudGl0eVR5cGUsIGluc3RhbmNlSURzKTsKKwkJZW50aXR5VHlwZS5nZXRQYXJlbnRSZWxhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIociAtPiByLmdldFRhcmdldCgpLmVxdWFscyhlbnRpdHlUeXBlKSkKKwkJCQkuZm9yRWFjaChyZWxhdGlvbiAtPiBmaWx0ZXIuaWRzKHJlbGF0aW9uLCBpbnN0YW5jZUlEcykpOworCisJCS8vIHF1ZXJ5IGNoaWxkIElEcworCQlNYXA8RW50aXR5VHlwZSwgU2V0PFN0cmluZz4+IGNoaWxkcmVuID0gbmV3IEhhc2hNYXA8PigpOworCQlmb3IgKFJlc3VsdCByZXN1bHQgOiBxdWVyeS5mZXRjaChmaWx0ZXIpKSB7CisJCQkvLyBsb2FkIGNoaWxkcmVuIG9mIG90aGVyIHR5cGVzCisJCQlyZXN1bHQuc3RyZWFtKCkuZmlsdGVyKHIgLT4gci5nZXRJRCgpICE9IG51bGwgJiYgci5nZXRJRCgpLmxlbmd0aCgpID4gMCkuZm9yRWFjaChyIC0+IHsKKwkJCQljaGlsZHJlbi5jb21wdXRlSWZBYnNlbnQoci5nZXRFbnRpdHlUeXBlKCksIGsgLT4gbmV3IEhhc2hTZXQ8PigpKS5hZGQoci5nZXRJRCgpKTsKKwkJCX0pOworCisJCQkvLyBjb2xsZWN0IGZpbGUgbGlua3MgdG8gcmVtb3ZlCisJCQlMaXN0PEZpbGVMaW5rPiBmaWxlTGlua3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZvciAoVmFsdWUgdmFsdWUgOiByZXN1bHQuZ2V0UmVjb3JkKGVudGl0eVR5cGUpLmdldFZhbHVlcygpLnZhbHVlcygpKSB7CisJCQkJaWYgKHZhbHVlLmdldFZhbHVlVHlwZSgpLmlzRmlsZUxpbmsoKSkgeworCQkJCQlmaWxlTGlua3MuYWRkKHZhbHVlLmV4dHJhY3QoKSk7CisJCQkJfSBlbHNlIGlmICh2YWx1ZS5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rU2VxdWVuY2UoKSkgeworCQkJCQlmaWxlTGlua3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoKEZpbGVMaW5rW10pIHZhbHVlLmV4dHJhY3QoKSkpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFmaWxlTGlua3MuaXNFbXB0eSgpKSB7CisJCQkJZ2V0VHJhbnNhY3Rpb24oKS5nZXRVcGxvYWRTZXJ2aWNlKCkuYWRkVG9SZW1vdmUoZmlsZUxpbmtzKTsKKwkJCX0KKwkJfQorCisJCS8vIG9taXQgY29udGV4dCByb290cyB3aXRoIHJlZmVyZW5jZXMgdG8gbm90IHJlbW92ZWQgbWVhc3VyZW1lbnRzCisJCWlmICghaWdub3JlU2libGluZ3MgJiYgbWVhc3VyZW1lbnQuZXF1YWxzKGVudGl0eVR5cGUpKSB7CisJCQlmb3IgKEVudGl0eVR5cGUgY29udGV4dFJvb3QgOiBBcnJheXMuYXNMaXN0KHVuaXRVbmRlclRlc3QsIHRlc3RTZXF1ZW5jZSwgdGVzdEVxdWlwbWVudCkpIHsKKwkJCQlTZXQ8U3RyaW5nPiBjb250ZXh0Um9vdElEcyA9IGNoaWxkcmVuLmdldE9yRGVmYXVsdChjb250ZXh0Um9vdCwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisJCQkJaWYgKGNvbnRleHRSb290SURzLmlzRW1wdHkoKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlRdWVyeSBjb250ZXh0UXVlcnkgPSBnZXRRdWVyeVNlcnZpY2UoKS5jcmVhdGVRdWVyeSgpOworCQkJCWNvbnRleHRRdWVyeS5zZWxlY3RJRChjb250ZXh0Um9vdCwgbWVhc3VyZW1lbnQpOworCQkJCWNvbnRleHRRdWVyeS5qb2luKGNvbnRleHRSb290LCBtZWFzdXJlbWVudCk7CisKKwkJCQlmb3IgKFJlc3VsdCByZXN1bHQgOiBjb250ZXh0UXVlcnkuZmV0Y2goRmlsdGVyLmlkc09ubHkoY29udGV4dFJvb3QsIGNvbnRleHRSb290SURzKSkpIHsKKwkJCQkJaWYgKGluc3RhbmNlSURzLmNvbnRhaW5zKHJlc3VsdC5nZXRSZWNvcmQobWVhc3VyZW1lbnQpLmdldElEKCkpKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCS8vIGNvbnRleHQgcm9vdCByZWZlcmVuY2VzIGEgbm90IHJlbW92ZWQgbWVhc3VyZW1lbnQKKwkJCQkJY29udGV4dFJvb3RJRHMucmVtb3ZlKHJlc3VsdC5nZXRSZWNvcmQoY29udGV4dFJvb3QpLmdldElEKCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWludCBhbW91bnQgPSAwOworCQkvLyBkZWxldGUgcmVhbCBjaGlsZHJlbgorCQlMaXN0PEVudHJ5PEVudGl0eVR5cGUsIFNldDxTdHJpbmc+Pj4gY29uc2lkZXJlZENoaWxkcmVuID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoRW50cnk8RW50aXR5VHlwZSwgU2V0PFN0cmluZz4+IGVudHJ5IDogY2hpbGRyZW4uZW50cnlTZXQoKSkgeworCQkJRW50aXR5VHlwZSBjaGlsZFR5cGUgPSBlbnRyeS5nZXRLZXkoKTsKKwkJCVNldDxTdHJpbmc+IGNoaWxkSW5zdGFuY2VJRHMgPSBlbnRyeS5nZXRWYWx1ZSgpOworCQkJaWYgKGVudGl0eVR5cGUuZXF1YWxzKGNoaWxkVHlwZSkpIHsKKwkJCQljaGlsZEluc3RhbmNlSURzLnJlbW92ZUFsbChpbnN0YW5jZUlEcyk7CisJCQl9IGVsc2UgaWYgKGRlbGF5ZWREZWxldGUuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7CisJCQkJY29uc2lkZXJlZENoaWxkcmVuLmFkZChlbnRyeSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlhbW91bnQgKz0gZGVsZXRlKGVudHJ5LmdldEtleSgpLCBjaGlsZEluc3RhbmNlSURzLCB0cnVlKTsKKwkJfQorCisJCWdldEFwcGxFbGVtQWNjZXNzKCkuZGVsZXRlSW5zdGFuY2VzKCgoT0RTRW50aXR5VHlwZSkgZW50aXR5VHlwZSkuZ2V0T0RTSUQoKSwgdG9PRFNJRHMoaW5zdGFuY2VJRHMpKTsKKworCQkvLyBkZWxldGUgY29uc2lkZXJlZCBjaGlsZHJlbiAoaW5mb3JtYXRpdmUgcmVsYXRpb24pCisJCWZvciAoRW50cnk8RW50aXR5VHlwZSwgU2V0PFN0cmluZz4+IGVudHJ5IDogY29uc2lkZXJlZENoaWxkcmVuKSB7CisJCQlhbW91bnQgKz0gZGVsZXRlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCB0cnVlKTsKKwkJfQorCisJCXJldHVybiBhbW91bnQgKyBpbnN0YW5jZUlEcy5zaXplKCk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0Bjb2RlIENvbGxlY3Rpb259IG9mIGluc3RhbmNlIElEcyB0byBPRFMgYSB7QGxpbmsgVF9MT05HTE9OR30KKwkgKiBhcnJheS4KKwkgKgorCSAqIEBwYXJhbSBpbnN0YW5jZUlEcyBUaGUgaW5zdGFuY2UgSURzLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgT0RTIHtAY29kZSBUX0xPTkdMT05HW119IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgVF9MT05HTE9OR1tdIHRvT0RTSURzKENvbGxlY3Rpb248U3RyaW5nPiBpbnN0YW5jZUlEcykgeworCQlyZXR1cm4gaW5zdGFuY2VJRHMuc3RyZWFtKCkubWFwKE9EU0NvbnZlcnRlcjo6dG9PRFNJRCkudG9BcnJheShUX0xPTkdMT05HW106Om5ldyk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vSW5zZXJ0U3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vSW5zZXJ0U3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1NGFjNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9JbnNlcnRTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI4MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQUlETmFtZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQUlETmFtZVZhbHVlU2VxVW5pdElkOworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRWxlbUlkOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Db3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU29ydGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUXVlcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU1V0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKKy8qKgorICogSW5zZXJ0IHN0YXRlbWVudCBpcyB1c2VkIHRvIHdyaXRlIG5ldyBlbnRpdGllcyBhbmQgdGhlaXIgY2hpbGRyZW4uCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK2ZpbmFsIGNsYXNzIEluc2VydFN0YXRlbWVudCBleHRlbmRzIEJhc2VTdGF0ZW1lbnQgeworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluc2VydFN0YXRlbWVudC5jbGFzcyk7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBjaGlsZHJlbk1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8Q29yZT4gY29yZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8VmFsdWU+PiBpbnNlcnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8RmlsZUxpbms+IGZpbGVMaW5rVG9VcGxvYWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU29ydEluZGV4VGVzdFN0ZXBzPiBzb3J0SW5kZXhUZXN0U3RlcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBib29sZWFuIGxvYWRTb3J0SW5kZXg7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSB0cmFuc2FjdGlvbiBUaGUgb3duaW5nIHtAbGluayBPRFNUcmFuc2FjdGlvbn0uCisJICogQHBhcmFtIGVudGl0eVR5cGUgIFRoZSBhc3NvY2lhdGVkIHtAbGluayBFbnRpdHlUeXBlfS4KKwkgKi8KKwlJbnNlcnRTdGF0ZW1lbnQoT0RTVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIEVudGl0eVR5cGUgZW50aXR5VHlwZSkgeworCQlzdXBlcih0cmFuc2FjdGlvbiwgZW50aXR5VHlwZSk7CisKKwkJbG9hZFNvcnRJbmRleCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpLmVxdWFscyhnZXRFbnRpdHlUeXBlKCkpOworCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWVudGl0aWVzLnN0cmVhbSgpLm1hcChPRFNFbnRpdHlGYWN0b3J5OjpleHRyYWN0KS5mb3JFYWNoKHRoaXM6OnJlYWRFbnRpdHlDb3JlKTsKKwkJZXhlY3V0ZSgpOworCX0KKworCS8qKgorCSAqIEV4ZWN1dGVzIHRoaXMgc3RhdGVtZW50IGZvciBnaXZlbiB7QGxpbmsgQ29yZX1zLgorCSAqCisJICogQHBhcmFtIGNvcmVzIFRoZSBwcm9jZXNzZWQge0Bjb2RlIENvcmV9cy4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgYSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiBmYWlscy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlV2l0aENvcmVzKENvbGxlY3Rpb248Q29yZT4gY29yZXMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQljb3Jlcy5mb3JFYWNoKHRoaXM6OnJlYWRFbnRpdHlDb3JlKTsKKwkJZXhlY3V0ZSgpOworCX0KKworCS8qKgorCSAqIFVwbG9hZHMgbmV3IHtAbGluayBGaWxlTGlua31zLCBhZGp1c3RzIHNvcnQgaW5kaWNlcyBmb3IgbmV3IHtAbGluayBUZXN0U3RlcH0KKwkgKiBlbnRpdGllcyBhbmQgd3JpdGVzIGNvbGxlY3RlZCBpbnNlcnRpb24gZGF0YSBhdCBvbmNlLiBPbmNlIG5ldyBlbnRpdGllcyBhcmUKKwkgKiB3cml0dGVuIHRoZWlyIGNoaWxkcmVuIGFyZSBjcmVhdGVkIGJ5IGRlbGVnYXRpb24gdG8gdGhlCisJICoge0BsaW5rIE9EU1RyYW5zYWN0aW9ufS4KKwkgKgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpZiBhIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uIGZhaWxzLgorCSAqLworCXByaXZhdGUgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCUxpc3Q8QUlETmFtZVZhbHVlU2VxVW5pdElkPiBhbnZzdUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJVF9MT05HTE9ORyBhSUQgPSBnZXRFbnRpdHlUeXBlKCkuZ2V0T0RTSUQoKTsKKworCQkvLyBUT0RPIHRyYWNpbmcgcHJvZ3Jlc3MgaW4gdGhpcyBtZXRob2QuLi4KKworCQlpZiAobG9hZFNvcnRJbmRleCAmJiAhc29ydEluZGV4VGVzdFN0ZXBzLmlzRW1wdHkoKSkgeworCQkJYWRqdXN0TWlzc2luZ1NvcnRJbmRpY2VzKCk7CisJCX0KKworCQlpZiAoIWZpbGVMaW5rVG9VcGxvYWQuaXNFbXB0eSgpKSB7CisJCQlnZXRUcmFuc2FjdGlvbigpLmdldFVwbG9hZFNlcnZpY2UoKS51cGxvYWRQYXJhbGxlbChmaWxlTGlua1RvVXBsb2FkLCBudWxsKTsKKwkJfQorCisJCWZvciAoRW50cnk8U3RyaW5nLCBMaXN0PFZhbHVlPj4gZW50cnkgOiBpbnNlcnRNYXAuZW50cnlTZXQoKSkgeworCQkJQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEVudGl0eVR5cGUoKS5nZXRBdHRyaWJ1dGUoZW50cnkuZ2V0S2V5KCkpOworCisJCQlBSUROYW1lVmFsdWVTZXFVbml0SWQgYW52c3UgPSBuZXcgQUlETmFtZVZhbHVlU2VxVW5pdElkKCk7CisJCQlhbnZzdS5hdHRyID0gbmV3IEFJRE5hbWUoYUlELCBlbnRyeS5nZXRLZXkoKSk7CisJCQlhbnZzdS51bml0SWQgPSBPRFNDb252ZXJ0ZXIudG9PRFNMb25nKDApOworCQkJYW52c3UudmFsdWVzID0gT0RTQ29udmVydGVyLnRvT0RTVmFsdWVTZXEoYXR0cmlidXRlLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJCWFudnN1TGlzdC5hZGQoYW52c3UpOworCQl9CisKKwkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCQlFbGVtSWRbXSBlbGVtSWRzID0gZ2V0QXBwbEVsZW1BY2Nlc3MoKQorCQkJCS5pbnNlcnRJbnN0YW5jZXMoYW52c3VMaXN0LnRvQXJyYXkobmV3IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZFthbnZzdUxpc3Quc2l6ZSgpXSkpOworCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1JZHMubGVuZ3RoOyBpKyspIHsKKwkJCWNvcmVzLmdldChpKS5zZXRJRChMb25nLnRvU3RyaW5nKE9EU0NvbnZlcnRlci5mcm9tT0RTTG9uZyhlbGVtSWRzW2ldLmlpZCkpKTsKKwkJfQorCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworCQlMT0dHRVIuZGVidWcoInt9ICIgKyBnZXRFbnRpdHlUeXBlKCkgKyAiIGluc3RhbmNlcyBjcmVhdGVkIGluIHt9IG1zLiIsIGVsZW1JZHMubGVuZ3RoLCBzdG9wIC0gc3RhcnQpOworCisJCWZvciAoTGlzdDxFbnRpdHk+IGNoaWxkcmVuIDogY2hpbGRyZW5NYXAudmFsdWVzKCkpIHsKKwkJCWdldFRyYW5zYWN0aW9uKCkuY3JlYXRlKGNoaWxkcmVuKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJlYWRzIGdpdmVuIHtAbGluayBDb3JlfSBhbmQgcHJlcGFyZXMgaXRzIGRhdGEgdG8gYmUgd3JpdHRlbjoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+Y29sbGVjdCBuZXcge0BsaW5rIEZpbGVMaW5rfXM8L2xpPgorCSAqIDxsaT50cmFjZSBtaXNzaW5nIHNvcnQgaW5kaWNlcyBvZiBUZXN0U3RlcHM8L2xpPgorCSAqIDxsaT5jb2xsZWN0IHByb3BlcnR5IHtAbGluayBWYWx1ZX1zPC9saT4KKwkgKiA8bGk+Y29sbGVjdCBmb3JlaWduIGtleSB7QGNvZGUgVmFsdWV9czwvbGk+CisJICogPGxpPmNvbGxlY3QgY2hpbGQgZW50aXRpZXMgZm9yIHJlY3Vyc2l2ZSBjcmVhdGlvbjwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGNvZGUgQ29yZX0uCisJICovCisJcHJpdmF0ZSB2b2lkIHJlYWRFbnRpdHlDb3JlKENvcmUgY29yZSkgeworCQlpZiAoIWNvcmUuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoZ2V0RW50aXR5VHlwZSgpLmdldE5hbWUoKSkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudGl0eSBjb3JlICciICsgY29yZS5nZXRUeXBlTmFtZSgpCisJCQkJCSsgIicgaXMgaW5jb21wYXRpYmxlIHdpdGggY3VycmVudCBpbnNlcnQgc3RhdGVtZW50IGZvciBlbnRpdHkgdHlwZSAnIiArIGdldEVudGl0eVR5cGUoKSArICInLiIpOworCQl9CisKKwkJY29yZXMuYWRkKGNvcmUpOworCisJCWlmIChsb2FkU29ydEluZGV4KSB7CisJCQlpZiAoKEludGVnZXIpIGNvcmUuZ2V0VmFsdWVzKCkuZ2V0KFNvcnRhYmxlLkFUVFJfU09SVF9JTkRFWCkuZXh0cmFjdCgpIDwgMCkgeworCQkJCXNvcnRJbmRleFRlc3RTdGVwcy5jb21wdXRlSWZBYnNlbnQoY29yZS5nZXRQZXJtYW5lbnRTdG9yZSgpLmdldChUZXN0LmNsYXNzKS5nZXRJRCgpLAorCQkJCQkJayAtPiBuZXcgU29ydEluZGV4VGVzdFN0ZXBzKCkpLnRlc3RTdGVwQ29yZXMuYWRkKGNvcmUpOworCQkJfQorCQl9CisKKwkJLy8gYWRkIGFsbCBlbnRpdHkgdmFsdWVzCisJCWZvciAoVmFsdWUgdmFsdWUgOiBjb3JlLmdldEFsbFZhbHVlcygpLnZhbHVlcygpKSB7CisJCQlpbnNlcnRNYXAuY29tcHV0ZUlmQWJzZW50KHZhbHVlLmdldE5hbWUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkuYWRkKHZhbHVlKTsKKwkJfQorCisJCS8vIGNvbGxlY3QgZmlsZSBsaW5rcworCQlmaWxlTGlua1RvVXBsb2FkLmFkZEFsbChjb3JlLmdldEFkZGVkRmlsZUxpbmtzKCkpOworCisJCS8vIGRlZmluZSAiZW1wdHkiIHZhbHVlcyBmb3IgaW5mb3JtYXRpdmUgcmVsYXRpb25zCisJCWZvciAoUmVsYXRpb24gcmVsYXRpb24gOiBnZXRFbnRpdHlUeXBlKCkuZ2V0SW5mb1JlbGF0aW9ucygpKSB7CisJCQlpbnNlcnRNYXAuY29tcHV0ZUlmQWJzZW50KHJlbGF0aW9uLmdldE5hbWUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkuYWRkKHJlbGF0aW9uLmNyZWF0ZVZhbHVlKCkpOworCQl9CisKKwkJLy8gZGVmaW5lICJlbXB0eSIgdmFsdWVzIGZvciBwYXJlbnQgcmVsYXRpb25zCisJCWZvciAoUmVsYXRpb24gcmVsYXRpb24gOiBnZXRFbnRpdHlUeXBlKCkuZ2V0UGFyZW50UmVsYXRpb25zKCkpIHsKKwkJCWluc2VydE1hcC5jb21wdXRlSWZBYnNlbnQocmVsYXRpb24uZ2V0TmFtZSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQocmVsYXRpb24uY3JlYXRlVmFsdWUoKSk7CisJCX0KKworCQkvLyByZXBsYWNlICJlbXB0eSIgcmVsYXRpb24gdmFsdWVzIHdpdGggY29ycmVzcG9uZGluZyBpbnN0YW5jZSBJRHMKKwkJc2V0UmVsYXRpb25JRHMoY29yZS5nZXRNdXRhYmxlU3RvcmUoKS5nZXRDdXJyZW50KCkpOworCQlzZXRSZWxhdGlvbklEcyhjb3JlLmdldFBlcm1hbmVudFN0b3JlKCkuZ2V0Q3VycmVudCgpKTsKKworCQlmb3IgKEVudHJ5PENsYXNzPD8gZXh0ZW5kcyBEZWxldGFibGU+LCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBlbnRyeSA6IGNvcmUuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldEN1cnJlbnQoKQorCQkJCS5lbnRyeVNldCgpKSB7CisJCQljaGlsZHJlbk1hcC5jb21wdXRlSWZBYnNlbnQoZW50cnkuZ2V0S2V5KCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJfQorCisJCWdldFRyYW5zYWN0aW9uKCkuYWRkTW9kaWZpZWQoY29yZSk7CisJCWdldFRyYW5zYWN0aW9uKCkuYWRkQ3JlYXRlZChjb3JlKTsKKwl9CisKKwkvKioKKwkgKiBPdmVyd3JpdGVzIGVtcHR5IGZvcmVpZ24ga2V5IHtAbGluayBWYWx1ZX0gY29udGFpbmVycy4KKwkgKgorCSAqIEBwYXJhbSByZWxhdGVkRW50aXRpZXMgVGhlIHJlbGF0ZWQge0BsaW5rIEVudGl0eX1zLgorCSAqLworCXByaXZhdGUgdm9pZCBzZXRSZWxhdGlvbklEcyhDb2xsZWN0aW9uPEVudGl0eT4gcmVsYXRlZEVudGl0aWVzKSB7CisJCWZvciAoRW50aXR5IHJlbGF0ZWRFbnRpdHkgOiByZWxhdGVkRW50aXRpZXMpIHsKKwkJCWlmICghT0RTVXRpbHMuaXNWYWxpZElEKHJlbGF0ZWRFbnRpdHkuZ2V0SUQoKSkpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWxhdGVkIGVudGl0eSBtdXN0IGJlIGEgcGVyc2l0ZWQgZW50aXR5LiIpOworCQkJfQorCisJCQlSZWxhdGlvbiByZWxhdGlvbiA9IGdldEVudGl0eVR5cGUoKS5nZXRSZWxhdGlvbihnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKHJlbGF0ZWRFbnRpdHkpKTsKKwkJCUxpc3Q8VmFsdWU+IHJlbGF0aW9uVmFsdWVzID0gaW5zZXJ0TWFwLmdldChyZWxhdGlvbi5nZXROYW1lKCkpOworCQkJaWYgKHJlbGF0aW9uVmFsdWVzID09IG51bGwpIHsKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZWxhdGlvbiAnIiArIHJlbGF0aW9uICsgIicgaXMgaW5jb21wYXRpYmxlIHdpdGggaW5zZXJ0IHN0YXRlbWVudCAiCisJCQkJCQkrICJmb3IgZW50aXR5IHR5cGUgJyIgKyBnZXRFbnRpdHlUeXBlKCkgKyAiJyIpOworCQkJfQorCQkJcmVsYXRpb25WYWx1ZXMuZ2V0KHJlbGF0aW9uVmFsdWVzLnNpemUoKSAtIDEpLnNldChyZWxhdGVkRW50aXR5LmdldElEKCkpOworCQl9CisJfQorCisJLyoqCisJICogQWRqdXN0cyBtaXNzaW5nIHNvcnQgaW5kaWNlcyBmb3Ige0BsaW5rIFRlc3RTdGVwfXMgYnkgcXVlcnlpbmcgbGFzdCB1c2VkIG1heAorCSAqIHNvcnQgaW5kZXguCisJICoKKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHVuYWJsZSB0byBxdWVyeSB1c2VkIHNvcnQgaW5kaWNlcy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgYWRqdXN0TWlzc2luZ1NvcnRJbmRpY2VzKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlFbnRpdHlUeXBlIHRlc3RTdGVwID0gZ2V0RW50aXR5VHlwZSgpOworCQlFbnRpdHlUeXBlIHRlc3QgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKFRlc3QuY2xhc3MpOworCQlSZWxhdGlvbiBwYXJlbnRSZWxhdGlvbiA9IHRlc3RTdGVwLmdldFJlbGF0aW9uKHRlc3QpOworCisJCUF0dHJpYnV0ZSBhdHRyU29ydEluZGV4ID0gdGVzdFN0ZXAuZ2V0QXR0cmlidXRlKFNvcnRhYmxlLkFUVFJfU09SVF9JTkRFWCk7CisJCVF1ZXJ5IHF1ZXJ5ID0gZ2V0UXVlcnlTZXJ2aWNlKCkuY3JlYXRlUXVlcnkoKS5zZWxlY3QocGFyZW50UmVsYXRpb24uZ2V0QXR0cmlidXRlKCkpCisJCQkJLnNlbGVjdChhdHRyU29ydEluZGV4LCBBZ2dyZWdhdGlvbi5NQVhJTVVNKS5ncm91cChwYXJlbnRSZWxhdGlvbi5nZXRBdHRyaWJ1dGUoKSk7CisKKwkJRmlsdGVyIGZpbHRlciA9IEZpbHRlci5pZHNPbmx5KHBhcmVudFJlbGF0aW9uLCBzb3J0SW5kZXhUZXN0U3RlcHMua2V5U2V0KCkpOworCQlmb3IgKFJlc3VsdCByZXN1bHQgOiBxdWVyeS5mZXRjaChmaWx0ZXIpKSB7CisJCQlSZWNvcmQgcmVjb3JkID0gcmVzdWx0LmdldFJlY29yZCh0ZXN0U3RlcCk7CisJCQlpbnQgc29ydEluZGV4ID0gcmVzdWx0LmdldFZhbHVlKGF0dHJTb3J0SW5kZXgsIEFnZ3JlZ2F0aW9uLk1BWElNVU0pLmV4dHJhY3QoKTsKKwkJCXNvcnRJbmRleFRlc3RTdGVwcy5yZW1vdmUocmVjb3JkLmdldElEKHBhcmVudFJlbGF0aW9uKS5nZXQoKSkuc2V0SW5kaWNlcyhzb3J0SW5kZXggKyAxKTsKKwkJfQorCisJCS8vIHN0YXJ0IGF0IDEgZm9yIGFsbCByZW1haW5pbmcKKwkJc29ydEluZGV4VGVzdFN0ZXBzLnZhbHVlcygpLmZvckVhY2godHNzIC0+IHRzcy5zZXRJbmRpY2VzKDApKTsKKwl9CisKKwkvKioKKwkgKiBVdGlsaXR5IGNsYXNzIHRvIHdyaXRlIG1pc3Npbmcgc29ydCBpbmRleCBvZiBuZXcge0BsaW5rIFRlc3RTdGVwfXMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU29ydEluZGV4VGVzdFN0ZXBzIHsKKworCQlwcml2YXRlIExpc3Q8Q29yZT4gdGVzdFN0ZXBDb3JlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCS8qKgorCQkgKiBBc3NpZ25zIHNvcnQgaW5kaWNlcyB0byB7QGxpbmsgQ29yZX1zIHN0YXJ0aW5nIGF0IGdpdmVuIGluZGV4LgorCQkgKgorCQkgKiBAcGFyYW0gc3RhcnRJbmRleCBUaGUgc3RhcnQgaW5kZXguCisJCSAqLworCQlwcml2YXRlIHZvaWQgc2V0SW5kaWNlcyhpbnQgc3RhcnRJbmRleCkgeworCQkJaW50IGluZGV4ID0gc3RhcnRJbmRleDsKKwkJCWZvciAoQ29yZSBjb3JlIDogdGVzdFN0ZXBDb3JlcykgeworCQkJCWNvcmUuZ2V0VmFsdWVzKCkuZ2V0KFNvcnRhYmxlLkFUVFJfU09SVF9JTkRFWCkuc2V0KGluZGV4KyspOworCQkJfQorCQl9CisKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9PRFNUcmFuc2FjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL09EU1RyYW5zYWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4MjViNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9PRFNUcmFuc2FjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQ4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnRyYW5zYWN0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5FbGVtSWQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNldFR5cGU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuV3JpdGVSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLkNhdGFsb2dTZW5zb3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuVHJhbnNmZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0VudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIE9EUyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRyYW5zYWN0aW9ufSBpbnRlcmZhY2UuCisgKgorICogQHNpbmNlIDEuMC4wCisgKiBAYXV0aG9yIFZpa3RvciBTdG9laHIsIEdpZ2F0cm9uaWsgSW5nb2xzdGFkdCBHbWJICisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPRFNUcmFuc2FjdGlvbiBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uIHsKKworCS8vIFRPRE86IGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhIGF0dGFjaCBhIHByb2dyZXNzIGxpc3RlbmVyCisJLy8gLT4gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uIHVwZGF0ZXMgd2hpbGUgdXBsb2FkaW5nIGZpbGVzCisJLy8gLT4gYW55IG90aGVyIHVzZWZ1bCBpbmZvcm1hdGlvbnM/IQorCS8vIC0+IHNwbGl0dGluZyBvZiB0YXNrcyBpbnRvIHN1YnRhc2tzIG1heSBiZSByZXF1aXJlZC4uLgorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU1RyYW5zYWN0aW9uLmNsYXNzKTsKKworCS8vIHRoaXMgb25lIGlzIHN0b3JlZCBpbiBjYXNlIG9mIGFwcGxpY2F0aW9uIG1vZGVsIG1vZGlmaWNhdGlvbnMKKwlwcml2YXRlIGZpbmFsIE9EU0NvbnRleHQgcGFyZW50Q29udGV4dDsKKworCS8vIHRoaXMgb25lIGlzIHVzZWQgdG8gYWNjZXNzIHRoZSBhcHBsaWNhdGlvbiBtb2RlbCBhbmQgZXhlY3V0ZSBxdWVyaWVzCisJLy8gaW5zdGFuY2UgaXMgZGVjb3VwbGVkIGZyb20gaXRzIHBhcmVudAorCXByaXZhdGUgZmluYWwgT0RTQ29udGV4dCBjb250ZXh0OworCisJLy8gb25seSBmb3IgbG9nZ2luZworCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKworCS8vIG5lZWQgdG8gd3JpdGUgdmVyc2lvbiA9PSBpbnN0YW5jZUlEIC0+IHVwZGF0ZSBhZnRlciBjcmVhdGUKKwlwcml2YXRlIGZpbmFsIExpc3Q8Q29udGV4dFJvb3Q+IGNvbnRleHRSb290cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJLy8gcmVzZXQgaW5zdGFuY2UgSURzIG9uIGFib3J0CisJcHJpdmF0ZSBmaW5hbCBMaXN0PENvcmU+IGNyZWF0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCS8vIGFwcGx5IGNoYW5nZXMKKwlwcml2YXRlIGZpbmFsIExpc3Q8Q29yZT4gbW9kaWZpZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCXByaXZhdGUgZmluYWwgRW50aXR5IGVudGl0eTsKKwlwcml2YXRlIGZpbmFsIFRyYW5zZmVyIHRyYW5zZmVyOworCisJcHJpdmF0ZSBVcGxvYWRTZXJ2aWNlIHVwbG9hZFNlcnZpY2U7CisKKwlwcml2YXRlIENhdGFsb2dNYW5hZ2VyIGNhdGFsb2dNYW5hZ2VyOworCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gcGFyZW50TW9kZWxNYW5hZ2VyIFVzZWQgdG8gYWNjZXNzIHRoZSBwZXJzaXN0ZW5jZS4KKwkgKiBAcGFyYW0gZW50aXR5ICAgICAgICAgICAgIFVzZWQgZm9yIHNlY3VyaXR5IGNoZWNrcworCSAqIEBwYXJhbSB0cmFuc2ZlciAgICAgICAgICAgVGhlIGZpbGUgdHJhbnNmZXIgdHlwZS4KKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gc3RhcnQgYSBjby1zZXNzaW9uLgorCSAqLworCXB1YmxpYyBPRFNUcmFuc2FjdGlvbihPRFNDb250ZXh0IHBhcmVudENvbnRleHQsIEVudGl0eSBlbnRpdHksIFRyYW5zZmVyIHRyYW5zZmVyKSB0aHJvd3MgQW9FeGNlcHRpb24geworCQl0aGlzLnBhcmVudENvbnRleHQgPSBwYXJlbnRDb250ZXh0OworCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKKwkJdGhpcy50cmFuc2ZlciA9IHRyYW5zZmVyOworCQljb250ZXh0ID0gcGFyZW50Q29udGV4dC5uZXdDb250ZXh0KCk7CisJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuc3RhcnRUcmFuc2FjdGlvbigpOworCQlMT0dHRVIuZGVidWcoIlRyYW5zYWN0aW9uICd7fScgc3RhcnRlZC4iLCBpZCk7CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCXB1YmxpYyA8VCBleHRlbmRzIEVudGl0eT4gdm9pZCBjcmVhdGUoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlpZiAoZW50aXRpZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSBpZiAoZW50aXRpZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIGdpdmVuIGVudGl0eSBpcyBhbHJlYWR5IHBlcnNpc3RlZC4iKTsKKwkJfQorCisJCXRyeSB7CisJCQlNYXA8Q2xhc3M8Pz4sIExpc3Q8VD4+IGVudGl0aWVzQnlDbGFzc1R5cGUgPSBlbnRpdGllcy5zdHJlYW0oKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoZSAtPiBlLmdldENsYXNzKCkpKTsKKworCQkJTGlzdDxDYXRhbG9nQ29tcG9uZW50PiBjYXRhbG9nQ29tcG9uZW50cyA9IChMaXN0PENhdGFsb2dDb21wb25lbnQ+KSBlbnRpdGllc0J5Q2xhc3NUeXBlCisJCQkJCS5nZXQoQ2F0YWxvZ0NvbXBvbmVudC5jbGFzcyk7CisJCQlpZiAoY2F0YWxvZ0NvbXBvbmVudHMgIT0gbnVsbCkgeworCQkJCWdldENhdGFsb2dNYW5hZ2VyKCkuY3JlYXRlQ2F0YWxvZ0NvbXBvbmVudHMoY2F0YWxvZ0NvbXBvbmVudHMpOworCQkJfQorCisJCQlMaXN0PENhdGFsb2dTZW5zb3I+IGNhdGFsb2dTZW5zb3JzID0gKExpc3Q8Q2F0YWxvZ1NlbnNvcj4pIGVudGl0aWVzQnlDbGFzc1R5cGUuZ2V0KENhdGFsb2dTZW5zb3IuY2xhc3MpOworCQkJaWYgKGNhdGFsb2dTZW5zb3JzICE9IG51bGwpIHsKKwkJCQkvLyBUT0RPIGFuZWhtZXIgb24gMjAxNy0xMS0xNjogYXZhbG9uIDQuM2IgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpbgorCQkJCS8vIEFvU2Vzc2lvbi5jb21taXRUcmFuc2FjdGlvbigpIGlmIG11bHRpcGxlCisJCQkJLy8gY2F0YWxvZyBzZW5zb3JzIGhhdmUgYmVlbiBkZWxldGVkIGFuZCBsZWF2ZXMgdGhlIGFwcGxpY2F0aW9uCisJCQkJLy8gbW9kZWwgaW4gYSBicm9rZW4gc3RhdGUuIFRoaXMgaXMgYWxzbyBzdGF0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoaXMKKwkJCQkvLyBjb21tZW50IHNob3VsZCBiZSByZW1vdmVkIGxhdGVyLgorCQkJCWdldENhdGFsb2dNYW5hZ2VyKCkuY3JlYXRlQ2F0YWxvZ1NlbnNvcnMoY2F0YWxvZ1NlbnNvcnMpOworCQkJfQorCisJCQlMaXN0PENhdGFsb2dBdHRyaWJ1dGU+IGNhdGFsb2dBdHRyaWJ1dGVzID0gKExpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4pIGVudGl0aWVzQnlDbGFzc1R5cGUKKwkJCQkJLmdldChDYXRhbG9nQXR0cmlidXRlLmNsYXNzKTsKKwkJCWlmIChjYXRhbG9nQXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQkJZ2V0Q2F0YWxvZ01hbmFnZXIoKS5jcmVhdGVDYXRhbG9nQXR0cmlidXRlcyhjYXRhbG9nQXR0cmlidXRlcyk7CisJCQl9CisKKwkJCUxpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+IHRlbXBsYXRlQXR0cmlidXRlcyA9IChMaXN0PFRlbXBsYXRlQXR0cmlidXRlPikgZW50aXRpZXNCeUNsYXNzVHlwZQorCQkJCQkuZ2V0KFRlbXBsYXRlQXR0cmlidXRlLmNsYXNzKTsKKwkJCWlmICh0ZW1wbGF0ZUF0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJCUxpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+IGZpbHRlcmVkID0gZ2V0RmlsZUxpbmtUZW1wbGF0ZUF0dHJpYnV0ZXModGVtcGxhdGVBdHRyaWJ1dGVzKTsKKwkJCQlpZiAoIWZpbHRlcmVkLmlzRW1wdHkoKSkgeworCQkJCQlnZXRVcGxvYWRTZXJ2aWNlKCkudXBsb2FkKGZpbHRlcmVkLCBudWxsKTsKKwkJCQl9CisJCQl9CisKKwkJCUxpc3Q8VGVzdFN0ZXA+IHRlc3RTdGVwcyA9IChMaXN0PFRlc3RTdGVwPikgZW50aXRpZXNCeUNsYXNzVHlwZS5nZXQoVGVzdFN0ZXAuY2xhc3MpOworCQkJaWYgKHRlc3RTdGVwcyAhPSBudWxsKSB7CisJCQkJY3JlYXRlKHRlc3RTdGVwcy5zdHJlYW0oKS5tYXAoQ29udGV4dFJvb3Q6Om9mKS5jb2xsZWN0KEFycmF5TGlzdDo6bmV3LCBMaXN0OjphZGRBbGwsIExpc3Q6OmFkZEFsbCkpOworCQkJfQorCisJCQlMaXN0PE1lYXN1cmVtZW50PiBtZWFzdXJlbWVudHMgPSAoTGlzdDxNZWFzdXJlbWVudD4pIGVudGl0aWVzQnlDbGFzc1R5cGUuZ2V0KE1lYXN1cmVtZW50LmNsYXNzKTsKKwkJCWlmIChtZWFzdXJlbWVudHMgIT0gbnVsbCkgeworCQkJCS8vIFVzZSBzZXQgaGVyZSwgc2luY2UgbWVhc3VyZW1lbnQgc2libGluZ3MgcG9pbnQgdG8gdGhlIHNhbWUKKwkJCQkvLyBjb250ZXh0IHJvb3RzLiBPbmx5IGNyZWF0ZSB0aG9zZSBDb250ZXh0Um9vdHMgdGhhdCBoYXZlbid0IGJlZW4gY3JlYXRlZCB5ZXQ6CisJCQkJY3JlYXRlKG1lYXN1cmVtZW50cy5zdHJlYW0oKS5tYXAoQ29udGV4dFJvb3Q6Om9mKQorCQkJCQkJLmNvbGxlY3QoSGFzaFNldDxDb250ZXh0Um9vdD46Om5ldywgU2V0PENvbnRleHRSb290Pjo6YWRkQWxsLCBTZXQ8Q29udGV4dFJvb3Q+OjphZGRBbGwpLnN0cmVhbSgpCisJCQkJCQkuZmlsdGVyKGNyIC0+ICFPRFNVdGlscy5pc1ZhbGlkSUQoY3IuZ2V0SUQoKSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisJCQl9CisKKwkJCWV4ZWN1dGVTdGF0ZW1lbnRzKGV0IC0+IG5ldyBJbnNlcnRTdGF0ZW1lbnQodGhpcywgZXQpLCBlbnRpdGllcyk7CisJCQlwcm9jZXNzTnRvTVJlbGF0aW9ucyhlbnRpdGllcyk7CisKKwkJCUxpc3Q8Q29udGV4dFJvb3Q+IHJvb3RzID0gKExpc3Q8Q29udGV4dFJvb3Q+KSBlbnRpdGllc0J5Q2xhc3NUeXBlLmdldChDb250ZXh0Um9vdC5jbGFzcyk7CisJCQlpZiAocm9vdHMgIT0gbnVsbCkgeworCQkJCXJvb3RzLmZvckVhY2goY29udGV4dFJvb3QgLT4geworCQkJCQljb250ZXh0Um9vdC5zZXRWZXJzaW9uKGNvbnRleHRSb290LmdldElEKCkudG9TdHJpbmcoKSk7CisJCQkJfSk7CisKKwkJCQkvLyB0aGlzIHdpbGwgcmVzdG9yZSB0aGUgQVNBTSBwYXRoIG9mIGVhY2ggY29udGV4dCByb290CisJCQkJZXhlY3V0ZVN0YXRlbWVudHMoZXQgLT4gbmV3IFVwZGF0ZVN0YXRlbWVudCh0aGlzLCBldCwgdHJ1ZSksIHJvb3RzKTsKKwkJCQljb250ZXh0Um9vdHMuYWRkQWxsKHJvb3RzKTsKKwkJCX0KKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBuZXcgZW50aXRpZXMgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIHdyaXRlIG5ldyBlbnRpdGllcyBkdWUgdG86ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiB7QGluaGVyaXREb2N9CisJICovCisJQE92ZXJyaWRlCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHVibGljIDxUIGV4dGVuZHMgRW50aXR5PiB2b2lkIHVwZGF0ZShDb2xsZWN0aW9uPFQ+IGVudGl0aWVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmIChlbnRpdGllcy5pc0VtcHR5KCkpIHsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChlbnRpdGllcy5zdHJlYW0oKS5maWx0ZXIoZSAtPiAhT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpLmZpbmRBbnkoKS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQXQgbGVhc3Qgb25lIGdpdmVuIGVudGl0eSBpcyBub3QgeWV0IHBlcnNpc3RlZC4iKTsKKwkJfQorCisJCXRyeSB7CisJCQlNYXA8Q2xhc3M8Pz4sIExpc3Q8VD4+IGVudGl0aWVzQnlDbGFzc1R5cGUgPSBlbnRpdGllcy5zdHJlYW0oKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLmdyb3VwaW5nQnkoZSAtPiBlLmdldENsYXNzKCkpKTsKKwkJCUxpc3Q8Q2F0YWxvZ0F0dHJpYnV0ZT4gY2F0YWxvZ0F0dHJpYnV0ZXMgPSAoTGlzdDxDYXRhbG9nQXR0cmlidXRlPikgZW50aXRpZXNCeUNsYXNzVHlwZQorCQkJCQkuZ2V0KENhdGFsb2dBdHRyaWJ1dGUuY2xhc3MpOworCQkJaWYgKGNhdGFsb2dBdHRyaWJ1dGVzICE9IG51bGwpIHsKKwkJCQlnZXRDYXRhbG9nTWFuYWdlcigpLnVwZGF0ZUNhdGFsb2dBdHRyaWJ1dGVzKGNhdGFsb2dBdHRyaWJ1dGVzKTsKKwkJCX0KKworCQkJTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzID0gKExpc3Q8VGVtcGxhdGVBdHRyaWJ1dGU+KSBlbnRpdGllc0J5Q2xhc3NUeXBlCisJCQkJCS5nZXQoVGVtcGxhdGVBdHRyaWJ1dGUuY2xhc3MpOworCQkJaWYgKHRlbXBsYXRlQXR0cmlidXRlcyAhPSBudWxsKSB7CisJCQkJTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZmlsdGVyZWQgPSBnZXRGaWxlTGlua1RlbXBsYXRlQXR0cmlidXRlcyh0ZW1wbGF0ZUF0dHJpYnV0ZXMpOworCQkJCWlmICghZmlsdGVyZWQuaXNFbXB0eSgpKSB7CisJCQkJCWdldFVwbG9hZFNlcnZpY2UoKS51cGxvYWQoZmlsdGVyZWQsIG51bGwpOworCQkJCX0KKwkJCX0KKwkJCWV4ZWN1dGVTdGF0ZW1lbnRzKGV0IC0+IG5ldyBVcGRhdGVTdGF0ZW1lbnQodGhpcywgZXQsIGZhbHNlKSwgZW50aXRpZXMpOworCQkJcHJvY2Vzc050b01SZWxhdGlvbnMoZW50aXRpZXMpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIHVwZGF0ZSBlbnRpdGllcyBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gdXBkYXRlIGVudGl0aWVzIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlwdWJsaWMgPFQgZXh0ZW5kcyBEZWxldGFibGU+IHZvaWQgZGVsZXRlKENvbGxlY3Rpb248VD4gZW50aXRpZXMpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJaWYgKGVudGl0aWVzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJTGlzdDxUPiBmaWx0ZXJlZEVudGl0aWVzID0gZW50aXRpZXMuc3RyZWFtKCkuZmlsdGVyKGUgLT4gT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKwkJdHJ5IHsKKwkJCU1hcDxDbGFzczw/PiwgTGlzdDxUPj4gZW50aXRpZXNCeUNsYXNzVHlwZSA9IGZpbHRlcmVkRW50aXRpZXMuc3RyZWFtKCkKKwkJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGUgLT4gZS5nZXRDbGFzcygpKSk7CisKKwkJCUxpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4gY2F0YWxvZ0NvbXBvbmVudHMgPSAoTGlzdDxDYXRhbG9nQ29tcG9uZW50PikgZW50aXRpZXNCeUNsYXNzVHlwZQorCQkJCQkuZ2V0KENhdGFsb2dDb21wb25lbnQuY2xhc3MpOworCQkJaWYgKGNhdGFsb2dDb21wb25lbnRzICE9IG51bGwpIHsKKwkJCQlnZXRDYXRhbG9nTWFuYWdlcigpLmRlbGV0ZUNhdGFsb2dDb21wb25lbnRzKGNhdGFsb2dDb21wb25lbnRzKTsKKwkJCX0KKworCQkJTGlzdDxDYXRhbG9nU2Vuc29yPiBjYXRhbG9nU2Vuc29ycyA9IChMaXN0PENhdGFsb2dTZW5zb3I+KSBlbnRpdGllc0J5Q2xhc3NUeXBlLmdldChDYXRhbG9nU2Vuc29yLmNsYXNzKTsKKwkJCWlmIChjYXRhbG9nU2Vuc29ycyAhPSBudWxsKSB7CisJCQkJLy8gVE9ETyBhbmVobWVyIG9uIDIwMTctMTEtMTY6IGF2YWxvbiA0LjNiIHRocm93cyBhbiBleGNlcHRpb24gaW4KKwkJCQkvLyBBb1Nlc3Npb24uY29tbWl0VHJhbnNhY3Rpb24oKSBpZiBtdWx0aXBsZQorCQkJCS8vIGNhdGFsb2cgc2Vuc29ycyBoYXZlIGJlZW4gZGVsZXRlZCBhbmQgbGVhdmVzIHRoZSBhcHBsaWNhdGlvbgorCQkJCS8vIG1vZGVsIGluIGEgYnJva2VuIHN0YXRlLiBUaGlzIGlzIGFsc28gc3RhdGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzCisJCQkJLy8gY29tbWVudCBzaG91bGQgYmUgcmVtb3ZlZCBsYXRlci4KKwkJCQlnZXRDYXRhbG9nTWFuYWdlcigpLmRlbGV0ZUNhdGFsb2dTZW5zb3JzKGNhdGFsb2dTZW5zb3JzKTsKKwkJCX0KKworCQkJTGlzdDxDYXRhbG9nQXR0cmlidXRlPiBjYXRhbG9nQXR0cmlidXRlcyA9IChMaXN0PENhdGFsb2dBdHRyaWJ1dGU+KSBlbnRpdGllc0J5Q2xhc3NUeXBlCisJCQkJCS5nZXQoQ2F0YWxvZ0F0dHJpYnV0ZS5jbGFzcyk7CisJCQlpZiAoY2F0YWxvZ0F0dHJpYnV0ZXMgIT0gbnVsbCkgeworCQkJCWdldENhdGFsb2dNYW5hZ2VyKCkuZGVsZXRlQ2F0YWxvZ0F0dHJpYnV0ZXMoY2F0YWxvZ0F0dHJpYnV0ZXMpOworCQkJfQorCisJCQkvKgorCQkJICogVE9ETzogZm9yIGFueSB0ZW1wbGF0ZSB0aGF0IGhhcyB0byBiZSBkZWxldGVkIGl0IGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGVyZQorCQkJICogYXJlIG5vIGxpbmtzIHRvIGl0Li4uCisJCQkgKi8KKworCQkJZXhlY3V0ZVN0YXRlbWVudHMoZXQgLT4gbmV3IERlbGV0ZVN0YXRlbWVudCh0aGlzLCBldCwgdHJ1ZSksIGZpbHRlcmVkRW50aXRpZXMpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIGRlbGV0ZSBlbnRpdGllcyBkdWUgdG86ICIgKyBlLnJlYXNvbiwgZSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gZGVsZXRlIGVudGl0aWVzIGR1ZSB0bzogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJfQorCX0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCB3cml0ZU1lYXN1cmVkVmFsdWVzKENvbGxlY3Rpb248V3JpdGVSZXF1ZXN0PiB3cml0ZVJlcXVlc3RzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmICh3cml0ZVJlcXVlc3RzLmlzRW1wdHkoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJdHJ5IHsKKwkJCU1hcDxTY2FsYXJUeXBlLCBMaXN0PFdyaXRlUmVxdWVzdD4+IHdyaXRlUmVxdWVzdHNCeVJhd1R5cGUgPSB3cml0ZVJlcXVlc3RzLnN0cmVhbSgpCisJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShXcml0ZVJlcXVlc3Q6OmdldFJhd1NjYWxhclR5cGUpKTsKKworCQkJZm9yIChMaXN0PFdyaXRlUmVxdWVzdD4gd3JpdGVSZXF1ZXN0R3JvdXAgOiB3cml0ZVJlcXVlc3RzQnlSYXdUeXBlLnZhbHVlcygpKSB7CisJCQkJV3JpdGVSZXF1ZXN0SGFuZGxlciB3cml0ZVJlcXVlc3RIYW5kbGVyID0gbmV3IFdyaXRlUmVxdWVzdEhhbmRsZXIodGhpcyk7CisJCQkJTGlzdDxDaGFubmVsPiBjaGFubmVscyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisJCQkJZm9yIChXcml0ZVJlcXVlc3Qgd3JpdGVSZXF1ZXN0IDogd3JpdGVSZXF1ZXN0R3JvdXApIHsKKwkJCQkJQ2hhbm5lbCBjaGFubmVsID0gd3JpdGVSZXF1ZXN0LmdldENoYW5uZWwoKTsKKwkJCQkJY2hhbm5lbC5zZXRTY2FsYXJUeXBlKHdyaXRlUmVxdWVzdC5nZXRDYWxjdWxhdGVkU2NhbGFyVHlwZSgpKTsKKwkJCQkJLy8gVE9ETyBpdCBtaWdodCBiZSByZXF1aXJlZCB0byBjaGFuZ2UgcmVsYXRpb24gdG8gYW5vdGhlcgorCQkJCQkvLyB1bml0PyE/PworCQkJCQljaGFubmVscy5hZGQoY2hhbm5lbCk7CisJCQkJCXdyaXRlUmVxdWVzdEhhbmRsZXIuYWRkUmVxdWVzdCh3cml0ZVJlcXVlc3QpOworCQkJCX0KKworCQkJCXVwZGF0ZShjaGFubmVscyk7CisJCQkJd3JpdGVSZXF1ZXN0SGFuZGxlci5leGVjdXRlKCk7CisJCQl9CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJVbmFibGUgdG8gd3JpdGUgbWVhc3VyZWQgdmFsdWVzIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIlVuYWJsZSB0byB3cml0ZSBtZWFzdXJlZCB2YWx1ZXMgZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCksIGUpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuY29tbWl0VHJhbnNhY3Rpb24oKTsKKworCQkJLy8gY29tbWl0IHN1Y2NlZWQgLT4gYXBwbHkgY2hhbmdlcyBpbiBlbnRpdHkgY29yZXMKKwkJCW1vZGlmaWVkLmZvckVhY2goQ29yZTo6YXBwbHkpOworCisJCQkvLyByZW1vdmUgZGVsZXRlZCByZW1vdGUgZmlsZXMKKwkJCWlmICh1cGxvYWRTZXJ2aWNlICE9IG51bGwpIHsKKwkJCQl1cGxvYWRTZXJ2aWNlLmNvbW1pdCgpOworCQkJfQorCisJCQlpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkgeworCQkJCS8vIGFwcGxpY2F0aW9uIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkIC0+IHJlbG9hZAorCQkJCXBhcmVudENvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkucmVsb2FkQXBwbGljYXRpb25Nb2RlbCgpOworCQkJfQorCisJCQlMT0dHRVIuZGVidWcoIlRyYW5zYWN0aW9uICd7fScgY29tbWl0dGVkLiIsIGlkKTsKKwkJCWNsb3NlU2Vzc2lvbigpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiVW5hYmxlIHRvIGNvbW1pdCB0cmFuc2FjdGlvbiAnIiArIGlkICsgIicgZHVlIHRvOiAiICsgZS5yZWFzb24sIGUpOworCQl9CisJfQorCisJLyoqCisJICoge0Bpbmhlcml0RG9jfQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGFib3J0KCkgeworCQl0cnkgeworCQkJaWYgKHVwbG9hZFNlcnZpY2UgIT0gbnVsbCkgeworCQkJCXVwbG9hZFNlcnZpY2UuYWJvcnQoKTsKKwkJCX0KKworCQkJLy8gcmVzZXQgdmVyc2lvbiwgc2luY2UgY3JlYXRpb24gZmFpbGVkIG9yIHdhcyBhYm9ydGVkCisJCQljb250ZXh0Um9vdHMuZm9yRWFjaChjciAtPiBjci5zZXRWZXJzaW9uKG51bGwpKTsKKworCQkJLy8gcmVzZXQgaW5zdGFuY2UgSURzCisJCQlTdHJpbmcgdmlydHVhbElEID0gIjAiOworCQkJY3JlYXRlZC5mb3JFYWNoKGMgLT4gYy5zZXRJRCh2aXJ0dWFsSUQpKTsKKworCQkJY29udGV4dC5nZXRBb1Nlc3Npb24oKS5hYm9ydFRyYW5zYWN0aW9uKCk7CisKKwkJCUxPR0dFUi5kZWJ1ZygiVHJhbnNhY3Rpb24gJ3t9JyBhYm9ydGVkLiIsIGlkKTsKKwkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJTE9HR0VSLmVycm9yKCJVbmFibGUgdG8gYWJvcnQgdHJhbnNhY3Rpb24gJyIgKyBpZCArICInIGR1ZSB0bzogIiArIGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWNsb3NlU2Vzc2lvbigpOworCQl9CisJfQorCisJLyoqCisJICogT25jZSB7QGxpbmsgI2Fib3J0KCl9IGlzIGNhbGxlZCBpbnN0YW5jZSBJRCBvZiBnaXZlbiB7QGxpbmsgQ29yZX0gd2lsbCBiZQorCSAqIHJlc2V0IHRvIHtAY29kZSAwfSB3aGljaCBpbmRpY2F0ZXMgYSB2aXJ0dWFsIHtAbGluayBFbnRpdHl9LCBub3QgeWV0CisJICogcGVyc2lzdGVkLCBlbnRpdHkuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0Bjb2RlIENvcmV9IG9mIGEgbmV3bHkgd3JpdHRlbiB7QGNvZGUgRW50aXR5fS4KKwkgKi8KKwl2b2lkIGFkZENyZWF0ZWQoQ29yZSBjb3JlKSB7CisJCWNyZWF0ZWQuYWRkKGNvcmUpOworCX0KKworCS8qKgorCSAqIE9uY2Uge0BsaW5rICNjb21taXQoKX0gaXMge0BsaW5rIENvcmUjYXBwbHkoKX0gd2lsbCBiZSBjYWxsZWQgdG8gYXBwbHkKKwkgKiBtb2RpZmllZCB7QGxpbmsgVmFsdWV9IGNvbnRlbnRzIGFuZCByZW1vdmVkIHJlbGF0ZWQgZW50aXRpZXMuCisJICoKKwkgKiBAcGFyYW0gY29yZSBUaGUge0Bjb2RlIENvcmV9IG9mIGFuIHVwZGF0ZWQge0Bjb2RlIEVudGl0eX0uCisJICovCisJdm9pZCBhZGRNb2RpZmllZChDb3JlIGNvcmUpIHsKKwkJbW9kaWZpZWQuYWRkKGNvcmUpOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPRFNDb250ZXh0fS4KKwkgKgorCSAqIEByZXR1cm4gVGhlIHtAY29kZSBPRFNDb250ZXh0fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlPRFNDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHtAbGluayBPRFNNb2RlbE1hbmFnZXJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIE9EU01vZGVsTWFuYWdlcn0gaXMgcmV0dXJuZWQuCisJICovCisJT0RTTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKKwkJcmV0dXJuIGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCk7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUge0BsaW5rIFVwbG9hZFNlcnZpY2V9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIFVwbG9hZFNlcnZpY2V9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gaWYgZmlsZSB0cmFuc2ZlciBpcyBub3QgcG9zc2libGUuCisJICovCisJVXBsb2FkU2VydmljZSBnZXRVcGxvYWRTZXJ2aWNlKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlpZiAodXBsb2FkU2VydmljZSA9PSBudWxsKSB7CisJCQlpZiAoY29udGV4dC5nZXRGaWxlU2VydmVyKCkgPT0gbnVsbCkgeworCQkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCJDT1JCQSBmaWxlIHNlcnZlciBpcyBub3QgYXZhaWxhYmxlLiIpOworCQkJfQorCisJCQkvLyB1cGxvYWQgc2VydmljZSBzdGFydHMgYSBwZXJpb2RpYyBzZXNzaW9uIHJlZnJlc2ggdGFzayAtPiBsYXp5CisJCQkvLyBpbnN0YW50aWF0aW9uCisJCQl1cGxvYWRTZXJ2aWNlID0gbmV3IFVwbG9hZFNlcnZpY2UoY29udGV4dCwgZW50aXR5LCB0cmFuc2Zlcik7CisJCX0KKworCQlyZXR1cm4gdXBsb2FkU2VydmljZTsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ2F0YWxvZ01hbmFnZXJ9LgorCSAqCisJICogQHJldHVybiBUaGUge0Bjb2RlIENhdGFsb2dNYW5hZ2VyfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIENhdGFsb2dNYW5hZ2VyIGdldENhdGFsb2dNYW5hZ2VyKCkgeworCQlpZiAoY2F0YWxvZ01hbmFnZXIgPT0gbnVsbCkgeworCQkJY2F0YWxvZ01hbmFnZXIgPSBuZXcgQ2F0YWxvZ01hbmFnZXIodGhpcyk7CisJCX0KKworCQlyZXR1cm4gY2F0YWxvZ01hbmFnZXI7CisJfQorCisJLyoqCisJICogQ29sbGVjdHMge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMgd2l0aCBhIHZhbGlkIGRlZmF1bHQge0BsaW5rIFZhbHVlfSBvZgorCSAqIHR5cGUge0BsaW5rIFZhbHVlVHlwZSNGSUxFX0xJTkt9IG9yIHtAbGluayBWYWx1ZVR5cGUjRklMRV9MSU5LX1NFUVVFTkNFfS4KKwkgKgorCSAqIEBwYXJhbSB0ZW1wbGF0ZUF0dHJpYnV0ZXMgVGhlIHByb2Nlc3NlZCB7QGNvZGUgVGVtcGxhdGVBdHRyaWJ1dGV9cy4KKwkgKiBAcmV0dXJuIFJldHVybnMge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfSB3aGljaCBoYXZlIHtAbGluayBGaWxlTGlua31zIHN0b3JlZAorCSAqICAgICAgICAgYXMgZGVmYXVsdCB7QGNvZGUgVmFsdWV9LgorCSAqLworCXByaXZhdGUgTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gZ2V0RmlsZUxpbmtUZW1wbGF0ZUF0dHJpYnV0ZXMoTGlzdDxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzKSB7CisJCXJldHVybiB0ZW1wbGF0ZUF0dHJpYnV0ZXMuc3RyZWFtKCkuZmlsdGVyKHRhIC0+IHsKKwkJCVZhbHVlIHZhbHVlID0gdGEuZ2V0RGVmYXVsdFZhbHVlKCk7CisJCQlyZXR1cm4gdmFsdWUuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGlua1R5cGUoKSAmJiB2YWx1ZS5pc1ZhbGlkKCk7CisJCX0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJfQorCisJLyoqCisJICogRXhlY3V0ZXMgc3RhdGVtZW50cyBmb3IgZ2l2ZW4gZW50aXRpZXMgYnkgdXNpbmcgZ2l2ZW4gc3RhdGVtZW50IGZhY3RvcnkuCisJICoKKwkgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICBUaGUgZW50aXR5IHR5cGUuCisJICogQHBhcmFtIHN0YXRlbWVudEZhY3RvcnkgVXNlZCB0byBjcmVhdGUgYSBuZXcgc3RhdGVtZW50IGZvciBhIGdpdmVuCisJICogICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEVudGl0eVR5cGV9LgorCSAqIEBwYXJhbSBlbnRpdGllcyAgICAgICAgIFRoZSBwcm9jZXNzZWQge0Bjb2RlIEVudGl0eX1zLgorCSAqIEB0aHJvd3MgQW9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgdGhlIGV4ZWN1dGlvbiBmYWlscy4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgIFRocm93biBpZiBhIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uIGZhaWxzLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IHZvaWQgZXhlY3V0ZVN0YXRlbWVudHMoRnVuY3Rpb248RW50aXR5VHlwZSwgQmFzZVN0YXRlbWVudD4gc3RhdGVtZW50RmFjdG9yeSwKKwkJCUNvbGxlY3Rpb248VD4gZW50aXRpZXMpIHRocm93cyBBb0V4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlNYXA8RW50aXR5VHlwZSwgTGlzdDxFbnRpdHk+PiBlbnRpdGllc0J5VHlwZSA9IGVudGl0aWVzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KGNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCk6OmdldEVudGl0eVR5cGUpKTsKKwkJZm9yIChFbnRyeTxFbnRpdHlUeXBlLCBMaXN0PEVudGl0eT4+IGVudHJ5IDogZW50aXRpZXNCeVR5cGUuZW50cnlTZXQoKSkgeworCQkJc3RhdGVtZW50RmFjdG9yeS5hcHBseShlbnRyeS5nZXRLZXkoKSkuZXhlY3V0ZShlbnRyeS5nZXRWYWx1ZSgpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFByb2Nlc3NlcyBOLXRvLU0gcmVsYXRpb25zIGZvciB0aGUgZ2l2ZW4gZW50aXRpZXMKKwkgKiAKKwkgKiBAcGFyYW0gZW50aXRpZXMgVGhlIHByb2Nlc3NlZCB7QGNvZGUgRW50aXR5fXMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqLworCXByaXZhdGUgPFQgZXh0ZW5kcyBFbnRpdHk+IHZvaWQgcHJvY2Vzc050b01SZWxhdGlvbnMoQ29sbGVjdGlvbjxUPiBlbnRpdGllcykgeworCQlmb3IgKEVudGl0eSBlIDogZW50aXRpZXMpIHsKKwkJCWNvbnRleHQuZ2V0T0RTTW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShlKS5nZXRSZWxhdGlvbnMoKS5zdHJlYW0oKS5maWx0ZXIoUmVsYXRpb246OmlzTnRvTSkKKwkJCQkJLmZvckVhY2gociAtPiBwcm9jZXNzTXRvTVJlbGF0aW9uKGUsIHIpKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBwcm9jZXNzTXRvTVJlbGF0aW9uKEVudGl0eSBlbnRpdHksIFJlbGF0aW9uIHJlbGF0aW9uKSB7CisKKwkJTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPiByZW1vdmVkUmVsYXRlZEVudGl0aWVzID0gT0RTRW50aXR5RmFjdG9yeS5leHRyYWN0KGVudGl0eSkuZ2V0TnRvTVN0b3JlKCkuZ2V0UmVtb3ZlZCgpCisJCQkJLmdldE9yRGVmYXVsdChyZWxhdGlvbi5nZXROYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKwkJTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPiBhZGRlZFJlbGF0ZWRFbnRpdGllcyA9IE9EU0VudGl0eUZhY3RvcnkuZXh0cmFjdChlbnRpdHkpLmdldE50b01TdG9yZSgpLmdldEFkZGVkKCkKKwkJCQkuZ2V0T3JEZWZhdWx0KHJlbGF0aW9uLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworCisJCVRfTE9OR0xPTkdbXSByZW1vdmVkSW5zdElkcyA9IHJlbW92ZWRSZWxhdGVkRW50aXRpZXMuc3RyZWFtKCkubWFwKEVudGl0eTo6Z2V0SUQpLm1hcChPRFNDb252ZXJ0ZXI6OnRvT0RTSUQpCisJCQkJLnRvQXJyYXkoVF9MT05HTE9OR1tdOjpuZXcpOworCisJCVRfTE9OR0xPTkdbXSBhZGRlZEluc3RJZHMgPSBhZGRlZFJlbGF0ZWRFbnRpdGllcy5zdHJlYW0oKS5tYXAoRW50aXR5OjpnZXRJRCkubWFwKE9EU0NvbnZlcnRlcjo6dG9PRFNJRCkKKwkJCQkudG9BcnJheShUX0xPTkdMT05HW106Om5ldyk7CisKKwkJdHJ5IHsKKwkJCWlmIChyZW1vdmVkSW5zdElkcy5sZW5ndGggPiAwKSB7CisJCQkJT0RTRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gKChPRFNFbnRpdHlUeXBlKSBjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoZW50aXR5KSk7CisJCQkJRWxlbUlkIGVsZW1JZCA9IG5ldyBFbGVtSWQoZW50aXR5VHlwZS5nZXRPRFNJRCgpLCBPRFNDb252ZXJ0ZXIudG9PRFNJRChlbnRpdHkuZ2V0SUQoKSkpOworCQkJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbEVsZW1BY2Nlc3MoKS5zZXRSZWxJbnN0KGVsZW1JZCwgcmVsYXRpb24uZ2V0TmFtZSgpLCByZW1vdmVkSW5zdElkcywKKwkJCQkJCVNldFR5cGUuUkVNT1ZFKTsKKwkJCX0KKworCQkJaWYgKGFkZGVkSW5zdElkcy5sZW5ndGggPiAwKSB7CisJCQkJT0RTRW50aXR5VHlwZSBlbnRpdHlUeXBlID0gKChPRFNFbnRpdHlUeXBlKSBjb250ZXh0LmdldE9EU01vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoZW50aXR5KSk7CisJCQkJRWxlbUlkIGVsZW1JZCA9IG5ldyBFbGVtSWQoZW50aXR5VHlwZS5nZXRPRFNJRCgpLCBPRFNDb252ZXJ0ZXIudG9PRFNJRChlbnRpdHkuZ2V0SUQoKSkpOworCQkJCWNvbnRleHQuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbEVsZW1BY2Nlc3MoKS5zZXRSZWxJbnN0KGVsZW1JZCwgcmVsYXRpb24uZ2V0TmFtZSgpLCBhZGRlZEluc3RJZHMsCisJCQkJCQlTZXRUeXBlLkFQUEVORCk7CisJCQl9CisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKCIiICsgZS5yZWFzb24sIGUpOyAvLyBUT0RPCisJCX0KKwl9CisKKwkvKioKKwkgKiBDbG9zZXMgdGhlIGNvLXNlc3Npb24gb2YgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY2xvc2VTZXNzaW9uKCkgeworCQlpZiAoY2F0YWxvZ01hbmFnZXIgIT0gbnVsbCkgeworCQkJY2F0YWxvZ01hbmFnZXIuY2xlYXIoKTsKKwkJfQorCisJCWNvbnRleHQuY2xvc2UoKTsKKwkJTE9HR0VSLmRlYnVnKCJUcmFuc2FjdGlvbiAne30nIGNsb3NlZC4iLCBpZCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vVXBkYXRlU3RhdGVtZW50LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vVXBkYXRlU3RhdGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2MjJiNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9VcGRhdGVTdGF0ZW1lbnQuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWVWYWx1ZVNlcVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkNvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5U3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5SZWxhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRGVsZXRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlc0F0dGFjaGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Sb2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5sb29rdXAuY29uZmlnLkVudGl0eUNvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIucXVlcnkuT0RTRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlscy5PRFNVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisvKioKKyAqIEluc2VydCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB1cGRhdGUgZW50aXRpZXMgYW5kIHRoZWlyIGNoaWxkcmVuLgorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICovCitmaW5hbCBjbGFzcyBVcGRhdGVTdGF0ZW1lbnQgZXh0ZW5kcyBCYXNlU3RhdGVtZW50IHsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDbGFzcyB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVXBkYXRlU3RhdGVtZW50LmNsYXNzKTsKKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBJbnN0YW5jZSB2YXJpYWJsZXMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwlwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgRW50aXR5PiwgTGlzdDxFbnRpdHk+PiBjaGlsZHJlblRvQ3JlYXRlID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IGNoaWxkcmVuVG9VcGRhdGUgPSBuZXcgSGFzaE1hcDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIERlbGV0YWJsZT4sIExpc3Q8RGVsZXRhYmxlPj4gY2hpbGRyZW5Ub1JlbW92ZSA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8VmFsdWU+PiB1cGRhdGVNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIExpc3Q8RmlsZUxpbms+IGZpbGVMaW5rVG9VcGxvYWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBub25VcGRhdGFibGVSZWxhdGlvbk5hbWVzOworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpZ25vcmVDaGlsZHJlbjsKKwlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNGaWxlc0F0dGFjaGFibGU7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb24gICAgVGhlIG93bmluZyB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqIEBwYXJhbSBlbnRpdHlUeXBlICAgICBUaGUgYXNzb2NpYXRlZCB7QGxpbmsgRW50aXR5VHlwZX0uCisJICogQHBhcmFtIGlnbm9yZUNoaWxkcmVuIElmIHtAY29kZSB0cnVlfSwgdGhlbiBjaGlsZCBlbnRpdGllcyB3b24ndCBiZQorCSAqICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuCisJICovCisJVXBkYXRlU3RhdGVtZW50KE9EU1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBFbnRpdHlUeXBlIGVudGl0eVR5cGUsIGJvb2xlYW4gaWdub3JlQ2hpbGRyZW4pIHsKKwkJc3VwZXIodHJhbnNhY3Rpb24sIGVudGl0eVR5cGUpOworCisJCW5vblVwZGF0YWJsZVJlbGF0aW9uTmFtZXMgPSBlbnRpdHlUeXBlLmdldEluZm9SZWxhdGlvbnMoKS5zdHJlYW0oKS5tYXAoUmVsYXRpb246OmdldE5hbWUpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJCXRoaXMuaWdub3JlQ2hpbGRyZW4gPSBpZ25vcmVDaGlsZHJlbjsKKworCQlFbnRpdHlDb25maWc8Pz4gZW50aXR5Q29uZmlnID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5Q29uZmlnKGdldEVudGl0eVR5cGUoKSk7CisJCWlzRmlsZXNBdHRhY2hhYmxlID0gRmlsZXNBdHRhY2hhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZW50aXR5Q29uZmlnLmdldEVudGl0eUNsYXNzKCkpOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQdWJsaWMgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIHtAaW5oZXJpdERvY30KKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBleGVjdXRlKENvbGxlY3Rpb248RW50aXR5PiBlbnRpdGllcykgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWZvciAoRW50aXR5IGVudGl0eSA6IGVudGl0aWVzKSB7CisJCQlyZWFkRW50aXR5Q29yZShPRFNFbnRpdHlGYWN0b3J5LmV4dHJhY3QoZW50aXR5KSk7CisJCX0KKworCQkvLyBUT0RPIHRyYWNpbmcgcHJvZ3Jlc3MgaW4gdGhpcyBtZXRob2QuLi4KKworCQlMaXN0PEFJRE5hbWVWYWx1ZVNlcVVuaXRJZD4gYW52c3VMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRfTE9OR0xPTkcgYUlEID0gZ2V0RW50aXR5VHlwZSgpLmdldE9EU0lEKCk7CisKKwkJaWYgKCFmaWxlTGlua1RvVXBsb2FkLmlzRW1wdHkoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5nZXRVcGxvYWRTZXJ2aWNlKCkudXBsb2FkUGFyYWxsZWwoZmlsZUxpbmtUb1VwbG9hZCwgbnVsbCk7CisJCX0KKworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxWYWx1ZT4+IGVudHJ5IDogdXBkYXRlTWFwLmVudHJ5U2V0KCkpIHsKKwkJCWlmIChub25VcGRhdGFibGVSZWxhdGlvbk5hbWVzLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgeworCQkJCS8vIHNraXAgImVtcHR5IiBpbmZvcm1hdGl2ZSByZWxhdGlvbiBzZXF1ZW5jZQorCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGVudHJ5LmdldEtleSgpLmVxdWFsc0lnbm9yZUNhc2UoUm9sZS5BVFRSX1NVUEVSVVNFUl9GTEFHKSkgeworCQkJCS8vIHNraXAgc3VwZXJ1c2VyIGZsYWcgYXMgaXQgY2Fubm90IGJlIHdyaXR0ZW4gdGhyb3VnaCB0aGUgT0RTIEFQSQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0RW50aXR5VHlwZSgpLmdldEF0dHJpYnV0ZShlbnRyeS5nZXRLZXkoKSk7CisKKwkJCUFJRE5hbWVWYWx1ZVNlcVVuaXRJZCBhbnZzdSA9IG5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWQoKTsKKwkJCWFudnN1LmF0dHIgPSBuZXcgQUlETmFtZShhSUQsIGVudHJ5LmdldEtleSgpKTsKKwkJCWFudnN1LnVuaXRJZCA9IE9EU0NvbnZlcnRlci50b09EU0xvbmcoMCk7CisJCQlhbnZzdS52YWx1ZXMgPSBPRFNDb252ZXJ0ZXIudG9PRFNWYWx1ZVNlcShhdHRyaWJ1dGUsIGVudHJ5LmdldFZhbHVlKCkpOworCQkJYW52c3VMaXN0LmFkZChhbnZzdSk7CisJCX0KKworCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisJCWdldEFwcGxFbGVtQWNjZXNzKCkudXBkYXRlSW5zdGFuY2VzKGFudnN1TGlzdC50b0FycmF5KG5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWRbYW52c3VMaXN0LnNpemUoKV0pKTsKKwkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKwkJTE9HR0VSLmRlYnVnKCJ7fSAiICsgZ2V0RW50aXR5VHlwZSgpICsgIiBpbnN0YW5jZXMgdXBkYXRlZCBpbiB7fSBtcy4iLCBlbnRpdGllcy5zaXplKCksIHN0b3AgLSBzdGFydCk7CisKKwkJLy8gZGVsZXRlIGZpcnN0IHRvIG1ha2Ugc3VyZSBuYW1pbmcgY29sbGlzaW9ucyBkbyBub3Qgb2NjdXIhCisJCWZvciAoTGlzdDxEZWxldGFibGU+IGNoaWxkcmVuIDogY2hpbGRyZW5Ub1JlbW92ZS52YWx1ZXMoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5kZWxldGUoY2hpbGRyZW4pOworCQl9CisJCWZvciAoTGlzdDxFbnRpdHk+IGNoaWxkcmVuIDogY2hpbGRyZW5Ub0NyZWF0ZS52YWx1ZXMoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS5jcmVhdGUoY2hpbGRyZW4pOworCQl9CisJCWZvciAoTGlzdDxFbnRpdHk+IGNoaWxkcmVuIDogY2hpbGRyZW5Ub1VwZGF0ZS52YWx1ZXMoKSkgeworCQkJZ2V0VHJhbnNhY3Rpb24oKS51cGRhdGUoY2hpbGRyZW4pOworCQl9CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFByaXZhdGUgbWV0aG9kcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIFJlYWRzIGdpdmVuIHtAbGluayBDb3JlfSBhbmQgcHJlcGFyZXMgaXRzIGRhdGEgdG8gYmUgd3JpdHRlbjoKKwkgKgorCSAqIDx1bD4KKwkgKiA8bGk+Y29sbGVjdCBuZXcgYW5kIHJlbW92ZWQge0BsaW5rIEZpbGVMaW5rfXM8L2xpPgorCSAqIDxsaT5jb2xsZWN0IHByb3BlcnR5IHtAbGluayBWYWx1ZX1zPC9saT4KKwkgKiA8bGk+Y29sbGVjdCBmb3JlaWduIGtleSB7QGNvZGUgVmFsdWV9czwvbGk+CisJICogPGxpPmNvbGxlY3QgY2hpbGQgZW50aXRpZXMgZm9yIHJlY3Vyc2l2ZSBjcmVhdGUvdXBkYXRlL2RlbGV0ZTwvbGk+CisJICogPC91bD4KKwkgKgorCSAqIEBwYXJhbSBjb3JlIFRoZSB7QGNvZGUgQ29yZX0uCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpbiBjYXNlIG9mIGVycm9ycy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgcmVhZEVudGl0eUNvcmUoQ29yZSBjb3JlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWlmICghY29yZS5nZXRUeXBlTmFtZSgpLmVxdWFscyhnZXRFbnRpdHlUeXBlKCkuZ2V0TmFtZSgpKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRW50aXR5IGNvcmUgJyIgKyBjb3JlLmdldFR5cGVOYW1lKCkKKwkJCQkJKyAiJyBpcyBpbmNvbXBhdGlibGUgd2l0aCBjdXJyZW50IHVwZGF0ZSBzdGF0ZW1lbnQgZm9yIGVudGl0eSB0eXBlICciICsgZ2V0RW50aXR5VHlwZSgpICsgIicuIik7CisJCX0KKworCQkvLyBhZGQgYWxsIGVudGl0eSB2YWx1ZXMKKwkJZm9yIChWYWx1ZSB2YWx1ZSA6IGNvcmUuZ2V0QWxsVmFsdWVzKCkudmFsdWVzKCkpIHsKKwkJCXVwZGF0ZU1hcC5jb21wdXRlSWZBYnNlbnQodmFsdWUuZ2V0TmFtZSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQodmFsdWUpOworCQl9CisKKwkJLy8gY29sbGVjdCBmaWxlIGxpbmtzCisJCWZpbGVMaW5rVG9VcGxvYWQuYWRkQWxsKGNvcmUuZ2V0QWRkZWRGaWxlTGlua3MoKSk7CisJCUxpc3Q8RmlsZUxpbms+IGZpbGVMaW5rc1RvUmVtb3ZlID0gY29yZS5nZXRSZW1vdmVkRmlsZUxpbmtzKCk7CisJCWlmIChpc0ZpbGVzQXR0YWNoYWJsZSAmJiAhZmlsZUxpbmtzVG9SZW1vdmUuaXNFbXB0eSgpKSB7CisJCQlnZXRUcmFuc2FjdGlvbigpLmdldFVwbG9hZFNlcnZpY2UoKS5hZGRUb1JlbW92ZShmaWxlTGlua3NUb1JlbW92ZSk7CisJCX0KKworCQl1cGRhdGVNYXAuY29tcHV0ZUlmQWJzZW50KGdldEVudGl0eVR5cGUoKS5nZXRJREF0dHJpYnV0ZSgpLmdldE5hbWUoKSwgayAtPiBuZXcgQXJyYXlMaXN0PD4oKSkKKwkJCQkuYWRkKGdldEVudGl0eVR5cGUoKS5nZXRJREF0dHJpYnV0ZSgpLmNyZWF0ZVZhbHVlKGNvcmUuZ2V0SUQoKSkpOworCisJCS8vIGRlZmluZSAiZW1wdHkiIHZhbHVlcyBmb3IgQUxMIGluZm9ybWF0aXZlIHJlbGF0aW9ucworCQlmb3IgKFJlbGF0aW9uIHJlbGF0aW9uIDogZ2V0RW50aXR5VHlwZSgpLmdldEluZm9SZWxhdGlvbnMoKSkgeworCQkJdXBkYXRlTWFwLmNvbXB1dGVJZkFic2VudChyZWxhdGlvbi5nZXROYW1lKCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChyZWxhdGlvbi5jcmVhdGVWYWx1ZSgpKTsKKwkJfQorCisJCS8vIHByZXNlcnZlICJlbXB0eSIgcmVsYXRpb24gdmFsdWVzIGZvciByZW1vdmVkIHJlbGF0ZWQgZW50aXRpZXMKKwkJRW50aXR5U3RvcmUgbXV0YWJsZVN0b3JlID0gY29yZS5nZXRNdXRhYmxlU3RvcmUoKTsKKwkJbXV0YWJsZVN0b3JlLmdldFJlbW92ZWQoKS5zdHJlYW0oKS5tYXAoZSAtPiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFbnRpdHlUeXBlKGUpKQorCQkJCS5tYXAoZ2V0RW50aXR5VHlwZSgpOjpnZXRSZWxhdGlvbikubWFwKFJlbGF0aW9uOjpnZXROYW1lKS5mb3JFYWNoKG5vblVwZGF0YWJsZVJlbGF0aW9uTmFtZXM6OnJlbW92ZSk7CisKKwkJLy8gcmVwbGFjZSAiZW1wdHkiIHJlbGF0aW9uIHZhbHVlcyB3aXRoIGNvcnJlc3BvbmRpbmcgaW5zdGFuY2UgSURzCisJCXNldFJlbGF0aW9uSURzKG11dGFibGVTdG9yZS5nZXRDdXJyZW50KCkpOworCisJCWNvbGxlY3RDaGlsZEVudGl0aWVzKGNvcmUpOworCisJCWdldFRyYW5zYWN0aW9uKCkuYWRkTW9kaWZpZWQoY29yZSk7CisJfQorCisJLyoqCisJICogQ29sbGVjdHMgY2hpbGQgZW50aXRpZXMgZm9yIHJlY3Vyc2l2ZSBwcm9jZXNzaW5nLgorCSAqCisJICogQHBhcmFtIGNvcmUgVGhlIHtAbGluayBDb3JlfS4KKwkgKi8KKwlwcml2YXRlIHZvaWQgY29sbGVjdENoaWxkRW50aXRpZXMoQ29yZSBjb3JlKSB7CisJCWlmIChpZ25vcmVDaGlsZHJlbikgeworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChFbnRyeTxDbGFzczw/IGV4dGVuZHMgRGVsZXRhYmxlPiwgTGlzdDw/IGV4dGVuZHMgRGVsZXRhYmxlPj4gZW50cnkgOiBjb3JlLmdldENoaWxkcmVuU3RvcmUoKS5nZXRDdXJyZW50KCkKKwkJCQkuZW50cnlTZXQoKSkgeworCQkJTWFwPEJvb2xlYW4sIExpc3Q8RW50aXR5Pj4gcGFydGl0aW9uID0gZW50cnkuZ2V0VmFsdWUoKS5zdHJlYW0oKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnBhcnRpdGlvbmluZ0J5KGUgLT4gT0RTVXRpbHMuaXNWYWxpZElEKGUuZ2V0SUQoKSkpKTsKKwkJCUxpc3Q8RW50aXR5PiB2aXJ0dWFsRW50aXRpZXMgPSBwYXJ0aXRpb24uZ2V0KEJvb2xlYW4uRkFMU0UpOworCQkJaWYgKHZpcnR1YWxFbnRpdGllcyAhPSBudWxsICYmICF2aXJ0dWFsRW50aXRpZXMuaXNFbXB0eSgpKSB7CisJCQkJY2hpbGRyZW5Ub0NyZWF0ZS5jb21wdXRlSWZBYnNlbnQoZW50cnkuZ2V0S2V5KCksIGsgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZEFsbCh2aXJ0dWFsRW50aXRpZXMpOworCQkJfQorCQkJTGlzdDxFbnRpdHk+IGV4aXN0aW5nRW50aXRpZXMgPSBwYXJ0aXRpb24uZ2V0KEJvb2xlYW4uVFJVRSk7CisJCQlpZiAoZXhpc3RpbmdFbnRpdGllcyAhPSBudWxsICYmICFleGlzdGluZ0VudGl0aWVzLmlzRW1wdHkoKSkgeworCQkJCWNoaWxkcmVuVG9VcGRhdGUuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGRBbGwoZXhpc3RpbmdFbnRpdGllcyk7CisJCQl9CisJCX0KKworCQlmb3IgKEVudHJ5PENsYXNzPD8gZXh0ZW5kcyBEZWxldGFibGU+LCBMaXN0PD8gZXh0ZW5kcyBEZWxldGFibGU+PiBlbnRyeSA6IGNvcmUuZ2V0Q2hpbGRyZW5TdG9yZSgpLmdldFJlbW92ZWQoKQorCQkJCS5lbnRyeVNldCgpKSB7CisJCQlMaXN0PERlbGV0YWJsZT4gdG9EZWxldGUgPSBlbnRyeS5nZXRWYWx1ZSgpLnN0cmVhbSgpLmZpbHRlcihlIC0+IE9EU1V0aWxzLmlzVmFsaWRJRChlLmdldElEKCkpKQorCQkJCQkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwkJCWNoaWxkcmVuVG9SZW1vdmUuY29tcHV0ZUlmQWJzZW50KGVudHJ5LmdldEtleSgpLCBrIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGRBbGwodG9EZWxldGUpOworCQl9CisJfQorCisJLyoqCisJICogT3ZlcndyaXRlcyBlbXB0eSBmb3JlaWduIGtleSB7QGxpbmsgVmFsdWV9IGNvbnRhaW5lcnMuCisJICoKKwkgKiBAcGFyYW0gcmVsYXRlZEVudGl0aWVzIFRoZSByZWxhdGVkIHtAbGluayBFbnRpdHl9cy4KKwkgKi8KKwlwcml2YXRlIHZvaWQgc2V0UmVsYXRpb25JRHMoQ29sbGVjdGlvbjxFbnRpdHk+IHJlbGF0ZWRFbnRpdGllcykgeworCQlmb3IgKEVudGl0eSByZWxhdGVkRW50aXR5IDogcmVsYXRlZEVudGl0aWVzKSB7CisJCQlpZiAoIU9EU1V0aWxzLmlzVmFsaWRJRChyZWxhdGVkRW50aXR5LmdldElEKCkpKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVsYXRlZCBlbnRpdHkgbXVzdCBiZSBhIHBlcnNpdGVkIGVudGl0eS4iKTsKKwkJCX0KKworCQkJUmVsYXRpb24gcmVsYXRpb24gPSBnZXRFbnRpdHlUeXBlKCkuZ2V0UmVsYXRpb24oZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RW50aXR5VHlwZShyZWxhdGVkRW50aXR5KSk7CisJCQlMaXN0PFZhbHVlPiByZWxhdGlvblZhbHVlcyA9IHVwZGF0ZU1hcC5nZXQocmVsYXRpb24uZ2V0TmFtZSgpKTsKKwkJCWlmIChyZWxhdGlvblZhbHVlcyA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVsYXRpb24gJyIgKyByZWxhdGlvbgorCQkJCQkJKyAiJyBpcyBpbmNvbXBhdGlibGUgd2l0aCB1cGRhdGUgc3RhdGVtZW50IGZvciBlbnRpdHkgdHlwZSAnIiArIGdldEVudGl0eVR5cGUoKSArICInIik7CisJCQl9CisJCQlyZWxhdGlvblZhbHVlcy5nZXQocmVsYXRpb25WYWx1ZXMuc2l6ZSgpIC0gMSkuc2V0KHJlbGF0ZWRFbnRpdHkuZ2V0SUQoKSk7CisJCQlub25VcGRhdGFibGVSZWxhdGlvbk5hbWVzLnJlbW92ZShyZWxhdGlvbi5nZXROYW1lKCkpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vVXBsb2FkU2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL1VwbG9hZFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ4MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3RyYW5zYWN0aW9uL1VwbG9hZFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci50cmFuc2FjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5Bb0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuZmlsZS5GaWxlU2VydmljZS5Qcm9ncmVzc0xpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLmZpbGV0cmFuc2Zlci5DT1JCQUZpbGVTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5maWxldHJhbnNmZXIuVHJhbnNmZXI7CisKKy8qKgorICogTWFuYWdlcyBuZXcgb3IgcmVtb3ZlZCBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworZmluYWwgY2xhc3MgVXBsb2FkU2VydmljZSB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVyID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woMSk7CisKKwlwcml2YXRlIGZpbmFsIE1hcDxUZW1wbGF0ZUF0dHJpYnV0ZSwgVmFsdWU+IHRlbXBsYXRlQXR0cmlidXRlRmlsZUxpbmtzID0gbmV3IEhhc2hNYXA8PigpOworCXByaXZhdGUgZmluYWwgTGlzdDxGaWxlTGluaz4gdXBsb2FkZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwlwcml2YXRlIGZpbmFsIE1hcDxJbnB1dFN0cmVhbSwgU3RyaW5nPiByZW1vdGVQYXRocyA9IG5ldyBIYXNoTWFwPD4oKTsKKwlwcml2YXRlIGZpbmFsIExpc3Q8RmlsZUxpbms+IHRvUmVtb3ZlID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwlwcml2YXRlIGZpbmFsIENPUkJBRmlsZVNlcnZpY2UgZmlsZVNlcnZpY2U7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHkgZW50aXR5OworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqCisJICogQHBhcmFtIGNvbnRleHQgIFVzZWQgZm9yIHNldHVwLgorCSAqIEBwYXJhbSBlbnRpdHkgICBVc2VkIGZvciBzZWN1cml0eSBjaGVja3MuCisJICogQHBhcmFtIHRyYW5zZmVyIFRoZSB0cmFuc2ZlciB0eXBlLgorCSAqLworCVVwbG9hZFNlcnZpY2UoT0RTQ29udGV4dCBjb250ZXh0LCBFbnRpdHkgZW50aXR5LCBUcmFuc2ZlciB0cmFuc2ZlcikgeworCQlmaWxlU2VydmljZSA9IG5ldyBDT1JCQUZpbGVTZXJ2aWNlKGNvbnRleHQsIHRyYW5zZmVyKTsKKwkJdGhpcy5lbnRpdHkgPSBlbnRpdHk7CisKKwkJc2NoZWR1bGVyLnNjaGVkdWxlQXRGaXhlZFJhdGUoKCkgLT4geworCQkJdHJ5IHsKKwkJCQljb250ZXh0LmdldEFvU2Vzc2lvbigpLmdldE5hbWUoKTsKKwkJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCQkvKgorCQkJCSAqIE5PVEU6IFRoaXMgaXMgZG9uZSB0byBrZWVwIHRoZSBwYXJlbnQgdHJhbnNhY3Rpb24ncyBzZXNzaW9uIGFsaXZlIHRpbGwgaXRzCisJCQkJICogY29tbWl0IG9yIGFib3J0IG1ldGhvZCBpcyBjYWxsZWQuIElmIHRoaXMgc2Vzc2lvbiByZWZyZXNoIHJlc3VsdHMgaW4gYW4KKwkJCQkgKiBlcnJvciwgdGhlbiBhbnkgcnVubmluZyBmaWxlIHRyYW5zZmVyIHdpbGwgYWJvcnQgd2l0aCBhIHByb3BlciBlcnJvciwKKwkJCQkgKiB0aGVyZWZvcmUgYW55IGV4Y2VwdGlvbiBoZXJlIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBhbmQgZXhwbGljaXRseSBOT1QgbG9nZ2VkIQorCQkJCSAqLworCQkJfQorCQl9LCA1LCA1LCBUaW1lVW5pdC5NSU5VVEVTKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHVibGljIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBVcGxvYWRzIG5ldyBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcyBzdG9yZWQgaW4gZ2l2ZW4KKwkgKiB7QGxpbmsgVGVtcGxhdGVBdHRyaWJ1dGV9cy4gVGhlIHVwbG9hZCBwcm9ncmVzcyBtYXkgYmUgdHJhY2VkIHdpdGggYSBwcm9ncmVzcworCSAqIGxpc3RlbmVyLgorCSAqCisJICogQHBhcmFtIHRlbXBsYXRlQXR0cmlidXRlcyBUaGUge0BsaW5rIFRlbXBsYXRlQXR0cmlidXRlfXMuCisJICogQHBhcmFtIHByb2dyZXNzTGlzdGVuZXIgICBUaGUgcHJvZ3Jlc3MgbGlzdGVuZXIuCisJICogQHRocm93cyBJT0V4Y2VwdGlvbiBUaHJvd24gaWYgdW5hYmxlIHRvIHVwbG9hZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCB1cGxvYWQoQ29sbGVjdGlvbjxUZW1wbGF0ZUF0dHJpYnV0ZT4gdGVtcGxhdGVBdHRyaWJ1dGVzLCBQcm9ncmVzc0xpc3RlbmVyIHByb2dyZXNzTGlzdGVuZXIpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlMaXN0PEZpbGVMaW5rPiBmaWxlTGlua3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZm9yIChUZW1wbGF0ZUF0dHJpYnV0ZSB0ZW1wbGF0ZUF0dHJpYnV0ZSA6IHRlbXBsYXRlQXR0cmlidXRlcykgeworCQkJVmFsdWUgZGVmYXVsdFZhbHVlID0gdGVtcGxhdGVBdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlKCk7CisJCQlpZiAoIWRlZmF1bHRWYWx1ZS5pc1ZhbGlkKCkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGRlZmF1bHRWYWx1ZS5nZXRWYWx1ZVR5cGUoKS5pc0ZpbGVMaW5rKCkpIHsKKwkJCQlmaWxlTGlua3MuYWRkKGRlZmF1bHRWYWx1ZS5leHRyYWN0KCkpOworCQkJfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUuZ2V0VmFsdWVUeXBlKCkuaXNGaWxlTGlua1NlcXVlbmNlKCkpIHsKKwkJCQlmaWxlTGlua3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoKEZpbGVMaW5rW10pIGRlZmF1bHRWYWx1ZS5leHRyYWN0KCkpKTsKKwkJCX0gZWxzZSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVtcGxhdGUgYXR0cmlidXRlJ3MgdmFsdWUgdHlwZSBpcyBub3Qgb2YgdHlwZSBmaWxlIGxpbmsuIik7CisJCQl9CisKKwkJCXRlbXBsYXRlQXR0cmlidXRlRmlsZUxpbmtzLnB1dCh0ZW1wbGF0ZUF0dHJpYnV0ZSwgZGVmYXVsdFZhbHVlKTsKKwkJfQorCisJCWlmICghZmlsZUxpbmtzLmlzRW1wdHkoKSkgeworCQkJdXBsb2FkUGFyYWxsZWwoZmlsZUxpbmtzLCBwcm9ncmVzc0xpc3RlbmVyKTsKKwkJCS8vIHJlbW90ZSBwYXRocyBhdmFpbGFibGUgLT4gdXBkYXRlIHRlbXBsYXRlIGF0dHJpYnV0ZQorCQkJdGVtcGxhdGVBdHRyaWJ1dGVGaWxlTGlua3MuZm9yRWFjaCgodGEsIHYpIC0+IHRhLnNldERlZmF1bHRWYWx1ZSh2LmV4dHJhY3QoKSkpOworCQl9CisJfQorCisJLyoqCisJICogUGFyYWxsZWwgdXBsb2FkIG9mIGdpdmVuIHtAbGluayBGaWxlTGlua31zLiBMb2NhbCB7QGxpbmsgUGF0aH1zIGxpbmtlZAorCSAqIG11bHRpcGxlIHRpbWVzIGFyZSB1cGxvYWRlZCBvbmx5IG9uY2UuIFRoZSB1cGxvYWQgcHJvZ3Jlc3MgbWF5IGJlIHRyYWNlZCB3aXRoCisJICogYSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGlua3MgICAgICAgIENvbGxlY3Rpb24gb2Yge0Bjb2RlIEZpbGVMaW5rfXMgdG8gdXBsb2FkLgorCSAqIEBwYXJhbSBwcm9ncmVzc0xpc3RlbmVyIFRoZSBwcm9ncmVzcyBsaXN0ZW5lci4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFRocm93biBpZiB1bmFibGUgdG8gdXBsb2FkIGZpbGVzLgorCSAqLworCXB1YmxpYyB2b2lkIHVwbG9hZFBhcmFsbGVsKENvbGxlY3Rpb248RmlsZUxpbms+IGZpbGVMaW5rcywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlMaXN0PEZpbGVMaW5rPiBmaWx0ZXJlZCA9IHJldGFpbkZvclVwbG9hZChmaWxlTGlua3MpOworCQl0cnkgeworCQkJZmlsZVNlcnZpY2UudXBsb2FkUGFyYWxsZWwoZW50aXR5LCBmaWx0ZXJlZCwgcHJvZ3Jlc3NMaXN0ZW5lcik7CisJCX0gZmluYWxseSB7CisJCQlmaWx0ZXJlZC5zdHJlYW0oKS5maWx0ZXIoRmlsZUxpbms6OmlzUmVtb3RlKS5mb3JFYWNoKGZsIC0+IHsKKwkJCQlyZW1vdGVQYXRocy5wdXQoZmwuZ2V0TG9jYWxTdHJlYW0oKSwgZmwuZ2V0UmVtb3RlUGF0aCgpKTsKKwkJCQl1cGxvYWRlZC5hZGQoZmwpOworCQkJfSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBPbmNlIHtAbGluayAjY29tbWl0KCl9IGlzIGNhbGxlZCBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cyB3aWxsIGJlIGRlbGV0ZWQgZnJvbQorCSAqIHRoZSByZW1vdGUgc3RvcmFnZS4KKwkgKgorCSAqIEBwYXJhbSBmaWxlTGlua3MgQ29sbGVjdGlvbiBvZiB7QGNvZGUgRmlsZUxpbmt9cyB0byBkZWxldGUuCisJICovCisJcHVibGljIHZvaWQgYWRkVG9SZW1vdmUoQ29sbGVjdGlvbjxGaWxlTGluaz4gZmlsZUxpbmtzKSB7CisJCXRvUmVtb3ZlLmFkZEFsbChmaWxlTGlua3MpOworCX0KKworCS8qKgorCSAqIENvbW1pdHMgbW9kaWZpY2F0aW9ucyBvZiBleHRlcm5hbGx5IGxpbmtlZCBmaWxlcy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBjb21taXQoKSB7CisJCWZpbGVTZXJ2aWNlLmRlbGV0ZShlbnRpdHksIHRvUmVtb3ZlKTsKKwkJc2NoZWR1bGVyLnNodXRkb3duKCk7CisJfQorCisJLyoqCisJICogQWJvcnRzIG1vZGlmaWNhdGlvbnMgb2YgZXh0ZXJuYWxseSBsaW5rZWQgZmlsZXMuCisJICovCisJcHVibGljIHZvaWQgYWJvcnQoKSB7CisJCWZpbGVTZXJ2aWNlLmRlbGV0ZShlbnRpdHksIHVwbG9hZGVkKTsKKwkJdXBsb2FkZWQuZm9yRWFjaChmbCAtPiBmbC5zZXRSZW1vdGVQYXRoKG51bGwpKTsKKwkJdGVtcGxhdGVBdHRyaWJ1dGVGaWxlTGlua3MuZm9yRWFjaCgodGEsIHYpIC0+IHRhLnNldERlZmF1bHRWYWx1ZSh2LmV4dHJhY3QoKSkpOworCQlzY2hlZHVsZXIuc2h1dGRvd24oKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogRmlsdGVycyBnaXZlbiB7QGxpbmsgRmlsZUxpbmt9cyBieSByZW1vdmluZyBhbHJlYWR5IHVwbG9hZGVkIG9uZXMuCisJICoKKwkgKiBAcGFyYW0gZmlsZUxpbmtzIFdpbGwgYmUgZmlsdGVyZWQuCisJICogQHJldHVybiBSZXR1cm5zIHtAY29kZSBGaWxlTGlua31zIHdoaWNoIGhhdmUgdG8gYmUgdXBsb2FkZWQuCisJICovCisJcHJpdmF0ZSBMaXN0PEZpbGVMaW5rPiByZXRhaW5Gb3JVcGxvYWQoQ29sbGVjdGlvbjxGaWxlTGluaz4gZmlsZUxpbmtzKSB7CisJCUxpc3Q8RmlsZUxpbms+IGZpbHRlcmVkID0gbmV3IEFycmF5TGlzdDw+KGZpbGVMaW5rcyk7CisJCWZvciAoRmlsZUxpbmsgZmlsZUxpbmsgOiBmaWxlTGlua3MpIHsKKwkJCVN0cmluZyByZW1vdGVQYXRoID0gcmVtb3RlUGF0aHMuZ2V0KGZpbGVMaW5rLmdldExvY2FsU3RyZWFtKCkpOworCQkJaWYgKHJlbW90ZVBhdGggIT0gbnVsbCAmJiAhcmVtb3RlUGF0aC5pc0VtcHR5KCkpIHsKKwkJCQlmaWxlTGluay5zZXRSZW1vdGVQYXRoKHJlbW90ZVBhdGgpOworCQkJCWZpbHRlcmVkLnJlbW92ZShmaWxlTGluayk7CisJCQkJdXBsb2FkZWQuYWRkKGZpbGVMaW5rKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBmaWx0ZXJlZDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci90cmFuc2FjdGlvbi9Xcml0ZVJlcXVlc3RIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vV3JpdGVSZXF1ZXN0SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMmFmNTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdHJhbnNhY3Rpb24vV3JpdGVSZXF1ZXN0SGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMTY4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnRyYW5zYWN0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQ29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5EZWZhdWx0Q29yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Xcml0ZVJlcXVlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHMuT0RTQ29udmVydGVyOworCisvKioKKyAqIFdyaXRlcyBtYXNzIGRhdGEgc3BlY2lmaWVkIGluIHtAbGluayBXcml0ZVJlcXVlc3R9cy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlUmVxdWVzdEhhbmRsZXIgeworCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENsYXNzIHZhcmlhYmxlcworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRV9MQ19BVFRSX0lOREVQRU5ERU5UID0gIkluZGVwZW5kZW50RmxhZyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFX0xDX0FUVFJfUkVQUkVTRU5UQVRJT04gPSAiU2VxdWVuY2VSZXByZXNlbnRhdGlvbiI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFX0xDX0FUVFJfUEFSQU1FVEVSUyA9ICJHZW5lcmF0aW9uUGFyYW1ldGVycyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFX0xDX0FUVFJfUkFXREFUQVRZUEUgPSAiUmF3RGF0YXR5cGUiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBRV9MQ19BVFRSX0FYSVNUWVBFID0gImF4aXN0eXBlIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUVfTENfQVRUUl9WQUxVRVMgPSAiVmFsdWVzIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUVfTENfQVRUUl9GTEFHUyA9ICJGbGFncyI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFFX0xDX0FUVFJfR0xPQkFMX0ZMQUcgPSAiR2xvYmFsRmxhZyI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gSW5zdGFuY2UgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBmaW5hbCBMaXN0PENvcmU+IGNvcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJcHJpdmF0ZSBmaW5hbCBFbnRpdHlUeXBlIGxvY2FsQ29sdW1uRW50aXR5VHlwZTsKKwlwcml2YXRlIGZpbmFsIEluc2VydFN0YXRlbWVudCBpbnNlcnRTdGF0ZW1lbnQ7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICoKKwkgKiBAcGFyYW0gdHJhbnNhY3Rpb24gVGhlIG93bmluZyB7QGxpbmsgT0RTVHJhbnNhY3Rpb259LgorCSAqLworCXB1YmxpYyBXcml0ZVJlcXVlc3RIYW5kbGVyKE9EU1RyYW5zYWN0aW9uIHRyYW5zYWN0aW9uKSB7CisJCWxvY2FsQ29sdW1uRW50aXR5VHlwZSA9IHRyYW5zYWN0aW9uLmdldE1vZGVsTWFuYWdlcigpLmdldEVudGl0eVR5cGUoIkxvY2FsQ29sdW1uIik7CisJCWluc2VydFN0YXRlbWVudCA9IG5ldyBJbnNlcnRTdGF0ZW1lbnQodHJhbnNhY3Rpb24sIGxvY2FsQ29sdW1uRW50aXR5VHlwZSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQWRkcyBnaXZlbiB7QGxpbmsgV3JpdGVSZXF1ZXN0fSB0byBiZSBwcm9jZXNzZWQuCisJICoKKwkgKiBAcGFyYW0gd3JpdGVSZXF1ZXN0IFRoZSB7QGNvZGUgV3JpdGVSZXF1ZXN0fS4KKwkgKi8KKwlwdWJsaWMgdm9pZCBhZGRSZXF1ZXN0KFdyaXRlUmVxdWVzdCB3cml0ZVJlcXVlc3QpIHsKKwkJY29yZXMuYWRkKGNyZWF0ZUNvcmUod3JpdGVSZXF1ZXN0KSk7CisJfQorCisJLyoqCisJICogSW1wb3J0cyBnaXZlbiBtYXNzIGRhdGEgY29uZmlndXJhdGlvbnMuCisJICoKKwkgKiBAdGhyb3dzIEFvRXhjZXB0aW9uICAgICAgICAgVGhyb3duIGlmIHRoZSBleGVjdXRpb24gZmFpbHMuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzLgorCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICBUaHJvd24gaWYgYSBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiBmYWlscy4KKwkgKi8KKwlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEFvRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCWluc2VydFN0YXRlbWVudC5leGVjdXRlV2l0aENvcmVzKGNvcmVzKTsKKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUHJpdmF0ZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmVhZHMgZ2l2ZW4ge0BsaW5rIFdyaXRlUmVxdWVzdH0gYW5kIHByZXBhcmVzIGEgY29ycmVzcG9uZGluZyB7QGxpbmsgQ29yZX0KKwkgKiBmb3IgaW1wb3J0LgorCSAqCisJICogQHBhcmFtIHdyaXRlUmVxdWVzdCBUaGUgbWFzcyBkYXRhIGNvbmZpZ3VyYXRpb24uCisJICogQHJldHVybiBUaGUgY3JlYXRlZCB7QGNvZGUgQ29yZX0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBDb3JlIGNyZWF0ZUNvcmUoV3JpdGVSZXF1ZXN0IHdyaXRlUmVxdWVzdCkgeworCQlDb3JlIGNvcmUgPSBuZXcgRGVmYXVsdENvcmUobG9jYWxDb2x1bW5FbnRpdHlUeXBlKTsKKworCQljb3JlLmdldFBlcm1hbmVudFN0b3JlKCkuc2V0KHdyaXRlUmVxdWVzdC5nZXRDaGFubmVsR3JvdXAoKSk7CisJCWNvcmUuZ2V0TXV0YWJsZVN0b3JlKCkuc2V0KHdyaXRlUmVxdWVzdC5nZXRDaGFubmVsKCkpOworCisJCU1hcDxTdHJpbmcsIFZhbHVlPiB2YWx1ZXMgPSBjb3JlLmdldFZhbHVlcygpOworCQl2YWx1ZXMuZ2V0KEVudGl0eS5BVFRSX05BTUUpLnNldCh3cml0ZVJlcXVlc3QuZ2V0Q2hhbm5lbCgpLmdldE5hbWUoKSk7CisJCXZhbHVlcy5nZXQoRW50aXR5LkFUVFJfTUlNRVRZUEUpLnNldCgiYXBwbGljYXRpb24veC1hc2FtLmFvbG9jYWxjb2x1bW4iKTsKKwkJdmFsdWVzLmdldChBRV9MQ19BVFRSX0lOREVQRU5ERU5UKS5zZXQoKHNob3J0KSAod3JpdGVSZXF1ZXN0LmlzSW5kZXBlbmRlbnQoKSA/IDEgOiAwKSk7CisJCXZhbHVlcy5nZXQoQUVfTENfQVRUUl9SQVdEQVRBVFlQRSkuc2V0KHdyaXRlUmVxdWVzdC5nZXRSYXdTY2FsYXJUeXBlKCkpOworCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfUkVQUkVTRU5UQVRJT04pLnNldCh3cml0ZVJlcXVlc3QuZ2V0U2VxdWVuY2VSZXByZXNlbnRhdGlvbigpKTsKKwkJdmFsdWVzLmdldChBRV9MQ19BVFRSX0FYSVNUWVBFKS5zZXQod3JpdGVSZXF1ZXN0LmdldEF4aXNUeXBlKCkpOworCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfUEFSQU1FVEVSUykuc2V0KHdyaXRlUmVxdWVzdC5nZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpKTsKKworCQlpZiAod3JpdGVSZXF1ZXN0Lmhhc1ZhbHVlcygpKSB7CisJCQlWYWx1ZVR5cGU8Pz4gdmFsdWVUeXBlID0gd3JpdGVSZXF1ZXN0LmdldFJhd1NjYWxhclR5cGUoKS50b1ZhbHVlVHlwZSgpOworCQkJU3RyaW5nIHVuaXROYW1lID0gd3JpdGVSZXF1ZXN0LmdldENoYW5uZWwoKS5nZXRVbml0KCkuZ2V0TmFtZSgpOworCQkJdmFsdWVzLnB1dChBRV9MQ19BVFRSX1ZBTFVFUywKKwkJCQkJdmFsdWVUeXBlLmNyZWF0ZShBRV9MQ19BVFRSX1ZBTFVFUywgdW5pdE5hbWUsIHRydWUsIHdyaXRlUmVxdWVzdC5nZXRWYWx1ZXMoKSkpOworCisJCQkvLyBPcGVuQVRGWCBpc3N1ZTogRm9yICJpbXBsaWNpdCIgY29sdW1ucywgaWYgbm8gdmFsdWUgZm9yIHRoZQorCQkJLy8gR2VuZXJhdGlvblBhcmFtZXRlcnMgYXR0cmlidXRlIGlzIHByZXNlbnQsCisJCQkvLyBpdCBpcyBhdHRlbXB0ZWQgdG8gdHJhbnNmZXIgdGhlIGxvY2FsIGNvbHVtbiB2YWx1ZXMgKHRocm91Z2ggd2hpY2ggdGhlCisJCQkvLyBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXJlCisJCQkvLyBhdmFpbGFibGUgaW4gdGhlc2UgY2FzZXMpIHRvIHRoZSBHZW5lcmF0aW9uUGFyYW1ldGVycyBhdHRyaWJ1dGUgd2l0aG91dAorCQkJLy8gY29udmVydGluZyB0aGVtIHRvIHRoZQorCQkJLy8gY29ycmVjdCBEU19ET1VCTEUgZGF0YSB0eXBlIGZpcnN0ICh1bmxlc3MgaXQgaXMgYSBET1VCTEUgb3IgTE9ORyBjb2x1bW4pLAorCQkJLy8gcmVzdWx0aW5nIGluIGFuIGV4Y2VwdGlvbi4KKwkJCS8vIEhlbmNlLCBzdXBwbHkgY29ycmVjdGx5IGNvbnZlcnRlZCBnZW5lcmF0aW9uIHBhcmFtZXRlcnMgYXMgYSB3b3JrYXJvdW5kOgorCQkJaWYgKHdyaXRlUmVxdWVzdC5nZXRTZXF1ZW5jZVJlcHJlc2VudGF0aW9uKCkuaXNJbXBsaWNpdCgpKSB7CisJCQkJT2JqZWN0IGdlblBhcmFtVmFsdWVzID0gd3JpdGVSZXF1ZXN0LmdldFZhbHVlcygpOworCQkJCWRvdWJsZVtdIGdlblBhcmFtRCA9IG5ldyBkb3VibGVbQXJyYXkuZ2V0TGVuZ3RoKGdlblBhcmFtVmFsdWVzKV07CisJCQkJSW50U3RyZWFtLnJhbmdlKDAsIGdlblBhcmFtRC5sZW5ndGgpCisJCQkJCQkuZm9yRWFjaChpIC0+IGdlblBhcmFtRFtpXSA9ICgoTnVtYmVyKSBBcnJheS5nZXQoZ2VuUGFyYW1WYWx1ZXMsIGkpKS5kb3VibGVWYWx1ZSgpKTsKKwkJCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfUEFSQU1FVEVSUykuc2V0KGdlblBhcmFtRCk7CisJCQl9CisKKwkJCS8vIGZsYWdzCisJCQlpZiAod3JpdGVSZXF1ZXN0LmFyZUFsbFZhbGlkKCkpIHsKKwkJCQl2YWx1ZXMuZ2V0KEFFX0xDX0FUVFJfR0xPQkFMX0ZMQUcpLnNldCgoc2hvcnQpIDE1KTsKKwkJCX0gZWxzZSB7CisJCQkJc2hvcnRbXSBmbGFncyA9IE9EU0NvbnZlcnRlci50b09EU1ZhbGlkRmxhZ1NlcSh3cml0ZVJlcXVlc3QuZ2V0RmxhZ3MoKSk7CisJCQkJdmFsdWVzLmdldChBRV9MQ19BVFRSX0ZMQUdTKS5zZXQoZmxhZ3MpOworCQkJfQorCQl9IGVsc2UgaWYgKHdyaXRlUmVxdWVzdC5oYXNFeHRlcm5hbENvbXBvbmVudHMoKSkgeworCQkJLy8gVE9ETworCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOT1QgWUVUIElNUExFTUVOVEVELiIpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiR2l2ZW4gd3JpdGUgcmVxdWVzdCBuZWl0aGVyIGhhcyBtZWFzdXJlZCB2YWx1ZXMgbm9yIGV4dGVybmFsIGNvbXBvbmVudHMiKTsKKwkJfQorCisJCXJldHVybiBjb3JlOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0NvbnZlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0NvbnZlcnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjczZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTQ29udmVydGVyLmphdmEKQEAgLTAsMCArMSwxMjA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzOworCitpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZTsKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOworaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVGb3JtYXR0ZXJCdWlsZGVyOworaW1wb3J0IGphdmEudGltZS5mb3JtYXQuRGF0ZVRpbWVQYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUudGVtcG9yYWwuQ2hyb25vRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQmxvYjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLk5hbWVWYWx1ZVNlcVVuaXQ7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRTX1VuaW9uOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UU19VbmlvblNlcTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVFNfVmFsdWU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRTX1ZhbHVlU2VxOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0NPTVBMRVg7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfRENPTVBMRVg7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfRXh0ZXJuYWxSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRfTE9OR0xPTkc7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Eb3VibGVDb21wbGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5GaWxlTGluazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRmxvYXRDb21wbGV4OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlZFZhbHVlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlNjYWxhclR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5SZWFkUmVxdWVzdEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0F0dHJpYnV0ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciB2YWx1ZSBjb252ZXJzaW9ucyBmcm9tL3RvIE9EUyB0eXBlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9EU0NvbnZlcnRlciB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIERhdGVUaW1lRm9ybWF0dGVyPiBPRFNfREFURV9GT1JNQVRURVJTID0gbmV3IEhhc2hNYXA8PigpOworCisJc3RhdGljIHsKKwkJT0RTX0RBVEVfRk9STUFUVEVSUy5wdXQoNCwKKwkJCQluZXcgRGF0ZVRpbWVGb3JtYXR0ZXJCdWlsZGVyKCkuYXBwZW5kUGF0dGVybigieXl5eSIpLnBhcnNlRGVmYXVsdGluZyhDaHJvbm9GaWVsZC5NT05USF9PRl9ZRUFSLCAxKQorCQkJCQkJLnBhcnNlRGVmYXVsdGluZyhDaHJvbm9GaWVsZC5EQVlfT0ZfTU9OVEgsIDEpLnRvRm9ybWF0dGVyKCkpOworCQlPRFNfREFURV9GT1JNQVRURVJTLnB1dCg2LCBuZXcgRGF0ZVRpbWVGb3JtYXR0ZXJCdWlsZGVyKCkuYXBwZW5kUGF0dGVybigieXl5eU1NIikKKwkJCQkucGFyc2VEZWZhdWx0aW5nKENocm9ub0ZpZWxkLkRBWV9PRl9NT05USCwgMSkudG9Gb3JtYXR0ZXIoKSk7CisJCU9EU19EQVRFX0ZPUk1BVFRFUlMucHV0KDgsIERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigieXl5eU1NZGQiKSk7CisJCU9EU19EQVRFX0ZPUk1BVFRFUlMucHV0KDEwLCBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oInl5eXlNTWRkSEgiKSk7CisJCU9EU19EQVRFX0ZPUk1BVFRFUlMucHV0KDEyLCBEYXRlVGltZUZvcm1hdHRlci5vZlBhdHRlcm4oInl5eXlNTWRkSEhtbSIpKTsKKwkJT0RTX0RBVEVfRk9STUFUVEVSUy5wdXQoMTQsIERhdGVUaW1lRm9ybWF0dGVyLm9mUGF0dGVybigieXl5eU1NZGRISG1tc3MiKSk7CisJCS8qCisJCSAqIEpESy04MDMxMDg1OiBEYXRlVGltZUZvcm1hdHRlciB3b24ndCBwYXJzZSBkYXRlcyB3aXRoIGN1c3RvbSBmb3JtYXQKKwkJICogInl5eXlNTWRkSEhtbXNzU1NTIgorCQkgKiAKKwkJICogQHNlZSBodHRwOi8vYnVncy5qYXZhLmNvbS9idWdkYXRhYmFzZS92aWV3X2J1Zy5kbz9idWdfaWQ9ODAzMTA4NQorCQkgKi8KKwkJT0RTX0RBVEVfRk9STUFUVEVSUy5wdXQoMTcsIG5ldyBEYXRlVGltZUZvcm1hdHRlckJ1aWxkZXIoKS5hcHBlbmRQYXR0ZXJuKCJ5eXl5TU1kZEhIbW1zcyIpCisJCQkJLmFwcGVuZFZhbHVlKENocm9ub0ZpZWxkLk1JTExJX09GX1NFQ09ORCwgMykudG9Gb3JtYXR0ZXIoKSk7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIENvbnN0cnVjdG9ycworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCS8qKgorCSAqIENvbnN0cnVjdG9yLgorCSAqLworCXByaXZhdGUgT0RTQ29udmVydGVyKCkgeworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBDb252ZXJzaW9uIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVFNfVmFsdWVTZXF9IHRvIHtAbGluayBWYWx1ZX1zLgorCSAqCisJICogQHBhcmFtIGF0dHJpYnV0ZSAgIFRoZSB7QGxpbmsgQXR0cmlidXRlfS4KKwkgKiBAcGFyYW0gYWdncmVnYXRpb24gVGhlIHtAbGluayBBZ2dyZWdhdGlvbn0gdXNlZCB3aGVuIHRoZSB2YWx1ZXMgd2VyZQorCSAqICAgICAgICAgICAgICAgICAgICBvYnRhaW5lZC4KKwkgKiBAcGFyYW0gdW5pdCAgICAgICAgVGhlIHVuaXQgbmFtZS4KKwkgKiBAcGFyYW0gb2RzVmFsdWVTZXEgVGhlIHtAY29kZSBUU19WYWx1ZVNlcX0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBWYWx1ZX1zIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24gVGhyb3duIG9uIGNvbnZlcnNpb24gZXJyb3JzLgorCSAqLworCXB1YmxpYyBzdGF0aWMgTGlzdDxWYWx1ZT4gZnJvbU9EU1ZhbHVlU2VxKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uIGFnZ3JlZ2F0aW9uLCBTdHJpbmcgdW5pdCwKKwkJCVRTX1ZhbHVlU2VxIG9kc1ZhbHVlU2VxKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCURhdGFUeXBlIGRhdGFUeXBlID0gb2RzVmFsdWVTZXEudS5kaXNjcmltaW5hdG9yKCk7CisJCXNob3J0W10gZmxhZ3MgPSBvZHNWYWx1ZVNlcS5mbGFnOworCQlMaXN0PFZhbHVlPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oZmxhZ3MubGVuZ3RoKTsKKworCQlpZiAoKChPRFNBdHRyaWJ1dGUpIGF0dHJpYnV0ZSkuaXNJZEF0dHJpYnV0ZSgpICYmIFNldHMKKwkJCQkuaW1tdXRhYmxlRW51bVNldChBZ2dyZWdhdGlvbi5NSU5JTVVNLCBBZ2dyZWdhdGlvbi5NQVhJTVVNLCBBZ2dyZWdhdGlvbi5ESVNUSU5DVCwgQWdncmVnYXRpb24uTk9ORSkKKwkJCQkuY29udGFpbnMoYWdncmVnYXRpb24pKSB7CisJCQlpZiAoRGF0YVR5cGUuRFRfTE9OR0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCQlUX0xPTkdMT05HW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5sb25nbG9uZ1ZhbCgpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBEYXRhVHlwZS5EVF9TVFJJTkcsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJCUxvbmcudG9TdHJpbmcoZnJvbU9EU0xvbmcob2RzVmFsdWVzW2ldKSkpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlczsKKwkJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfTE9OR0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCQlUX0xPTkdMT05HW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51Lmxvbmdsb25nU2VxKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIERhdGFUeXBlLkRTX1NUUklORywgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQkJdG9TdHJpbmcob2RzVmFsdWVzW2ldKSkpOworCQkJCX0KKwkJCQlyZXR1cm4gdmFsdWVzOworCQkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9MT05HID09IGRhdGFUeXBlKSB7CisJCQkJaW50W10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5sb25nVmFsKCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIERhdGFUeXBlLkRUX1NUUklORywgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQkJSW50ZWdlci50b1N0cmluZyhvZHNWYWx1ZXNbaV0pKSk7CisJCQkJfQorCQkJCXJldHVybiB2YWx1ZXM7CisJCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCQlpbnRbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ1NlcSgpOworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBEYXRhVHlwZS5EU19TVFJJTkcsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJCXRvU3RyaW5nKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCQl9CisJCQkJcmV0dXJuIHZhbHVlczsKKwkJCX0KKwkJfQorCisJCWlmIChEYXRhVHlwZS5EVF9TVFJJTkcgPT0gZGF0YVR5cGUpIHsKKwkJCVN0cmluZ1tdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuc3RyaW5nVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX1NUUklORyA9PSBkYXRhVHlwZSkgeworCQkJU3RyaW5nW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LnN0cmluZ1NlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9EQVRFID09IGRhdGFUeXBlKSB7CisJCQlTdHJpbmdbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRhdGVWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKAorCQkJCQkJY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBmcm9tT0RTRGF0ZShvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfREFURSA9PSBkYXRhVHlwZSkgeworCQkJU3RyaW5nW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRhdGVTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCWZyb21PRFNEYXRlU2VxKG9kc1ZhbHVlc1tpXSkpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9CT09MRUFOID09IGRhdGFUeXBlKSB7CisJCQlib29sZWFuW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5ib29sZWFuVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0JPT0xFQU4gPT0gZGF0YVR5cGUpIHsKKwkJCWJvb2xlYW5bXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuYm9vbGVhblNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9CWVRFID09IGRhdGFUeXBlKSB7CisJCQlieXRlW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5ieXRlVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0JZVEUgPT0gZGF0YVR5cGUpIHsKKwkJCWJ5dGVbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuYnl0ZVNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9TSE9SVCA9PSBkYXRhVHlwZSkgeworCQkJc2hvcnRbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LnNob3J0VmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX1NIT1JUID09IGRhdGFUeXBlKSB7CisJCQlzaG9ydFtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5zaG9ydFNlcSgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9MT05HID09IGRhdGFUeXBlKSB7CisJCQlpbnRbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmxvbmdWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfTE9ORyA9PSBkYXRhVHlwZSkgeworCQkJaW50W11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmxvbmdTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfTE9OR0xPTkcgPT0gZGF0YVR5cGUpIHsKKwkJCVRfTE9OR0xPTkdbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51Lmxvbmdsb25nVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZCgKKwkJCQkJCWNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgZnJvbU9EU0xvbmcob2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0xPTkdMT05HID09IGRhdGFUeXBlKSB7CisJCQlUX0xPTkdMT05HW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51Lmxvbmdsb25nU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlmcm9tT0RTTG9uZ1NlcShvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRkxPQVQgPT0gZGF0YVR5cGUpIHsKKwkJCWZsb2F0W10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5mbG9hdFZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19GTE9BVCA9PSBkYXRhVHlwZSkgeworCQkJZmxvYXRbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZmxvYXRTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRE9VQkxFID09IGRhdGFUeXBlKSB7CisJCQlkb3VibGVbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRvdWJsZVZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBvZHNWYWx1ZXNbaV0pKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EU19ET1VCTEUgPT0gZGF0YVR5cGUpIHsKKwkJCWRvdWJsZVtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5kb3VibGVTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwgb2RzVmFsdWVzW2ldKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQllURVNUUiA9PSBkYXRhVHlwZSkgeworCQkJYnl0ZVtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5ieXRlc3RyVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0JZVEVTVFIgPT0gZGF0YVR5cGUpIHsKKwkJCWJ5dGVbXVtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5ieXRlc3RyU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsIG9kc1ZhbHVlc1tpXSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0NPTVBMRVggPT0gZGF0YVR5cGUpIHsKKwkJCVRfQ09NUExFWFtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuY29tcGxleFZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJZnJvbU9EU0Zsb2F0Q29tcGxleChvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfQ09NUExFWCA9PSBkYXRhVHlwZSkgeworCQkJVF9DT01QTEVYW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmNvbXBsZXhTZXEoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCWZyb21PRFNGbG9hdENvbXBsZXhTZXEob2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0RDT01QTEVYID09IGRhdGFUeXBlKSB7CisJCQlUX0RDT01QTEVYW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5kY29tcGxleFZhbCgpOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlcy5hZGQoY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LAorCQkJCQkJZnJvbU9EU0RvdWJsZUNvbXBsZXgob2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0RDT01QTEVYID09IGRhdGFUeXBlKSB7CisJCQlUX0RDT01QTEVYW11bXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRjb21wbGV4U2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlmcm9tT0RTRG91YmxlQ29tcGxleFNlcShvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRU5VTSA9PSBkYXRhVHlwZSkgeworCQkJaW50W10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5lbnVtVmFsKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlPRFNFbnVtZXJhdGlvbnMuZnJvbU9EU0VudW0oYXR0cmlidXRlLmdldEVudW1PYmooKSwgb2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRTX0VOVU0gPT0gZGF0YVR5cGUpIHsKKwkJCWludFtdW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5lbnVtU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlPRFNFbnVtZXJhdGlvbnMuZnJvbU9EU0VudW1TZXEoYXR0cmlidXRlLmdldEVudW1PYmooKSwgb2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0VYVEVSTkFMUkVGRVJFTkNFID09IGRhdGFUeXBlKSB7CisJCQlUX0V4dGVybmFsUmVmZXJlbmNlW10gb2RzVmFsdWVzID0gb2RzVmFsdWVTZXEudS5leHRSZWZWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKGNyZWF0ZVZhbHVlKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24sIGRhdGFUeXBlLCB1bml0LCBmbGFnc1tpXSA9PSAxNSwKKwkJCQkJCWZyb21PRFNFeHRlcm5hbFJlZmVyZW5jZShvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFNfRVhURVJOQUxSRUZFUkVOQ0UgPT0gZGF0YVR5cGUpIHsKKwkJCVRfRXh0ZXJuYWxSZWZlcmVuY2VbXVtdIG9kc1ZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuZXh0UmVmU2VxKCk7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJdmFsdWVzLmFkZChjcmVhdGVWYWx1ZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uLCBkYXRhVHlwZSwgdW5pdCwgZmxhZ3NbaV0gPT0gMTUsCisJCQkJCQlmcm9tT0RTRXh0ZXJuYWxSZWZlcmVuY2VTZXEob2RzVmFsdWVzW2ldKSkpOworCQkJfQorCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0JMT0IgPT0gZGF0YVR5cGUpIHsKKwkJCUJsb2JbXSBvZHNWYWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJsb2JWYWwoKTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXMuYWRkKAorCQkJCQkJY3JlYXRlVmFsdWUoYXR0cmlidXRlLCBhZ2dyZWdhdGlvbiwgZGF0YVR5cGUsIHVuaXQsIGZsYWdzW2ldID09IDE1LCBmcm9tT0RTQmxvYihvZHNWYWx1ZXNbaV0pKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiQ29udmVyc2lvbiBmb3IgT0RTIGRhdGEgdHlwZSAnIiArIGRhdGFUeXBlLnRvU3RyaW5nKCkgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwkJfQorCisJCXJldHVybiB2YWx1ZXM7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIHtAbGluayBWYWx1ZX0gZnJvbSB0aGUgaW5wdXQuCisJICogCisJICogQHBhcmFtIGF0dHJpYnV0ZSAgIFRoZSB7QGxpbmsgQXR0cmlidXRlfQorCSAqIEBwYXJhbSBhZ2dyZWdhdGlvbiBUaGUge0BsaW5rIEFnZ3JlZ2F0aW9ufSB1c2VkIHdoZW4gdGhlIGlucHV0IHZhbHVlcyB3ZXJlCisJICogICAgICAgICAgICAgICAgICAgIG9idGFpbmVkCisJICogQHBhcmFtIGRhdGFUeXBlICAgIFRoZSB7QGxpbmsgRGF0YVR5cGV9IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgdmFsdWUsCisJICogICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlZCBvbmx5IGlmIGFnZ3JlZ2F0aW9uICE9IHtAY29kZSBBZ2dyZWdhdGlvbi5OT05FfSwKKwkgKiAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoYXQgb2YgdGhlIGF0dHJpYnV0ZSBpcyB1c2VkCisJICogQHBhcmFtIHVuaXQgICAgICAgIFRoZSB1bml0IG9mIHRoZSBpbnB1dCB2YWx1ZQorCSAqIEBwYXJhbSB2YWxpZCAgICAgICBUaGUgdmFsaWRpdHkgZmxhZyBvZiB0aGUgaW5wdXQgdmFsdWUKKwkgKiBAcGFyYW0gaW5wdXQgICAgICAgVGhlIGlucHV0IHZhbHVlCisJICogQHJldHVybiBUaGUge0BsaW5rIFZhbHVlfSBjcmVhdGVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFZhbHVlIGNyZWF0ZVZhbHVlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEFnZ3JlZ2F0aW9uIGFnZ3JlZ2F0aW9uLCBEYXRhVHlwZSBkYXRhVHlwZSwgU3RyaW5nIHVuaXQsCisJCQlib29sZWFuIHZhbGlkLCBPYmplY3QgaW5wdXQpIHsKKwkJaWYgKEFnZ3JlZ2F0aW9uLk5PTkUgPT0gYWdncmVnYXRpb24pIHsKKwkJCXJldHVybiBhdHRyaWJ1dGUuY3JlYXRlVmFsdWUodW5pdCwgdmFsaWQsIGlucHV0KTsKKwkJfSBlbHNlIHsKKwkJCVZhbHVlVHlwZTw/PiB2YWx1ZVR5cGUgPSBPRFNVdGlscy5WQUxVRVRZUEVTLmludmVyc2UoKS5nZXQoZGF0YVR5cGUpOworCQkJaWYgKHZhbHVlVHlwZS5pc0VudW1lcmF0aW9uVHlwZSgpICYmIGF0dHJpYnV0ZS5nZXRWYWx1ZVR5cGUoKS5pc0VudW1lcmF0aW9uVHlwZSgpCisJCQkJCSYmIFNldHMuaW1tdXRhYmxlRW51bVNldChBZ2dyZWdhdGlvbi5NSU5JTVVNLCBBZ2dyZWdhdGlvbi5NQVhJTVVNLCBBZ2dyZWdhdGlvbi5ESVNUSU5DVCkKKwkJCQkJCQkuY29udGFpbnMoYWdncmVnYXRpb24pKSB7CisJCQkJcmV0dXJuIHZhbHVlVHlwZS5jcmVhdGUoZ2V0Q29sdW1uTmFtZShhdHRyaWJ1dGUsIGFnZ3JlZ2F0aW9uKSwgdW5pdCwgdmFsaWQsIGlucHV0LAorCQkJCQkJYXR0cmlidXRlLmdldEVudW1PYmooKS5nZXROYW1lKCkpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gdmFsdWVUeXBlLmNyZWF0ZShnZXRDb2x1bW5OYW1lKGF0dHJpYnV0ZSwgYWdncmVnYXRpb24pLCB1bml0LCB2YWxpZCwgaW5wdXQpOworCQkJfQorCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggaXRzIGFwcGxpZWQgYWdncmVnYXRpb24gYXMgcmV0dXJuZWQgYnkKKwkgKiB0aGUgT0RTIFNlcnZlciwgZm9yIGV4YW1wbGU6IE1BWElNVU0oc29ydEluZGV4KQorCSAqIAorCSAqIEBwYXJhbSBhdHRyaWJ1dGUKKwkgKiBAcGFyYW0gYWdncmVnYXRpb24KKwkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgYXBwbGllZCBhZ2dyYWdhdGlvbgorCSAqLworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbHVtbk5hbWUoQXR0cmlidXRlIGF0dHJpYnV0ZSwgQWdncmVnYXRpb24gYWdncmVnYXRpb24pIHsKKwkJcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIGFnZ3JlZ2F0aW9uLm5hbWUoKSwgYXR0cmlidXRlLmdldE5hbWUoKSk7CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdG9TdHJpbmcoaW50W10gb2RzVmFsdWVzKSB7CisJCXJldHVybiBJbnRTdHJlYW0ub2Yob2RzVmFsdWVzKS5tYXBUb09iaihJbnRlZ2VyOjp0b1N0cmluZykudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b1N0cmluZyhUX0xPTkdMT05HW10gb2RzVmFsdWVzKSB7CisJCXJldHVybiBTdHJlYW0ub2Yob2RzVmFsdWVzKS5tYXAobCAtPiBMb25nLnRvU3RyaW5nKGZyb21PRFNMb25nKGwpKSkudG9BcnJheShTdHJpbmdbXTo6bmV3KTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVmFsdWV9cyB0byB7QGxpbmsgVFNfVmFsdWVTZXF9LgorCSAqCisJICogQHBhcmFtIHZhbHVlcyBUaGUge0Bjb2RlIFZhbHVlfXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBUU19WYWx1ZVNlcX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBvbiBjb252ZXJzaW9uIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRTX1ZhbHVlU2VxIHRvT0RTVmFsdWVTZXEoQXR0cmlidXRlIGF0dHJpYnV0ZSwgTGlzdDxWYWx1ZT4gdmFsdWVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCWludCBzaXplID0gdmFsdWVzID09IG51bGwgPyAwIDogdmFsdWVzLnNpemUoKTsKKwkJc2hvcnRbXSBmbGFncyA9IG5ldyBzaG9ydFtzaXplXTsKKworCQlUU19WYWx1ZVNlcSBvZHNWYWx1ZVNlcSA9IG5ldyBUU19WYWx1ZVNlcShuZXcgVFNfVW5pb25TZXEoKSwgZmxhZ3MpOworCQlpZiAodmFsdWVzID09IG51bGwgfHwgc2l6ZSA8IDEpIHsKKwkJCW9kc1ZhbHVlU2VxLnUuX2RlZmF1bHQoKTsKKwkJCXJldHVybiBvZHNWYWx1ZVNlcTsKKwkJfQorCisJCVZhbHVlVHlwZTw/PiB0eXBlID0gdmFsdWVzLmdldCgwKS5nZXRWYWx1ZVR5cGUoKTsKKwkJaWYgKFZhbHVlVHlwZS5TVFJJTkcgPT0gdHlwZSkgeworCQkJU3RyaW5nW10gb2RzVmFsdWVzID0gbmV3IFN0cmluZ1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlpZiAoKChPRFNBdHRyaWJ1dGUpIGF0dHJpYnV0ZSkuaXNJZEF0dHJpYnV0ZSgpKSB7CisJCQkJb2RzVmFsdWVTZXEudS5sb25nbG9uZ1ZhbCh0b0xvbmdMb25nKG9kc1ZhbHVlcykpOworCQkJfSBlbHNlIHsKKwkJCQlvZHNWYWx1ZVNlcS51LnN0cmluZ1ZhbChvZHNWYWx1ZXMpOworCQkJfQorCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5TVFJJTkdfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJU3RyaW5nW11bXSBvZHNWYWx1ZXMgPSBuZXcgU3RyaW5nW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJaWYgKCgoT0RTQXR0cmlidXRlKSBhdHRyaWJ1dGUpLmlzSWRBdHRyaWJ1dGUoKSkgeworCQkJCW9kc1ZhbHVlU2VxLnUubG9uZ2xvbmdTZXEodG9Mb25nTG9uZ1NlcShvZHNWYWx1ZXMpKTsKKwkJCX0gZWxzZSB7CisJCQkJb2RzVmFsdWVTZXEudS5zdHJpbmdTZXEob2RzVmFsdWVzKTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5EQVRFID09IHR5cGUpIHsKKwkJCVN0cmluZ1tdIG9kc1ZhbHVlcyA9IG5ldyBTdHJpbmdbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0RhdGUodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZGF0ZVZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5EQVRFX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCVN0cmluZ1tdW10gb2RzVmFsdWVzID0gbmV3IFN0cmluZ1tzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNEYXRlU2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmRhdGVTZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQk9PTEVBTiA9PSB0eXBlKSB7CisJCQlib29sZWFuW10gb2RzVmFsdWVzID0gbmV3IGJvb2xlYW5bc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmJvb2xlYW5WYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQk9PTEVBTl9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlib29sZWFuW11bXSBvZHNWYWx1ZXMgPSBuZXcgYm9vbGVhbltzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5ib29sZWFuU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEUgPT0gdHlwZSkgeworCQkJYnl0ZVtdIG9kc1ZhbHVlcyA9IG5ldyBieXRlW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5ieXRlVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEVfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJYnl0ZVtdW10gb2RzVmFsdWVzID0gbmV3IGJ5dGVbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuYnl0ZVNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5TSE9SVCA9PSB0eXBlKSB7CisJCQlzaG9ydFtdIG9kc1ZhbHVlcyA9IG5ldyBzaG9ydFtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuc2hvcnRWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuU0hPUlRfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJc2hvcnRbXVtdIG9kc1ZhbHVlcyA9IG5ldyBzaG9ydFtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5zaG9ydFNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5JTlRFR0VSID09IHR5cGUpIHsKKwkJCWludFtdIG9kc1ZhbHVlcyA9IG5ldyBpbnRbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmxvbmdWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuSU5URUdFUl9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlpbnRbXVtdIG9kc1ZhbHVlcyA9IG5ldyBpbnRbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUubG9uZ1NlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5MT05HID09IHR5cGUpIHsKKwkJCVRfTE9OR0xPTkdbXSBvZHNWYWx1ZXMgPSBuZXcgVF9MT05HTE9OR1tzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTTG9uZyh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5sb25nbG9uZ1ZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5MT05HX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCVRfTE9OR0xPTkdbXVtdIG9kc1ZhbHVlcyA9IG5ldyBUX0xPTkdMT05HW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0xvbmdTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUubG9uZ2xvbmdTZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRkxPQVQgPT0gdHlwZSkgeworCQkJZmxvYXRbXSBvZHNWYWx1ZXMgPSBuZXcgZmxvYXRbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmZsb2F0VmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZMT0FUX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCWZsb2F0W11bXSBvZHNWYWx1ZXMgPSBuZXcgZmxvYXRbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHZhbHVlLmV4dHJhY3QoKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZmxvYXRTZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFID09IHR5cGUpIHsKKwkJCWRvdWJsZVtdIG9kc1ZhbHVlcyA9IG5ldyBkb3VibGVbc2l6ZV07CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmRvdWJsZVZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5ET1VCTEVfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJZG91YmxlW11bXSBvZHNWYWx1ZXMgPSBuZXcgZG91YmxlW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB2YWx1ZS5leHRyYWN0KCk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmRvdWJsZVNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CWVRFX1NUUkVBTSA9PSB0eXBlKSB7CisJCQlieXRlW11bXSBvZHNWYWx1ZXMgPSBuZXcgYnl0ZVtzaXplXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5ieXRlc3RyVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEVfU1RSRUFNX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCWJ5dGVbXVtdW10gb2RzVmFsdWVzID0gbmV3IGJ5dGVbc2l6ZV1bXVtdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdmFsdWUuZXh0cmFjdCgpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5ieXRlc3RyU2VxKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZMT0FUX0NPTVBMRVggPT0gdHlwZSkgeworCQkJVF9DT01QTEVYW10gb2RzVmFsdWVzID0gbmV3IFRfQ09NUExFWFtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTRmxvYXRDb21wbGV4KHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmNvbXBsZXhWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRkxPQVRfQ09NUExFWF9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlUX0NPTVBMRVhbXVtdIG9kc1ZhbHVlcyA9IG5ldyBUX0NPTVBMRVhbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTRmxvYXRDb21wbGV4U2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmNvbXBsZXhTZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVggPT0gdHlwZSkgeworCQkJVF9EQ09NUExFWFtdIG9kc1ZhbHVlcyA9IG5ldyBUX0RDT01QTEVYW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNEb3VibGVDb21wbGV4KHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmRjb21wbGV4VmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRPVUJMRV9DT01QTEVYX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCVRfRENPTVBMRVhbXVtdIG9kc1ZhbHVlcyA9IG5ldyBUX0RDT01QTEVYW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0RvdWJsZUNvbXBsZXhTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZGNvbXBsZXhTZXEob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRU5VTUVSQVRJT04gPT0gdHlwZSkgeworCQkJaW50W10gb2RzVmFsdWVzID0gbmV3IGludFtzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IE9EU0VudW1lcmF0aW9ucy50b09EU0VudW0odmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZW51bVZhbChvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5FTlVNRVJBVElPTl9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlpbnRbXVtdIG9kc1ZhbHVlcyA9IG5ldyBpbnRbc2l6ZV1bXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IE9EU0VudW1lcmF0aW9ucy50b09EU0VudW1TZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJCW9kc1ZhbHVlU2VxLnUuZW51bVNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GSUxFX0xJTksgPT0gdHlwZSkgeworCQkJVF9FeHRlcm5hbFJlZmVyZW5jZVtdIG9kc1ZhbHVlcyA9IG5ldyBUX0V4dGVybmFsUmVmZXJlbmNlW3NpemVdOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGFncy5sZW5ndGg7IGkrKykgeworCQkJCVZhbHVlIHZhbHVlID0gdmFsdWVzLmdldChpKTsKKwkJCQlmbGFnc1tpXSA9IHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSk7CisJCQkJb2RzVmFsdWVzW2ldID0gdG9PRFNFeHRlcm5hbFJlZmVyZW5jZSh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5leHRSZWZWYWwob2RzVmFsdWVzKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRklMRV9MSU5LX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCVRfRXh0ZXJuYWxSZWZlcmVuY2VbXVtdIG9kc1ZhbHVlcyA9IG5ldyBUX0V4dGVybmFsUmVmZXJlbmNlW3NpemVdW107CisJCQlmb3IgKGludCBpID0gMDsgaSA8IGZsYWdzLmxlbmd0aDsgaSsrKSB7CisJCQkJVmFsdWUgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworCQkJCWZsYWdzW2ldID0gdG9PRFNWYWxpZEZsYWcodmFsdWUuaXNWYWxpZCgpKTsKKwkJCQlvZHNWYWx1ZXNbaV0gPSB0b09EU0V4dGVybmFsUmVmZXJlbmNlU2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCQl9CisJCQlvZHNWYWx1ZVNlcS51LmV4dFJlZlNlcShvZHNWYWx1ZXMpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CTE9CID09IHR5cGUpIHsKKwkJCUJsb2JbXSBvZHNWYWx1ZXMgPSBuZXcgQmxvYltzaXplXTsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhZ3MubGVuZ3RoOyBpKyspIHsKKwkJCQlWYWx1ZSB2YWx1ZSA9IHZhbHVlcy5nZXQoaSk7CisJCQkJZmxhZ3NbaV0gPSB0b09EU1ZhbGlkRmxhZyh2YWx1ZS5pc1ZhbGlkKCkpOworCQkJCW9kc1ZhbHVlc1tpXSA9IHRvT0RTQmxvYih2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQkJb2RzVmFsdWVTZXEudS5ibG9iVmFsKG9kc1ZhbHVlcyk7CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiTWFwcGluZyBmb3IgdmFsdWUgdHlwZSAnIiArIHR5cGUgKyAiJyBkb2VzIG5vdCBleGlzdC4iKTsKKwkJfQorCisJCXJldHVybiBvZHNWYWx1ZVNlcTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB0d28gZGltZW5zaW9uYWwgU3RyaW5nIGFycmF5IHRvIHR3byBkaW1lbnNpb25hbAorCSAqIHtAbGluayBUX0xPTkdMT05HfSBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIFN0cmluZyBhcnJheS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0BsaW5rIFRfTE9OR0xPTkd9IGFycmF5LgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfTE9OR0xPTkdbXVtdIHRvTG9uZ0xvbmdTZXEoU3RyaW5nW11bXSB2YWx1ZSkgeworCisJCXJldHVybiBTdHJlYW0ub2YodmFsdWUpLm1hcChPRFNDb252ZXJ0ZXI6OnRvTG9uZ0xvbmcpLnRvQXJyYXkoVF9MT05HTE9OR1tdW106Om5ldyk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4gU3RyaW5nIGFycmF5IHRvIHtAbGluayBUX0xPTkdMT05HfSBhcnJheS4KKwkgKiAKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIFN0cmluZyBhcnJheS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0BsaW5rIFRfTE9OR0xPTkd9IGFycmF5LgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfTE9OR0xPTkdbXSB0b0xvbmdMb25nKFN0cmluZ1tdIHZhbHVlKSB7CisJCXJldHVybiBTdHJlYW0ub2YodmFsdWUpLm1hcChzIC0+IHRvT0RTSUQocykpLnRvQXJyYXkoVF9MT05HTE9OR1tdOjpuZXcpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBOYW1lVmFsdWVTZXFVbml0W119IHRvIHtAbGluayBNZWFzdXJlZFZhbHVlc31zLgorCSAqCisJICogQHBhcmFtIG9kc01lYXN1cmVkVmFsdWVzU2VxIFRoZSB7QGNvZGUgTmFtZVZhbHVlU2VxVW5pdH1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgTWVhc3VyZWRWYWx1ZXN9cyBhcmUgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBvbiBjb252ZXJzaW9uIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIExpc3Q8TWVhc3VyZWRWYWx1ZXM+IGZyb21PRFNNZWFzdXJlZFZhbHVlc1NlcShOYW1lVmFsdWVTZXFVbml0W10gb2RzTWVhc3VyZWRWYWx1ZXNTZXEsCisJCQlSZWFkUmVxdWVzdEhhbmRsZXIuQ29sdW1uQXR0cmlidXRlc1tdIGNvbHVtbkF0dHJpYnV0ZXNBcnJheSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PE1lYXN1cmVkVmFsdWVzPiBtZWFzdXJlZFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PihvZHNNZWFzdXJlZFZhbHVlc1NlcS5sZW5ndGgpOworCisJCU1hcDxTdHJpbmcsIFJlYWRSZXF1ZXN0SGFuZGxlci5Db2x1bW5BdHRyaWJ1dGVzPiBtYXBDb2x1bW5BdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8PigpOworCQlpZiAobnVsbCAhPSBjb2x1bW5BdHRyaWJ1dGVzQXJyYXkpIHsKKwkJCUFycmF5cy5zdHJlYW0oY29sdW1uQXR0cmlidXRlc0FycmF5KS5mb3JFYWNoKGNhIC0+IG1hcENvbHVtbkF0dHJpYnV0ZXMucHV0KGNhLmdldE5hbWUoKSwgY2EpKTsKKwkJfQorCisJCWZvciAoTmFtZVZhbHVlU2VxVW5pdCBvZHNNZWFzdXJlZFZhbHVlcyA6IG9kc01lYXN1cmVkVmFsdWVzU2VxKSB7CisJCQltZWFzdXJlZFZhbHVlcworCQkJCQkuYWRkKGZyb21PRFNNZWFzdXJlZFZhbHVlcyhvZHNNZWFzdXJlZFZhbHVlcywgbWFwQ29sdW1uQXR0cmlidXRlcy5nZXQob2RzTWVhc3VyZWRWYWx1ZXMudmFsTmFtZSkpKTsKKwkJfQorCisJCXJldHVybiBtZWFzdXJlZFZhbHVlczsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgTmFtZVZhbHVlU2VxVW5pdH0gdG8ge0BsaW5rIE1lYXN1cmVkVmFsdWVzfS4KKwkgKgorCSAqIEBwYXJhbSBvZHNNZWFzdXJlZFZhbHVlcyBUaGUge0Bjb2RlIE5hbWVWYWx1ZVNlcVVuaXR9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgTWVhc3VyZWRWYWx1ZXN9IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiBUaHJvd24gb24gY29udmVyc2lvbiBlcnJvcnMuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTWVhc3VyZWRWYWx1ZXMgZnJvbU9EU01lYXN1cmVkVmFsdWVzKE5hbWVWYWx1ZVNlcVVuaXQgb2RzTWVhc3VyZWRWYWx1ZXMsCisJCQlSZWFkUmVxdWVzdEhhbmRsZXIuQ29sdW1uQXR0cmlidXRlcyBjb2x1bW5BdHRyaWJ1dGVzKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCVRTX1ZhbHVlU2VxIG9kc1ZhbHVlU2VxID0gb2RzTWVhc3VyZWRWYWx1ZXMudmFsdWU7CisJCURhdGFUeXBlIGRhdGFUeXBlID0gb2RzVmFsdWVTZXEudS5kaXNjcmltaW5hdG9yKCk7CisJCVNjYWxhclR5cGUgc2NhbGFyVHlwZTsKKwkJT2JqZWN0IHZhbHVlczsKKworCQlpZiAoRGF0YVR5cGUuRFRfU1RSSU5HID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5TVFJJTkc7CisJCQl2YWx1ZXMgPSBvZHNWYWx1ZVNlcS51LnN0cmluZ1ZhbCgpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0RBVEUgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkRBVEU7CisJCQl2YWx1ZXMgPSBmcm9tT0RTRGF0ZVNlcShvZHNWYWx1ZVNlcS51LmRhdGVWYWwoKSk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQk9PTEVBTiA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuQk9PTEVBTjsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUuYm9vbGVhblZhbCgpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0JZVEUgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkJZVEU7CisJCQl2YWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmJ5dGVWYWwoKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9TSE9SVCA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuU0hPUlQ7CisJCQl2YWx1ZXMgPSBvZHNWYWx1ZVNlcS51LnNob3J0VmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfTE9ORyA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuSU5URUdFUjsKKwkJCXZhbHVlcyA9IG9kc1ZhbHVlU2VxLnUubG9uZ1ZhbCgpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0xPTkdMT05HID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5MT05HOworCQkJdmFsdWVzID0gZnJvbU9EU0xvbmdTZXEob2RzVmFsdWVTZXEudS5sb25nbG9uZ1ZhbCgpKTsKKwkJfSBlbHNlIGlmIChEYXRhVHlwZS5EVF9GTE9BVCA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuRkxPQVQ7CisJCQl2YWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmZsb2F0VmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRE9VQkxFID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5ET1VCTEU7CisJCQl2YWx1ZXMgPSBvZHNWYWx1ZVNlcS51LmRvdWJsZVZhbCgpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0JZVEVTVFIgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkJZVEVfU1RSRUFNOworCQkJdmFsdWVzID0gb2RzVmFsdWVTZXEudS5ieXRlc3RyVmFsKCk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfQ09NUExFWCA9PSBkYXRhVHlwZSkgeworCQkJc2NhbGFyVHlwZSA9IFNjYWxhclR5cGUuRkxPQVRfQ09NUExFWDsKKwkJCXZhbHVlcyA9IGZyb21PRFNGbG9hdENvbXBsZXhTZXEob2RzVmFsdWVTZXEudS5jb21wbGV4VmFsKCkpOworCQl9IGVsc2UgaWYgKERhdGFUeXBlLkRUX0RDT01QTEVYID09IGRhdGFUeXBlKSB7CisJCQlzY2FsYXJUeXBlID0gU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWDsKKwkJCXZhbHVlcyA9IGZyb21PRFNEb3VibGVDb21wbGV4U2VxKG9kc1ZhbHVlU2VxLnUuZGNvbXBsZXhWYWwoKSk7CisJCX0gZWxzZSBpZiAoRGF0YVR5cGUuRFRfRVhURVJOQUxSRUZFUkVOQ0UgPT0gZGF0YVR5cGUpIHsKKwkJCXNjYWxhclR5cGUgPSBTY2FsYXJUeXBlLkZJTEVfTElOSzsKKwkJCXZhbHVlcyA9IGZyb21PRFNFeHRlcm5hbFJlZmVyZW5jZVNlcShvZHNWYWx1ZVNlcS51LmV4dFJlZlZhbCgpKTsKKwkJfSBlbHNlIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKAorCQkJCQkiQ29udmVyc2lvbiBmb3IgT0RTIG1lYXN1cmVkIHBvaW50cyBvZiB0eXBlICciICsgZGF0YVR5cGUudG9TdHJpbmcoKSArICInIGRvZXMgbm90IGV4aXN0LiIpOworCQl9CisKKwkJaWYgKG51bGwgPT0gY29sdW1uQXR0cmlidXRlcykgeworCQkJY29sdW1uQXR0cmlidXRlcyA9IG5ldyBSZWFkUmVxdWVzdEhhbmRsZXIuQ29sdW1uQXR0cmlidXRlcygiIiwgbnVsbCwgbmV3IGRvdWJsZVswXSwgZmFsc2UsIG51bGwpOworCQl9CisKKwkJcmV0dXJuIHNjYWxhclR5cGUuY3JlYXRlTWVhc3VyZWRWYWx1ZXMob2RzTWVhc3VyZWRWYWx1ZXMudmFsTmFtZSwgb2RzTWVhc3VyZWRWYWx1ZXMudW5pdCwKKwkJCQljb2x1bW5BdHRyaWJ1dGVzLmdldFNlcXVlbmNlUmVwcmVzZW50YXRpb24oKSwgY29sdW1uQXR0cmlidXRlcy5nZXRHZW5lcmF0aW9uUGFyYW1ldGVycygpLAorCQkJCWNvbHVtbkF0dHJpYnV0ZXMuaXNJbmRlcGVuZGVudENvbHVtbigpLCBjb2x1bW5BdHRyaWJ1dGVzLmdldEF4aXNUeXBlKCksIHZhbHVlcywKKwkJCQlmcm9tT0RTVmFsaWRGbGFnU2VxKG9kc1ZhbHVlU2VxLmZsYWcpKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVmFsdWV9IHRvIHtAbGluayBUU19WYWx1ZX0uCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIHtAY29kZSBWYWx1ZX0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBUU19WYWx1ZX0gaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIFRocm93biBvbiBjb252ZXJzaW9uIGVycm9ycy4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRTX1ZhbHVlIHRvT0RTVmFsdWUoQXR0cmlidXRlIGF0dHJpYnV0ZSwgVmFsdWUgdmFsdWUpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJVFNfVmFsdWUgb2RzVmFsdWUgPSBuZXcgVFNfVmFsdWUobmV3IFRTX1VuaW9uKCksIHRvT0RTVmFsaWRGbGFnKHZhbHVlLmlzVmFsaWQoKSkpOworCQlWYWx1ZVR5cGU8Pz4gdHlwZSA9IHZhbHVlLmdldFZhbHVlVHlwZSgpOworCisJCWlmIChWYWx1ZVR5cGUuU1RSSU5HID09IHR5cGUpIHsKKwkJCWlmICgoKE9EU0F0dHJpYnV0ZSkgYXR0cmlidXRlKS5pc0lkQXR0cmlidXRlKCkpIHsKKwkJCQlvZHNWYWx1ZS51Lmxvbmdsb25nVmFsKE9EU0NvbnZlcnRlci50b09EU0lEKHZhbHVlLmV4dHJhY3QoKSkpOworCQkJfSBlbHNlIHsKKwkJCQlvZHNWYWx1ZS51LnN0cmluZ1ZhbCh2YWx1ZS5leHRyYWN0KCkpOworCQkJfQorCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5TVFJJTkdfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJaWYgKCgoT0RTQXR0cmlidXRlKSBhdHRyaWJ1dGUpLmlzSWRBdHRyaWJ1dGUoKSkgeworCQkJCW9kc1ZhbHVlLnUubG9uZ2xvbmdTZXEoCisJCQkJCQlTdHJlYW0ub2YoKFN0cmluZ1tdKSB2YWx1ZS5leHRyYWN0KCkpLm1hcChPRFNDb252ZXJ0ZXI6OnRvT0RTSUQpLnRvQXJyYXkoVF9MT05HTE9OR1tdOjpuZXcpKTsKKwkJCX0gZWxzZSB7CisJCQkJb2RzVmFsdWUudS5zdHJpbmdTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuREFURSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmRhdGVWYWwodG9PRFNEYXRlKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5EQVRFX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZGF0ZVNlcSh0b09EU0RhdGVTZXEodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJPT0xFQU4gPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5ib29sZWFuVmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJPT0xFQU5fU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5ib29sZWFuVmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEUgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5ieXRlVmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkJZVEVfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5ieXRlU2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLlNIT1JUID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuc2hvcnRWYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuU0hPUlRfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5zaG9ydFNlcSh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5JTlRFR0VSID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUubG9uZ1ZhbCh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5JTlRFR0VSX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUubG9uZ1NlcSh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5MT05HID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUubG9uZ2xvbmdWYWwodG9PRFNMb25nKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5MT05HX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUubG9uZ2xvbmdTZXEodG9PRFNMb25nU2VxKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GTE9BVCA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmZsb2F0VmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZMT0FUX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZmxvYXRTZXEodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZG91YmxlVmFsKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRPVUJMRV9TRVFVRU5DRSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmRvdWJsZVNlcSh2YWx1ZS5leHRyYWN0KCkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5CWVRFX1NUUkVBTSA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJ5dGVzdHJWYWwodmFsdWUuZXh0cmFjdCgpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQllURV9TVFJFQU1fU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5ieXRlc3RyU2VxKHZhbHVlLmV4dHJhY3QoKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZMT0FUX0NPTVBMRVggPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5jb21wbGV4VmFsKHRvT0RTRmxvYXRDb21wbGV4KHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GTE9BVF9DT01QTEVYX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuY29tcGxleFNlcSh0b09EU0Zsb2F0Q29tcGxleFNlcSh2YWx1ZS5leHRyYWN0KCkpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRE9VQkxFX0NPTVBMRVggPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5kY29tcGxleFZhbCh0b09EU0RvdWJsZUNvbXBsZXgodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkRPVUJMRV9DT01QTEVYX1NFUVVFTkNFID09IHR5cGUpIHsKKwkJCW9kc1ZhbHVlLnUuZGNvbXBsZXhTZXEodG9PRFNEb3VibGVDb21wbGV4U2VxKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5FTlVNRVJBVElPTiA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmVudW1WYWwoT0RTRW51bWVyYXRpb25zLnRvT0RTRW51bSh2YWx1ZS5leHRyYWN0KCkpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuRU5VTUVSQVRJT05fU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5lbnVtU2VxKE9EU0VudW1lcmF0aW9ucy50b09EU0VudW1TZXEodmFsdWUuZXh0cmFjdCgpKSk7CisJCX0gZWxzZSBpZiAoVmFsdWVUeXBlLkZJTEVfTElOSyA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmV4dFJlZlZhbCh0b09EU0V4dGVybmFsUmVmZXJlbmNlKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgaWYgKFZhbHVlVHlwZS5GSUxFX0xJTktfU0VRVUVOQ0UgPT0gdHlwZSkgeworCQkJb2RzVmFsdWUudS5leHRSZWZTZXEodG9PRFNFeHRlcm5hbFJlZmVyZW5jZVNlcSh2YWx1ZS5leHRyYWN0KCkpKTsKKwkJfSBlbHNlIGlmIChWYWx1ZVR5cGUuQkxPQiA9PSB0eXBlKSB7CisJCQlvZHNWYWx1ZS51LmJsb2JWYWwodG9PRFNCbG9iKHZhbHVlLmV4dHJhY3QoKSkpOworCQl9IGVsc2UgeworCQkJdGhyb3cgbmV3IERhdGFBY2Nlc3NFeGNlcHRpb24oIk1hcHBpbmcgZm9yIHZhbHVlIHR5cGUgJyIgKyB0eXBlICsgIicgZG9lcyBub3QgZXhpc3QuIik7CisJCX0KKworCQlyZXR1cm4gb2RzVmFsdWU7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIHNob3J0W119IHRvIHtAbGluayBib29sZWFuW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgc2hvcnR9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIGJvb2xlYW59cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbltdIGZyb21PRFNWYWxpZEZsYWdTZXEoc2hvcnRbXSBpbnB1dCkgeworCQlib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5baW5wdXQubGVuZ3RoXTsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKKwkJCXJlc3VsdFtpXSA9IGZyb21PRFNWYWxpZEZsYWcoaW5wdXRbaV0pOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgc2hvcnR9IHRvIHtAbGluayBib29sZWFufS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIHNob3J0fS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIGJvb2xlYW59IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZnJvbU9EU1ZhbGlkRmxhZyhzaG9ydCBpbnB1dCkgeworCQlyZXR1cm4gaW5wdXQgPT0gMTU7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIGJvb2xlYW5bXX0gdG8ge0BsaW5rIHNob3J0W119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgYm9vbGVhbn1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgc2hvcnR9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBzaG9ydFtdIHRvT0RTVmFsaWRGbGFnU2VxKGJvb2xlYW5bXSBpbnB1dCkgeworCQlzaG9ydFtdIHJlc3VsdCA9IG5ldyBzaG9ydFtpbnB1dC5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2ldID0gdG9PRFNWYWxpZEZsYWcoaW5wdXRbaV0pOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgYm9vbGVhbn0gdG8ge0BsaW5rIHNob3J0fS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIGJvb2xlYW59LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgc2hvcnR9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgc2hvcnQgdG9PRFNWYWxpZEZsYWcoYm9vbGVhbiBpbnB1dCkgeworCQlyZXR1cm4gKHNob3J0KSAoaW5wdXQgPyAxNSA6IDApOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBUX0xPTkdMT05HW119IHRvIHtAbGluayBsb25nW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgVF9MT05HTE9OR31zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgbG9uZ31zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBsb25nW10gZnJvbU9EU0xvbmdTZXEoVF9MT05HTE9OR1tdIGlucHV0KSB7CisJCWxvbmdbXSByZXN1bHQgPSBuZXcgbG9uZ1tpbnB1dC5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2ldID0gZnJvbU9EU0xvbmcoaW5wdXRbaV0pOworCQl9CisKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVF9MT05HTE9OR30gdG8ge0BsaW5rIGxvbmd9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgVF9MT05HTE9OR30uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBsb25nfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGxvbmcgZnJvbU9EU0xvbmcoVF9MT05HTE9ORyBpbnB1dCkgeworCQlUX0xPTkdMT05HIHZhbHVlID0gaW5wdXQgPT0gbnVsbCA/IG5ldyBUX0xPTkdMT05HKCkgOiBpbnB1dDsKKwkJcmV0dXJuICh2YWx1ZS5oaWdoICsgKHZhbHVlLmxvdyA+PSAwID8gMCA6IDEpKSAqIDB4MTAwMDAwMDAwTCArIHZhbHVlLmxvdzsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgbG9uZ1tdfSB0byB7QGxpbmsgVF9MT05HTE9OR1tdfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIGxvbmd9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfTE9OR0xPTkd9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9MT05HTE9OR1tdIHRvT0RTTG9uZ1NlcShsb25nW10gaW5wdXQpIHsKKwkJTGlzdDxUX0xPTkdMT05HPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oaW5wdXQubGVuZ3RoKTsKKwkJZm9yIChsb25nIHZhbHVlIDogaW5wdXQpIHsKKwkJCXJlc3VsdC5hZGQodG9PRFNMb25nKHZhbHVlKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFRfTE9OR0xPTkdbcmVzdWx0LnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBsb25nfSB0byB7QGxpbmsgVF9MT05HTE9OR30uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBsb25nfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfTE9OR0xPTkd9IGlzIHJldHVybmVkLgorCSAqLworCXB1YmxpYyBzdGF0aWMgVF9MT05HTE9ORyB0b09EU0xvbmcobG9uZyBpbnB1dCkgeworCQlyZXR1cm4gbmV3IFRfTE9OR0xPTkcoKGludCkgKGlucHV0ID4+IDMyICYgMHhmZmZmZmZmZkwpLCAoaW50KSAoaW5wdXQgJiAweGZmZmZmZmZmTCkpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGEgZ2l2ZW4gTURNIElEIHN0cmluZyB0byB7QGxpbmsgVF9MT05HTE9OR30uCisJICogCisJICogQHBhcmFtIGlucHV0IFRoZSBNRE0gSUQgc3RyaW5nLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgVF9MT05HTE9OR30gaXMgcmV0dXJuZWQuCisJICovCisJcHVibGljIHN0YXRpYyBUX0xPTkdMT05HIHRvT0RTSUQoU3RyaW5nIGlucHV0KSB7CisJCXRyeSB7CisJCQlyZXR1cm4gdG9PRFNMb25nKExvbmcudmFsdWVPZihpbnB1dCkpOworCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworCQkJcmV0dXJuIG5ldyBUX0xPTkdMT05HKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgU3RyaW5nW119IHRvIHtAbGluayBMb2NhbERhdGVUaW1lW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgU3RyaW5nfXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBMb2NhbERhdGVUaW1lfXMgYXJlIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIExvY2FsRGF0ZVRpbWVbXSBmcm9tT0RTRGF0ZVNlcShTdHJpbmdbXSBpbnB1dCkgeworCQlMaXN0PExvY2FsRGF0ZVRpbWU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoaW5wdXQgIT0gbnVsbCkgeworCQkJZm9yIChTdHJpbmcgdmFsdWUgOiBpbnB1dCkgeworCQkJCXJlc3VsdC5hZGQoZnJvbU9EU0RhdGUodmFsdWUpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgTG9jYWxEYXRlVGltZVtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFN0cmluZ30gdG8ge0BsaW5rIExvY2FsRGF0ZVRpbWV9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgVF9DT01QTEVYfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFN0cmluZ30gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgTG9jYWxEYXRlVGltZSBmcm9tT0RTRGF0ZShTdHJpbmcgaW5wdXQpIHsKKwkJaWYgKGlucHV0ID09IG51bGwgfHwgaW5wdXQuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gbnVsbDsKKwkJfQorCisJCURhdGVUaW1lRm9ybWF0dGVyIGZvcm1hdHRlciA9IE9EU19EQVRFX0ZPUk1BVFRFUlMuZ2V0KGlucHV0Lmxlbmd0aCgpKTsKKwkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIE9EUyBkYXRlOiAiICsgaW5wdXQpOworCQl9CisKKwkJdHJ5IHsKKwkJCWlmIChpbnB1dC5sZW5ndGgoKSA8PSA4KSB7CisJCQkJLy8gSmF2YSBkb2VzIG5vdCBhY2NlcHQgYSBiYXJlIGRhdGUgYXMgRGF0ZVRpbWUsIHNvIHdlIGFyZSB1c2luZyBMb2NhbERhdGUKKwkJCQkvLyBpbnN0ZWFkIG9mIExvY2FsRGF0ZVRpbWUKKwkJCQlyZXR1cm4gTG9jYWxEYXRlLnBhcnNlKGlucHV0LCBmb3JtYXR0ZXIpLmF0U3RhcnRPZkRheSgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gTG9jYWxEYXRlVGltZS5wYXJzZShpbnB1dCwgZm9ybWF0dGVyKTsKKwkJCX0KKwkJfSBjYXRjaCAoRGF0ZVRpbWVQYXJzZUV4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIE9EUyBkYXRlOiAiICsgaW5wdXQsIGUpOworCQl9CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIExvY2FsRGF0ZVRpbWVbXX0gdG8ge0BsaW5rIFN0cmluZ1tdfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIExvY2FsRGF0ZVRpbWV9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFN0cmluZ31zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0b09EU0RhdGVTZXEoTG9jYWxEYXRlVGltZVtdIGlucHV0KSB7CisJCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oaW5wdXQubGVuZ3RoKTsKKwkJZm9yIChMb2NhbERhdGVUaW1lIHZhbHVlIDogaW5wdXQpIHsKKwkJCXJlc3VsdC5hZGQodG9PRFNEYXRlKHZhbHVlKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIExvY2FsRGF0ZVRpbWV9IHRvIHtAbGluayBTdHJpbmd9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgTG9jYWxEYXRlVGltZX0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBTdHJpbmd9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b09EU0RhdGUoTG9jYWxEYXRlVGltZSBpbnB1dCkgeworCQlyZXR1cm4gaW5wdXQgPT0gbnVsbCA/ICIiIDogaW5wdXQuZm9ybWF0KE9EU19EQVRFX0ZPUk1BVFRFUlMuZ2V0KDE0KSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFRfQ09NUExFWFtdfSB0byB7QGxpbmsgRmxvYXRDb21wbGV4W119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgVF9DT01QTEVYfXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBGbG9hdENvbXBsZXh9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRmxvYXRDb21wbGV4W10gZnJvbU9EU0Zsb2F0Q29tcGxleFNlcShUX0NPTVBMRVhbXSBpbnB1dCkgeworCQlMaXN0PEZsb2F0Q29tcGxleD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWlmIChpbnB1dCAhPSBudWxsKSB7CisJCQlmb3IgKFRfQ09NUExFWCB2YWx1ZSA6IGlucHV0KSB7CisJCQkJcmVzdWx0LmFkZChmcm9tT0RTRmxvYXRDb21wbGV4KHZhbHVlKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IEZsb2F0Q29tcGxleFtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFRfQ09NUExFWH0gdG8ge0BsaW5rIEZsb2F0Q29tcGxleH0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0NPTVBMRVh9LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgRmxvYXRDb21wbGV4fSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBGbG9hdENvbXBsZXggZnJvbU9EU0Zsb2F0Q29tcGxleChUX0NPTVBMRVggaW5wdXQpIHsKKwkJcmV0dXJuIGlucHV0ID09IG51bGwgPyBudWxsIDogbmV3IEZsb2F0Q29tcGxleChpbnB1dC5yLCBpbnB1dC5pKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgRmxvYXRDb21wbGV4W119IHRvIHtAbGluayBUX0NPTVBMRVhbXX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBGbG9hdENvbXBsZXh9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfQ09NUExFWH1zIGFyZSByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBUX0NPTVBMRVhbXSB0b09EU0Zsb2F0Q29tcGxleFNlcShGbG9hdENvbXBsZXhbXSBpbnB1dCkgeworCQlMaXN0PFRfQ09NUExFWD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KGlucHV0Lmxlbmd0aCk7CisJCWZvciAoRmxvYXRDb21wbGV4IHZhbHVlIDogaW5wdXQpIHsKKwkJCXJlc3VsdC5hZGQodG9PRFNGbG9hdENvbXBsZXgodmFsdWUpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgVF9DT01QTEVYW3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgRmxvYXRDb21wbGV4fSB0byB7QGxpbmsgVF9DT01QTEVYfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIEZsb2F0Q29tcGxleH0uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBUX0NPTVBMRVh9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfQ09NUExFWCB0b09EU0Zsb2F0Q29tcGxleChGbG9hdENvbXBsZXggaW5wdXQpIHsKKwkJcmV0dXJuIGlucHV0ID09IG51bGwgPyBudWxsIDogbmV3IFRfQ09NUExFWChpbnB1dC5yZWFsKCksIGlucHV0LmltYWdpbmFyeSgpKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgVF9EQ09NUExFWFtdfSB0byB7QGxpbmsgRG91YmxlQ29tcGxleFtdfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIFRfRENPTVBMRVh9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIERvdWJsZUNvbXBsZXh9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRG91YmxlQ29tcGxleFtdIGZyb21PRFNEb3VibGVDb21wbGV4U2VxKFRfRENPTVBMRVhbXSBpbnB1dCkgeworCQlMaXN0PERvdWJsZUNvbXBsZXg+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoaW5wdXQgIT0gbnVsbCkgeworCQkJZm9yIChUX0RDT01QTEVYIHZhbHVlIDogaW5wdXQpIHsKKwkJCQlyZXN1bHQuYWRkKGZyb21PRFNEb3VibGVDb21wbGV4KHZhbHVlKSk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IERvdWJsZUNvbXBsZXhbcmVzdWx0LnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBUX0RDT01QTEVYfSB0byB7QGxpbmsgRG91YmxlQ29tcGxleH0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0RDT01QTEVYfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIERvdWJsZUNvbXBsZXh9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIERvdWJsZUNvbXBsZXggZnJvbU9EU0RvdWJsZUNvbXBsZXgoVF9EQ09NUExFWCBpbnB1dCkgeworCQlyZXR1cm4gaW5wdXQgPT0gbnVsbCA/IG51bGwgOiBuZXcgRG91YmxlQ29tcGxleChpbnB1dC5yLCBpbnB1dC5pKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiB7QGxpbmsgRG91YmxlQ29tcGxleFtdfSB0byB7QGxpbmsgVF9EQ09NUExFWFtdfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIERvdWJsZUNvbXBsZXh9cy4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfRENPTVBMRVh9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgVF9EQ09NUExFWFtdIHRvT0RTRG91YmxlQ29tcGxleFNlcShEb3VibGVDb21wbGV4W10gaW5wdXQpIHsKKwkJTGlzdDxUX0RDT01QTEVYPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oaW5wdXQubGVuZ3RoKTsKKwkJZm9yIChEb3VibGVDb21wbGV4IHZhbHVlIDogaW5wdXQpIHsKKwkJCXJlc3VsdC5hZGQodG9PRFNEb3VibGVDb21wbGV4KHZhbHVlKSk7CisJCX0KKworCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IFRfRENPTVBMRVhbcmVzdWx0LnNpemUoKV0pOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBEb3VibGVDb21wbGV4fSB0byB7QGxpbmsgVF9EQ09NUExFWH0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBEb3VibGVDb21wbGV4fS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIFRfRENPTVBMRVh9IGlzIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfRENPTVBMRVggdG9PRFNEb3VibGVDb21wbGV4KERvdWJsZUNvbXBsZXggaW5wdXQpIHsKKwkJcmV0dXJuIGlucHV0ID09IG51bGwgPyBudWxsIDogbmV3IFRfRENPTVBMRVgoaW5wdXQucmVhbCgpLCBpbnB1dC5pbWFnaW5hcnkoKSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFRfRXh0ZXJuYWxSZWZlcmVuY2VbXX0gdG8ge0BsaW5rIEZpbGVMaW5rW119LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgVF9FeHRlcm5hbFJlZmVyZW5jZX1zLgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgRmlsZUxpbmt9cyBhcmUgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgRmlsZUxpbmtbXSBmcm9tT0RTRXh0ZXJuYWxSZWZlcmVuY2VTZXEoVF9FeHRlcm5hbFJlZmVyZW5jZVtdIGlucHV0KSB7CisJCUxpc3Q8RmlsZUxpbms+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlpZiAoaW5wdXQgIT0gbnVsbCkgeworCQkJZm9yIChUX0V4dGVybmFsUmVmZXJlbmNlIHZhbHVlIDogaW5wdXQpIHsKKwkJCQlyZXN1bHQuYWRkKGZyb21PRFNFeHRlcm5hbFJlZmVyZW5jZSh2YWx1ZSkpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBGaWxlTGlua1tyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIFRfRXh0ZXJuYWxSZWZlcmVuY2V9IHRvIHtAbGluayBGaWxlTGlua30uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBUX0V4dGVybmFsUmVmZXJlbmNlfS4KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIEZpbGVMaW5rfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBGaWxlTGluayBmcm9tT0RTRXh0ZXJuYWxSZWZlcmVuY2UoVF9FeHRlcm5hbFJlZmVyZW5jZSBpbnB1dCkgeworCQlpZiAoaW5wdXQgPT0gbnVsbCkgeworCQkJcmV0dXJuIG51bGw7CisJCX0KKwkJcmV0dXJuIEZpbGVMaW5rLm5ld1JlbW90ZShpbnB1dC5sb2NhdGlvbiwgbmV3IE1pbWVUeXBlKGlucHV0Lm1pbWVUeXBlKSwgaW5wdXQuZGVzY3JpcHRpb24pOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBGaWxlTGlua1tdfSB0byB7QGxpbmsgVF9FeHRlcm5hbFJlZmVyZW5jZVtdfS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUge0Bjb2RlIEZpbGVMaW5rfXMuCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBUX0V4dGVybmFsUmVmZXJlbmNlfXMgYXJlIHJldHVybmVkLgorCSAqLworCXByaXZhdGUgc3RhdGljIFRfRXh0ZXJuYWxSZWZlcmVuY2VbXSB0b09EU0V4dGVybmFsUmVmZXJlbmNlU2VxKEZpbGVMaW5rW10gaW5wdXQpIHsKKwkJTGlzdDxUX0V4dGVybmFsUmVmZXJlbmNlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oaW5wdXQubGVuZ3RoKTsKKwkJZm9yIChGaWxlTGluayB2YWx1ZSA6IGlucHV0KSB7CisJCQlyZXN1bHQuYWRkKHRvT0RTRXh0ZXJuYWxSZWZlcmVuY2UodmFsdWUpKTsKKwkJfQorCisJCXJldHVybiByZXN1bHQudG9BcnJheShuZXcgVF9FeHRlcm5hbFJlZmVyZW5jZVtyZXN1bHQuc2l6ZSgpXSk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIEZpbGVMaW5rfSB0byB7QGxpbmsgVF9FeHRlcm5hbFJlZmVyZW5jZX0uCisJICoKKwkgKiBAcGFyYW0gaW5wdXQgVGhlIHtAY29kZSBGaWxlTGlua30uCisJICogQHJldHVybiBUaGUgY29udmVydGVkIHtAY29kZSBUX0V4dGVybmFsUmVmZXJlbmNlfSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBUX0V4dGVybmFsUmVmZXJlbmNlIHRvT0RTRXh0ZXJuYWxSZWZlcmVuY2UoRmlsZUxpbmsgaW5wdXQpIHsKKwkJaWYgKGlucHV0ID09IG51bGwpIHsKKwkJCXJldHVybiBuZXcgVF9FeHRlcm5hbFJlZmVyZW5jZSgiIiwgIiIsICIiKTsKKwkJfQorCQlTdHJpbmcgcmVtb3RlUGF0aCA9IGlucHV0LmlzUmVtb3RlKCkgPyBpbnB1dC5nZXRSZW1vdGVQYXRoKCkgOiAiIjsKKwkJcmV0dXJuIG5ldyBUX0V4dGVybmFsUmVmZXJlbmNlKGlucHV0LmdldERlc2NyaXB0aW9uKCksIGlucHV0LmdldE1pbWVUeXBlKCkudG9TdHJpbmcoKSwgcmVtb3RlUGF0aCk7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4ge0BsaW5rIEJsb2J9IHRvIHtAbGluayBPYmplY3R9LgorCSAqCisJICogQHBhcmFtIGlucHV0IFRoZSB7QGNvZGUgQmxvYn0KKwkgKiBAcmV0dXJuIFRoZSBjb252ZXJ0ZWQge0Bjb2RlIE9iamVjdH0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGZyb21PRFNCbG9iKEJsb2IgaW5wdXQpIHsKKwkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOT1QgWUVUIElNUExFTUVOVEVEIik7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4gb2JqZWN0IHRvIHtAbGluayBCbG9ifS4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dCBUaGUgb2JqZWN0LgorCSAqIEByZXR1cm4gVGhlIGNvbnZlcnRlZCB7QGNvZGUgQmxvYn0gaXMgcmV0dXJuZWQuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgQmxvYiB0b09EU0Jsb2IoT2JqZWN0IGlucHV0KSB7CisJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTk9UIFlFVCBJTVBMRU1FTlRFRCIpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0VudW0uamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmJmMTFkOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNFbnVtLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlsczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvblZhbHVlOworCisvKioKKyAqIFNwZWNpYWwgZW51bWVyYXRpb24gY2xhc3MgZm9yIE9EUyBlbnVtZXJhdGlvbnMKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBPRFNFbnVtIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZSB7CisJLyoqCisJICogQ29uc3RydWN0b3IKKwkgKiAKKwkgKiBAcGFyYW0gbmFtZTogICAgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVudW1lcmF0aW9uIHZhbHVlCisJICogQHBhcmFtIG9yZGluYWw6IHRoZSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZQorCSAqLworCXB1YmxpYyBPRFNFbnVtKFN0cmluZyBuYW1lLCBpbnQgb3JkaW5hbCkgeworCQlzdXBlcihuYW1lLCBvcmRpbmFsKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNFbnVtZXJhdGlvbnMuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNFbnVtZXJhdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNjNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy9tYWluL2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0VudW1lcmF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsNDY1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW51bWVyYXRpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuSW50ZXJwb2xhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2VxdWVuY2VSZXByZXNlbnRhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVHlwZVNwZWNpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZlcnNpb25TdGF0ZTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBlbnVtZXJhdGlvbiBjb25zdGFudCBjb252ZXJzaW9ucyBmcm9tL3RvIE9EUyB0eXBlcy4KKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgVmlrdG9yIFN0b2VociwgR2lnYXRyb25payBJbmdvbHN0YWR0IEdtYkgKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9EU0VudW1lcmF0aW9ucyB7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ2xhc3MgdmFyaWFibGVzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDQUxBUl9UWVBFX05BTUUgPSAiZGF0YXR5cGVfZW51bSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX05BTUUgPSAidmFsaWRfZW51bSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSUE9MQVRJT05fTkFNRSA9ICJpbnRlcnBvbGF0aW9uX2VudW0iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBWElTX1RZUEVfTkFNRSA9ICJheGlzdHlwZSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1BFQ0lGSUNBVElPTl9OQU1FID0gInR5cGVzcGVjX2VudW0iOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DRV9SRVBSRVNFTlRBVElPTl9OQU1FID0gInNlcV9yZXBfZW51bSI7CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gQ29uc3RydWN0b3JzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29uc3RydWN0b3IuCisJICovCisJcHJpdmF0ZSBPRFNFbnVtZXJhdGlvbnMoKSB7CisJfQorCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS8vIFB1YmxpYyBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogUmV0dXJucyB0aGUgZW51bWVyYXRpb24gY2xhc3MgaWRlbnRpZmllZCBieSBnaXZlbiBuYW1lLgorCSAqCisJICogQHBhcmFtIDxFPiAgVGhlIGVudW1lcmF0aW9uIHR5cGUuCisJICogQHBhcmFtIG5hbWUgVGhlIE9EUyBuYW1lIG9mIHRoZSByZXF1ZXN0ZWQgZW51bWVyYXRpb24gY2xhc3MuCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbiBjbGFzcyBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgT0RTIGVudW1lcmF0aW9uIG5hbWUgaXMgdW5rbm93bi4KKwkgKi8KKwkvLyBGSVhNRSAoRmxvcmlhbiBTY2htaXR0KTogY2FuIHdlIGRvIHRoaXMgc2ltcGxlcj8KKwlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBnZXRFbnVtT2JqKFN0cmluZyBuYW1lKSB7CisJCUVudW1SZWdpc3RyeSBlciA9IEVudW1SZWdpc3RyeS5nZXRJbnN0YW5jZSgpOworCQlpZiAoU0NBTEFSX1RZUEVfTkFNRS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiAoZXIuZ2V0KEVudW1SZWdpc3RyeS5TQ0FMQVJfVFlQRSkpOworCQl9IGVsc2UgaWYgKFNUQVRFX05BTUUuZXF1YWxzKG5hbWUpKSB7CisJCQlyZXR1cm4gKGVyLmdldChFbnVtUmVnaXN0cnkuVkVSU0lPTl9TVEFURSkpOworCQl9IGVsc2UgaWYgKElOVEVSUE9MQVRJT05fTkFNRS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiAoZXIuZ2V0KEVudW1SZWdpc3RyeS5JTlRFUlBPTEFUSU9OKSk7CisJCX0gZWxzZSBpZiAoQVhJU19UWVBFX05BTUUuZXF1YWxzKG5hbWUpKSB7CisJCQlyZXR1cm4gKGVyLmdldChFbnVtUmVnaXN0cnkuQVhJU19UWVBFKSk7CisJCX0gZWxzZSBpZiAoVFlQRV9TUEVDSUZJQ0FUSU9OX05BTUUuZXF1YWxzKG5hbWUpKSB7CisJCQlyZXR1cm4gKGVyLmdldChFbnVtUmVnaXN0cnkuVFlQRV9TUEVDSUZJQ0FUSU9OKSk7CisJCX0gZWxzZSBpZiAoU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT05fTkFNRS5lcXVhbHMobmFtZSkpIHsKKwkJCXJldHVybiAoZXIuZ2V0KEVudW1SZWdpc3RyeS5TRVFVRU5DRV9SRVBSRVNFTlRBVElPTikpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIGVyLmdldChuYW1lKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIE9EUyBlbnVtZXJhdGlvbiBuYW1lIGZvciBnaXZlbiBlbnVtZXJhdGlvbiBjbGFzcy4KKwkgKgorCSAqIEBwYXJhbSBlbnVtT2JqIFRoZSBlbnVtZXJhdGlvbiBvYmplY3QuCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24gbmFtZSBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgZW51bWVyYXRpb24gY2xhc3MgaXMgdW5rbm93bi4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtTmFtZShFbnVtZXJhdGlvbjw/PiBlbnVtT2JqKSB7CisJCWlmIChlbnVtT2JqID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudW1lcmF0aW9uVmFsdWUgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUuZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIFNDQUxBUl9UWVBFX05BTUU7CisJCX0gZWxzZSBpZiAoRW51bVJlZ2lzdHJ5LlZFUlNJT05fU1RBVEUuZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIFNUQVRFX05BTUU7CisJCX0gZWxzZSBpZiAoRW51bVJlZ2lzdHJ5LklOVEVSUE9MQVRJT04uZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIElOVEVSUE9MQVRJT05fTkFNRTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuQVhJU19UWVBFLmVxdWFscyhlbnVtT2JqLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBBWElTX1RZUEVfTkFNRTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuVFlQRV9TUEVDSUZJQ0FUSU9OLmVxdWFscyhlbnVtT2JqLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiBUWVBFX1NQRUNJRklDQVRJT05fTkFNRTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT04uZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIFNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OX05BTUU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gZW51bU9iai5nZXROYW1lKCk7CisJCX0KKwl9CisKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLy8gUGFja2FnZSBtZXRob2RzCisJLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4gT0RTIGVudW1lcmF0aW9uIHZhbHVlIHVzaW5nIGdpdmVuIGVudW1lcmF0aW9uIGNsYXNzIHRvIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24gY29uc3RhbnQuCisJICoKKwkgKiBAcGFyYW0gPEU+ICAgICAgIFRoZSBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBlbnVtQ2xhc3MgVGhlIGVudW1lcmF0aW9uIGNsYXNzLgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGVudW1lcmF0aW9uIGNvbnN0YW50IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwkvLyBGSVhNRTogY2FudCB3ZSBoYXZlIHRoaXMgZWFzaWVyPworCXN0YXRpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IEUgZnJvbU9EU0VudW0oRW51bWVyYXRpb248RT4gZW51bU9iaiwgaW50IHZhbHVlKSB7CisJCWlmIChlbnVtT2JqID09IG51bGwpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVudW1lcmF0aW9uVmFsdWUgY2xhc3MgaXMgbm90IGFsbG93ZWQgdG8gYmUgbnVsbC4iKTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUuZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJcmV0dXJuIChFKSBmcm9tT0RTU2NhbGFyVHlwZSh2YWx1ZSk7CisJCX0gZWxzZSBpZiAoRW51bVJlZ2lzdHJ5LlNFUVVFTkNFX1JFUFJFU0VOVEFUSU9OLmVxdWFscyhlbnVtT2JqLmdldE5hbWUoKSkpIHsKKwkJCXJldHVybiAoRSkgZnJvbU9EU1NlcXVlbmNlUmVwcmVzZW50YXRpb24odmFsdWUpOworCQl9IGVsc2UgeworCQkJcmV0dXJuIChFKSBmcm9tT0RTRW51bUJ5T3JkaW5hbChlbnVtT2JqLCB2YWx1ZSk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBPRFMgZW51bWVyYXRpb24gdmFsdWVzIHVzaW5nIGdpdmVuIGVudW1lcmF0aW9uIGNsYXNzIHRvIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24gY29uc3RhbnRzLgorCSAqCisJICogQHBhcmFtIDxFPiAgICAgICBUaGUgZW51bWVyYXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gZW51bUNsYXNzIFRoZSBlbnVtZXJhdGlvbiBjbGFzcy4KKwkgKiBAcGFyYW0gdmFsdWVzICAgIFRoZSBPRFMgZW51bWVyYXRpb24gdmFsdWVzLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24gY29uc3RhbnRzIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgY29udmVyc2lvbiBub3QgcG9zc2libGUuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJc3RhdGljIDxFIGV4dGVuZHMgRW51bWVyYXRpb25WYWx1ZT4gRVtdIGZyb21PRFNFbnVtU2VxKEVudW1lcmF0aW9uPD8+IGVudW1PYmosIGludFtdIHZhbHVlcykgeworCQlpZiAoZW51bU9iaiA9PSBudWxsKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnVtZXJhdGlvblZhbHVlIGNsYXNzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIG51bGwuIik7CisJCX0gZWxzZSBpZiAoRW51bVJlZ2lzdHJ5LlNDQUxBUl9UWVBFLmVxdWFscyhlbnVtT2JqLmdldE5hbWUoKSkpIHsKKwkJCUxpc3Q8RT4gc2NhbGFyVHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzLmxlbmd0aCk7CisJCQlmb3IgKGludCB2YWx1ZSA6IHZhbHVlcykgeworCQkJCXNjYWxhclR5cGVzLmFkZCgoRSkgZnJvbU9EU1NjYWxhclR5cGUodmFsdWUpKTsKKwkJCX0KKwkJCXJldHVybiAoRVtdKSBzY2FsYXJUeXBlcy50b0FycmF5KG5ldyBTY2FsYXJUeXBlW3ZhbHVlcy5sZW5ndGhdKTsKKwkJfSBlbHNlIGlmIChFbnVtUmVnaXN0cnkuU0VRVUVOQ0VfUkVQUkVTRU5UQVRJT04uZXF1YWxzKGVudW1PYmouZ2V0TmFtZSgpKSkgeworCQkJTGlzdDxFPiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZXMubGVuZ3RoKTsKKwkJCWZvciAoaW50IHZhbHVlIDogdmFsdWVzKSB7CisJCQkJc2VxdWVuY2VSZXByZXNlbnRhdGlvbnMuYWRkKChFKSBmcm9tT0RTU2VxdWVuY2VSZXByZXNlbnRhdGlvbih2YWx1ZSkpOworCQkJfQorCQkJcmV0dXJuIChFW10pIHNlcXVlbmNlUmVwcmVzZW50YXRpb25zLnRvQXJyYXkobmV3IFNlcXVlbmNlUmVwcmVzZW50YXRpb25bdmFsdWVzLmxlbmd0aF0pOworCQl9IGVsc2UgeworCQkJcmV0dXJuIChFW10pIGZyb21PRFNFbnVtU2VxQnlPcmRpbmFsKGVudW1PYmosIHZhbHVlcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBlbnVtZXJhdGlvbiBjb25zdGFudCB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24KKwkgKiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSA8RT4gICAgICBUaGUgZW51bWVyYXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gY29uc3RhbnQgVGhlIGVudW1lcmF0aW9uIGNvbnN0YW50LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgT0RTIGVudW1lcmF0aW9uIHZhbHVlIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlzdGF0aWMgPEUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBpbnQgdG9PRFNFbnVtKEUgY29uc3RhbnQpIHsKKwkJaWYgKGNvbnN0YW50ID09IG51bGwpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGNvbnN0YW50IGluc3RhbmNlb2YgU2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIHRvT0RTU2NhbGFyVHlwZSgoU2NhbGFyVHlwZSkgY29uc3RhbnQpOworCQl9IGVsc2UgaWYgKGNvbnN0YW50IGluc3RhbmNlb2YgVmVyc2lvblN0YXRlIHx8IGNvbnN0YW50IGluc3RhbmNlb2YgSW50ZXJwb2xhdGlvbiB8fCBjb25zdGFudCBpbnN0YW5jZW9mIEF4aXNUeXBlCisJCQkJfHwgY29uc3RhbnQgaW5zdGFuY2VvZiBUeXBlU3BlY2lmaWNhdGlvbikgeworCQkJLy8gTk9URTogT3JkaW5hbCBudW1iZXJzIG1hcCBkaXJlY3RseSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMKKwkJCS8vIGVudW1lcmF0aW9uIGNvbnN0YW50IHZhbHVlLgorCQkJcmV0dXJuIGNvbnN0YW50Lm9yZGluYWwoKTsKKwkJfSBlbHNlIGlmIChjb25zdGFudCBpbnN0YW5jZW9mIFNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJCXJldHVybiB0b09EU1NlcXVlbmNlUmVwcmVzZW50YXRpb24oKFNlcXVlbmNlUmVwcmVzZW50YXRpb24pIGNvbnN0YW50KTsKKwkJfQorCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisJCQkJIkVudW1lcmF0aW9uVmFsdWUgbWFwcGluZyBmb3IgdHlwZSAnIiArIGNvbnN0YW50LmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIicgZG9lcyBub3QgZXhpc3QuIik7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4gZW51bWVyYXRpb24gY29uc3RhbnRzIHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyBlbnVtZXJhdGlvbgorCSAqIHZhbHVlcy4KKwkgKgorCSAqIEBwYXJhbSA8RT4gICAgICAgVGhlIGVudW1lcmF0aW9uIHR5cGUuCisJICogQHBhcmFtIGNvbnN0YW50cyBUaGUgZW51bWVyYXRpb24gY29uc3RhbnRzLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgT0RTIGVudW1lcmF0aW9uIHZhbHVlcyBhcmUgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCXN0YXRpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IGludFtdIHRvT0RTRW51bVNlcShFW10gY29uc3RhbnRzKSB7CisJCWlmIChjb25zdGFudHMgPT0gbnVsbCkgeworCQkJcmV0dXJuIG5ldyBpbnRbMF07CisJCX0KKworCQlpbnRbXSB2YWx1ZXMgPSBuZXcgaW50W2NvbnN0YW50cy5sZW5ndGhdOworCQlpZiAoY29uc3RhbnRzIGluc3RhbmNlb2YgU2NhbGFyVHlwZVtdKSB7CisJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgeworCQkJCXZhbHVlc1tpXSA9IHRvT0RTU2NhbGFyVHlwZSgoU2NhbGFyVHlwZSkgY29uc3RhbnRzW2ldKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjb25zdGFudHMgaW5zdGFuY2VvZiBWZXJzaW9uU3RhdGVbXSB8fCBjb25zdGFudHMgaW5zdGFuY2VvZiBJbnRlcnBvbGF0aW9uW10KKwkJCQl8fCBjb25zdGFudHMgaW5zdGFuY2VvZiBBeGlzVHlwZVtdIHx8IGNvbnN0YW50cyBpbnN0YW5jZW9mIFR5cGVTcGVjaWZpY2F0aW9uW10pIHsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisJCQkJLy8gTk9URTogT3JkaW5hbCBudW1iZXJzIGRpcmVjdGx5IG1hcCB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMKKwkJCQkvLyBlbnVtZXJhdGlvbiBjb25zdGFudCB2YWx1ZS4KKwkJCQkvLyBGSVhNRTogZG8gd2UgcmVhbGx5IHdhbnQgdGhpcz8KKwkJCQl2YWx1ZXNbaV0gPSAoKEVudW1lcmF0aW9uVmFsdWUpIGNvbnN0YW50c1tpXSkub3JkaW5hbCgpOworCQkJfQorCQl9IGVsc2UgaWYgKGNvbnN0YW50cyBpbnN0YW5jZW9mIFNlcXVlbmNlUmVwcmVzZW50YXRpb25bXSkgeworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKwkJCQl2YWx1ZXNbaV0gPSB0b09EU1NlcXVlbmNlUmVwcmVzZW50YXRpb24oKFNlcXVlbmNlUmVwcmVzZW50YXRpb24pIGNvbnN0YW50c1tpXSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFbnVtZXJhdGlvblZhbHVlIG1hcHBpbmcgZm9yIHR5cGUgJyIKKwkJCQkJKyBjb25zdGFudHMuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkuZ2V0U2ltcGxlTmFtZSgpICsgIicgZG9lcyBub3QgZXhpc3QuIik7CisJCX0KKworCQlyZXR1cm4gdmFsdWVzOworCX0KKworCS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkvLyBQcml2YXRlIG1ldGhvZHMKKwkvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBPRFMgZW51bWVyYXRpb24gdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcge0BsaW5rIFNjYWxhclR5cGV9CisJICogY29uc3RhbnQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIHtAY29kZSBTY2FsYXJUeXBlfSBjb25zdGFudCBpcyByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgY29udmVyc2lvbiBub3QgcG9zc2libGUuCisJICovCisJcHJpdmF0ZSBzdGF0aWMgU2NhbGFyVHlwZSBmcm9tT0RTU2NhbGFyVHlwZShpbnQgdmFsdWUpIHsKKwkJaWYgKHZhbHVlID09IDApIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLlVOS05PV047CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMSkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuU1RSSU5HOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDIpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLlNIT1JUOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDMpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkZMT0FUOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDQpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkJPT0xFQU47CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gNSkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuQllURTsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA2KSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5JTlRFR0VSOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDcpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkRPVUJMRTsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA4KSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5MT05HOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDEwKSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5EQVRFOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDExKSB7CisJCQlyZXR1cm4gU2NhbGFyVHlwZS5CWVRFX1NUUkVBTTsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAxMikgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuQkxPQjsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAxMykgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuRkxPQVRfQ09NUExFWDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAxNCkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuRE9VQkxFX0NPTVBMRVg7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMjgpIHsKKwkJCXJldHVybiBTY2FsYXJUeXBlLkZJTEVfTElOSzsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAzMCkgeworCQkJcmV0dXJuIFNjYWxhclR5cGUuRU5VTUVSQVRJT047CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbWFwIE9EUyBlbnVtZXJhdGlvbiB2YXVlICciICsgdmFsdWUgKyAiJyB0byBjb25zdGFudCBvZiB0eXBlICciCisJCQkJKyBTY2FsYXJUeXBlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICInLiIpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBTY2FsYXJUeXBlfSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24gdmFsdWUuCisJICoKKwkgKiBAcGFyYW0gc2NhbGFyVHlwZSBUaGUge0Bjb2RlIFNjYWxhclR5cGV9LgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgT0RTIGVudW1lcmF0aW9uIHZhbHVlIGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBpbnQgdG9PRFNTY2FsYXJUeXBlKFNjYWxhclR5cGUgc2NhbGFyVHlwZSkgeworCQlpZiAoU2NhbGFyVHlwZS5VTktOT1dOID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuU1RSSU5HID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuU0hPUlQgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDI7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5GTE9BVCA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMzsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkJPT0xFQU4gPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDQ7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5CWVRFID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiA1OworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuSU5URUdFUiA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gNjsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkRPVUJMRSA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gNzsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkxPTkcgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDg7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5EQVRFID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAxMDsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkJZVEVfU1RSRUFNID09IHNjYWxhclR5cGUpIHsKKwkJCXJldHVybiAxMTsKKwkJfSBlbHNlIGlmIChTY2FsYXJUeXBlLkJMT0IgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDEyOworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuRkxPQVRfQ09NUExFWCA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMTM7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5ET1VCTEVfQ09NUExFWCA9PSBzY2FsYXJUeXBlKSB7CisJCQlyZXR1cm4gMTQ7CisJCX0gZWxzZSBpZiAoU2NhbGFyVHlwZS5GSUxFX0xJTksgPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDI4OworCQl9IGVsc2UgaWYgKFNjYWxhclR5cGUuRU5VTUVSQVRJT04gPT0gc2NhbGFyVHlwZSkgeworCQkJcmV0dXJuIDMwOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIG1hcCBlbnVtZXJhdGlvbiBjb25zdGFudCAnIiArIHNjYWxhclR5cGUgKyAiJyBvZiB0eXBlICciCisJCQkJKyBTY2FsYXJUeXBlLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICInIHRvIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4iKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBPRFMgZW51bWVyYXRpb24gdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiB7QGxpbmsgU2VxdWVuY2VSZXByZXNlbnRhdGlvbn0gY29uc3RhbnQuCisJICoKKwkgKiBAcGFyYW0gdmFsdWUgVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIHtAY29kZSBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSBjb25zdGFudCBpcworCSAqICAgICAgICAgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCXByaXZhdGUgc3RhdGljIFNlcXVlbmNlUmVwcmVzZW50YXRpb24gZnJvbU9EU1NlcXVlbmNlUmVwcmVzZW50YXRpb24oaW50IHZhbHVlKSB7CisJCWlmICh2YWx1ZSA9PSAwKSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAxKSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9DT05TVEFOVDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAyKSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9MSU5FQVI7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gMykgeworCQkJcmV0dXJuIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uSU1QTElDSVRfU0FXOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDQpIHsKKwkJCXJldHVybiBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19MSU5FQVI7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gNSkgeworCQkJcmV0dXJuIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX1BPTFlOT01JQUw7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gNykgeworCQkJcmV0dXJuIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uRVhQTElDSVRfRVhURVJOQUw7CisJCX0gZWxzZSBpZiAodmFsdWUgPT0gOCkgeworCQkJcmV0dXJuIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9FWFRFUk5BTDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSA5KSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfUE9MWU5PTUlBTF9FWFRFUk5BTDsKKwkJfSBlbHNlIGlmICh2YWx1ZSA9PSAxMCkgeworCQkJcmV0dXJuIFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX0xJTkVBUl9DQUxJQlJBVEVEOworCQl9IGVsc2UgaWYgKHZhbHVlID09IDExKSB7CisJCQlyZXR1cm4gU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUw7CisJCX0KKworCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gbWFwIE9EUyBlbnVtZXJhdGlvbiB2YXVlICciICsgdmFsdWUgKyAiJyB0byBjb25zdGFudCBvZiB0eXBlICciCisJCQkJKyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICInLiIpOworCX0KKworCS8qKgorCSAqIENvbnZlcnRzIGdpdmVuIHtAbGluayBTZXF1ZW5jZVJlcHJlc2VudGF0aW9ufSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMKKwkgKiBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKgorCSAqIEBwYXJhbSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uIFRoZSB7QGNvZGUgU2VxdWVuY2VSZXByZXNlbnRhdGlvbn0uCisJICogQHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBPRFMgZW51bWVyYXRpb24gdmFsdWUgaXMgcmV0dXJuZWQuCisJICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhyb3duIGlmIGNvbnZlcnNpb24gbm90IHBvc3NpYmxlLgorCSAqLworCXByaXZhdGUgc3RhdGljIGludCB0b09EU1NlcXVlbmNlUmVwcmVzZW50YXRpb24oU2VxdWVuY2VSZXByZXNlbnRhdGlvbiBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCWlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLkVYUExJQ0lUID09IHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uSU1QTElDSVRfQ09OU1RBTlQgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDE7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9MSU5FQVIgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDI7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5JTVBMSUNJVF9TQVcgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDM7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSID09IHNlcXVlbmNlUmVwcmVzZW50YXRpb24pIHsKKwkJCXJldHVybiA0OworCQl9IGVsc2UgaWYgKFNlcXVlbmNlUmVwcmVzZW50YXRpb24uUkFXX1BPTFlOT01JQUwgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDU7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5FWFBMSUNJVF9FWFRFUk5BTCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gNzsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19MSU5FQVJfRVhURVJOQUwgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDg7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfUE9MWU5PTUlBTF9FWFRFUk5BTCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gOTsKKwkJfSBlbHNlIGlmIChTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLlJBV19MSU5FQVJfQ0FMSUJSQVRFRCA9PSBzZXF1ZW5jZVJlcHJlc2VudGF0aW9uKSB7CisJCQlyZXR1cm4gMTA7CisJCX0gZWxzZSBpZiAoU2VxdWVuY2VSZXByZXNlbnRhdGlvbi5SQVdfTElORUFSX0NBTElCUkFURURfRVhURVJOQUwgPT0gc2VxdWVuY2VSZXByZXNlbnRhdGlvbikgeworCQkJcmV0dXJuIDExOworCQl9CisKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIG1hcCBlbnVtZXJhdGlvbiBjb25zdGFudCAnIiArIHNlcXVlbmNlUmVwcmVzZW50YXRpb24KKwkJCQkrICInIG9mIHR5cGUgJyIgKyBTZXF1ZW5jZVJlcHJlc2VudGF0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICInIHRvIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4iKTsKKwl9CisKKwkvKioKKwkgKiBDb252ZXJ0cyBnaXZlbiBPRFMgZW51bWVyYXRpb24gdmFsdWUgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24KKwkgKiBjb25zdGFudC4gVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBvcmRpbmFsIG51bWJlciBvZiB0aGUKKwkgKiByZXF1ZXN0ZWQgZW51bWVyYXRpb24gY29uc3RhbnQuCisJICoKKwkgKiBAcGFyYW0gPEU+ICAgICAgIFRoZSBlbnVtZXJhdGlvbiB0eXBlLgorCSAqIEBwYXJhbSBlbnVtQ2xhc3MgVGhlIGVudW1lcmF0aW9uIGNsYXNzLgorCSAqIEBwYXJhbSB2YWx1ZSAgICAgVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZS4KKwkgKiBAcmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGVudW1lcmF0aW9uIGNvbnN0YW50IGlzIHJldHVybmVkLgorCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRocm93biBpZiBjb252ZXJzaW9uIG5vdCBwb3NzaWJsZS4KKwkgKi8KKwlwcml2YXRlIHN0YXRpYyA8RSBleHRlbmRzIEVudW1lcmF0aW9uVmFsdWU+IEUgZnJvbU9EU0VudW1CeU9yZGluYWwoRW51bWVyYXRpb248RT4gZW51bU9iaiwgaW50IHZhbHVlKSB7CisJCS8vIE5PVEU6IE9yZGluYWwgbnVtYmVycyBkaXJlY3RseSBtYXAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgT0RTCisJCS8vIGVudW1lcmF0aW9uIGNvbnN0YW50IHZhbHVlLgorCQlFIGVudW12YWx1ZSA9IGVudW1PYmoudmFsdWVPZih2YWx1ZSk7CisJCWlmIChlbnVtdmFsdWUgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQl9CisJCXJldHVybiBlbnVtdmFsdWU7CisJfQorCisJLyoqCisJICogQ29udmVydHMgZ2l2ZW4gT0RTIGVudW1lcmF0aW9uIHZhbHVlcyB0byB0aGUgY29ycmVzcG9uZGluZyBlbnVtZXJhdGlvbgorCSAqIGNvbnN0YW50cy4gVGhlIE9EUyBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIG9yZGluYWwgbnVtYmVycyBvZiB0aGUKKwkgKiByZXF1ZXN0ZWQgZW51bWVyYXRpb24gY29uc3RhbnRzLgorCSAqCisJICogQHBhcmFtIDxFPiAgICAgICBUaGUgZW51bWVyYXRpb24gdHlwZS4KKwkgKiBAcGFyYW0gZW51bUNsYXNzIFRoZSBlbnVtZXJhdGlvbiBjbGFzcy4KKwkgKiBAcGFyYW0gdmFsdWVzICAgIFRoZSBPRFMgZW51bWVyYXRpb24gdmFsdWVzLgorCSAqIEByZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgZW51bWVyYXRpb24gY29uc3RhbnRzIGFyZSByZXR1cm5lZC4KKwkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaHJvd24gaWYgY29udmVyc2lvbiBub3QgcG9zc2libGUuCisJICovCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJcHJpdmF0ZSBzdGF0aWMgPEUgZXh0ZW5kcyBFbnVtZXJhdGlvblZhbHVlPiBFW10gZnJvbU9EU0VudW1TZXFCeU9yZGluYWwoRW51bWVyYXRpb248RT4gZW51bU9iaiwgaW50W10gdmFsdWVzKSB7CisJCUxpc3Q8RT4gZW51bVZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZXMubGVuZ3RoKTsKKworCQlmb3IgKGludCB2YWx1ZSA6IHZhbHVlcykgeworCQkJLy8gTk9URTogT3JkaW5hbCBudW1iZXJzIGRpcmVjdGx5IG1hcCB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMKKwkJCS8vIGVudW1lcmF0aW9uIGNvbnN0YW50IHZhbHVlLgorCQkJRSBlbnVtdmFsdWUgPSBlbnVtT2JqLnZhbHVlT2YodmFsdWUpOworCQkJaWYgKGVudW12YWx1ZSA9PSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworCQkJfQorCQkJZW51bVZhbHVlcy5hZGQoZW51bXZhbHVlKTsKKwkJfQorCisJCXJldHVybiBlbnVtVmFsdWVzLnRvQXJyYXkoKEVbXSkgQXJyYXkubmV3SW5zdGFuY2UoZW51bU9iai5nZXRDbGFzcygpLCB2YWx1ZXMubGVuZ3RoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZDUwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvdXRpbHMvT0RTVXRpbHMuamF2YQpAQCAtMCwwICsxLDEzOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci51dGlsczsKKworaW1wb3J0IG9yZy5hc2FtLm9kcy5BZ2dyRnVuYzsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuRGF0YVR5cGU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlNlbE9wY29kZTsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuU2VsT3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuUmVsYXRpb25UeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVmFsdWVUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5BZ2dyZWdhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQm9vbGVhbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5CcmFja2V0T3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbXBhcmlzb25PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuSm9pblR5cGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUJpTWFwOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgcHJvdmlkZXMgYmlkaXJlY3Rpb25hbCBtYXBwaW5ncyBmb3IgT0RTIHR5cGVzCisgKgorICogQGF1dGhvciBWaWt0b3IgU3RvZWhyLCBHaWdhdHJvbmlrIEluZ29sc3RhZHQgR21iSAorICogQHNpbmNlIDEuMC4wCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPRFNVdGlscyB7CisJLyoqCisJICogTWFwcyB7QGxpbmsgUmVsYXRpb25UeXBlfSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMge0BsaW5rIFJlbGF0aW9uVHlwZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVCaU1hcDxSZWxhdGlvblR5cGUsIG9yZy5hc2FtLm9kcy5SZWxhdGlvblR5cGU+IFJFTEFUSU9OU0hJUFMgPSBJbW11dGFibGVCaU1hcC48UmVsYXRpb25UeXBlLCBvcmcuYXNhbS5vZHMuUmVsYXRpb25UeXBlPmJ1aWxkZXIoKQorCQkJLnB1dChSZWxhdGlvblR5cGUuRkFUSEVSX0NISUxELCBvcmcuYXNhbS5vZHMuUmVsYXRpb25UeXBlLkZBVEhFUl9DSElMRCkKKwkJCS5wdXQoUmVsYXRpb25UeXBlLklORk8sIG9yZy5hc2FtLm9kcy5SZWxhdGlvblR5cGUuSU5GTykKKwkJCS5wdXQoUmVsYXRpb25UeXBlLklOSEVSSVRBTkNFLCBvcmcuYXNhbS5vZHMuUmVsYXRpb25UeXBlLklOSEVSSVRBTkNFKS5idWlsZCgpOworCisJLyoqCisJICogTWFwcyB7QGxpbmsgQWdncmVnYXRpb259IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgQWdnckZ1bmN9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1tdXRhYmxlQmlNYXA8QWdncmVnYXRpb24sIEFnZ3JGdW5jPiBBR0dSRUdBVElPTlMgPSBJbW11dGFibGVCaU1hcAorCQkJLjxBZ2dyZWdhdGlvbiwgQWdnckZ1bmM+YnVpbGRlcigpLnB1dChBZ2dyZWdhdGlvbi5OT05FLCBBZ2dyRnVuYy5OT05FKQorCQkJLnB1dChBZ2dyZWdhdGlvbi5DT1VOVCwgQWdnckZ1bmMuQ09VTlQpLnB1dChBZ2dyZWdhdGlvbi5ESVNUSU5DVF9DT1VOVCwgQWdnckZ1bmMuRENPVU5UKQorCQkJLnB1dChBZ2dyZWdhdGlvbi5NSU5JTVVNLCBBZ2dyRnVuYy5NSU4pLnB1dChBZ2dyZWdhdGlvbi5NQVhJTVVNLCBBZ2dyRnVuYy5NQVgpCisJCQkucHV0KEFnZ3JlZ2F0aW9uLkFWRVJBR0UsIEFnZ3JGdW5jLkFWRykucHV0KEFnZ3JlZ2F0aW9uLkRFVklBVElPTiwgQWdnckZ1bmMuU1REREVWKQorCQkJLnB1dChBZ2dyZWdhdGlvbi5TVU0sIEFnZ3JGdW5jLlNVTSkucHV0KEFnZ3JlZ2F0aW9uLkRJU1RJTkNULCBBZ2dyRnVuYy5ESVNUSU5DVCkuYnVpbGQoKTsKKworCS8qKgorCSAqIE1hcHMge0BsaW5rIENvbnRleHRUeXBlfSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMge0BsaW5rIFN0cmluZ30uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVCaU1hcDxDb250ZXh0VHlwZSwgU3RyaW5nPiBDT05URVhUVFlQRVMgPSBJbW11dGFibGVCaU1hcC48Q29udGV4dFR5cGUsIFN0cmluZz5idWlsZGVyKCkKKwkJCS5wdXQoQ29udGV4dFR5cGUuVU5JVFVOREVSVEVTVCwgIlVuaXRVbmRlclRlc3QiKS5wdXQoQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFLCAiVGVzdFNlcXVlbmNlIikKKwkJCS5wdXQoQ29udGV4dFR5cGUuVEVTVEVRVUlQTUVOVCwgIlRlc3RFcXVpcG1lbnQiKS5idWlsZCgpOworCisJLyoqCisJICogTWFwcyB7QGxpbmsgQ29tcGFyaXNvbk9wZXJhdG9yfSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMge0BsaW5rIFNlbE9wY29kZX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVCaU1hcDxDb21wYXJpc29uT3BlcmF0b3IsIFNlbE9wY29kZT4gT1BFUkFUSU9OUyA9IEltbXV0YWJsZUJpTWFwCisJCQkuPENvbXBhcmlzb25PcGVyYXRvciwgU2VsT3Bjb2RlPmJ1aWxkZXIoKS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkxJS0UsIFNlbE9wY29kZS5MSUtFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuQ0FTRV9JTlNFTlNJVElWRV9MSUtFLCBTZWxPcGNvZGUuQ0lfTElLRSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLk5PVF9MSUtFLCBTZWxPcGNvZGUuTk9UTElLRSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkNBU0VfSU5TRU5TSVRJVkVfTk9UX0xJS0UsIFNlbE9wY29kZS5DSV9OT1RMSUtFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuRVFVQUwsIFNlbE9wY29kZS5FUSkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX0VRVUFMLCBTZWxPcGNvZGUuQ0lfRVEpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5OT1RfRVFVQUwsIFNlbE9wY29kZS5ORVEpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX05PVF9FUVVBTCwgU2VsT3Bjb2RlLkNJX05FUSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTiwgU2VsT3Bjb2RlLkdUKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuQ0FTRV9JTlNFTlNJVElWRV9HUkVBVEVSX1RIQU4sIFNlbE9wY29kZS5DSV9HVCkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTCwgU2VsT3Bjb2RlLkdURSkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLkNBU0VfSU5TRU5TSVRJVkVfR1JFQVRFUl9USEFOX09SX0VRVUFMLCBTZWxPcGNvZGUuQ0lfR1RFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOLCBTZWxPcGNvZGUuTFQpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX0xFU1NfVEhBTiwgU2VsT3Bjb2RlLkNJX0xUKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuTEVTU19USEFOX09SX0VRVUFMLCBTZWxPcGNvZGUuTFRFKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuQ0FTRV9JTlNFTlNJVElWRV9MRVNTX1RIQU5fT1JfRVFVQUwsIFNlbE9wY29kZS5DSV9MVEUpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5JU19OVUxMLCBTZWxPcGNvZGUuSVNfTlVMTCkKKwkJCS5wdXQoQ29tcGFyaXNvbk9wZXJhdG9yLklTX05PVF9OVUxMLCBTZWxPcGNvZGUuSVNfTk9UX05VTEwpLnB1dChDb21wYXJpc29uT3BlcmF0b3IuSU5fU0VULCBTZWxPcGNvZGUuSU5TRVQpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5DQVNFX0lOU0VOU0lUSVZFX0lOX1NFVCwgU2VsT3Bjb2RlLkNJX0lOU0VUKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuTk9UX0lOX1NFVCwgU2VsT3Bjb2RlLk5PVElOU0VUKQorCQkJLnB1dChDb21wYXJpc29uT3BlcmF0b3IuQ0FTRV9JTlNFTlNJVElWRV9OT1RfSU5fU0VULCBTZWxPcGNvZGUuQ0lfTk9USU5TRVQpCisJCQkucHV0KENvbXBhcmlzb25PcGVyYXRvci5CRVRXRUVOLCBTZWxPcGNvZGUuQkVUV0VFTikuYnVpbGQoKTsKKworCS8qKgorCSAqIE1hcHMge0BsaW5rIEJvb2xlYW5PcGVyYXRvcn0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgT0RTIHtAbGluayBTZWxPcGVyYXRvcn0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVCaU1hcDxCb29sZWFuT3BlcmF0b3IsIFNlbE9wZXJhdG9yPiBPUEVSQVRPUlMgPSBJbW11dGFibGVCaU1hcAorCQkJLjxCb29sZWFuT3BlcmF0b3IsIFNlbE9wZXJhdG9yPmJ1aWxkZXIoKS5wdXQoQm9vbGVhbk9wZXJhdG9yLkFORCwgU2VsT3BlcmF0b3IuQU5EKQorCQkJLnB1dChCb29sZWFuT3BlcmF0b3IuT1IsIFNlbE9wZXJhdG9yLk9SKS5wdXQoQm9vbGVhbk9wZXJhdG9yLk5PVCwgU2VsT3BlcmF0b3IuTk9UKS5idWlsZCgpOworCisJLyoqCisJICogTWFwcyB7QGxpbmsgQnJhY2tldE9wZXJhdG9yfSB0byB0aGUgY29ycmVzcG9uZGluZyBPRFMge0BsaW5rIFNlbE9wZXJhdG9yfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUJpTWFwPEJyYWNrZXRPcGVyYXRvciwgU2VsT3BlcmF0b3I+IEJSQUNLRVRPUEVSQVRPUlMgPSBJbW11dGFibGVCaU1hcAorCQkJLjxCcmFja2V0T3BlcmF0b3IsIFNlbE9wZXJhdG9yPmJ1aWxkZXIoKS5wdXQoQnJhY2tldE9wZXJhdG9yLk9QRU4sIFNlbE9wZXJhdG9yLk9QRU4pCisJCQkucHV0KEJyYWNrZXRPcGVyYXRvci5DTE9TRSwgU2VsT3BlcmF0b3IuQ0xPU0UpLmJ1aWxkKCk7CisKKwkvKioKKwkgKiBNYXBzIHtAbGluayBWYWx1ZVR5cGV9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgRGF0YVR5cGV9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1tdXRhYmxlQmlNYXA8VmFsdWVUeXBlPD8+LCBEYXRhVHlwZT4gVkFMVUVUWVBFUyA9IEltbXV0YWJsZUJpTWFwCisJCQkuPFZhbHVlVHlwZTw/PiwgRGF0YVR5cGU+YnVpbGRlcigpLnB1dChWYWx1ZVR5cGUuVU5LTk9XTiwgRGF0YVR5cGUuRFRfVU5LTk9XTikKKwkJCS5wdXQoVmFsdWVUeXBlLlNUUklORywgRGF0YVR5cGUuRFRfU1RSSU5HKS5wdXQoVmFsdWVUeXBlLlNUUklOR19TRVFVRU5DRSwgRGF0YVR5cGUuRFNfU1RSSU5HKQorCQkJLnB1dChWYWx1ZVR5cGUuREFURSwgRGF0YVR5cGUuRFRfREFURSkucHV0KFZhbHVlVHlwZS5EQVRFX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19EQVRFKQorCQkJLnB1dChWYWx1ZVR5cGUuQk9PTEVBTiwgRGF0YVR5cGUuRFRfQk9PTEVBTikucHV0KFZhbHVlVHlwZS5CT09MRUFOX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19CT09MRUFOKQorCQkJLnB1dChWYWx1ZVR5cGUuQllURSwgRGF0YVR5cGUuRFRfQllURSkucHV0KFZhbHVlVHlwZS5CWVRFX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19CWVRFKQorCQkJLnB1dChWYWx1ZVR5cGUuU0hPUlQsIERhdGFUeXBlLkRUX1NIT1JUKS5wdXQoVmFsdWVUeXBlLlNIT1JUX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19TSE9SVCkKKwkJCS5wdXQoVmFsdWVUeXBlLklOVEVHRVIsIERhdGFUeXBlLkRUX0xPTkcpLnB1dChWYWx1ZVR5cGUuSU5URUdFUl9TRVFVRU5DRSwgRGF0YVR5cGUuRFNfTE9ORykKKwkJCS5wdXQoVmFsdWVUeXBlLkxPTkcsIERhdGFUeXBlLkRUX0xPTkdMT05HKS5wdXQoVmFsdWVUeXBlLkxPTkdfU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0xPTkdMT05HKQorCQkJLnB1dChWYWx1ZVR5cGUuRkxPQVQsIERhdGFUeXBlLkRUX0ZMT0FUKS5wdXQoVmFsdWVUeXBlLkZMT0FUX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19GTE9BVCkKKwkJCS5wdXQoVmFsdWVUeXBlLkRPVUJMRSwgRGF0YVR5cGUuRFRfRE9VQkxFKS5wdXQoVmFsdWVUeXBlLkRPVUJMRV9TRVFVRU5DRSwgRGF0YVR5cGUuRFNfRE9VQkxFKQorCQkJLnB1dChWYWx1ZVR5cGUuQllURV9TVFJFQU0sIERhdGFUeXBlLkRUX0JZVEVTVFIpLnB1dChWYWx1ZVR5cGUuQllURV9TVFJFQU1fU0VRVUVOQ0UsIERhdGFUeXBlLkRTX0JZVEVTVFIpCisJCQkucHV0KFZhbHVlVHlwZS5GTE9BVF9DT01QTEVYLCBEYXRhVHlwZS5EVF9DT01QTEVYKQorCQkJLnB1dChWYWx1ZVR5cGUuRkxPQVRfQ09NUExFWF9TRVFVRU5DRSwgRGF0YVR5cGUuRFNfQ09NUExFWCkKKwkJCS5wdXQoVmFsdWVUeXBlLkRPVUJMRV9DT01QTEVYLCBEYXRhVHlwZS5EVF9EQ09NUExFWCkKKwkJCS5wdXQoVmFsdWVUeXBlLkRPVUJMRV9DT01QTEVYX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19EQ09NUExFWCkucHV0KFZhbHVlVHlwZS5FTlVNRVJBVElPTiwgRGF0YVR5cGUuRFRfRU5VTSkKKwkJCS5wdXQoVmFsdWVUeXBlLkVOVU1FUkFUSU9OX1NFUVVFTkNFLCBEYXRhVHlwZS5EU19FTlVNKQorCQkJLnB1dChWYWx1ZVR5cGUuRklMRV9MSU5LLCBEYXRhVHlwZS5EVF9FWFRFUk5BTFJFRkVSRU5DRSkKKwkJCS5wdXQoVmFsdWVUeXBlLkZJTEVfTElOS19TRVFVRU5DRSwgRGF0YVR5cGUuRFNfRVhURVJOQUxSRUZFUkVOQ0UpLnB1dChWYWx1ZVR5cGUuQkxPQiwgRGF0YVR5cGUuRFRfQkxPQikKKwkJCS5idWlsZCgpOworCisJLyoqCisJICogTWFwcyB7QGxpbmsgSm9pblR5cGV9IHRvIHRoZSBjb3JyZXNwb25kaW5nIE9EUyB7QGxpbmsgb3JnLmFzYW0ub2RzLkpvaW5UeXBlfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUJpTWFwPEpvaW5UeXBlLCBvcmcuYXNhbS5vZHMuSm9pblR5cGU+IEpPSU5TID0gSW1tdXRhYmxlQmlNYXAuPEpvaW5UeXBlLCBvcmcuYXNhbS5vZHMuSm9pblR5cGU+YnVpbGRlcigpCisJCQkucHV0KEpvaW5UeXBlLklOTkVSLCBvcmcuYXNhbS5vZHMuSm9pblR5cGUuSlRERUZBVUxUKS5wdXQoSm9pblR5cGUuT1VURVIsIG9yZy5hc2FtLm9kcy5Kb2luVHlwZS5KVE9VVEVSKQorCQkJLmJ1aWxkKCk7CisKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZElEKFN0cmluZyBpbnN0YW5jZUlEKSB7CisJCXJldHVybiBpbnN0YW5jZUlEICE9IG51bGwgJiYgIWluc3RhbmNlSUQuaXNFbXB0eSgpICYmICEiMCIuZXF1YWxzKGluc3RhbmNlSUQpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvbWFpbi9wcm90by9ub3RpZmljYXRpb24ucHJvdG8gYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vcHJvdG8vbm90aWZpY2F0aW9uLnByb3RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDMyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL21haW4vcHJvdG8vbm90aWZpY2F0aW9uLnByb3RvCkBAIC0wLDAgKzEsNDkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE4IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uDQorICoNCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsDQorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuDQorICoNCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUNCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0DQorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLg0KKyAqDQorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjANCisgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisgCitzeW50YXggPSAicHJvdG8zIjsKKworcGFja2FnZSBjb20ucGVha3NvbHV0aW9uLm9kcy5ub3RpZmljYXRpb247CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5wZWFrc29sdXRpb24ub2RzLm5vdGlmaWNhdGlvbi5wcm90b2J1ZiI7CitvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiTm90aWZpY2F0aW9uUHJvdG9zIjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIjsKKworZW51bSBNb2RpZmljYXRpb25UeXBlIHsKKyAgTkVXID0gMDsKKyAgTU9ESUZZID0gMTsKKyAgREVMRVRFID0gMjsKKyAgTU9ERUwgPSAzOworICBTRUNVUklUWSA9IDQ7Cit9CisJCittZXNzYWdlIFJlZ2lzdHJhdGlvbiB7CisJZW51bSBOb3RpZmljYXRpb25Nb2RlIHsKKwkJUFVTSCA9IDA7CisJCVBVTEwgPSAxOworCX0KKwkKKwlOb3RpZmljYXRpb25Nb2RlIG1vZGUgPSAxOworCXJlcGVhdGVkIE1vZGlmaWNhdGlvblR5cGUgdHlwZSA9IDI7CisJcmVwZWF0ZWQgaW50NjQgYWlkID0gMzsKK30KKworbWVzc2FnZSBOb3RpZmljYXRpb24geworCU1vZGlmaWNhdGlvblR5cGUgdHlwZSA9IDE7CisJc3RyaW5nIHV1aWQgPSAyOworCWdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgY3JlYXRpb24gPSAzOworCWludDY0IHVzZXJJZCA9IDQ7CisJaW50NjQgYWlkID0gNTsKKwlyZXBlYXRlZCBpbnQ2NCBpaWQgPSA2OworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9BZ2dyZWdhdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9BZ2dyZWdhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDgwODljCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1VTRVI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkVudGl0eVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuTW9kZWxNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Vbml0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkFnZ3JlZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlc3VsdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworCisvKioKKyAqIEFnZ3JlZ2F0aW9uIHRlc3QKKyAqCisgKiBAc2luY2UgMS4wLjAKKyAqIEBhdXRob3IgbWFmLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqLworQElnbm9yZQorLy8gRklYTUUgMTEuMDEuMjAxODogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvLyBDb21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgQWdncmVnYXRpb25UZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCVN0cmluZyBuYW1lU2VydmljZUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImhvc3QiKTsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicG9ydCIpOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNlcnZpY2UiKTsKKworCQlpZiAobmFtZVNlcnZpY2VIb3N0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VIb3N0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIGhvc3QgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnaG9zdCciKTsKKwkJfQorCisJCW5hbWVTZXJ2aWNlUG9ydCA9IG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkgPyBTdHJpbmcudmFsdWVPZigyODA5KSA6IG5hbWVTZXJ2aWNlUG9ydDsKKwkJaWYgKG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBwb3J0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3BvcnQnIik7CisJCX0KKworCQlpZiAoc2VydmljZU5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTmFtZS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgbmFtZSBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdzZXJ2aWNlJyIpOworCQl9CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjb25uZWN0aW9uUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX05BTUVTRVJWSUNFLCBTdHJpbmcuZm9ybWF0KE5BTUVfU0VSVklDRSwgbmFtZVNlcnZpY2VIb3N0LCBuYW1lU2VydmljZVBvcnQpKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1NFUlZJQ0VOQU1FLCBzZXJ2aWNlTmFtZSArICIuQVNBTS1PRFMiKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1VTRVIsIFVTRVIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fUEFTU1dPUkQsIFBBU1NXT1JEKTsKKworCQljb250ZXh0ID0gbmV3IE9EU0NvbnRleHRGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UXVlcnlJZEFuZE5hbWVOb0FnZ3JlZ2F0aW9uKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSA9IGNvbnRleHQuZ2V0UXVlcnlTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSB1bml0RW50aXR5VHlwZSA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFVuaXQuY2xhc3MpOworCQlBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSB1bml0RW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoIklkIik7CisJCUF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlID0gdW5pdEVudGl0eVR5cGUuZ2V0QXR0cmlidXRlKCJOYW1lIik7CisKKwkJTGlzdDxSZXN1bHQ+IGxpc3RSZXMgPSBxdWVyeVNlcnZpY2UuY3JlYXRlUXVlcnkoKS5zZWxlY3QoaWRBdHRyaWJ1dGUpLnNlbGVjdChuYW1lQXR0cmlidXRlKS5mZXRjaCgpOworCisJCWFzc2VydFRoYXQobGlzdFJlcy5zaXplKCkpLmlzR3JlYXRlclRoYW5PckVxdWFsVG8oMSk7CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUoaWRBdHRyaWJ1dGUpLmdldFZhbHVlVHlwZSgpKS5pc0VxdWFsVG8oVmFsdWVUeXBlLlNUUklORyk7CisJCS8vIFRlc3QgcmV0cmlldmluZyBhdHRyaWJ1dGUgdmFsdWUgd2l0aCBBZ2dyZWdhdGlvbi5OT05FIChzaG91bGQgeWllbGQgdGhlIHNhbWUKKwkJLy8gcmVzdWx0IGFzIHdpdGggbm8gYWdncmVnYXRpb24pOgorCQlhc3NlcnRUaGF0KGxpc3RSZXMuZ2V0KDApLmdldFZhbHVlKGlkQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5OT05FKS5nZXRWYWx1ZVR5cGUoKSkuaXNFcXVhbFRvKFZhbHVlVHlwZS5TVFJJTkcpOworCQlhc3NlcnRUaGF0KGxpc3RSZXMuZ2V0KDApLmdldFZhbHVlKG5hbWVBdHRyaWJ1dGUpLmdldFZhbHVlVHlwZSgpKS5pc0VxdWFsVG8oVmFsdWVUeXBlLlNUUklORyk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFF1ZXJ5SWRXaXRoQWdncmVnYXRpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIHVuaXRFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVW5pdC5jbGFzcyk7CisJCUF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IHVuaXRFbnRpdHlUeXBlLmdldEF0dHJpYnV0ZSgiSWQiKTsKKworCQlMaXN0PFJlc3VsdD4gbGlzdFJlcyA9IHF1ZXJ5U2VydmljZS5jcmVhdGVRdWVyeSgpLnNlbGVjdChpZEF0dHJpYnV0ZSwgQWdncmVnYXRpb24uTUFYSU1VTSkgLy8gc2hvdWxkIGJlIGEgc3RyaW5nCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW4gcmVzdWx0LCBqdXN0CisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbGlrZQorCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vbi1hZ2dyZWdhdGVkIElkCisJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYXR0cmlidXRlCisJCQkJLnNlbGVjdChpZEF0dHJpYnV0ZSwgQWdncmVnYXRpb24uQVZFUkFHRSkgLy8gc2hvdWxkIGJlIGEgbnVtZXJpYyB2YWx1ZSBpbiByZXN1bHQKKwkJCQkuZmV0Y2goKTsKKworCQlhc3NlcnRUaGF0KGxpc3RSZXMuc2l6ZSgpKS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDEpOworCQlhc3NlcnRUaGF0KGxpc3RSZXMuZ2V0KDApLmdldFZhbHVlKGlkQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5NQVhJTVVNKS5nZXRWYWx1ZVR5cGUoKSkKKwkJCQkuaXNFcXVhbFRvKFZhbHVlVHlwZS5TVFJJTkcpOworCQlhc3NlcnRUaGF0KGxpc3RSZXMuZ2V0KDApLmdldFZhbHVlKGlkQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5BVkVSQUdFKS5nZXRWYWx1ZVR5cGUoKSkuaXNFcXVhbFRvKFZhbHVlVHlwZS5MT05HKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UXVlcnlGYWN0b3JXaXRoQWdncmVnYXRpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIHVuaXRFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVW5pdC5jbGFzcyk7CisJCUF0dHJpYnV0ZSBmYWN0b3JBdHRyaWJ1dGUgPSB1bml0RW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoIkZhY3RvciIpOworCisJCUxpc3Q8UmVzdWx0PiBsaXN0UmVzID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0KGZhY3RvckF0dHJpYnV0ZSwgQWdncmVnYXRpb24uQ09VTlQpCisJCQkJLmdyb3VwKGZhY3RvckF0dHJpYnV0ZSkuZmV0Y2goKTsKKworCQlhc3NlcnRUaGF0KGxpc3RSZXMuc2l6ZSgpKS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDEpOworCQlhc3NlcnRUaGF0KGxpc3RSZXMuZ2V0KDApLmdldFZhbHVlKGZhY3RvckF0dHJpYnV0ZSwgQWdncmVnYXRpb24uQ09VTlQpLmdldFZhbHVlVHlwZSgpKQorCQkJCS5pc0VxdWFsVG8oVmFsdWVUeXBlLklOVEVHRVIpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RRdWVyeUZhY3RvcldpdGhBbmRXaXRob3V0QWdncmVnYXRpb24oKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIHVuaXRFbnRpdHlUeXBlID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVW5pdC5jbGFzcyk7CisJCUF0dHJpYnV0ZSBmYWN0b3JBdHRyaWJ1dGUgPSB1bml0RW50aXR5VHlwZS5nZXRBdHRyaWJ1dGUoIkZhY3RvciIpOworCisJCUxpc3Q8UmVzdWx0PiBsaXN0UmVzID0gcXVlcnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KCkuc2VsZWN0KGZhY3RvckF0dHJpYnV0ZSkKKwkJCQkuc2VsZWN0KGZhY3RvckF0dHJpYnV0ZSwgQWdncmVnYXRpb24uU1VNKS5ncm91cChmYWN0b3JBdHRyaWJ1dGUpLmZldGNoKCk7CisKKwkJYXNzZXJ0VGhhdChsaXN0UmVzLnNpemUoKSkuaXNHcmVhdGVyVGhhbk9yRXF1YWxUbygxKTsKKwkJYXNzZXJ0VGhhdChsaXN0UmVzLmdldCgwKS5nZXRWYWx1ZShmYWN0b3JBdHRyaWJ1dGUpLmdldFZhbHVlVHlwZSgpKS5pc0VxdWFsVG8oVmFsdWVUeXBlLkRPVUJMRSk7CisJCWFzc2VydFRoYXQobGlzdFJlcy5nZXQoMCkuZ2V0VmFsdWUoZmFjdG9yQXR0cmlidXRlLCBBZ2dyZWdhdGlvbi5TVU0pLmdldFZhbHVlVHlwZSgpKQorCQkJCS5pc0VxdWFsVG8oVmFsdWVUeXBlLkRPVUJMRSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvSm9pblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9Kb2luVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4M2IxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvSm9pblRlc3QuamF2YQpAQCAtMCwwICsxLDM1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLmFkYXB0ZXIuRW50aXR5VHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5Nb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkNoYW5uZWxHcm91cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5EYXRhQWNjZXNzRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CisKKy8qKgorICogSm9pblR5cGUgdGVzdAorICoKKyAqIEBzaW5jZSAxLjAuMAorICogQGF1dGhvciBqc3QsIFBlYWsgU29sdXRpb24gR21iSAorICovCitASWdub3JlCisvLyBGSVhNRSAxMC43LjIwMTc6IHRoaXMgdGVzdCBuZWVkcyBhIHJ1bm5pbmcgT0RTIFNlcnZlciwgdGhhdCBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbnRpbm91cyBidWlsZCBpbiBKZW5raW5zLgorLy8gQ29tbWVudCB0aGlzIGluIGZvciBsb2NhbCB0ZXN0cyBvbmx5LgorcHVibGljIGNsYXNzIEpvaW5UZXN0IHsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCVN0cmluZyBuYW1lU2VydmljZUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImhvc3QiKTsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicG9ydCIpOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNlcnZpY2UiKTsKKworCQlpZiAobmFtZVNlcnZpY2VIb3N0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VIb3N0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIGhvc3QgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnaG9zdCciKTsKKwkJfQorCisJCW5hbWVTZXJ2aWNlUG9ydCA9IG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkgPyBTdHJpbmcudmFsdWVPZigyODA5KSA6IG5hbWVTZXJ2aWNlUG9ydDsKKwkJaWYgKG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBwb3J0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3BvcnQnIik7CisJCX0KKworCQlpZiAoc2VydmljZU5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTmFtZS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgbmFtZSBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdzZXJ2aWNlJyIpOworCQl9CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjb25uZWN0aW9uUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX05BTUVTRVJWSUNFLCBTdHJpbmcuZm9ybWF0KE5BTUVfU0VSVklDRSwgbmFtZVNlcnZpY2VIb3N0LCBuYW1lU2VydmljZVBvcnQpKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1NFUlZJQ0VOQU1FLCBzZXJ2aWNlTmFtZSArICIuQVNBTS1PRFMiKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1VTRVIsIFVTRVIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fUEFTU1dPUkQsIFBBU1NXT1JEKTsKKworCQljb250ZXh0ID0gbmV3IE9EU0NvbnRleHRGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kVGVzdEZyb21UZXN0U3RlcElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKworCQlMaXN0PFRlc3Q+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKFRlc3QuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIzNyIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRUZXN0RnJvbU1lYXN1cmVtZW50SWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoTWVhc3VyZW1lbnQuY2xhc3MpOworCisJCUxpc3Q8VGVzdD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjY1IikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZFRlc3RGcm9tQ2hhbm5lbEdyb3VwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoQ2hhbm5lbEdyb3VwLmNsYXNzKTsKKworCQlMaXN0PFRlc3Q+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKFRlc3QuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICI4MCIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRUZXN0RnJvbUNoYW5uZWxJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsLmNsYXNzKTsKKworCQlMaXN0PFRlc3Q+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKFRlc3QuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIzMDIiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kVGVzdFN0ZXBGcm9tVGVzdElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3QuY2xhc3MpOworCisJCUxpc3Q8VGVzdFN0ZXA+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKFRlc3RTdGVwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMjgiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kVGVzdFN0ZXBGcm9tTWVhc3VyZW1lbnRJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShNZWFzdXJlbWVudC5jbGFzcyk7CisKKwkJTGlzdDxUZXN0U3RlcD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdFN0ZXAuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICI2NSIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRUZXN0U3RlcEZyb21DaGFubmVsR3JvdXBJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsR3JvdXAuY2xhc3MpOworCisJCUxpc3Q8VGVzdD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goVGVzdC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjgwIikpOworCisJCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZFRlc3RTdGVwRnJvbUNoYW5uZWxJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsLmNsYXNzKTsKKworCQlMaXN0PFRlc3RTdGVwPiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChUZXN0U3RlcC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjMwMiIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRNZWFzdXJlbWVudEZyb21UZXN0SWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdC5jbGFzcyk7CisKKwkJTGlzdDxNZWFzdXJlbWVudD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goTWVhc3VyZW1lbnQuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIyOCIpKTsKKworCQlhc3NlcnRFcXVhbHMoOSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRNZWFzdXJlbWVudEZyb21UZXN0U3RlcElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKworCQlMaXN0PE1lYXN1cmVtZW50PiBsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChNZWFzdXJlbWVudC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjM3IikpOworCisJCWFzc2VydEVxdWFscyg5LCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZE1lYXN1cmVtZW50RnJvbUNoYW5uZWxHcm91cElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKENoYW5uZWxHcm91cC5jbGFzcyk7CisKKwkJTGlzdDxNZWFzdXJlbWVudD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goTWVhc3VyZW1lbnQuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICI4MCIpKTsKKworCQlhc3NlcnRFcXVhbHMoMSwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRNZWFzdXJlbWVudEZyb21DaGFubmVsSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoQ2hhbm5lbC5jbGFzcyk7CisKKwkJTGlzdDxNZWFzdXJlbWVudD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goTWVhc3VyZW1lbnQuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICIzMDIiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQ2hhbm5lbEdyb3VwRnJvbVRlc3RJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShUZXN0LmNsYXNzKTsKKworCQlMaXN0PENoYW5uZWxHcm91cD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbEdyb3VwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMjgiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDE0LCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZENoYW5uZWxHcm91cEZyb21UZXN0U3RlcElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKworCQlMaXN0PENoYW5uZWxHcm91cD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbEdyb3VwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMzciKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDE0LCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZENoYW5uZWxHcm91cEZyb21NZWFzdXJlbWVudElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKE1lYXN1cmVtZW50LmNsYXNzKTsKKworCQlMaXN0PENoYW5uZWxHcm91cD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbEdyb3VwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiNjUiKSk7CisKKwkJYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKKwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3Quc2l6ZSgpKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCBmaW5kQ2hhbm5lbEdyb3VwRnJvbUNoYW5uZWxJZCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0KCk7CisJCVNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZSA9IGNvbnRleHQuZ2V0U2VhcmNoU2VydmljZSgpLmdldCgpOworCisJCUVudGl0eVR5cGUgZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShDaGFubmVsLmNsYXNzKTsKKworCQlMaXN0PENoYW5uZWxHcm91cD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbEdyb3VwLmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0LCAiMzAyIikpOworCisJCWFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZENoYW5uZWxGcm9tVGVzdElkKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5nZXQoKTsKKwkJU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkuZ2V0KCk7CisKKwkJRW50aXR5VHlwZSBldCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3QuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjI4IikpOworCisJCWFzc2VydEVxdWFscyg0MywgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRDaGFubmVsRnJvbVRlc3RTdGVwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjM3IikpOworCisJCWFzc2VydEVxdWFscyg0MywgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGZpbmRDaGFubmVsRnJvbU1lYXN1cmVtZW50SWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoTWVhc3VyZW1lbnQuY2xhc3MpOworCisJCUxpc3Q8Q2hhbm5lbD4gbGlzdCA9IHNlYXJjaFNlcnZpY2UuZmV0Y2goQ2hhbm5lbC5jbGFzcywgRmlsdGVyLmlkT25seShldCwgIjY1IikpOworCisJCWFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7CisJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0LnNpemUoKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgZmluZENoYW5uZWxGcm9tQ2hhbm5lbEdyb3VwSWQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoQ2hhbm5lbEdyb3VwLmNsYXNzKTsKKworCQlMaXN0PENoYW5uZWw+IGxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKENoYW5uZWwuY2xhc3MsIEZpbHRlci5pZE9ubHkoZXQsICI4MCIpKTsKKworCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOworCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdC5zaXplKCkpOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0FkYXB0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQWRhcHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ2MjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL09EU0FkYXB0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1VTRVI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBqYXZhLnRpbWUuTG9jYWxEYXRlVGltZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLk1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubWFzc2RhdGEuV3JpdGVSZXF1ZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tYXNzZGF0YS5Xcml0ZVJlcXVlc3RCdWlsZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5BeGlzVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQmFzZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Q29tcG9uZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5Db250ZXh0Um9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ29udGV4dFR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkRlbGV0YWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnVtUmVnaXN0cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLkZpbGVMaW5rOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWltZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlBoeXNpY2FsRGltZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5RdWFudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuU2NhbGFyVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdFN0ZXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlVuaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlZhbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkRhdGFBY2Nlc3NFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uuc2VhcmNoLlNlYXJjaFNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuQ2F0YWxvZ0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuRW50aXR5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUG9vbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVDb21wb25lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlRlbXBsYXRlUm9vdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQubW9kZWwuVGVtcGxhdGVUZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5UZW1wbGF0ZVRlc3RTdGVwOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BJZ25vcmUKKy8vIEZJWE1FIDEwLjcuMjAxNzogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvLyBDb21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgT0RTQWRhcHRlclRlc3QgeworCisJLyoKKwkgKiBBVFRFTlRJT046ID09PT09PT09PT0KKwkgKgorCSAqIFRvIHJ1biB0aGlzIHRlc3QgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmljZSBpcyBydW5uaW5nIGEgTURNIGRlZmF1bHQgbW9kZWwKKwkgKiBhbmQgYW55IGRhdGFiYXNlIGNvbnN0cmFpbnQgd2hpY2ggZW5mb3JjZXMgYSByZWxhdGlvbiBvZiBUZXN0IHRvIGEgcGFyZW50CisJICogZW50aXR5IGlzIGRlYWN0aXZhdGVkIQorCSAqLworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU0FkYXB0ZXJUZXN0LmNsYXNzKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgc3RhdGljIEVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlcjsKKwlwcml2YXRlIHN0YXRpYyBFbnRpdHlGYWN0b3J5IGVudGl0eUZhY3Rvcnk7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCQlTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2VydmljZSIpOworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwkJZW50aXR5TWFuYWdlciA9IGNvbnRleHQuZ2V0RW50aXR5TWFuYWdlcigpCisJCQkJLm9yRWxzZVRocm93KCgpIC0+IG5ldyBTZXJ2aWNlTm90UHJvdmlkZWRFeGNlcHRpb24oRW50aXR5TWFuYWdlci5jbGFzcykpOworCQllbnRpdHlGYWN0b3J5ID0gY29udGV4dC5nZXRFbnRpdHlGYWN0b3J5KCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW50aXR5IG1hbmFnZXIgZmFjdG9yeSBub3QgYXZhaWxhYmxlLiIpKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuY2xvc2UoKTsKKwkJfQorCX0KKworCS8qCisJICogRklYTUUgdGhpcyB0ZXN0IHJlcXVpcmVzIHRoYXQgdGhlcmUgaXMgYSB0ZXN0c3RlcCB3aXRoIGlkIDIsIHRoYXQgaGFzIGEKKwkgKiB1bml0dW5kZXJ0ZXN0IGNvbXBvbmVudCBjYWxsZWQgImZpbGV0ZXN0IiwgdGhhdCBoYXMgYW4gZW1wdHkgZmlsZWxpbmsKKwkgKiBhdHRyaWJ1dGUgIm15ZXh0cmVmIiBhbmQgYSBzdHJpbmcgYXR0cmludXRlICJhdHRyMSIuIHJlbW92ZSB0aGUgY29tbWVudCBhdAorCSAqIG9yZy5qdW5pdC5UZXN0IGlmIHlvdSBmdWxmaWxsIHRoZXNlIHJlcXVpcmVtZW50cworCSAqLworCS8vIEBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZUZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGlkdGVzdHN0ZXAgPSAiMiI7CisJCU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBjb250ZXh0LmdldE1vZGVsTWFuYWdlcigpLmdldCgpOworCQlTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBjb250ZXh0LmdldFNlYXJjaFNlcnZpY2UoKS5nZXQoKTsKKworCQlFbnRpdHlUeXBlIGV0dGVzdHN0ZXAgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShUZXN0U3RlcC5jbGFzcyk7CisJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOworCisJCXRyYW5zYWN0aW9uID0gZW50aXR5TWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKCk7CisKKwkJdHJ5IHsKKwkJCUxpc3Q8VGVzdFN0ZXA+IG1lYWxpc3Q7CisJCQltZWFsaXN0ID0gc2VhcmNoU2VydmljZS5mZXRjaChUZXN0U3RlcC5jbGFzcywgRmlsdGVyLmlkT25seShldHRlc3RzdGVwLCBpZHRlc3RzdGVwKSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgbWVhbGlzdC5zaXplKCkpOworCQkJVGVzdFN0ZXAgdHMgPSBtZWFsaXN0LmdldCgwKTsKKwkJCU1hcDxDb250ZXh0VHlwZSwgQ29udGV4dFJvb3Q+IGxvYWRDb250ZXh0cyA9IHRzLmxvYWRDb250ZXh0cyhlbnRpdHlNYW5hZ2VyLCBDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKTsKKwkJCUNvbnRleHRSb290IGNvbnRleHRSb290ID0gbG9hZENvbnRleHRzLmdldChDb250ZXh0VHlwZS5VTklUVU5ERVJURVNUKTsKKwkJCU9wdGlvbmFsPENvbnRleHRDb21wb25lbnQ+IGNvbnRleHRDb21wb25lbnQgPSBjb250ZXh0Um9vdC5nZXRDb250ZXh0Q29tcG9uZW50KCJmaWxldGVzdCIpOworCQkJVmFsdWUgdmFsdWUgPSBjb250ZXh0Q29tcG9uZW50LmdldCgpLmdldFZhbHVlKCJteWV4dHJlZiIpOworCQkJY29udGV4dENvbXBvbmVudC5nZXQoKS5nZXRWYWx1ZSgiYXR0cjEiKS5zZXQoInZhbDQ3MTEiKTsKKwkJCUZpbGVMaW5rIGZsID0gRmlsZUxpbmsubmV3UmVtb3RlKCIiLCBuZXcgTWltZVR5cGUoIiIpLCAiIik7CisJCQlGaWxlTGluayBmbDIgPSAoRmlsZUxpbmspIHZhbHVlLmV4dHJhY3QoKTsKKwkJCWFzc2VydEVxdWFscyhmbDIsIGZsKTsKKwkJCUxpc3Q8QmFzZUVudGl0eT4gdG9VcGRhdGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCXRvVXBkYXRlLmFkZChjb250ZXh0Q29tcG9uZW50LmdldCgpKTsKKwkJCXRyYW5zYWN0aW9uLnVwZGF0ZSh0b1VwZGF0ZSk7CisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQl0cmFuc2FjdGlvbi5hYm9ydCgpOworCQkJdGhyb3cgZTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHJ1bnRUZXN0U2NyaXB0KCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlMaXN0PENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzID0gY3JlYXRlQ2F0YWxvZ0NvbXBvbmVudHMoKTsKKwkJTGlzdDxUZW1wbGF0ZVJvb3Q+IHRlbXBsYXRlUm9vdHMgPSBjcmVhdGVUZW1wbGF0ZVJvb3RzKGNhdGFsb2dDb21wb25lbnRzKTsKKwkJTGlzdDxUZW1wbGF0ZVRlc3RTdGVwPiB0ZW1wbGF0ZVRlc3RTdGVwcyA9IGNyZWF0ZVRlbXBsYXRlVGVzdFN0ZXBzKHRlbXBsYXRlUm9vdHMpOworCQlUZW1wbGF0ZVRlc3QgdGVtcGxhdGVUZXN0ID0gY3JlYXRlVGVtcGxhdGVUZXN0KHRlbXBsYXRlVGVzdFN0ZXBzKTsKKwkJUGh5c2ljYWxEaW1lbnNpb24gcGh5c2ljYWxEaW1lbnNpb24gPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVBoeXNpY2FsRGltZW5zaW9uKCJhbnlfcGh5c2ljYWxfZGltZW5zaW9uIik7CisJCVVuaXQgdW5pdCA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVW5pdCgiYW55X3VuaXQiLCBwaHlzaWNhbERpbWVuc2lvbik7CisJCVF1YW50aXR5IHF1YW50aXR5ID0gZW50aXR5RmFjdG9yeS5jcmVhdGVRdWFudGl0eSgiYW55X3F1YW50aXR5IiwgdW5pdCk7CisKKwkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbnRpdHlNYW5hZ2VyLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJdHJ5IHsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgImNhdGFsb2cgY29tcG9uZW50cyIsIGNhdGFsb2dDb21wb25lbnRzKTsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgInRlbXBsYXRlIHJvb3RzIiwgdGVtcGxhdGVSb290cyk7CisJCQljcmVhdGUodHJhbnNhY3Rpb24sICJ0ZW1wbGF0ZSB0ZXN0IHN0ZXBzIiwgdGVtcGxhdGVUZXN0U3RlcHMpOworCQkJY3JlYXRlKHRyYW5zYWN0aW9uLCAidGVtcGxhdGUgdGVzdCIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodGVtcGxhdGVUZXN0KSk7CisJCQljcmVhdGUodHJhbnNhY3Rpb24sICJwaHlzaWNhbCBkaW1lbnNpb24iLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBoeXNpY2FsRGltZW5zaW9uKSk7CisJCQljcmVhdGUodHJhbnNhY3Rpb24sICJ1bml0IiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1bml0KSk7CisJCQljcmVhdGUodHJhbnNhY3Rpb24sICJxdWFudGl0eSIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocXVhbnRpdHkpKTsKKworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworCQkJdHJhbnNhY3Rpb24uYWJvcnQoKTsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCQlmYWlsKCJVbmFibGUgdG8gY3JlYXRlIHRlc3QgZGF0YSBkdWUgdG86ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisJCX0KKworCQlMaXN0PFByb2plY3Q+IHByb2plY3RzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisJCXRyeSB7CisJCQlwcm9qZWN0cyA9IGNyZWF0ZVRlc3REYXRhKHRlbXBsYXRlVGVzdCwgcXVhbnRpdHkpOworCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKwkJCWUucHJpbnRTdGFja1RyYWNlKCk7CisJCX0KKworCQl0cmFuc2FjdGlvbiA9IGVudGl0eU1hbmFnZXIuc3RhcnRUcmFuc2FjdGlvbigpOworCQl0cnkgeworCQkJLy8gZGVsZXRlIGluIHJldmVyc2Ugb3JkZXIhCisJCQlpZiAoIXByb2plY3RzLmlzRW1wdHkoKSkgeworCQkJCWRlbGV0ZSh0cmFuc2FjdGlvbiwgInByb2plY3RzIGFuZCB0aGVpciBjaGlsZHJlbiIsIHByb2plY3RzKTsKKwkJCX0KKworCQkJZGVsZXRlKHRyYW5zYWN0aW9uLCAicXVhbnRpdHkiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHF1YW50aXR5KSk7CisJCQlkZWxldGUodHJhbnNhY3Rpb24sICJ1bml0IiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh1bml0KSk7CisJCQlkZWxldGUodHJhbnNhY3Rpb24sICJwaHlzaWNhbCBkaW1lbnNpb24iLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHBoeXNpY2FsRGltZW5zaW9uKSk7CisJCQlkZWxldGUodHJhbnNhY3Rpb24sICJ0ZW1wbGF0ZSB0ZXN0IiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0ZW1wbGF0ZVRlc3QpKTsKKwkJCWRlbGV0ZSh0cmFuc2FjdGlvbiwgInRlbXBsYXRlIHRlc3Qgc3RlcHMiLCB0ZW1wbGF0ZVRlc3RTdGVwcyk7CisJCQlkZWxldGUodHJhbnNhY3Rpb24sICJ0ZW1wbGF0ZSByb290cyIsIHRlbXBsYXRlUm9vdHMpOworCQkJZGVsZXRlKHRyYW5zYWN0aW9uLCAiY2F0YWxvZyBjb21wb25lbnRzIiwgY2F0YWxvZ0NvbXBvbmVudHMpOworCisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQl0cmFuc2FjdGlvbi5hYm9ydCgpOworCQkJZmFpbCgiVW5hYmxlIHRvIGRlbGV0ZSB0ZXN0IGRhdGEgZHVlIHRvOiAiICsgZS5nZXRNZXNzYWdlKCkpOworCQl9CisKKwkJaWYgKHByb2plY3RzLmlzRW1wdHkoKSkgeworCQkJZmFpbCgiV2FzIHVuYWJsZSB0byBjcmVhdGUgdGVzdCBkYXRhLiIpOworCQl9CisJfQorCisJcHJpdmF0ZSBMaXN0PFByb2plY3Q+IGNyZWF0ZVRlc3REYXRhKFRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QsIFF1YW50aXR5IHF1YW50aXR5KSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJUHJvamVjdCBwcm9qZWN0ID0gZW50aXR5RmFjdG9yeS5jcmVhdGVQcm9qZWN0KCJzaW1wbGVfcHJvamVjdCIpOworCQlQb29sIHBvb2wgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVBvb2woInNpbXBsZV9wb29sIiwgcHJvamVjdCk7CisKKwkJTGlzdDxUZXN0PiB0ZXN0cyA9IGNyZWF0ZVRlc3RzKDIsIHBvb2wsIHRlbXBsYXRlVGVzdCk7CisKKwkJLy8gY3JlYXRlIG1lYXN1cmVtZW50IHRlc3QgZGF0YQorCQlMaXN0PFdyaXRlUmVxdWVzdD4gd3JpdGVSZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlmb3IgKFRlc3QgdGVzdCA6IHRlc3RzKSB7CisJCQlmb3IgKFRlc3RTdGVwIHRlc3RTdGVwIDogdGVzdC5nZXRDb21taXNzaW9uZWRUZXN0U3RlcHMoKSkgeworCQkJCU9wdGlvbmFsPFRlbXBsYXRlVGVzdFN0ZXA+IHRlbXBsYXRlVGVzdFN0ZXAgPSBUZW1wbGF0ZVRlc3RTdGVwLm9mKHRlc3RTdGVwKTsKKwkJCQlDb250ZXh0Um9vdFtdIGNvbnRleHRSb290cyA9IG5ldyBDb250ZXh0Um9vdFswXTsKKwkJCQlpZiAodGVtcGxhdGVUZXN0U3RlcC5pc1ByZXNlbnQoKSkgeworCQkJCQljb250ZXh0Um9vdHMgPSB0ZW1wbGF0ZVRlc3RTdGVwLmdldCgpLmdldFRlbXBsYXRlUm9vdHMoKS5zdHJlYW0oKQorCQkJCQkJCS5tYXAodGVtcGxhdGVSb290IC0+IGVudGl0eUZhY3RvcnkuY3JlYXRlQ29udGV4dFJvb3QodGVtcGxhdGVSb290KSkKKwkJCQkJCQkudG9BcnJheShDb250ZXh0Um9vdFtdOjpuZXcpOworCQkJCX0KKwkJCQlmb3IgKGludCBpID0gMTsgaSA8IDM7IGkrKykgeworCQkJCQlNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA9IGVudGl0eUZhY3RvcnkuY3JlYXRlTWVhc3VyZW1lbnQoIm1lYXN1cmVtZW50XyIgKyBpLCB0ZXN0U3RlcCwKKwkJCQkJCQljb250ZXh0Um9vdHMpOworCisJCQkJCS8vIGNyZWF0ZSBjaGFubmVscworCQkJCQlMaXN0PENoYW5uZWw+IGNoYW5uZWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgOTsgaisrKSB7CisJCQkJCQljaGFubmVscy5hZGQoZW50aXR5RmFjdG9yeS5jcmVhdGVDaGFubmVsKCJjaGFubmVsXyAiICsgaiwgbWVhc3VyZW1lbnQsIHF1YW50aXR5KSk7CisJCQkJCX0KKworCQkJCQkvLyBjcmVhdGUgY2hhbm5lbCBncm91cAorCQkJCQlDaGFubmVsR3JvdXAgY2hhbm5lbEdyb3VwID0gZW50aXR5RmFjdG9yeS5jcmVhdGVDaGFubmVsR3JvdXAoImdyb3VwIiwgMTAsIG1lYXN1cmVtZW50KTsKKwkJCQkJd3JpdGVSZXF1ZXN0cy5hZGRBbGwoY3JlYXRlTWVhc3VyZW1lbnREYXRhKG1lYXN1cmVtZW50LCBjaGFubmVsR3JvdXAsIGNoYW5uZWxzKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbnRpdHlNYW5hZ2VyLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJdHJ5IHsKKwkJCWNyZWF0ZSh0cmFuc2FjdGlvbiwgInByb2plY3QgYW5kIHBvb2wgd2l0aCB0ZXN0cyBiYXNlZCBvbiB0ZWFtcGxhdGVzIHdpdGggbWVhc3VyZW1lbnRzIGFuZCBtYXNzIGRhdGEiLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24ocHJvamVjdCkpOworCisJCQl0cmFuc2FjdGlvbi53cml0ZU1lYXN1cmVkVmFsdWVzKHdyaXRlUmVxdWVzdHMpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisJCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcm9qZWN0KTsKKwkJfSBjYXRjaCAoRGF0YUFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisJCQllLnByaW50U3RhY2tUcmFjZSgpOworCQkJdHJhbnNhY3Rpb24uYWJvcnQoKTsKKwkJfQorCisJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8V3JpdGVSZXF1ZXN0PiBjcmVhdGVNZWFzdXJlbWVudERhdGEoTWVhc3VyZW1lbnQgbWVhc3VyZW1lbnQsIENoYW5uZWxHcm91cCBjaGFubmVsR3JvdXAsCisJCQlMaXN0PENoYW5uZWw+IGNoYW5uZWxzKSB7CisJCS8vIHNldCBsZW5ndGggb2YgdGhlIGNoYW5uZWwgdmFsdWUgc2VxdWVuY2UKKwkJTGlzdDxXcml0ZVJlcXVlc3Q+IHdyaXRlUmVxdWVzdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworCQkvLyBwb3B1bGF0ZSBjaGFubmVsIHZhbHVlIHdyaXRlIHJlcXVlc3RzIC0gb25lIHBlciBjaGFubmVsCisJCUNvbGxlY3Rpb25zLnNvcnQoY2hhbm5lbHMsIChjMSwgYzIpIC0+IGMxLmdldE5hbWUoKS5jb21wYXJlVG8oYzIuZ2V0TmFtZSgpKSk7CisKKwkJV3JpdGVSZXF1ZXN0QnVpbGRlciB3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDApLCBBeGlzVHlwZS5YX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCh3cmIuaW1wbGljaXRMaW5lYXIoU2NhbGFyVHlwZS5GTE9BVCwgMCwgMSkuaW5kZXBlbmRlbnQoKS5idWlsZCgpKTsKKworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDEpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCh3cmIuZXhwbGljaXQoKQorCQkJCS5ib29sZWFuVmFsdWVzKG5ldyBib29sZWFuW10geyB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UgfSkKKwkJCQkuYnVpbGQoKSk7CisKKwkJd3JiID0gV3JpdGVSZXF1ZXN0LmNyZWF0ZShjaGFubmVsR3JvdXAsIGNoYW5uZWxzLmdldCgyKSwgQXhpc1R5cGUuWV9BWElTKTsKKwkJd3JpdGVSZXF1ZXN0cy5hZGQod3JiLmV4cGxpY2l0KCkuYnl0ZVZhbHVlcyhuZXcgYnl0ZVtdIHsgNSwgMzIsIDQyLCA5LCAxNywgNjUsIDEzLCA4LCAxNSwgMjEgfSkuYnVpbGQoKSk7CisKKwkJd3JiID0gV3JpdGVSZXF1ZXN0LmNyZWF0ZShjaGFubmVsR3JvdXAsIGNoYW5uZWxzLmdldCgzKSwgQXhpc1R5cGUuWV9BWElTKTsKKwkJd3JpdGVSZXF1ZXN0cy5hZGQoCisJCQkJd3JiLmV4cGxpY2l0KCkuaW50ZWdlclZhbHVlcyhuZXcgaW50W10geyA0MjMsIDY0NSwgMjIxLCAxMTEsIDY3NSwgMzUzLCA3ODEsIDU4MiwgNzU1LCAyMzEgfSkuYnVpbGQoKSk7CisKKwkJd3JiID0gV3JpdGVSZXF1ZXN0LmNyZWF0ZShjaGFubmVsR3JvdXAsIGNoYW5uZWxzLmdldCg0KSwgQXhpc1R5cGUuWV9BWElTKTsKKwkJd3JpdGVSZXF1ZXN0cy5hZGQod3JiLmV4cGxpY2l0KCkKKwkJCQkuc3RyaW5nVmFsdWVzKG5ldyBTdHJpbmdbXSB7ICJzMSIsICJzMiIsICJzMyIsICJzNCIsICJzNSIsICJzNiIsICJzNyIsICJzOCIsICJzOSIsICJzMTAiIH0pLmJ1aWxkKCkpOworCisJCUxvY2FsRGF0ZVRpbWUgbm93ID0gTG9jYWxEYXRlVGltZS5ub3coKTsKKwkJd3JiID0gV3JpdGVSZXF1ZXN0LmNyZWF0ZShjaGFubmVsR3JvdXAsIGNoYW5uZWxzLmdldCg1KSwgQXhpc1R5cGUuWV9BWElTKTsKKwkJd3JpdGVSZXF1ZXN0cworCQkJCS5hZGQod3JiLmV4cGxpY2l0KCkKKwkJCQkJCS5kYXRlVmFsdWVzKG5ldyBMb2NhbERhdGVUaW1lW10geyBub3csIG5vdy5wbHVzRGF5cygxKSwgbm93LnBsdXNEYXlzKDIpLCBub3cucGx1c0RheXMoMyksCisJCQkJCQkJCW5vdy5wbHVzRGF5cyg0KSwgbm93LnBsdXNEYXlzKDUpLCBub3cucGx1c0RheXMoNiksIG5vdy5wbHVzRGF5cyg3KSwgbm93LnBsdXNEYXlzKDgpLAorCQkJCQkJCQlub3cucGx1c0RheXMoOSkgfSkKKwkJCQkJCS5idWlsZCgpKTsKKworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDYpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCh3cmIuZXhwbGljaXQoKS5ieXRlU3RyZWFtVmFsdWVzKG5ldyBieXRlW11bXSB7IHsgMSwgMiB9LCB7IDMsIDQsIDUgfSwgeyA2LCA3LCA4IH0sIHsgOSwgMTAgfSwKKwkJCQl7IDExIH0sIHsgMTIsIDEzLCAxNCB9LCB7IDE1LCAxNiB9LCB7IDE3LCAxOCwgMTksIDIwIH0sIHsgMjEsIDIyIH0sIHsgMjMgfSB9KS5idWlsZCgpKTsKKworCQl3cmIgPSBXcml0ZVJlcXVlc3QuY3JlYXRlKGNoYW5uZWxHcm91cCwgY2hhbm5lbHMuZ2V0KDcpLCBBeGlzVHlwZS5ZX0FYSVMpOworCQl3cml0ZVJlcXVlc3RzLmFkZCh3cmIuaW1wbGljaXRDb25zdGFudChTY2FsYXJUeXBlLlNIT1JULCBTaG9ydC5NQVhfVkFMVUUpLmJ1aWxkKCkpOworCisJCXdyYiA9IFdyaXRlUmVxdWVzdC5jcmVhdGUoY2hhbm5lbEdyb3VwLCBjaGFubmVscy5nZXQoOCksIEF4aXNUeXBlLllfQVhJUyk7CisJCXdyaXRlUmVxdWVzdHMuYWRkKHdyYi5pbXBsaWNpdFNhdyhTY2FsYXJUeXBlLkZMT0FULCAwLCAxLCA0KS5idWlsZCgpKTsKKworCQlyZXR1cm4gd3JpdGVSZXF1ZXN0czsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgU3RyaW5nIGtleSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRGVsZXRhYmxlPiBlbnRpdGllcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTE9HR0VSLmluZm8oIj4+Pj4+Pj4+Pj4+Pj4+Pj4+IGRlbGV0aW5nICIgKyBrZXkgKyAiLi4uIik7CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJdHJhbnNhY3Rpb24uZGVsZXRlKGVudGl0aWVzKTsKKwkJTE9HR0VSLmluZm8oIj4+Pj4+Pj4+Pj4+Pj4+Pj4+ICIgKyBrZXkgKyAiIGRlbGV0ZWQgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICIgbXMiKTsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNyZWF0ZShUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwgU3RyaW5nIGtleSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRW50aXR5PiBlbnRpdGllcykKKwkJCXRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJTE9HR0VSLmluZm8oIj4+Pj4+Pj4+Pj4+Pj4+Pj4+IGNyZWF0aW5nICIgKyBrZXkgKyAiLi4uIik7CisJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKwkJdHJhbnNhY3Rpb24uY3JlYXRlKGVudGl0aWVzKTsKKwkJTE9HR0VSLmluZm8oIj4+Pj4+Pj4+Pj4+Pj4+Pj4+ICIgKyBrZXkgKyAiIHdyaXR0ZW4gaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0KSArICIgbXMiKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8VGVzdD4gY3JlYXRlVGVzdHMoaW50IGNvdW50LCBQb29sIHBvb2wsIFRlbXBsYXRlVGVzdCB0ZW1wbGF0ZVRlc3QpIHsKKwkJcmV0dXJuIEludFN0cmVhbS5yYW5nZSgxLCArK2NvdW50KQorCQkJCS5tYXBUb09iaihpIC0+IGVudGl0eUZhY3RvcnkuY3JlYXRlVGVzdCgic2ltcGxlX3Rlc3RfIiArIGksIHBvb2wsIHRlbXBsYXRlVGVzdCkpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisJfQorCisJcHJpdmF0ZSBUZW1wbGF0ZVRlc3QgY3JlYXRlVGVtcGxhdGVUZXN0KExpc3Q8VGVtcGxhdGVUZXN0U3RlcD4gdGVtcGxhdGVUZXN0U3RlcHMpIHsKKwkJVGVtcGxhdGVUZXN0IHRlbXBsYXRlVGVzdCA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVGVtcGxhdGVUZXN0KCJ0cGxfdGVzdCIpOworCQl0ZW1wbGF0ZVRlc3RTdGVwcy5mb3JFYWNoKHR0cyAtPiB7CisJCQllbnRpdHlGYWN0b3J5LmNyZWF0ZVRlbXBsYXRlVGVzdFN0ZXBVc2FnZShVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLCB0ZW1wbGF0ZVRlc3QsIHR0cyk7CisJCX0pOworCQlyZXR1cm4gdGVtcGxhdGVUZXN0OworCX0KKworCXByaXZhdGUgTGlzdDxUZW1wbGF0ZVRlc3RTdGVwPiBjcmVhdGVUZW1wbGF0ZVRlc3RTdGVwcyhMaXN0PFRlbXBsYXRlUm9vdD4gdGVtcGxhdGVSb290cykgeworCQkvLyBtYWtlIHN1cmUgZWFjaCBjb250ZXh0IHR5cGUgaXMgZ2l2ZW4gb25seSBvbmNlCisJCXRlbXBsYXRlUm9vdHMuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKFRlbXBsYXRlUm9vdDo6Z2V0Q29udGV4dFR5cGUsIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKworCQlMaXN0PFRlbXBsYXRlVGVzdFN0ZXA+IHRlbXBsYXRlVGVzdFN0ZXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCVRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcDEgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVRlbXBsYXRlVGVzdFN0ZXAoInRwbF90ZXN0X3N0ZXBfMSIpOworCQl0ZW1wbGF0ZVJvb3RzLmZvckVhY2godHIgLT4gdGVtcGxhdGVUZXN0U3RlcDEuc2V0VGVtcGxhdGVSb290KHRyKSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBzLmFkZCh0ZW1wbGF0ZVRlc3RTdGVwMSk7CisJCVRlbXBsYXRlVGVzdFN0ZXAgdGVtcGxhdGVUZXN0U3RlcDIgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVRlbXBsYXRlVGVzdFN0ZXAoInRwbF90ZXN0X3N0ZXBfMiIpOworCQl0ZW1wbGF0ZVJvb3RzLmZvckVhY2godHIgLT4gdGVtcGxhdGVUZXN0U3RlcDIuc2V0VGVtcGxhdGVSb290KHRyKSk7CisJCXRlbXBsYXRlVGVzdFN0ZXBzLmFkZCh0ZW1wbGF0ZVRlc3RTdGVwMik7CisKKwkJcmV0dXJuIHRlbXBsYXRlVGVzdFN0ZXBzOworCX0KKworCXByaXZhdGUgTGlzdDxUZW1wbGF0ZVJvb3Q+IGNyZWF0ZVRlbXBsYXRlUm9vdHMoTGlzdDxDYXRhbG9nQ29tcG9uZW50PiBjYXRhbG9nQ29tcG9uZW50cykgeworCQlNYXA8Q29udGV4dFR5cGUsIExpc3Q8Q2F0YWxvZ0NvbXBvbmVudD4+IGdyb3VwcyA9IGNhdGFsb2dDb21wb25lbnRzLnN0cmVhbSgpCisJCQkJLmNvbGxlY3QoQ29sbGVjdG9ycy5ncm91cGluZ0J5KENhdGFsb2dDb21wb25lbnQ6OmdldENvbnRleHRUeXBlKSk7CisKKwkJTGlzdDxUZW1wbGF0ZVJvb3Q+IHRlbXBsYXRlUm9vdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJZ3JvdXBzLmZvckVhY2goKGNvbnRleHRUeXBlLCBjYXRhbG9nQ29tcHMpIC0+IHsKKwkJCVRlbXBsYXRlUm9vdCB0ZW1wbGF0ZVJvb3QgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVRlbXBsYXRlUm9vdChjb250ZXh0VHlwZSwKKwkJCQkJInRwbF8iICsgdG9Mb3dlcihjb250ZXh0VHlwZS5uYW1lKCkpICsgIl9yb290Iik7CisJCQkvLyBjcmVhdGUgY2hpbGQgdGVtcGxhdGUgY29tcG9uZW50cyBmb3IgdGVtcGxhdGUgcm9vdAorCQkJY2F0YWxvZ0NvbXBzLmZvckVhY2goY2F0YWxvZ0NvbXAgLT4geworCQkJCVRlbXBsYXRlQ29tcG9uZW50IHRlbXBsYXRlQ29tcG9uZW50ID0gZW50aXR5RmFjdG9yeQorCQkJCQkJLmNyZWF0ZVRlbXBsYXRlQ29tcG9uZW50KCJ0cGxfIiArIGNhdGFsb2dDb21wLmdldE5hbWUoKSArICJfcGFyZW50IiwgdGVtcGxhdGVSb290LCBjYXRhbG9nQ29tcCk7CisJCQkJZW50aXR5RmFjdG9yeS5jcmVhdGVUZW1wbGF0ZUNvbXBvbmVudCgidHBsXyIgKyBjYXRhbG9nQ29tcC5nZXROYW1lKCkgKyAiX2NoaWxkIiwgdGVtcGxhdGVDb21wb25lbnQsCisJCQkJCQljYXRhbG9nQ29tcCk7CisJCQl9KTsKKworCQkJdGVtcGxhdGVSb290cy5hZGQodGVtcGxhdGVSb290KTsKKwkJfSk7CisKKwkJcmV0dXJuIHRlbXBsYXRlUm9vdHM7CisJfQorCisJcHJpdmF0ZSBMaXN0PENhdGFsb2dDb21wb25lbnQ+IGNyZWF0ZUNhdGFsb2dDb21wb25lbnRzKCkgeworCQlMaXN0PENhdGFsb2dDb21wb25lbnQ+IGNhdGFsb2dDb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWNhdGFsb2dDb21wb25lbnRzLmFkZChjcmVhdGVDYXRhbG9nQ29tcG9uZW50KENvbnRleHRUeXBlLlVOSVRVTkRFUlRFU1QpKTsKKwkJY2F0YWxvZ0NvbXBvbmVudHMuYWRkKGNyZWF0ZUNhdGFsb2dDb21wb25lbnQoQ29udGV4dFR5cGUuVEVTVFNFUVVFTkNFKSk7CisJCWNhdGFsb2dDb21wb25lbnRzLmFkZChjcmVhdGVDYXRhbG9nQ29tcG9uZW50KENvbnRleHRUeXBlLlRFU1RFUVVJUE1FTlQpKTsKKwkJcmV0dXJuIGNhdGFsb2dDb21wb25lbnRzOworCX0KKworCXByaXZhdGUgQ2F0YWxvZ0NvbXBvbmVudCBjcmVhdGVDYXRhbG9nQ29tcG9uZW50KENvbnRleHRUeXBlIGNvbnRleHRUeXBlKSB7CisJCUNhdGFsb2dDb21wb25lbnQgY2F0YWxvZ0NvbXBvbmVudCA9IGVudGl0eUZhY3RvcnkuY3JlYXRlQ2F0YWxvZ0NvbXBvbmVudChjb250ZXh0VHlwZSwKKwkJCQl0b0xvd2VyKGNvbnRleHRUeXBlLm5hbWUoKSkpOworCisJCWVudGl0eUZhY3RvcnkuY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZSgic3RyaW5nIiwgVmFsdWVUeXBlLlNUUklORywgY2F0YWxvZ0NvbXBvbmVudCk7CisJCWVudGl0eUZhY3RvcnkuY3JlYXRlQ2F0YWxvZ0F0dHJpYnV0ZSgiZGF0ZSIsIFZhbHVlVHlwZS5EQVRFLCBjYXRhbG9nQ29tcG9uZW50KTsKKwkJZW50aXR5RmFjdG9yeS5jcmVhdGVDYXRhbG9nQXR0cmlidXRlKCJsb25nIiwgVmFsdWVUeXBlLkxPTkcsIGNhdGFsb2dDb21wb25lbnQpOworCQllbnRpdHlGYWN0b3J5LmNyZWF0ZUNhdGFsb2dBdHRyaWJ1dGUoImZpbGVfbGluayIsIFZhbHVlVHlwZS5GSUxFX0xJTkssIGNhdGFsb2dDb21wb25lbnQpOworCQllbnRpdHlGYWN0b3J5LmNyZWF0ZUNhdGFsb2dBdHRyaWJ1dGUoImZpbGVfbGlua19hcnJheSIsIFZhbHVlVHlwZS5GSUxFX0xJTktfU0VRVUVOQ0UsIGNhdGFsb2dDb21wb25lbnQpOworCQlFbnVtUmVnaXN0cnkgZXIgPSBFbnVtUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKKwkJZW50aXR5RmFjdG9yeS5jcmVhdGVDYXRhbG9nQXR0cmlidXRlKCJzY2FsYXJfdHlwZSIsIGVyLmdldChFbnVtUmVnaXN0cnkuU0NBTEFSX1RZUEUpLCBjYXRhbG9nQ29tcG9uZW50KTsKKworCQlyZXR1cm4gY2F0YWxvZ0NvbXBvbmVudDsKKwl9CisKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9Mb3dlcihTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuUk9PVCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZjkzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTQ29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1BBU1NXT1JEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fU0VSVklDRU5BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9VU0VSOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkluc3RhbmNlRWxlbWVudDsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Db25kaXRpb247CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuRmFpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5CYXNlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0LkVudGl0eU1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnV0aWxzLk9EU0NvbnZlcnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitASWdub3JlCisvL0ZJWE1FIDI2LjAxLjIwMTg6IHRoaXMgdGVzdCBuZWVkcyBhIHJ1bm5pbmcgT0RTIFNlcnZlciwgdGhhdCBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbnRpbm91cyBidWlsZCBpbiBKZW5raW5zLgorLy9Db21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgT0RTQ29udGV4dFRlc3QgeworCisJLyoKKwkgKiBBVFRFTlRJT046ID09PT09PT09PT0KKwkgKgorCSAqIFRvIHJ1biB0aGlzIHRlc3QgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmljZSBpcyBydW5uaW5nIGEgTURNIGRlZmF1bHQgbW9kZWwKKwkgKiBhbmQgYW55IGRhdGFiYXNlIGNvbnN0cmFpbnQgd2hpY2ggZW5mb3JjZXMgYSByZWxhdGlvbiBvZiBUZXN0IHRvIGEgcGFyZW50CisJICogZW50aXR5IGlzIGRlYWN0aXZhdGVkIQorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgc3RhdGljIEVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlcjsKKworCXByaXZhdGUgc3RhdGljIFN0cmluZyBuYW1lU2VydmljZUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImhvc3QiKTsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNlcnZpY2VOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJzZXJ2aWNlIik7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKworCQlpZiAobmFtZVNlcnZpY2VIb3N0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VIb3N0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIGhvc3QgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnaG9zdCciKTsKKwkJfQorCisJCW5hbWVTZXJ2aWNlUG9ydCA9IG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkgPyBTdHJpbmcudmFsdWVPZigyODA5KSA6IG5hbWVTZXJ2aWNlUG9ydDsKKwkJaWYgKG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBwb3J0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3BvcnQnIik7CisJCX0KKworCQlpZiAoc2VydmljZU5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTmFtZS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgbmFtZSBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdzZXJ2aWNlJyIpOworCQl9CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjb25uZWN0aW9uUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX05BTUVTRVJWSUNFLCBTdHJpbmcuZm9ybWF0KE5BTUVfU0VSVklDRSwgbmFtZVNlcnZpY2VIb3N0LCBuYW1lU2VydmljZVBvcnQpKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1NFUlZJQ0VOQU1FLCBzZXJ2aWNlTmFtZSArICIuQVNBTS1PRFMiKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1VTRVIsIFVTRVIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fUEFTU1dPUkQsIFBBU1NXT1JEKTsKKworCQljb250ZXh0ID0gbmV3IE9EU0NvbnRleHRGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisJCWVudGl0eU1hbmFnZXIgPSBjb250ZXh0LmdldEVudGl0eU1hbmFnZXIoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKEVudGl0eU1hbmFnZXIuY2xhc3MpKTsKKwl9CisKKwlAQWZ0ZXJDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkFmdGVyQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCWlmIChjb250ZXh0ICE9IG51bGwpIHsKKwkJCWNvbnRleHQuY2xvc2UoKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRBZGFwdGVyVHlwZSgpIHsKKwkJYXNzZXJ0VGhhdChjb250ZXh0LmdldEFkYXB0ZXJUeXBlKCkpLmlzRXF1YWxUbygib2RzIik7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldExpbmsoKSB7CisJCS8vIHdlIGFzc3VtZSBhIHRlc3Qgd2l0aCBJRCA0IGV4aXN0cy4KKwkJVGVzdCB0ZXN0ID0gZW50aXR5TWFuYWdlci5sb2FkKFRlc3QuY2xhc3MsICI0Iik7CisKKwkJTWFwPEVudGl0eSwgU3RyaW5nPiBhc2FtUGF0aHMgPSBlbnRpdHlNYW5hZ2VyLmdldExpbmtzKEFycmF5cy5hc0xpc3QodGVzdCkpOworCisJCWFzc2VydFRoYXQoYXNhbVBhdGhzKS5oYXNTaXplKDEpLmNvbnRhaW5zT25seUtleXModGVzdCkuaGFzRW50cnlTYXRpc2Z5aW5nKHRlc3QsCisJCQkJbmV3IENvbmRpdGlvbjxTdHJpbmc+KHMgLT4gcy5zdGFydHNXaXRoKGdldExpbmtQcmVmaXgoKSksICIiKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldExpbmtBbmRMb2FkT2RzSW5zdGFuY2UoKSB7CisJCS8vIHdlIGFzc3VtZSBhIHRlc3Qgd2l0aCBJRCA0IGV4aXN0cy4KKwkJbG9uZyB0ZXN0SWQgPSA0TDsKKwkJVGVzdCB0ZXN0ID0gZW50aXR5TWFuYWdlci5sb2FkKFRlc3QuY2xhc3MsIExvbmcudG9TdHJpbmcodGVzdElkKSk7CisKKwkJTWFwPEVudGl0eSwgU3RyaW5nPiBhc2FtUGF0aHMgPSBlbnRpdHlNYW5hZ2VyLmdldExpbmtzKEFycmF5cy5hc0xpc3QodGVzdCkpOworCisJCWFzc2VydFRoYXQoYXNhbVBhdGhzKS5oYXNTaXplKDEpLmNvbnRhaW5zT25seUtleXModGVzdCkuaGFzRW50cnlTYXRpc2Z5aW5nKHRlc3QsCisJCQkJbmV3IENvbmRpdGlvbjxTdHJpbmc+KHMgLT4gcy5zdGFydHNXaXRoKGdldExpbmtQcmVmaXgoKSksICIiKSk7CisJCS8vIFdlIHRyeSB0byBsb2FkIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBPRFMgU2VydmVyIHdpdGggdGhlIEFzYW1QYXRoLCBidXQKKwkJLy8gd2l0aG91dCB0aGUgc2VydmljZSBwcmVmaXgKKwkJU3RyaW5nIGFzYW1QYXRoV2l0aG91dFNlcnZpY2UgPSBhc2FtUGF0aHMuZ2V0KHRlc3QpLnJlcGxhY2UoZ2V0TGlua1ByZWZpeCgpLCAiIik7CisKKwkJdHJ5IHsKKwkJCUluc3RhbmNlRWxlbWVudCBpZSA9ICgoT0RTQ29udGV4dCkgY29udGV4dCkuZ2V0QW9TZXNzaW9uKCkuZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKQorCQkJCQkuZ2V0SW5zdGFuY2VCeUFzYW1QYXRoKGFzYW1QYXRoV2l0aG91dFNlcnZpY2UpOworCQkJYXNzZXJ0VGhhdChPRFNDb252ZXJ0ZXIuZnJvbU9EU0xvbmcoaWUuZ2V0SWQoKSkpLmlzRXF1YWxUbyh0ZXN0SWQpOworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQlGYWlsLmZhaWwoCisJCQkJCSJJbnN0YW5jZSB3aXRoIEFzYW1QYXRoICciICsgYXNhbVBhdGhXaXRob3V0U2VydmljZSArICInIGNvdWxkIG5vdCBiZSBsb2FkZWQuIFJlYXNvbjogIiArIGUucmVhc29uLAorCQkJCQllKTsKKwkJfQorCX0KKworCUBvcmcuanVuaXQuVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3NXaXRoSW52YWxpZFR5cGUoKSB7CisJCS8vIHdlIGFzc3VtZSBhIHRlc3Qgd2l0aCBJRCA0IGV4aXN0cy4KKwkJVGVzdCB0ZXN0ID0gZW50aXR5TWFuYWdlci5sb2FkKFRlc3QuY2xhc3MsICI0Iik7CisJCUJhc2VFbnRpdHkgZW50aXR5ID0gTW9ja2l0by5tb2NrKEJhc2VFbnRpdHkuY2xhc3MpOworCQkvLyBNb2NrIGFuIGVudGl0eSB3aXRoIGEgbm9uIGV4aXN0aW5nIFR5cGVOYW1lCisJCXdoZW4oZW50aXR5LmdldFR5cGVOYW1lKCkpLnRoZW5SZXR1cm4oImludmFsaWRUeXBlIik7CisKKwkJZW50aXR5TWFuYWdlci5nZXRMaW5rcyhBcnJheXMuYXNMaXN0KHRlc3QsIGVudGl0eSkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRMaW5rc1dpdGhFbml0aXR5V2l0aE1pc3NpbmdJZCgpIHsKKwkJLy8gd2UgYXNzdW1lIGEgdGVzdCB3aXRoIElEIDQgZXhpc3RzLgorCQlUZXN0IHRlc3QgPSBlbnRpdHlNYW5hZ2VyLmxvYWQoVGVzdC5jbGFzcywgIjQiKTsKKworCQkvLyBNb2NrIGFuIGVudGl0eSB3aXRoIGEgbm9uIGV4aXN0aW5nIElECisJCVRlc3RTdGVwIHRlc3RTdGVwID0gTW9ja2l0by5tb2NrKFRlc3RTdGVwLmNsYXNzKTsKKwkJd2hlbih0ZXN0U3RlcC5nZXRJRCgpKS50aGVuUmV0dXJuKCItMSIpOworCisJCU1hcDxFbnRpdHksIFN0cmluZz4gYXNhbVBhdGhzID0gZW50aXR5TWFuYWdlci5nZXRMaW5rcyhBcnJheXMuYXNMaXN0KHRlc3QsIHRlc3RTdGVwKSk7CisKKwkJYXNzZXJ0VGhhdChhc2FtUGF0aHMpLmhhc1NpemUoMSkuY29udGFpbnNPbmx5S2V5cyh0ZXN0KS5oYXNFbnRyeVNhdGlzZnlpbmcodGVzdCwKKwkJCQluZXcgQ29uZGl0aW9uPFN0cmluZz4ocyAtPiBzLnN0YXJ0c1dpdGgoZ2V0TGlua1ByZWZpeCgpKSwgIiIpKTsKKwl9CisKKwlwcml2YXRlIFN0cmluZyBnZXRMaW5rUHJlZml4KCkgeworCQlyZXR1cm4gU3RyaW5nLmZvcm1hdCgiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZS8lcy5BU0FNLU9EUyIsIG5hbWVTZXJ2aWNlSG9zdCwgbmFtZVNlcnZpY2VQb3J0LAorCQkJCXNlcnZpY2VOYW1lKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTUm9sZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9PRFNSb2xlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjBhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvT0RTUm9sZVRlc3QuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9OQU1FU0VSVklDRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1BBU1NXT1JEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fU0VSVklDRU5BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9VU0VSOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5FbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5Sb2xlOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BJZ25vcmUKKy8vIEZJWE1FIDEwLjcuMjAxNzogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvLyBDb21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgT0RTUm9sZVRlc3QgeworCisJLyoKKwkgKiBBVFRFTlRJT046ID09PT09PT09PT0KKwkgKgorCSAqIFRvIHJ1biB0aGlzIHRlc3QgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmljZSBpcyBydW5uaW5nIGEgTURNIGRlZmF1bHQgbW9kZWwKKwkgKiBhbmQgYW55IGRhdGFiYXNlIGNvbnN0cmFpbnQgd2hpY2ggZW5mb3JjZXMgYSByZWxhdGlvbiBvZiBUZXN0IHRvIGEgcGFyZW50CisJICogZW50aXR5IGlzIGRlYWN0aXZhdGVkIQorCSAqLworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9EU1JvbGVUZXN0LmNsYXNzKTsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NFUlZJQ0UgPSAiY29yYmFsb2M6OjEuMkAlczolcy9OYW1lU2VydmljZSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUiA9ICJzYSI7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gInNhIjsKKworCXByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0OworCXByaXZhdGUgc3RhdGljIEVudGl0eU1hbmFnZXIgZW07CisJcHJpdmF0ZSBzdGF0aWMgRW50aXR5RmFjdG9yeSBlbnRpdHlGYWN0b3J5OworCisJQEJlZm9yZUNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQmVmb3JlQ2xhc3MoKSB0aHJvd3MgQ29ubmVjdGlvbkV4Y2VwdGlvbiB7CisJCVN0cmluZyBuYW1lU2VydmljZUhvc3QgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImhvc3QiKTsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgicG9ydCIpOworCQlTdHJpbmcgc2VydmljZU5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInNlcnZpY2UiKTsKKworCQlpZiAobmFtZVNlcnZpY2VIb3N0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VIb3N0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIGhvc3QgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnaG9zdCciKTsKKwkJfQorCisJCW5hbWVTZXJ2aWNlUG9ydCA9IG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkgPyBTdHJpbmcudmFsdWVPZigyODA5KSA6IG5hbWVTZXJ2aWNlUG9ydDsKKwkJaWYgKG5hbWVTZXJ2aWNlUG9ydCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlUG9ydC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBwb3J0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3BvcnQnIik7CisJCX0KKworCQlpZiAoc2VydmljZU5hbWUgPT0gbnVsbCB8fCBzZXJ2aWNlTmFtZS5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgbmFtZSBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdzZXJ2aWNlJyIpOworCQl9CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBjb25uZWN0aW9uUGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX05BTUVTRVJWSUNFLCBTdHJpbmcuZm9ybWF0KE5BTUVfU0VSVklDRSwgbmFtZVNlcnZpY2VIb3N0LCBuYW1lU2VydmljZVBvcnQpKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1NFUlZJQ0VOQU1FLCBzZXJ2aWNlTmFtZSArICIuQVNBTS1PRFMiKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1VTRVIsIFVTRVIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fUEFTU1dPUkQsIFBBU1NXT1JEKTsKKworCQljb250ZXh0ID0gbmV3IE9EU0NvbnRleHRGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisJCWVtID0gY29udGV4dC5nZXRFbnRpdHlNYW5hZ2VyKCkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihFbnRpdHlNYW5hZ2VyLmNsYXNzKSk7CisJCWVudGl0eUZhY3RvcnkgPSBjb250ZXh0LmdldEVudGl0eUZhY3RvcnkoKQorCQkJCS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbnRpdHkgbWFuYWdlciBmYWN0b3J5IG5vdCBhdmFpbGFibGUuIikpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJaWYgKGNvbnRleHQgIT0gbnVsbCkgeworCQkJY29udGV4dC5jbG9zZSgpOworCQl9CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdExvYWRSZWxhdGVkVXNlcnMoKQorCQkJdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisJCVVzZXIgdXNlciA9IGVtLmxvYWRBbGwoVXNlci5jbGFzcywgInNhIikuZ2V0KDApOworCQlMaXN0PFJvbGU+IHJvbGUgPSBlbS5sb2FkUmVsYXRlZEVudGl0aWVzKHVzZXIsICJ1c2VyczJncm91cHMiLCBSb2xlLmNsYXNzKTsKKworCQlhc3NlcnRUaGF0KHJvbGUpLmhhc1NpemUoMSkuZXh0cmFjdGluZyhSb2xlOjpnZXROYW1lKS5jb250YWluc0V4YWN0bHkoIk1ETVN5c3RlbUFkbWluaXN0cmF0b3IiKTsKKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TG9hZFJlbGF0ZWRSb2xlcygpCisJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJUm9sZSByb2xlID0gZW0ubG9hZEFsbChSb2xlLmNsYXNzLCAiTURNU3lzdGVtQWRtaW5pc3RyYXRvciIpLmdldCgwKTsKKwkJTGlzdDxVc2VyPiB1c2VyID0gZW0ubG9hZFJlbGF0ZWRFbnRpdGllcyhyb2xlLCAiZ3JvdXBzMnVzZXJzIiwgVXNlci5jbGFzcyk7CisKKwkJYXNzZXJ0VGhhdCh1c2VyKS5oYXNTaXplKDEpLmV4dHJhY3RpbmcoVXNlcjo6Z2V0TmFtZSkuY29udGFpbnNFeGFjdGx5KCJzYSIpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVVc2VyQW5kUm9sZSgpCisJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVzZXJOYW1lID0gIkNyZWF0ZVVzZXJBbmRSb2xlIjsKKwkJU3RyaW5nIHJvbGVOYW1lID0gIkNyZWF0ZVVzZXJBbmRSb2xlIjsKKworCQl0cnkgeworCQkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbS5zdGFydFRyYW5zYWN0aW9uKCk7CisJCQlVc2VyIHVzZXIgPSBlbnRpdHlGYWN0b3J5LmNyZWF0ZVVzZXIodXNlck5hbWUsICJUZXN0IiwgIlVzZXIiKTsKKwkJCVJvbGUgcm9sZSA9IGVudGl0eUZhY3RvcnkuY3JlYXRlUm9sZShyb2xlTmFtZSk7CisJCQlyb2xlLmFkZFVzZXIodXNlcik7CisKKwkJCXRyYW5zYWN0aW9uLmNyZWF0ZShBcnJheXMuYXNMaXN0KHVzZXIsIHJvbGUpKTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCisJCQlhc3NlcnRUaGF0KGVtLmxvYWRSZWxhdGVkRW50aXRpZXMocm9sZSwgInVzZXJzMmdyb3VwcyIsIFVzZXIuY2xhc3MpKS5oYXNTaXplKDEpLmV4dHJhY3RpbmcoVXNlcjo6Z2V0TmFtZSkKKwkJCQkJLmNvbnRhaW5zKHVzZXJOYW1lKTsKKworCQkJYXNzZXJ0VGhhdChlbS5sb2FkUmVsYXRlZEVudGl0aWVzKHVzZXIsICJncm91cHMydXNlcnMiLCBSb2xlLmNsYXNzKSkuaGFzU2l6ZSgxKS5leHRyYWN0aW5nKFJvbGU6OmdldE5hbWUpCisJCQkJCS5jb250YWlucyhyb2xlTmFtZSk7CisJCX0gZmluYWxseSB7CisJCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVtLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJCUxpc3Q8VXNlcj4gdXNlcnMgPSBlbS5sb2FkQWxsKFVzZXIuY2xhc3MsIHVzZXJOYW1lKTsKKwkJCXRyYW5zYWN0aW9uLmRlbGV0ZSh1c2Vycyk7CisJCQlMaXN0PFJvbGU+IHJvbGVzID0gZW0ubG9hZEFsbChSb2xlLmNsYXNzLCByb2xlTmFtZSk7CisJCQl0cmFuc2FjdGlvbi5kZWxldGUocm9sZXMpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0QWRkTXVsdGlwbGVVc2Vyc1RvTmV3Um9sZSgpCisJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJU3RyaW5nIHJvbGVOYW1lID0gIkFkZE11bHRpcGxlVXNlcnNUb05ld1JvbGUiOworCQl0cnkgeworCQkJVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBlbS5zdGFydFRyYW5zYWN0aW9uKCk7CisJCQlMaXN0PFVzZXI+IHVzZXJzID0gZW0ubG9hZEFsbChVc2VyLmNsYXNzKTsKKwkJCVJvbGUgcm9sZSA9IGVudGl0eUZhY3RvcnkuY3JlYXRlUm9sZShyb2xlTmFtZSk7CisKKwkJCXVzZXJzLmZvckVhY2godSAtPiByb2xlLmFkZFVzZXIodSkpOworCQkJdHJhbnNhY3Rpb24uY3JlYXRlKEFycmF5cy5hc0xpc3Qocm9sZSkpOworCQkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisKKwkJCWFzc2VydFRoYXQoZW0ubG9hZFJlbGF0ZWRFbnRpdGllcyhyb2xlLCAidXNlcnMyZ3JvdXBzIiwgVXNlci5jbGFzcykpLmhhc1NpemUodXNlcnMuc2l6ZSgpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZW0uc3RhcnRUcmFuc2FjdGlvbigpOworCQkJTGlzdDxSb2xlPiByb2xlcyA9IGVtLmxvYWRBbGwoUm9sZS5jbGFzcywgcm9sZU5hbWUpOworCQkJdHJhbnNhY3Rpb24uZGVsZXRlKHJvbGVzKTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCQl9CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdFJlbW92ZVVzZXJGcm9tUm9sZSgpCisJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJU3RyaW5nIHVzZXJOYW1lID0gIlJlbW92ZVVzZXJGcm9tUm9sZSI7CisJCXRyeSB7CisJCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVtLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJCVJvbGUgcm9sZSA9IGVtLmxvYWQoUm9sZS5jbGFzcywgIjEiKTsKKwkJCVVzZXIgdXNlciA9IGVudGl0eUZhY3RvcnkuY3JlYXRlVXNlcih1c2VyTmFtZSwgIlVzZXIiLCAiVXNlciIpOworCisJCQlyb2xlLmFkZFVzZXIodXNlcik7CisKKwkJCXRyYW5zYWN0aW9uLmNyZWF0ZShBcnJheXMuYXNMaXN0KHVzZXIpKTsKKwkJCXRyYW5zYWN0aW9uLnVwZGF0ZShBcnJheXMuYXNMaXN0KHJvbGUpKTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCisJCQlhc3NlcnRUaGF0KGVtLmxvYWRSZWxhdGVkRW50aXRpZXMocm9sZSwgImdyb3VwczJ1c2VycyIsIFVzZXIuY2xhc3MpKS5oYXNTaXplKDIpOworCisJCQlSb2xlIHJvbGUyID0gZW0ubG9hZChSb2xlLmNsYXNzLCAiMSIpOworCQkJdHJhbnNhY3Rpb24gPSBlbS5zdGFydFRyYW5zYWN0aW9uKCk7CisJCQlyb2xlMi5yZW1vdmVVc2VyKHVzZXIpOworCQkJdHJhbnNhY3Rpb24udXBkYXRlKEFycmF5cy5hc0xpc3Qocm9sZTIpKTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCisJCQlhc3NlcnRUaGF0KGVtLmxvYWRSZWxhdGVkRW50aXRpZXMocm9sZTIsICJncm91cHMydXNlcnMiLCBVc2VyLmNsYXNzKSkuaGFzU2l6ZSgxKTsKKwkJfSBmaW5hbGx5IHsKKwkJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZW0uc3RhcnRUcmFuc2FjdGlvbigpOworCQkJTGlzdDxVc2VyPiB1c2VycyA9IGVtLmxvYWRBbGwoVXNlci5jbGFzcywgdXNlck5hbWUpOworCQkJdHJhbnNhY3Rpb24uZGVsZXRlKHVzZXJzKTsKKwkJCXRyYW5zYWN0aW9uLmNvbW1pdCgpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL1JlbGF0aW9uVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL1JlbGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwN2I0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvUmVsYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1VTRVI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuQ29ubmVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlTdG9yZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLk1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlBhcmFtZXRlclNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LlJlY29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5zZWFyY2guU2VhcmNoU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNFbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5SZWxhdGlvblNlYXJjaFF1ZXJ5OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworCitASWdub3JlCisvLyBGSVhNRSAxMC43LjIwMTc6IHRoaXMgdGVzdCBuZWVkcyBhIHJ1bm5pbmcgT0RTIFNlcnZlciwgdGhhdCBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbnRpbm91cyBidWlsZCBpbiBKZW5raW5zLgorLy8gQ29tbWVudCB0aGlzIGluIGZvciBsb2NhbCB0ZXN0cyBvbmx5LgorcHVibGljIGNsYXNzIFJlbGF0aW9uVGVzdCB7CisKKwkvKgorCSAqIEFUVEVOVElPTjogPT09PT09PT09PQorCSAqCisJICogVG8gcnVuIHRoaXMgdGVzdCBtYWtlIHN1cmUgdGhlIHRhcmdldCBzZXJ2aWNlIGlzIHJ1bm5pbmcgYSBNRE0gZGVmYXVsdCBtb2RlbAorCSAqIGFuZCBhbnkgZGF0YWJhc2UgY29uc3RyYWludCB3aGljaCBlbmZvcmNlcyBhIHJlbGF0aW9uIG9mIFRlc3QgdG8gYSBwYXJlbnQKKwkgKiBlbnRpdHkgaXMgZGVhY3RpdmF0ZWQhCisJICovCisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TRVJWSUNFID0gImNvcmJhbG9jOjoxLjJAJXM6JXMvTmFtZVNlcnZpY2UiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAic2EiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJzYSI7CisKKwlwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dDsKKwlwcml2YXRlIHN0YXRpYyBFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXI7CisJcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIHN0YXRpYyBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlOworCXByaXZhdGUgc3RhdGljIFNlYXJjaFNlcnZpY2Ugc2VhcmNoU2VydmljZTsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlTdHJpbmcgbmFtZVNlcnZpY2VIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJob3N0Iik7CisJCVN0cmluZyBuYW1lU2VydmljZVBvcnQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBvcnQiKTsKKwkJU3RyaW5nIHNlcnZpY2VOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJzZXJ2aWNlIik7CisKKwkJaWYgKG5hbWVTZXJ2aWNlSG9zdCA9PSBudWxsIHx8IG5hbWVTZXJ2aWNlSG9zdC5pc0VtcHR5KCkpIHsKKwkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5hbWUgc2VydmljZSBob3N0IGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ2hvc3QnIik7CisJCX0KKworCQluYW1lU2VydmljZVBvcnQgPSBuYW1lU2VydmljZVBvcnQgPT0gbnVsbCB8fCBuYW1lU2VydmljZVBvcnQuaXNFbXB0eSgpID8gU3RyaW5nLnZhbHVlT2YoMjgwOSkgOiBuYW1lU2VydmljZVBvcnQ7CisJCWlmIChuYW1lU2VydmljZVBvcnQgPT0gbnVsbCB8fCBuYW1lU2VydmljZVBvcnQuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgcG9ydCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdwb3J0JyIpOworCQl9CisKKwkJaWYgKHNlcnZpY2VOYW1lID09IG51bGwgfHwgc2VydmljZU5hbWUuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlIG5hbWUgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAnc2VydmljZSciKTsKKwkJfQorCisJCU1hcDxTdHJpbmcsIFN0cmluZz4gY29ubmVjdGlvblBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9OQU1FU0VSVklDRSwgU3RyaW5nLmZvcm1hdChOQU1FX1NFUlZJQ0UsIG5hbWVTZXJ2aWNlSG9zdCwgbmFtZVNlcnZpY2VQb3J0KSk7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9TRVJWSUNFTkFNRSwgc2VydmljZU5hbWUgKyAiLkFTQU0tT0RTIik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9VU0VSLCBVU0VSKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1BBU1NXT1JELCBQQVNTV09SRCk7CisKKwkJY29udGV4dCA9IG5ldyBPRFNDb250ZXh0RmFjdG9yeSgpLmNvbm5lY3QoY29ubmVjdGlvblBhcmFtZXRlcnMpOworCQllbnRpdHlNYW5hZ2VyID0gY29udGV4dC5nZXRFbnRpdHlNYW5hZ2VyKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihFbnRpdHlNYW5hZ2VyLmNsYXNzKSk7CisJCW1vZGVsTWFuYWdlciA9IGNvbnRleHQuZ2V0TW9kZWxNYW5hZ2VyKCkub3JFbHNlVGhyb3coKCkgLT4gbmV3IFNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbihNb2RlbE1hbmFnZXIuY2xhc3MpKTsKKwkJcXVlcnlTZXJ2aWNlID0gY29udGV4dC5nZXRRdWVyeVNlcnZpY2UoKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKFF1ZXJ5U2VydmljZS5jbGFzcykpOworCQlzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2VhcmNoIHNlcnZpY2Ugbm90IGF2YWlsYWJsZS4iKSk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBjaGFuZ2VzIGEgcmVsYXRpb24gYmV0d2VlbiBpbnN0YW5jZXMuIFRoZXJlIG5lZWRzIHRvIGV4aXN0IGEgTWVhUmVzdWx0IG9mIGlkCisJICogMTEwMSBhbmQgYSBQYXJhbWV0ZXJTZXQgb2YgaWQgMTEwMiB3aGljaCB3aWxsIGJlIHJlbGF0ZWQgYWZ0ZXIgcnVubmluZyB0aGlzCisJICogdGVzdC4gSWYgdGhlc2UgZG9uJ3QgZXhpc3QsIHBsZWFzZSBsZWF2ZSB0aGUgZm9sbG93aW5nIGxpbmUgY29tbWVudGVkLCBvciB0aGUKKwkgKiB0ZXN0IHdpbGwgZmFpbC4KKwkgKiAKKwkgKiBAdGhyb3dzIEV4Y2VwdGlvbgorCSAqLworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIGNoYW5nZVJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBpZG1lYSA9ICIxMTAxIjsKKwkJU3RyaW5nIGlkcGFyYW1zZXQgPSAiMTAwMiI7CisKKwkJRW50aXR5VHlwZSBldG1lYXN1cmVtZW50ID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoTWVhc3VyZW1lbnQuY2xhc3MpOworCQlFbnRpdHlUeXBlIGV0cGFyYW1zZXQgPSBtb2RlbE1hbmFnZXIuZ2V0RW50aXR5VHlwZShQYXJhbWV0ZXJTZXQuY2xhc3MpOworCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbjsKKworCQl0cmFuc2FjdGlvbiA9IGVudGl0eU1hbmFnZXIuc3RhcnRUcmFuc2FjdGlvbigpOworCisJCXRyeSB7CisJCQlMaXN0PE1lYXN1cmVtZW50PiBtZWFsaXN0OworCQkJLy8gd2UgdXNlIHRoZSBzZWFyY2hTZXJ2aWNlIHRvIGZldGNoIGEgbWVhc3VyZW1lbnQuIFBsZWFzZSBub3RlLCB0aGF0IHdlCisJCQkvLyB1c2UgdGhlIHBlciBkZWZhdWx0IGRlZmluZWQgbWV0aG9kIHRvIGZldGNoIHRoZSBtZWFzdXJlbWVudC4KKwkJCS8vIFRoaXMgZG9lcyBub3QgbG9hZCBhbnkgcmVsYXRlZCBQYXJhbWV0ZXJTZXRzISBCdXQKKwkJCS8vIHdlIGRvbid0IGNhcmUgYXQgdGhpcyBwb2ludCwgYmVjYXVzZSB3ZSBqdXN0IHdhbnQgdG8gY2hhbmdlCisJCQkvLyB0aGUgcmVsYXRlZCBQYXJhbWV0ZXJTZXQgdG8gYSBuZXcgb25lLCBub3QgbG9vayBhdAorCQkJLy8gdGhlIGV4aXN0aW5nIHJlbGF0aW9ucy4KKwkJCW1lYWxpc3QgPSBzZWFyY2hTZXJ2aWNlLmZldGNoKE1lYXN1cmVtZW50LmNsYXNzLCBGaWx0ZXIuaWRPbmx5KGV0bWVhc3VyZW1lbnQsIGlkbWVhKSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgbWVhbGlzdC5zaXplKCkpOworCQkJTWVhc3VyZW1lbnQgbWVhID0gbWVhbGlzdC5nZXQoMCk7CisKKwkJCS8vIGxvYWQgdGhlIHBhcmFtZXRlciBzZXQgd2hpY2ggd2Ugd2FudCB0byByZWxhdGUgdG8gb3VyIG1lYXN1cm1lbnQuCisJCQkvLyBhZ2FpbiB3ZSBkb24ndCBjYXJlIGZvciBhbnkgcHJlZXhpc3RpbmcgcmVsYXRpb25zLgorCQkJTGlzdDxQYXJhbWV0ZXJTZXQ+IHBhcmFtc2V0bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJUGFyYW1ldGVyU2V0IHBhcmFtc2V0ID0gZW50aXR5TWFuYWdlci5sb2FkKFBhcmFtZXRlclNldC5jbGFzcywgaWRwYXJhbXNldCk7CisJCQlwYXJhbXNldGxpc3QuYWRkKHBhcmFtc2V0KTsKKwkJCS8vIE5vdGU6IHdlIGNhbiBvbmx5IHNldCByZWxhdGlvbnMgaW4gdGhlIG11dGFibGUgc3RvcmUgKHdoaWNoCisJCQkvLyBkb2Vzbid0IGluY2x1ZGUgcGFyZW50LWNoaWxkLXJlbGF0aW9ucykKKwkJCUVudGl0eVN0b3JlIHN0b3JlID0gT0RTRW50aXR5RmFjdG9yeS5nZXRNdXRhYmxlU3RvcmUocGFyYW1zZXQpOworCQkJc3RvcmUuc2V0KG1lYSk7CisJCQlhc3NlcnRFcXVhbHMoc3RvcmUuZ2V0KE1lYXN1cmVtZW50LmNsYXNzKSwgbWVhKTsKKworCQkJdHJhbnNhY3Rpb24udXBkYXRlKHBhcmFtc2V0bGlzdCk7CisJCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKworCQkJLy8gcmVsb2FkIGZyb20gZGF0YWJhc2UgYW5kIGNoZWNrIGlmIHJlbGF0aW9uIGlzIGNvbnNpc3RlbnQgd2l0aAorCQkJLy8gZXhwZWN0YXRpb25zCisJCQkvLyBmaXJzdCB3ZSBuZWVkIHRvIGJ1aWxkIG91ciBvd24gU2VhcmNoUXVlcnksIGJlY2F1c2UgdGhlCisJCQkvLyBwcmVkZWZpbmVkIG9uZXMgZG9uJ3QgaW5jbHVkZSBQYXJhbWV0ZXJTZXQgYXMgc3RhdGVkIGFib3ZlLgorCQkJUmVsYXRpb25TZWFyY2hRdWVyeSBtcSA9IG5ldyBSZWxhdGlvblNlYXJjaFF1ZXJ5KChPRFNNb2RlbE1hbmFnZXIpIG1vZGVsTWFuYWdlciwgcXVlcnlTZXJ2aWNlKTsKKwkJCS8vIHRoZSBTZWFyY2hRdWVyeSBkZWZpbmVzIGhvdyB0byBqb2luIG1lYXN1cmVtZW50IGFuZCBwYXJhbWV0ZXJzZXQsCisJCQkvLyBidXQgd2UgYWxzbyBoYXZlIHRvIGRlY2xhcmUgdGhhdCB3ZSB3YW50IHRvIGZldGNoIHRoZSByZWxhdGVkCisJCQkvLyBtZWFzdXJlbWVudAorCQkJTGlzdDxFbnRpdHlUeXBlPiBmZXRjaExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKwkJCWZldGNoTGlzdC5hZGQoZXRtZWFzdXJlbWVudCk7CisJCQlMaXN0PFJlc3VsdD4gZmV0Y2ggPSBtcS5mZXRjaENvbXBsZXRlKGZldGNoTGlzdCwgRmlsdGVyLmlkT25seShldHBhcmFtc2V0LCBpZHBhcmFtc2V0KSk7CisJCQlhc3NlcnRFcXVhbHMoZmV0Y2guc2l6ZSgpLCAxKTsKKworCQkJLy8gbm93IHdlIGNhbiBjaGVjayB0aGF0IHRoZSBuZXcgcmVsYXRpb24gaXMgdGhlcmUgYXMgZXhwZWN0ZWQKKwkJCVJlY29yZCByZWNvcmQgPSBmZXRjaC5nZXQoMCkuZ2V0UmVjb3JkKGV0bWVhc3VyZW1lbnQpOworCQkJYXNzZXJ0Tm90TnVsbChyZWNvcmQpOworCQkJYXNzZXJ0RXF1YWxzKHJlY29yZC5nZXRJRCgpLCBpZG1lYSk7CisKKwkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisJCQl0cmFuc2FjdGlvbi5hYm9ydCgpOworCQkJdGhyb3cgZTsKKwkJfQorCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL1BlYWtOb3RpZmljYXRpb25UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvbm90aWZpY2F0aW9uL3BlYWsvUGVha05vdGlmaWNhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTE1MmY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL25vdGlmaWNhdGlvbi9wZWFrL1BlYWtOb3RpZmljYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwzMzIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLnBlYWs7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX05BTUVTRVJWSUNFOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fUEFTU1dPUkQ7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9TRVJWSUNFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1VTRVI7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udGltZXM7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8udmVyaWZ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWU7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFJRE5hbWVWYWx1ZVNlcVVuaXRJZDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQW9FeGNlcHRpb247CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFvU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuQXBwbEVsZW1BY2Nlc3M7CitpbXBvcnQgb3JnLmFzYW0ub2RzLkFwcGxpY2F0aW9uRWxlbWVudDsKK2ltcG9ydCBvcmcuYXNhbS5vZHMuVFNfVW5pb25TZXE7CitpbXBvcnQgb3JnLmFzYW0ub2RzLlRTX1ZhbHVlU2VxOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UX0xPTkdMT05HOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5Db25uZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5UcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVXNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkZpbHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2Uubm90aWZpY2F0aW9uLk5vdGlmaWNhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5ub3RpZmljYXRpb24uTm90aWZpY2F0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmRmbHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5tb2RlbC5FbnRpdHlGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubm90aWZpY2F0aW9uLk9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5tb2NraXRvLkFyZ3VtZW50Q2FwdG9yOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBUZXN0IG5vdGlmaWNhdGlvbiBzZXJ2aWNlLgorICogCisgKiBOZWVkcyBhIHJ1bm5pbmcgT0RTIGFuZCBOb3RpZmljYXRpb24gU2VydmVyLiBBc3N1bWVzIGFuIGV4aXN0aW5nIFRlc3Qgd2l0aAorICogbmFtZSBkZWZpbmVkIGluIHtAbGluayBQZWFrTm90aWZpY2F0aW9uVGVzdCNQQVJFTlRfVEVTVH0sIGFuIFVuaXRVbmRlclRlc3QKKyAqIHdpdGggSUQgMTEgYW5kIGFuIFVuaXRVbmRlclRlc3RQYXJ0IHdpdGggSUQgMzQuCisgKiAKKyAqIEBhdXRob3IgTWF0dGhpYXMgS29sbGVyLCBQZWFrIFNvbHV0aW9uIEdtYkgKKyAqCisgKi8KK0BJZ25vcmUKKy8vIEZJWE1FIDEwLjcuMjAxNzogdGhpcyB0ZXN0IG5lZWRzIGEgcnVubmluZyBPRFMgU2VydmVyLCB0aGF0IGlzIG5vdCBzdWl0YWJsZSBmb3IgY29udGlub3VzIGJ1aWxkIGluIEplbmtpbnMuCisvLyBDb21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHkuCitwdWJsaWMgY2xhc3MgUGVha05vdGlmaWNhdGlvblRlc3QgeworCisJLyoKKwkgKiBBVFRFTlRJT046ID09PT09PT09PT0KKwkgKgorCSAqIFRvIHJ1biB0aGlzIHRlc3QgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmljZSBpcyBydW5uaW5nIGEgTURNIGRlZmF1bHQgbW9kZWwKKwkgKiBhbmQgYW55IGRhdGFiYXNlIGNvbnN0cmFpbnQgd2hpY2ggZW5mb3JjZXMgYSByZWxhdGlvbiBvZiBUZXN0IHRvIGEgcGFyZW50CisJICogZW50aXR5IGlzIGRlYWN0aXZhdGVkIQorCSAqLworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEV2ZW50UHJvY2Vzc29yLmNsYXNzKTsKKworCS8vIFRPRE8gbmFtZSBzZXJ2aWNlOiBjb3JiYWxvYzo6MS4yQDxTRVJWRVJfSVA+OjxTRVJWRVJfUE9SVD4vTmFtZVNlcnZpY2UKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9TRVJWSUNFID0gImNvcmJhbG9jOjoxLjJAMTI3LjAuMC4xOjI4MDkvTmFtZVNlcnZpY2UiOworCisJLy8gVE9ETyBzZXJ2aWNlIG5hbWU6IDxTRVJWSUNFX05BTUU+LkFTQU0tT0RTCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9ICJNRE1OVkguQVNBTS1PRFMiOworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAic2EiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJzYSI7CisKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX1RFU1QgPSAiUEJOX1VORUNFX1I1MV8xMzAyMjAxNF8xMzQ5IjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fVVJMID0gImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hcGkiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fUkVHSVNUUkFUSU9OX05BTUUgPSAibWRtIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX1VTRVIgPSAic2EiOworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBzdGF0aWMgRW50aXR5TWFuYWdlciBlbnRpdHlNYW5hZ2VyOworCXByaXZhdGUgc3RhdGljIE5vdGlmaWNhdGlvblNlcnZpY2Ugbm90aWZpY2F0aW9uTWFuYWdlcjsKKworCUBCZWZvcmVDbGFzcworCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcEJlZm9yZUNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIE5BTUVfU0VSVklDRSk7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9TRVJWSUNFTkFNRSwgU0VSVklDRV9OQU1FKTsKKwkJY29ubmVjdGlvblBhcmFtZXRlcnMucHV0KFBBUkFNX1VTRVIsIFVTRVIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fUEFTU1dPUkQsIFBBU1NXT1JEKTsKKworCQljb250ZXh0ID0gbmV3IE9EU0NvbnRleHRGYWN0b3J5KCkuY29ubmVjdChjb25uZWN0aW9uUGFyYW1ldGVycyk7CisKKwkJTWFwPFN0cmluZywgU3RyaW5nPiBub3RpZmljYXRpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQlub3RpZmljYXRpb25QYXJhbWV0ZXJzLnB1dChPRFNOb3RpZmljYXRpb25TZXJ2aWNlRmFjdG9yeS5QQVJBTV9TRVJWRVJfVFlQRSwKKwkJCQlPRFNOb3RpZmljYXRpb25TZXJ2aWNlRmFjdG9yeS5TRVJWRVJfVFlQRV9QRUFLKTsKKwkJbm90aWZpY2F0aW9uUGFyYW1ldGVycy5wdXQoT0RTTm90aWZpY2F0aW9uU2VydmljZUZhY3RvcnkuUEFSQU1fVVJMLCBOT1RJRklDQVRJT05fVVJMKTsKKwkJbm90aWZpY2F0aW9uUGFyYW1ldGVycy5wdXQoT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUiwgTk9USUZJQ0FUSU9OX1VTRVIpOworCQlub3RpZmljYXRpb25QYXJhbWV0ZXJzLnB1dChPRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRCwgTk9USUZJQ0FUSU9OX1BBU1NXT1JEKTsKKworCQlub3RpZmljYXRpb25NYW5hZ2VyID0gbmV3IE9EU05vdGlmaWNhdGlvblNlcnZpY2VGYWN0b3J5KCkuY3JlYXRlKGNvbnRleHQsIG5vdGlmaWNhdGlvblBhcmFtZXRlcnMpOworCX0KKworCUBBZnRlckNsYXNzCisJcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQWZ0ZXJDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uLCBOb3RpZmljYXRpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKworCQlpZiAobm90aWZpY2F0aW9uTWFuYWdlciAhPSBudWxsKSB7CisJCQlub3RpZmljYXRpb25NYW5hZ2VyLmRlcmVnaXN0ZXIoTk9USUZJQ0FUSU9OX1JFR0lTVFJBVElPTl9OQU1FKTsKKwkJCW5vdGlmaWNhdGlvbk1hbmFnZXIuY2xvc2UodHJ1ZSk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVGVzdFN0ZXAoKSB0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCVN0cmluZyB0ZXN0U3RlcE5hbWUgPSBVU0VSICsgIl9UZXN0U3RlcCI7CisKKwkJTm90aWZpY2F0aW9uTGlzdGVuZXIgbCA9IE1vY2tpdG8ubW9jayhOb3RpZmljYXRpb25MaXN0ZW5lci5jbGFzcyk7CisKKwkJbm90aWZpY2F0aW9uTWFuYWdlci5yZWdpc3RlcihOT1RJRklDQVRJT05fUkVHSVNUUkFUSU9OX05BTUUsIG5ldyBOb3RpZmljYXRpb25GaWx0ZXIoKSwgbCk7CisKKwkJdHJ5IHsKKwkJCWNyZWF0ZVRlc3RTdGVwKFBBUkVOVF9URVNULCB0ZXN0U3RlcE5hbWUpOworCisJCQkvLyBtYWtlIHN1cmUgbm90aWZpY2F0aW9uIGhhcyBzb21lIHRpbWUgdG8gYmUgcHVzaGVkCisJCQlUaHJlYWQuc2xlZXAoMTAwMEwpOworCisJCQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisJCQlBcmd1bWVudENhcHRvcjxMaXN0PFRlc3RTdGVwPj4gdGVzdFN0ZXBDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcygoQ2xhc3MpIExpc3QuY2xhc3MpOworCQkJQXJndW1lbnRDYXB0b3I8VXNlcj4gdXNlckNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFVzZXIuY2xhc3MpOworCisJCQl2ZXJpZnkobCwgdGltZXMoMSkpLmluc3RhbmNlQ3JlYXRlZCh0ZXN0U3RlcENhcHRvci5jYXB0dXJlKCksIHVzZXJDYXB0b3IuY2FwdHVyZSgpKTsKKworCQkJYXNzZXJ0VGhhdCh0ZXN0U3RlcENhcHRvci5nZXRWYWx1ZSgpLnNpemUoKSwgaXMoMSkpOworCQkJYXNzZXJ0VGhhdCh0ZXN0U3RlcENhcHRvci5nZXRWYWx1ZSgpLmdldCgwKS5nZXROYW1lKCksIGlzKHRlc3RTdGVwTmFtZSkpOworCQkJYXNzZXJ0VGhhdCh1c2VyQ2FwdG9yLmdldFZhbHVlKCkuZ2V0TmFtZSgpLCBpcyhVU0VSKSk7CisJCX0gZmluYWxseSB7CisJCQlub3RpZmljYXRpb25NYW5hZ2VyLmRlcmVnaXN0ZXIoTk9USUZJQ0FUSU9OX1JFR0lTVFJBVElPTl9OQU1FKTsKKwkJCWRlbGV0ZVRlc3RTdGVwKHRlc3RTdGVwTmFtZSk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udGV4dFJvb3QoKQorCQkJdGhyb3dzIE5vdGlmaWNhdGlvbkV4Y2VwdGlvbiwgRGF0YUFjY2Vzc0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKwkJTm90aWZpY2F0aW9uTGlzdGVuZXIgbCA9IE1vY2tpdG8ubW9jayhOb3RpZmljYXRpb25MaXN0ZW5lci5jbGFzcyk7CisKKwkJbm90aWZpY2F0aW9uTWFuYWdlci5yZWdpc3RlcihOT1RJRklDQVRJT05fUkVHSVNUUkFUSU9OX05BTUUsIG5ldyBOb3RpZmljYXRpb25GaWx0ZXIoKSwgbCk7CisKKwkJdHJ5IHsKKwkJCXVwZGF0ZVVVVCgxMSwgImFwcGxpY2F0aW9uL3gtYXNhbS5hb3VuaXR1bmRlcnRlc3QudW5pdHVuZGVydGVzdCIpOworCisJCQkvLyBtYWtlIHN1cmUgbm90aWZpY2F0aW9uIGhhcyBzb21lIHRpbWUgdG8gYmUgcHVzaGVkCisJCQlUaHJlYWQuc2xlZXAoMTAwMEwpOworCisJCQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisJCQlBcmd1bWVudENhcHRvcjxMaXN0PEVudGl0eT4+IGVudGl0eUNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKChDbGFzcykgTGlzdC5jbGFzcyk7CisJCQlBcmd1bWVudENhcHRvcjxVc2VyPiB1c2VyQ2FwdG9yID0gQXJndW1lbnRDYXB0b3IuZm9yQ2xhc3MoVXNlci5jbGFzcyk7CisKKwkJCXZlcmlmeShsLCB0aW1lcygxKSkuaW5zdGFuY2VNb2RpZmllZChlbnRpdHlDYXB0b3IuY2FwdHVyZSgpLCB1c2VyQ2FwdG9yLmNhcHR1cmUoKSk7CisKKwkJCWFzc2VydFRoYXQoZW50aXR5Q2FwdG9yLmdldFZhbHVlKCkuc2l6ZSgpLCBpcygxKSk7CisJCQlhc3NlcnRUaGF0KGVudGl0eUNhcHRvci5nZXRWYWx1ZSgpLmdldCgwKS5nZXROYW1lKCksIGlzKCJQQk5fVU5FQ0VfUjUxX0xlZnRfQWNjViIpKTsKKwkJCWFzc2VydFRoYXQodXNlckNhcHRvci5nZXRWYWx1ZSgpLmdldE5hbWUoKSwgaXMoVVNFUikpOworCQl9IGZpbmFsbHkgeworCQkJbm90aWZpY2F0aW9uTWFuYWdlci5kZXJlZ2lzdGVyKE5PVElGSUNBVElPTl9SRUdJU1RSQVRJT05fTkFNRSk7CisJCX0KKwl9CisKKwlAb3JnLmp1bml0LlRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udGV4dENvbXBvbmVudCgpCisJCQl0aHJvd3MgTm90aWZpY2F0aW9uRXhjZXB0aW9uLCBEYXRhQWNjZXNzRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlOb3RpZmljYXRpb25MaXN0ZW5lciBsID0gTW9ja2l0by5tb2NrKE5vdGlmaWNhdGlvbkxpc3RlbmVyLmNsYXNzKTsKKworCQlub3RpZmljYXRpb25NYW5hZ2VyLnJlZ2lzdGVyKE5PVElGSUNBVElPTl9SRUdJU1RSQVRJT05fTkFNRSwgbmV3IE5vdGlmaWNhdGlvbkZpbHRlcigpLCBsKTsKKworCQl0cnkgeworCQkJdXBkYXRlVVVUUCgzNCwgInRlc3QiKTsKKworCQkJLy8gbWFrZSBzdXJlIG5vdGlmaWNhdGlvbiBoYXMgc29tZSB0aW1lIHRvIGJlIHB1c2hlZAorCQkJVGhyZWFkLnNsZWVwKDEwMDBMKTsKKworCQkJQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQorCQkJQXJndW1lbnRDYXB0b3I8TGlzdDxFbnRpdHk+PiBlbnRpdHlDYXB0b3IgPSBBcmd1bWVudENhcHRvci5mb3JDbGFzcygoQ2xhc3MpIExpc3QuY2xhc3MpOworCQkJQXJndW1lbnRDYXB0b3I8VXNlcj4gdXNlckNhcHRvciA9IEFyZ3VtZW50Q2FwdG9yLmZvckNsYXNzKFVzZXIuY2xhc3MpOworCisJCQl2ZXJpZnkobCwgdGltZXMoMSkpLmluc3RhbmNlTW9kaWZpZWQoZW50aXR5Q2FwdG9yLmNhcHR1cmUoKSwgdXNlckNhcHRvci5jYXB0dXJlKCkpOworCisJCQlhc3NlcnRUaGF0KGVudGl0eUNhcHRvci5nZXRWYWx1ZSgpLnNpemUoKSwgaXMoMSkpOworCQkJYXNzZXJ0VGhhdChlbnRpdHlDYXB0b3IuZ2V0VmFsdWUoKS5nZXQoMCkuZ2V0TmFtZSgpLCBpcygiUEJOX1VORUNFX1I1MV9MZWZ0X1N0ZWFkeVYiKSk7CisJCQlhc3NlcnRUaGF0KHVzZXJDYXB0b3IuZ2V0VmFsdWUoKS5nZXROYW1lKCksIGlzKFVTRVIpKTsKKwkJfSBmaW5hbGx5IHsKKwkJCW5vdGlmaWNhdGlvbk1hbmFnZXIuZGVyZWdpc3RlcihOT1RJRklDQVRJT05fUkVHSVNUUkFUSU9OX05BTUUpOworCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdGVwKFN0cmluZyBwYXJlbnROYW1lLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24geworCQlUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IGVudGl0eU1hbmFnZXIuc3RhcnRUcmFuc2FjdGlvbigpOworCisJCUxpc3Q8VGVzdD4gdGVzdHMgPSBlbnRpdHlNYW5hZ2VyLmxvYWRBbGwoVGVzdC5jbGFzcywgcGFyZW50TmFtZSk7CisKKwkJYXNzZXJ0VGhhdCgiUGFyZW50IHRlc3Qgbm90IGZvdW5kISIsICF0ZXN0cy5pc0VtcHR5KCkpOworCisJCU9wdGlvbmFsPD8gZXh0ZW5kcyBFbnRpdHlGYWN0b3J5PiBlbnRpdHlGYWN0b3J5ID0gY29udGV4dC5nZXRFbnRpdHlGYWN0b3J5KCk7CisJCWlmICghZW50aXR5RmFjdG9yeS5pc1ByZXNlbnQoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW50aXR5IGZhY3Rvcnkgbm90IHByZXNlbnQhIik7CisJCX0KKworCQlUZXN0U3RlcCB0ZXN0U3RlcCA9IGVudGl0eUZhY3RvcnkuZ2V0KCkuY3JlYXRlVGVzdFN0ZXAobmFtZSwgdGVzdHMuZ2V0KDApKTsKKwkJdGVzdFN0ZXAuc2V0U29ydEluZGV4KDApOworCisJCXRyYW5zYWN0aW9uLmNyZWF0ZShBcnJheXMuYXNMaXN0KHRlc3RTdGVwKSk7CisKKwkJdHJhbnNhY3Rpb24uY29tbWl0KCk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVRlc3RTdGVwKFN0cmluZyBuYW1lKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uID0gZW50aXR5TWFuYWdlci5zdGFydFRyYW5zYWN0aW9uKCk7CisKKwkJTGlzdDxUZXN0U3RlcD4gdGVzdFN0ZXBzID0gZW50aXR5TWFuYWdlci5sb2FkQWxsKFRlc3RTdGVwLmNsYXNzLCBuYW1lKTsKKworCQl0cmFuc2FjdGlvbi5kZWxldGUodGVzdFN0ZXBzKTsKKworCQl0cmFuc2FjdGlvbi5jb21taXQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdXBkYXRlVVVUKGludCB1dXRJZCwgU3RyaW5nIG5ld1ZhbHVlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJQW9TZXNzaW9uIHNlc3Npb24gPSBudWxsOworCQl0cnkgeworCQkJc2Vzc2lvbiA9ICgoT0RTQ29udGV4dCkgY29udGV4dCkuZ2V0QW9TZXNzaW9uKCkuY3JlYXRlQ29TZXNzaW9uKCk7CisKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhZVVVVCA9IHNlc3Npb24uZ2V0QXBwbGljYXRpb25TdHJ1Y3R1cmUoKS5nZXRFbGVtZW50c0J5QmFzZVR5cGUoIkFvVW5pdFVuZGVyVGVzdCIpWzBdOworCisJCQlmaW5hbCBBcHBsRWxlbUFjY2VzcyBhZWEgPSBzZXNzaW9uLmdldEFwcGxFbGVtQWNjZXNzKCk7CisKKwkJCVRTX1VuaW9uU2VxIHVJZCA9IG5ldyBUU19VbmlvblNlcSgpOworCQkJdUlkLmxvbmdsb25nVmFsKG5ldyBUX0xPTkdMT05HW10geyBuZXcgVF9MT05HTE9ORygwLCB1dXRJZCkgfSk7CisKKwkJCVRTX1VuaW9uU2VxIHVNYW51ZmFjdHVyZXIgPSBuZXcgVFNfVW5pb25TZXEoKTsKKwkJCXVNYW51ZmFjdHVyZXIuc3RyaW5nVmFsKG5ldyBTdHJpbmdbXSB7IG5ld1ZhbHVlIH0pOworCisJCQlBSUROYW1lVmFsdWVTZXFVbml0SWRbXSB2YWwgPSBuZXcgQUlETmFtZVZhbHVlU2VxVW5pdElkW10geworCQkJCQluZXcgQUlETmFtZVZhbHVlU2VxVW5pdElkKG5ldyBBSUROYW1lKGFlVVVULmdldElkKCksICJJZCIpLCBuZXcgVF9MT05HTE9ORygpLAorCQkJCQkJCW5ldyBUU19WYWx1ZVNlcSh1SWQsIG5ldyBzaG9ydFtdIHsgKHNob3J0KSAxNSB9KSksCisJCQkJCW5ldyBBSUROYW1lVmFsdWVTZXFVbml0SWQobmV3IEFJRE5hbWUoYWVVVVQuZ2V0SWQoKSwgIk1pbWV0eXBlIiksIG5ldyBUX0xPTkdMT05HKCksCisJCQkJCQkJbmV3IFRTX1ZhbHVlU2VxKHVNYW51ZmFjdHVyZXIsIG5ldyBzaG9ydFtdIHsgKHNob3J0KSAxNSB9KSkgfTsKKwkJCXNlc3Npb24uc3RhcnRUcmFuc2FjdGlvbigpOworCQkJYWVhLnVwZGF0ZUluc3RhbmNlcyh2YWwpOworCQkJc2Vzc2lvbi5jb21taXRUcmFuc2FjdGlvbigpOworCisJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBEYXRhQWNjZXNzRXhjZXB0aW9uKGUucmVhc29uLCBlKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQlzZXNzaW9uLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoQW9FeGNlcHRpb24gZSkgeworCQkJCQlMT0dHRVIud2FybigiRXhjZXB0aW9uIHdoZW4gY2xvc2luZyB0aGUgb2RzIHNlc3Npb246ICIgKyBlLnJlYXNvbiwgZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcHJpdmF0ZSB2b2lkIHVwZGF0ZVVVVFAoaW50IHR5cmVJZCwgU3RyaW5nIG5ld1ZhbHVlKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisKKwkJQW9TZXNzaW9uIHNlc3Npb24gPSBudWxsOworCQl0cnkgeworCQkJc2Vzc2lvbiA9ICgoT0RTQ29udGV4dCkgY29udGV4dCkuZ2V0QW9TZXNzaW9uKCkuY3JlYXRlQ29TZXNzaW9uKCk7CisKKwkJCUFwcGxpY2F0aW9uRWxlbWVudCBhZVR5cmUgPSBzZXNzaW9uLmdldEFwcGxpY2F0aW9uU3RydWN0dXJlKCkuZ2V0RWxlbWVudEJ5TmFtZSgidHlyZSIpOworCisJCQlmaW5hbCBBcHBsRWxlbUFjY2VzcyBhZWEgPSBzZXNzaW9uLmdldEFwcGxFbGVtQWNjZXNzKCk7CisKKwkJCVRTX1VuaW9uU2VxIHVJZCA9IG5ldyBUU19VbmlvblNlcSgpOworCQkJdUlkLmxvbmdsb25nVmFsKG5ldyBUX0xPTkdMT05HW10geyBuZXcgVF9MT05HTE9ORygwLCB0eXJlSWQpIH0pOworCisJCQlUU19VbmlvblNlcSB1TWFudWZhY3R1cmVyID0gbmV3IFRTX1VuaW9uU2VxKCk7CisJCQl1TWFudWZhY3R1cmVyLnN0cmluZ1ZhbChuZXcgU3RyaW5nW10geyBuZXdWYWx1ZSB9KTsKKworCQkJQUlETmFtZVZhbHVlU2VxVW5pdElkW10gdmFsID0gbmV3IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZFtdIHsKKwkJCQkJbmV3IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZChuZXcgQUlETmFtZShhZVR5cmUuZ2V0SWQoKSwgIklkIiksIG5ldyBUX0xPTkdMT05HKCksCisJCQkJCQkJbmV3IFRTX1ZhbHVlU2VxKHVJZCwgbmV3IHNob3J0W10geyAoc2hvcnQpIDE1IH0pKSwKKwkJCQkJbmV3IEFJRE5hbWVWYWx1ZVNlcVVuaXRJZChuZXcgQUlETmFtZShhZVR5cmUuZ2V0SWQoKSwgIm1hbnVmYWN0dXJlciIpLCBuZXcgVF9MT05HTE9ORygpLAorCQkJCQkJCW5ldyBUU19WYWx1ZVNlcSh1TWFudWZhY3R1cmVyLCBuZXcgc2hvcnRbXSB7IChzaG9ydCkgMTUgfSkpIH07CisJCQlzZXNzaW9uLnN0YXJ0VHJhbnNhY3Rpb24oKTsKKwkJCWFlYS51cGRhdGVJbnN0YW5jZXModmFsKTsKKwkJCXNlc3Npb24uY29tbWl0VHJhbnNhY3Rpb24oKTsKKworCQl9IGNhdGNoIChBb0V4Y2VwdGlvbiBlKSB7CisJCQl0aHJvdyBuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbihlLnJlYXNvbiwgZSk7CisJCX0gZmluYWxseSB7CisJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisJCQkJdHJ5IHsKKwkJCQkJc2Vzc2lvbi5jbG9zZSgpOworCQkJCX0gY2F0Y2ggKEFvRXhjZXB0aW9uIGUpIHsKKwkJCQkJTE9HR0VSLndhcm4oIkV4Y2VwdGlvbiB3aGVuIGNsb3NpbmcgdGhlIG9kcyBzZXNzaW9uOiAiICsgZS5yZWFzb24sIGUpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU0ZyZWVUZXh0U2VhcmNoVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNGcmVlVGV4dFNlYXJjaFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzliYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNGcmVlVGV4dFNlYXJjaFRlc3QuamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAyMCBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Bcmd1bWVudE1hdGNoZXJzLmFueTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnlDb2xsZWN0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLnRleHQuU3RyaW5nRXNjYXBlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5FbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRGF0YUFjY2Vzc0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLkVudGl0eUxvYWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIubG9va3VwLmNvbmZpZy5FbnRpdHlDb25maWcuS2V5OworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNsaWVudC5SZXF1ZXN0OworaW1wb3J0IG9yZy5lbGFzdGljc2VhcmNoLmNsaWVudC5SZXN0Q2xpZW50OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkNsYXNzUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKK2ltcG9ydCBvcmcubW9ja2l0by5zdHViYmluZy5BbnN3ZXI7CitpbXBvcnQgb3JnLnRlc3Rjb250YWluZXJzLmVsYXN0aWNzZWFyY2guRWxhc3RpY3NlYXJjaENvbnRhaW5lcjsKK2ltcG9ydCBvcmcudGVzdGNvbnRhaW5lcnMuc2hhZGVkLmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CisKK0BJZ25vcmUKKy8vRklYTUUgMDUuMDIuMjAyMDogdGhpcyB0ZXN0IG5lZWRzIGEgZG9ja2VyIHRvIHJ1biBlbGFzdGljc2VhcmNoIGFuZCBpcyBub3Qgc3VpdGFibGUgZm9yIGNvbnRpbm91cyBidWlsZCBpbiBKZW5raW5zLgorLy9Db21tZW50IHRoaXMgaW4gZm9yIGxvY2FsIHRlc3RzIG9ubHksIGlmIGRvY2tlciBpcyBhdmFpbGFibGUKK3B1YmxpYyBjbGFzcyBPRFNGcmVlVGV4dFNlYXJjaFRlc3QgeworCisJcHJpdmF0ZSBFbnRpdHlMb2FkZXIgbG9hZGVyOworCXByaXZhdGUgT0RTRnJlZVRleHRTZWFyY2ggZnRzOworCXByaXZhdGUgVGVzdFN0ZXAgdHM7CisKKwlwcml2YXRlIFJlc3RDbGllbnQgY2xpZW50OworCisJQENsYXNzUnVsZQorCXB1YmxpYyBzdGF0aWMgRWxhc3RpY3NlYXJjaENvbnRhaW5lciBlbGFzdGljU2VhcmNoID0gbmV3IEVsYXN0aWNzZWFyY2hDb250YWluZXIoCisJCQkiZG9ja2VyLmVsYXN0aWMuY28vZWxhc3RpY3NlYXJjaC9lbGFzdGljc2VhcmNoLW9zczo3LjAuMCIpOworCisJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisJQEJlZm9yZQorCXB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgRGF0YUFjY2Vzc0V4Y2VwdGlvbiB7CisJCXRzID0gbW9jayhUZXN0U3RlcC5jbGFzcyk7CisJCWxvYWRlciA9IG1vY2soRW50aXR5TG9hZGVyLmNsYXNzKTsKKworCQl3aGVuKGxvYWRlci5sb2FkQWxsKGFueShLZXkuY2xhc3MpLCBhbnlDb2xsZWN0aW9uKCkpKS50aGVuQW5zd2VyKG5ldyBBbnN3ZXI8TGlzdDxFbnRpdHk+PigpIHsKKworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgTGlzdDxFbnRpdHk+IGFuc3dlcihJbnZvY2F0aW9uT25Nb2NrIGludm9jYXRpb24pIHRocm93cyBUaHJvd2FibGUgeworCQkJCUNvbGxlY3Rpb248TG9uZz4gb2JqZWN0ID0gKENvbGxlY3Rpb248TG9uZz4pIGludm9jYXRpb24uZ2V0QXJndW1lbnRzKClbMV07CisKKwkJCQlMaXN0PEVudGl0eT4gcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3Quc2l6ZSgpOyBpKyspIHsKKwkJCQkJcmVzLmFkZCh0cyk7CisJCQkJfQorCisJCQkJcmV0dXJuIHJlczsKKwkJCX0KKwkJfSk7CisKKwkJY2xpZW50ID0gUmVzdENsaWVudC5idWlsZGVyKEh0dHBIb3N0LmNyZWF0ZShlbGFzdGljU2VhcmNoLmdldEh0dHBIb3N0QWRkcmVzcygpKSkuYnVpbGQoKTsKKwkJZnRzID0gbmV3IE9EU0ZyZWVUZXh0U2VhcmNoKGxvYWRlciwgIm1kbSIsICJodHRwOi8vIiArIGVsYXN0aWNTZWFyY2guZ2V0SHR0cEhvc3RBZGRyZXNzKCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgbm9JbmRleF9lbXB0eVJlc3VsdCgpIHRocm93cyBEYXRhQWNjZXNzRXhjZXB0aW9uIHsKKwkJT0RTRnJlZVRleHRTZWFyY2ggZnRzT3RoZXJJbmRleCA9IG5ldyBPRFNGcmVlVGV4dFNlYXJjaChsb2FkZXIsICJVTktOT1dOX0lOREVYIiwKKwkJCQkiaHR0cDovLyIgKyBlbGFzdGljU2VhcmNoLmdldEh0dHBIb3N0QWRkcmVzcygpKTsKKworCQlNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gbWFwID0gZnRzT3RoZXJJbmRleC5zZWFyY2goIlZBR18wMDIiKTsKKwkJYXNzZXJ0VGhhdChtYXApLmlzRW1wdHkoKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIGV4YW1wbGVJbmRleF9xdWVyeVN1Y2Nlc3NmdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQljcmVhdGVFeGFtcGxlSW5kZXgoIm1kbSIsICJUZXN0U3RlcCIsICJhc2RmIik7CisKKwkJCWFzc2VydFRoYXQoZnRzLnNlYXJjaCgiYXNkZiIpLmdldChUZXN0U3RlcC5jbGFzcykuZ2V0KDApKS5pc0VxdWFsVG8odHMpOworCQl9IGZpbmFsbHkgeworCQkJZGVsZXRlSW5kZXgoIm1kbSIpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBzcGVjaWFsQ2hhcmFjdGVyc19jb3JyZWN0bHlFc2NhcGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWNyZWF0ZUV4YW1wbGVJbmRleCgibWRtIiwgIk1lYXN1cmVtZW50IiwgImhhbGxvXCIhwqciKTsKKworCQkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IHNlYXJjaCA9IGZ0cy5zZWFyY2goImhhbGxvXCIhwqciKTsKKwkJCWFzc2VydFRoYXQoc2VhcmNoLmdldChNZWFzdXJlbWVudC5jbGFzcykuZ2V0KDApKS5pc0VxdWFsVG8odHMpOworCQl9IGZpbmFsbHkgeworCQkJZGVsZXRlSW5kZXgoIm1kbSIpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBub25NZG1SZXN1bHRzX2lnbm9yZWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQl0cnkgeworCQkJY3JlYXRlRXhhbXBsZUluZGV4KCJtZG0iLCAiTk9OTURNU3R1ZmYiLCAidGVzdCIpOworCisJCQlNYXA8Q2xhc3M8PyBleHRlbmRzIEVudGl0eT4sIExpc3Q8RW50aXR5Pj4gc2VhcmNoID0gZnRzLnNlYXJjaCgidGVzdCIpOworCQkJYXNzZXJ0VGhhdChzZWFyY2gpLmlzRW1wdHkoKTsKKwkJfSBmaW5hbGx5IHsKKwkJCWRlbGV0ZUluZGV4KCJtZG0iKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdHdvUmVzdWx0c190d29SZXN1bHRzUmV0dW5lZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisJCXRyeSB7CisJCQljcmVhdGVFeGFtcGxlSW5kZXgoIm1kbSIsICJUZXN0IiwgIjAiLCAidW5pY29ybiBBU0RGIik7CisJCQljcmVhdGVFeGFtcGxlSW5kZXgoIm1kbSIsICJUZXN0IiwgIjEiLCAidW5pY29ybiBYWVoiKTsKKworCQkJTWFwPENsYXNzPD8gZXh0ZW5kcyBFbnRpdHk+LCBMaXN0PEVudGl0eT4+IHNlYXJjaCA9IGZ0cy5zZWFyY2goInVuaWNvcm4iKTsKKwkJCWFzc2VydFRoYXQoc2VhcmNoLmdldChvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuVGVzdC5jbGFzcykpLmhhc1NpemUoMik7CisJCX0gZmluYWxseSB7CisJCQlkZWxldGVJbmRleCgibWRtIik7CisJCX0KKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCBpbGxlZ2FsTG9hZFJlcXVlc3RfbmljZUV4Y2VwdGlvbklzVGhyb3duKCkgdGhyb3dzIERhdGFBY2Nlc3NFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJdHJ5IHsKKwkJCWxvYWRlciA9IG1vY2soRW50aXR5TG9hZGVyLmNsYXNzKTsKKwkJCXdoZW4obG9hZGVyLmxvYWRBbGwoYW55KCksIGFueUNvbGxlY3Rpb24oKSkpLnRoZW5UaHJvdyhuZXcgRGF0YUFjY2Vzc0V4Y2VwdGlvbigiIikpOworCQkJY3JlYXRlRXhhbXBsZUluZGV4KCJtZG0yIiwgIlRlc3RTdGVwIiwgImFzZGYiKTsKKwkJCU9EU0ZyZWVUZXh0U2VhcmNoIGZ0czIgPSBuZXcgT0RTRnJlZVRleHRTZWFyY2gobG9hZGVyLCAibWRtMiIsCisJCQkJCSJodHRwOi8vIiArIGVsYXN0aWNTZWFyY2guZ2V0SHR0cEhvc3RBZGRyZXNzKCkpOworCisJCQlmdHMyLnNlYXJjaCgiYXNkZiIpOworCQl9IGZpbmFsbHkgeworCQkJZGVsZXRlSW5kZXgoIm1kbTIiKTsKKwkJfQorCX0KKworCXByaXZhdGUgdm9pZCBjcmVhdGVFeGFtcGxlSW5kZXgoU3RyaW5nIGluZGV4TmFtZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKwkJY3JlYXRlRXhhbXBsZUluZGV4KGluZGV4TmFtZSwgdHlwZSwgIjAiLCB2YWx1ZSk7CisJfQorCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZUV4YW1wbGVJbmRleChTdHJpbmcgaW5kZXhOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIGlkLCBTdHJpbmcgdmFsdWUpCisJCQl0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCQlPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGpzb24gPSBuZXcgSGFzaE1hcDw+KCk7CisJCWpzb24ucHV0KCJpZCIsIFN0cmluZ0VzY2FwZVV0aWxzLmVzY2FwZUpzb24oaWQpKTsKKwkJanNvbi5wdXQoInR5cGUiLCBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVKc29uKHR5cGUpKTsKKwkJanNvbi5wdXQoImF0dHIiLCBTdHJpbmdFc2NhcGVVdGlscy5lc2NhcGVKc29uKHZhbHVlKSk7CisKKwkJdHJ5IHsKKwkJCVJlcXVlc3QgYSA9IG5ldyBSZXF1ZXN0KCJQVVQiLCBpbmRleE5hbWUgKyAiL19kb2MvIiArIHR5cGUgKyAiLSIgKyBpZCk7CisJCQlhLnNldEpzb25FbnRpdHkobWFwcGVyLndyaXRlVmFsdWVBc1N0cmluZyhqc29uKSk7CisJCQljbGllbnQucGVyZm9ybVJlcXVlc3QoYSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5kZXghIik7CisJCX0KKworCQlUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIGxldCB0aGUgaW5kZXggc29tZSB0aW1lIHRvIHBvcHVsYXRlCisJfQorCisJcHJpdmF0ZSB2b2lkIGRlbGV0ZUluZGV4KFN0cmluZyBpbmRleE5hbWUpIHsKKwkJdHJ5IHsKKwkJCWNsaWVudC5wZXJmb3JtUmVxdWVzdChuZXcgUmVxdWVzdCgiREVMRVRFIiwgaW5kZXhOYW1lKSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgZGVsZXRlIGluZGV4ISIpOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2VJVC5qYXZhIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNTZWFyY2hTZXJ2aWNlSVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTExZGQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9PRFNTZWFyY2hTZXJ2aWNlSVQuamF2YQpAQCAtMCwwICsxLDIxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLnR1cGxlOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fTkFNRVNFUlZJQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5PRFNDb250ZXh0RmFjdG9yeS5QQVJBTV9QQVNTV09SRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5LlBBUkFNX1NFUlZJQ0VOQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuT0RTQ29udGV4dEZhY3RvcnkuUEFSQU1fVVNFUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5pdGVyYWJsZS5FeHRyYWN0b3I7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5ncm91cHMuVHVwbGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLkNvbm5lY3Rpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLlNlcnZpY2VOb3RQcm92aWRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLk1vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UubW9kZWwuUGFyYW1ldGVyU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5UZXN0U3RlcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQm9vbGVhbk9wZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5CcmFja2V0T3BlcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkNvbXBhcmlzb25PcGVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuRmlsdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5GaWx0ZXJJdGVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnNlYXJjaC5TZWFyY2hTZXJ2aWNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuZGZsdC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLk9EU0NvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5xdWVyeS5PRFNNb2RlbE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaC5Kb2luVHJlZS5Kb2luQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworQElnbm9yZQorLy8gRklYTUUgMTAuNy4yMDE3OiB0aGlzIHRlc3QgbmVlZHMgYSBydW5uaW5nIE9EUyBTZXJ2ZXIsIHRoYXQgaXMgbm90IHN1aXRhYmxlIGZvciBjb250aW5vdXMgYnVpbGQgaW4gSmVua2lucy4KKy8vIENvbW1lbnQgdGhpcyBpbiBmb3IgbG9jYWwgdGVzdHMgb25seS4KK3B1YmxpYyBjbGFzcyBPRFNTZWFyY2hTZXJ2aWNlSVQgeworCisJLyoKKwkgKiBBVFRFTlRJT046ID09PT09PT09PT0KKwkgKgorCSAqIFRvIHJ1biB0aGlzIHRlc3QgbWFrZSBzdXJlIHRoZSB0YXJnZXQgc2VydmljZSBpcyBydW5uaW5nIGEgTURNIGRlZmF1bHQgbW9kZWwKKwkgKiBhbmQgYW55IGRhdGFiYXNlIGNvbnN0cmFpbnQgd2hpY2ggZW5mb3JjZXMgYSByZWxhdGlvbiBvZiBUZXN0IHRvIGEgcGFyZW50CisJICogZW50aXR5IGlzIGRlYWN0aXZhdGVkIQorCSAqLworCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfU0VSVklDRSA9ICJjb3JiYWxvYzo6MS4yQCVzOiVzL05hbWVTZXJ2aWNlIjsKKworCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSID0gInNhIjsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAic2EiOworCisJcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisJcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlcjsKKwlwcml2YXRlIHN0YXRpYyBTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2U7CisKKwlAQmVmb3JlQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBCZWZvcmVDbGFzcygpIHRocm93cyBDb25uZWN0aW9uRXhjZXB0aW9uIHsKKwkJU3RyaW5nIG5hbWVTZXJ2aWNlSG9zdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaG9zdCIpOworCQlTdHJpbmcgbmFtZVNlcnZpY2VQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJwb3J0Iik7CisJCVN0cmluZyBzZXJ2aWNlTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic2VydmljZSIpOworCisJCWlmIChuYW1lU2VydmljZUhvc3QgPT0gbnVsbCB8fCBuYW1lU2VydmljZUhvc3QuaXNFbXB0eSgpKSB7CisJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuYW1lIHNlcnZpY2UgaG9zdCBpcyB1bmtub3duOiBkZWZpbmUgc3lzdGVtIHByb3BlcnR5ICdob3N0JyIpOworCQl9CisKKwkJbmFtZVNlcnZpY2VQb3J0ID0gbmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSA/IFN0cmluZy52YWx1ZU9mKDI4MDkpIDogbmFtZVNlcnZpY2VQb3J0OworCQlpZiAobmFtZVNlcnZpY2VQb3J0ID09IG51bGwgfHwgbmFtZVNlcnZpY2VQb3J0LmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibmFtZSBzZXJ2aWNlIHBvcnQgaXMgdW5rbm93bjogZGVmaW5lIHN5c3RlbSBwcm9wZXJ0eSAncG9ydCciKTsKKwkJfQorCisJCWlmIChzZXJ2aWNlTmFtZSA9PSBudWxsIHx8IHNlcnZpY2VOYW1lLmlzRW1wdHkoKSkgeworCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VydmljZSBuYW1lIGlzIHVua25vd246IGRlZmluZSBzeXN0ZW0gcHJvcGVydHkgJ3NlcnZpY2UnIik7CisJCX0KKworCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbm5lY3Rpb25QYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fTkFNRVNFUlZJQ0UsIFN0cmluZy5mb3JtYXQoTkFNRV9TRVJWSUNFLCBuYW1lU2VydmljZUhvc3QsIG5hbWVTZXJ2aWNlUG9ydCkpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fU0VSVklDRU5BTUUsIHNlcnZpY2VOYW1lICsgIi5BU0FNLU9EUyIpOworCQljb25uZWN0aW9uUGFyYW1ldGVycy5wdXQoUEFSQU1fVVNFUiwgVVNFUik7CisJCWNvbm5lY3Rpb25QYXJhbWV0ZXJzLnB1dChQQVJBTV9QQVNTV09SRCwgUEFTU1dPUkQpOworCisJCWNvbnRleHQgPSBuZXcgT0RTQ29udGV4dEZhY3RvcnkoKS5jb25uZWN0KGNvbm5lY3Rpb25QYXJhbWV0ZXJzKTsKKwkJbW9kZWxNYW5hZ2VyID0gY29udGV4dC5nZXRNb2RlbE1hbmFnZXIoKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgU2VydmljZU5vdFByb3ZpZGVkRXhjZXB0aW9uKE1vZGVsTWFuYWdlci5jbGFzcykpOworCQlzZWFyY2hTZXJ2aWNlID0gY29udGV4dC5nZXRTZWFyY2hTZXJ2aWNlKCkKKwkJCQkub3JFbHNlVGhyb3coKCkgLT4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2VhcmNoIHNlcnZpY2Ugbm90IGF2YWlsYWJsZS4iKSk7CisJfQorCisJQEFmdGVyQ2xhc3MKKwlwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25BZnRlckNsYXNzKCkgdGhyb3dzIENvbm5lY3Rpb25FeGNlcHRpb24geworCQlpZiAoY29udGV4dCAhPSBudWxsKSB7CisJCQljb250ZXh0LmNsb3NlKCk7CisJCX0KKwl9CisKKwlmaW5hbCBjbGFzcyBNZWFzdXJlbWVudFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5IHsKKworCQkvKioKKwkJICogQ29uc3RydWN0b3IuCisJCSAqCisJCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJCSAqIEBwYXJhbSBjb250ZXh0U3RhdGUgVGhlIHtAbGluayBDb250ZXh0U3RhdGV9LgorCQkgKi8KKwkJTWVhc3VyZW1lbnRTZWFyY2hRdWVyeShPRFNNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyLCBRdWVyeVNlcnZpY2UgcXVlcnlTZXJ2aWNlLCBDb250ZXh0U3RhdGUgY29udGV4dFN0YXRlKSB7CisJCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgUGFyYW1ldGVyU2V0LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkJLy8gbGF5ZXJzCisJCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcudXAoUG9vbC5jbGFzcywgUHJvamVjdC5jbGFzcykpOworCQkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChUZXN0U3RlcC5jbGFzcywgVGVzdC5jbGFzcykpOworCQkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKE1lYXN1cmVtZW50LmNsYXNzLCBUZXN0U3RlcC5jbGFzcykpOworCQkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBhcmFtZXRlclNldC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy5kb3duKE1lYXN1cmVtZW50LmNsYXNzLCBDaGFubmVsLmNsYXNzKSk7CisJCQlhZGRKb2luQ29uZmlnKEpvaW5Db25maWcuZG93bihNZWFzdXJlbWVudC5jbGFzcywgQ2hhbm5lbEdyb3VwLmNsYXNzKSk7CisKKwkJCS8vIGNvbnRleHQKKwkJCWFkZEpvaW5Db25maWcoY29udGV4dFN0YXRlKTsKKwkJfQorCisJfQorCisJcHJpdmF0ZSBFeHRyYWN0b3I8RmlsdGVySXRlbSwgVHVwbGU+IGZpbHRlckV4dHJhY3RvcnMgPSBuZXcgRXh0cmFjdG9yPEZpbHRlckl0ZW0sIFR1cGxlPigpIHsKKworCQlAT3ZlcnJpZGUKKwkJcHVibGljIFR1cGxlIGV4dHJhY3QoRmlsdGVySXRlbSBmKSB7CisJCQlyZXR1cm4gdHVwbGUoZi5pc0Jvb2xlYW5PcGVyYXRvcigpID8gZi5nZXRCb29sZWFuT3BlcmF0b3IoKSA6IG51bGwsCisJCQkJCWYuaXNDb25kaXRpb24oKSA/IGYuZ2V0Q29uZGl0aW9uKCkuZ2V0QXR0cmlidXRlKCkuZ2V0TmFtZSgpIDogbnVsbCwKKwkJCQkJZi5pc0NvbmRpdGlvbigpID8gZi5nZXRDb25kaXRpb24oKS5nZXRDb21wYXJpc29uT3BlcmF0b3IoKSA6IG51bGwsCisJCQkJCWYuaXNDb25kaXRpb24oKSA/IGYuZ2V0Q29uZGl0aW9uKCkuZ2V0VmFsdWUoKS5leHRyYWN0KCkgOiBudWxsLAorCQkJCQlmLmlzQnJhY2tldE9wZXJhdG9yKCkgPyBmLmdldEJyYWNrZXRPcGVyYXRvcigpIDogbnVsbCk7CisJCX0KKwl9OworCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCisJCU9EU1NlYXJjaFNlcnZpY2Ugc2VydmljZSA9IE1vY2tpdG8uc3B5KChPRFNTZWFyY2hTZXJ2aWNlKSBzZWFyY2hTZXJ2aWNlKTsKKworCQlNb2NraXRvLmRvUmV0dXJuKEltbXV0YWJsZU1hcC5vZihUZXN0U3RlcC5jbGFzcywgQXJyYXlzLmFzTGlzdCgiMTAiKSkpLndoZW4oc2VydmljZSkKKwkJCQkuZmV0Y2hJZHMoTW9ja2l0by5hbnlTdHJpbmcoKSk7CisKKwkJRW50aXR5VHlwZSB0ZXN0U3RlcCA9IG1vZGVsTWFuYWdlci5nZXRFbnRpdHlUeXBlKFRlc3RTdGVwLmNsYXNzKTsKKworCQlhc3NlcnRUaGF0KHNlcnZpY2UuZ2V0TWVyZ2VkRmlsdGVyKEZpbHRlci5pZE9ubHkodGVzdFN0ZXAsICIxMSIpLCAicXVlcnkiKSkuaGFzU2l6ZSg3KQorCQkJCS5leHRyYWN0aW5nKGZpbHRlckV4dHJhY3RvcnMpLmNvbnRhaW5zRXhhY3RseSh0dXBsZShudWxsLCBudWxsLCBudWxsLCBudWxsLCBCcmFja2V0T3BlcmF0b3IuT1BFTiksCisJCQkJCQl0dXBsZShudWxsLCAiSWQiLCBDb21wYXJpc29uT3BlcmF0b3IuRVFVQUwsICIxMCIpLAorCQkJCQkJdHVwbGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQnJhY2tldE9wZXJhdG9yLkNMT1NFKSwKKwkJCQkJCXR1cGxlKEJvb2xlYW5PcGVyYXRvci5BTkQsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLAorCQkJCQkJdHVwbGUobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQnJhY2tldE9wZXJhdG9yLk9QRU4pLAorCQkJCQkJdHVwbGUobnVsbCwgIklkIiwgQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVCwgbmV3IFN0cmluZ1tdIHsgIjEwIiB9LCBudWxsKSwKKwkJCQkJCXR1cGxlKG51bGwsIG51bGwsIG51bGwsIG51bGwsIEJyYWNrZXRPcGVyYXRvci5DTE9TRSkpOworCX0KKworCUBvcmcuanVuaXQuVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RHZXRNZXJnZWRGaWx0ZXJOb0F0dHJpYnV0ZUZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNTZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBNb2NraXRvLnNweSgoT0RTU2VhcmNoU2VydmljZSkgc2VhcmNoU2VydmljZSk7CisKKwkJTW9ja2l0by5kb1JldHVybihJbW11dGFibGVNYXAub2YoVGVzdFN0ZXAuY2xhc3MsIEFycmF5cy5hc0xpc3QoIjEwIikpKS53aGVuKHNlcnZpY2UpCisJCQkJLmZldGNoSWRzKE1vY2tpdG8uYW55U3RyaW5nKCkpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmFuZCgpLCAicXVlcnkiKSkuZXh0cmFjdGluZyhmaWx0ZXJFeHRyYWN0b3JzKQorCQkJCS5jb250YWluc0V4YWN0bHkodHVwbGUobnVsbCwgIklkIiwgQ29tcGFyaXNvbk9wZXJhdG9yLklOX1NFVCwgbmV3IFN0cmluZ1tdIHsgIjEwIiB9KSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlck5vRnJlZXRleHRSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTU2VhcmNoU2VydmljZSBzZXJ2aWNlID0gTW9ja2l0by5zcHkoKE9EU1NlYXJjaFNlcnZpY2UpIHNlYXJjaFNlcnZpY2UpOworCisJCU1vY2tpdG8uZG9SZXR1cm4oQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkud2hlbihzZXJ2aWNlKS5mZXRjaElkcyhNb2NraXRvLmFueVN0cmluZygpKTsKKworCQlFbnRpdHlUeXBlIHRlc3RTdGVwID0gbW9kZWxNYW5hZ2VyLmdldEVudGl0eVR5cGUoVGVzdFN0ZXAuY2xhc3MpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmlkT25seSh0ZXN0U3RlcCwgIjExIiksICIiKSkuZXh0cmFjdGluZyhmaWx0ZXJFeHRyYWN0b3JzKQorCQkJCS5jb250YWluc0V4YWN0bHkodHVwbGUobnVsbCwgIklkIiwgQ29tcGFyaXNvbk9wZXJhdG9yLkVRVUFMLCAiMTEiKSk7CisJfQorCisJQG9yZy5qdW5pdC5UZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlck5vQXR0cmlidXRlRmlsdGVyQW5kTm9GcmVldGV4dFJlc3VsdCgpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNTZWFyY2hTZXJ2aWNlIHNlcnZpY2UgPSBNb2NraXRvLnNweSgoT0RTU2VhcmNoU2VydmljZSkgc2VhcmNoU2VydmljZSk7CisKKwkJTW9ja2l0by5kb1JldHVybihDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKS53aGVuKHNlcnZpY2UpLmZldGNoSWRzKE1vY2tpdG8uYW55U3RyaW5nKCkpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmFuZCgpLCBudWxsKSkuaXNFbXB0eSgpOworCisJCWFzc2VydFRoYXQoc2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmFuZCgpLCAiIikpLmlzRW1wdHkoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL09EU1NlYXJjaFNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzMjBhZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci9zZWFyY2gvT0RTU2VhcmNoU2VydmljZVRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE5IENvbnRyaWJ1dG9ycyB0byB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uCisgKgorICogU2VlIHRoZSBOT1RJQ0UgZmlsZShzKSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbAorICogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLm1vY2s7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5hZGFwdGVyLkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5WYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLnF1ZXJ5LkZpbHRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIE9EU1NlYXJjaFNlcnZpY2VUZXN0IHsKKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldE1lcmdlZEZpbHRlcigpIHsKKwkJRW50aXR5VHlwZSB0ZXN0RW50aXR5ID0gbW9ja0VudGl0eVR5cGUoKTsKKwkJT0RTU2VhcmNoU2VydmljZSBzZWFyY2hTZXJ2aWNlID0gbW9ja09EU1NlYXJjaFNlcnZpY2UodGVzdEVudGl0eSk7CisKKwkJLy8gTm8gZnJlZXRleHQgcXVlcnkgLT4gb3JpZ2luYWwgZmlsdGVyIGlzIHJldHVybmVkCisJCWFzc2VydFRoYXQoc2VhcmNoU2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmlkT25seSh0ZXN0RW50aXR5LCAiMSIpLCAiIikpCisJCQkJLmlzRXF1YWxUbyhGaWx0ZXIuYW5kKCkuaWQodGVzdEVudGl0eSwgIjEiKSk7CisKKwkJLy8gRnJlZXRleHQgcXVlcnkgd2l0aCByZXN1bHQgLT4gY29uanVjdGlvbiBvZiBvbGQgZmlsdGVyIGFuZCBmaWx0ZXIgZ2VuZXJhdGVkCisJCS8vIGJ5IGZyZWV0ZXh0IHJlc3VsdAorCQlhc3NlcnRUaGF0KHNlYXJjaFNlcnZpY2UuZ2V0TWVyZ2VkRmlsdGVyKEZpbHRlci5pZE9ubHkodGVzdEVudGl0eSwgIjEiKSwgImV4aXN0aW5nIikpCisJCQkJLmlzRXF1YWxUbyhGaWx0ZXIuYW5kKCkuaWQodGVzdEVudGl0eSwgIjEiKS5tZXJnZShGaWx0ZXIub3IoKS5pZCh0ZXN0RW50aXR5LCAiNSIpKSk7CisKKwkJLy8gRnJlZXRleHQgcXVlcnkgd2l0aCBubyByZXN1bHQgLT4gZW1wdHkgZmlsdGVyIGlzIHJldHVybmVkCisJCWFzc2VydFRoYXQoc2VhcmNoU2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLmlkT25seSh0ZXN0RW50aXR5LCAiMSIpLCAibm90IGV4aXN0aW5nIikpCisJCQkJLmlzRXF1YWxUbyhGaWx0ZXIub3IoKSk7CisKKwkJLy8gTm8gZmlsdGVyIC0+IGZpbHRlciBnZW5lcmF0ZWQgYnkgZnJlZXRleHQgcmVzdWx0IGlzIHJldHVybmVkCisJCWFzc2VydFRoYXQoc2VhcmNoU2VydmljZS5nZXRNZXJnZWRGaWx0ZXIoRmlsdGVyLm9yKCksICJleGlzdGluZyIpKS5pc0VxdWFsVG8oRmlsdGVyLm9yKCkuaWQodGVzdEVudGl0eSwgIjUiKSk7CisJfQorCisJcHJpdmF0ZSBPRFNTZWFyY2hTZXJ2aWNlIG1vY2tPRFNTZWFyY2hTZXJ2aWNlKEVudGl0eVR5cGUgdGVzdEVudGl0eSkgeworCQlPRFNTZWFyY2hTZXJ2aWNlIHNlYXJjaFNlcnZpY2UgPSBtb2NrKE9EU1NlYXJjaFNlcnZpY2UuY2xhc3MpOworCQl3aGVuKHNlYXJjaFNlcnZpY2UuZ2V0TWVyZ2VkRmlsdGVyKGFueSgpLCBhbnkoKSkpLnRoZW5DYWxsUmVhbE1ldGhvZCgpOworCisJCUZpbHRlciBmID0gRmlsdGVyLm9yKCkuaWQodGVzdEVudGl0eSwgIjUiKTsKKwkJd2hlbihzZWFyY2hTZXJ2aWNlLmdldEZpbHRlckZvckZyZWV0ZXh0UXVlcnkoImV4aXN0aW5nIikpLnRoZW5SZXR1cm4oZik7CisJCXdoZW4oc2VhcmNoU2VydmljZS5nZXRGaWx0ZXJGb3JGcmVldGV4dFF1ZXJ5KCJub3QgZXhpc3RpbmciKSkudGhlblJldHVybihudWxsKTsKKwkJd2hlbihzZWFyY2hTZXJ2aWNlLmdldEZpbHRlckZvckZyZWV0ZXh0UXVlcnkoIiIpKS50aGVuUmV0dXJuKEZpbHRlci5vcigpKTsKKwkJcmV0dXJuIHNlYXJjaFNlcnZpY2U7CisJfQorCisJcHJpdmF0ZSBFbnRpdHlUeXBlIG1vY2tFbnRpdHlUeXBlKCkgeworCQlBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBtb2NrKEF0dHJpYnV0ZS5jbGFzcyk7CisJCXdoZW4oaWRBdHRyaWJ1dGUuZ2V0TmFtZSgpKS50aGVuUmV0dXJuKCJJZCIpOworCQl3aGVuKGlkQXR0cmlidXRlLmNyZWF0ZVZhbHVlKCIiLCAiMSIpKS50aGVuUmV0dXJuKFZhbHVlVHlwZS5TVFJJTkcuY3JlYXRlKCJJZCIsICIxIikpOworCisJCUVudGl0eVR5cGUgdGVzdEVudGl0eSA9IG1vY2soRW50aXR5VHlwZS5jbGFzcyk7CisJCXdoZW4odGVzdEVudGl0eS5nZXROYW1lKCkpLnRoZW5SZXR1cm4oIlRlc3RFbnRpdHkiKTsKKwkJd2hlbih0ZXN0RW50aXR5LmdldElEQXR0cmlidXRlKCkpLnRoZW5SZXR1cm4oaWRBdHRyaWJ1dGUpOworCQl3aGVuKGlkQXR0cmlidXRlLmdldEVudGl0eVR5cGUoKSkudGhlblJldHVybih0ZXN0RW50aXR5KTsKKwkJcmV0dXJuIHRlc3RFbnRpdHk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9SZWxhdGlvblNlYXJjaFF1ZXJ5LmphdmEgYi9vcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZWNsaXBzZS9tZG0vYXBpL29kc2FkYXB0ZXIvc2VhcmNoL1JlbGF0aW9uU2VhcmNoUXVlcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDA1MGQyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3NlYXJjaC9SZWxhdGlvblNlYXJjaFF1ZXJ5LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOSBDb250cmlidXRvcnMgdG8gdGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICoKKyAqIFNlZSB0aGUgTk9USUNFIGZpbGUocykgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwKKyAqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitwYWNrYWdlIG9yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci5zZWFyY2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UuYWRhcHRlci5FbnRpdHlUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5DaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLk1lYXN1cmVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5tb2RlbC5QYXJhbWV0ZXJTZXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5iYXNlLm1vZGVsLlRlc3RTdGVwOworaW1wb3J0IG9yZy5lY2xpcHNlLm1kbS5hcGkuYmFzZS5xdWVyeS5RdWVyeVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlBvb2w7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5kZmx0Lm1vZGVsLlByb2plY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU01vZGVsTWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIuc2VhcmNoLkpvaW5UcmVlLkpvaW5Db25maWc7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgaGVscGVyIHRvIHRoZSB0ZXN0cyBpbgorICogb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLlJlbGF0aW9uVGVzdCBJdCBuZWVkcyB0byBiZSBoZXJlLCBiZWNhdXNlCisgKiBCYXNlRW50aXR5U2VhcmNoUXVlcnkgaXMgZGVjbGFyZWQgYXMgcHJvdGVjdGVkIGluIHRoZQorICogb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnNlYXJjaCBwYWNrYWdlLiBJdCBtYWtlcyBzb21lIHNlbnNlIHRvIGxlYXZlCisgKiBpdCBwcm90ZWN0ZWQgaW4gdGhhdCB3YXksIGJlY2F1c2UgaW1wbGVtZW50aW5nIGEgQmFzZUVudGl0eVNlYXJjaFF1ZXJ5CisgKiByZXF1aXJlcyB1bmRlcnN0YW5kaW5nIG9mIHRoZSB1bmRlcmx5aW5nIGRhdGEgbW9kZWwgd2hpY2ggVGhlIFJlbGF0aW9uVGVzdAorICogcmVxdWlyZXMgdGhhdCB0aGUgcmVsYXRlZCBwYXJhbWV0ZXJzZXRzIHRvIGEgbWVhc3VyZW1lbnQgYXJlIGxvYWRlZC4gVGhpcworICogY2xhc3MgcHJvdmlkZXMgYSBKb2luQ29uZmlnIHdoaWNoIGFsbG93cyB0aGlzIHRvIGhhcHBlbiBieSBkZWZpbmluZyB0aGUgd2F5CisgKiB0aGUgZW50aXRpZXMgaW4gcXVlc3Rpb24gaGF2ZSB0byBiZSBqb2luZWQuIElmIHdlIHdvdWxkbid0IGpvaW4gdGhlCisgKiBQYXJhbWV0ZXJTZXQgaW4sIHRoZSByZWxhdGVkIGVudGl0aWVzIHdvdWxkIG5vdCBiZSBsb2FkZWQsIGFuZCBpdCB3b3VsZCBiZQorICogaW1wb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbGF0ZWQgUGFyYW1ldGVyU2V0cyBvciBub3QuCisgKgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVsYXRpb25TZWFyY2hRdWVyeSBleHRlbmRzIEJhc2VFbnRpdHlTZWFyY2hRdWVyeSB7CisKKwkvKioKKwkgKiBDb25zdHJ1Y3Rvci4KKwkgKgorCSAqIEBwYXJhbSBtb2RlbE1hbmFnZXIgVXNlZCB0byBsb2FkIHtAbGluayBFbnRpdHlUeXBlfXMuCisJICogQHBhcmFtIGNvbnRleHRTdGF0ZSBUaGUge0BsaW5rIENvbnRleHRTdGF0ZX0uCisJICovCisJcHVibGljIFJlbGF0aW9uU2VhcmNoUXVlcnkoT0RTTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciwgUXVlcnlTZXJ2aWNlIHF1ZXJ5U2VydmljZSkgeworCQlzdXBlcihtb2RlbE1hbmFnZXIsIHF1ZXJ5U2VydmljZSwgUGFyYW1ldGVyU2V0LmNsYXNzLCBQcm9qZWN0LmNsYXNzKTsKKworCQkvLyBsYXllcnMKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBvb2wuY2xhc3MsIFByb2plY3QuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3QuY2xhc3MsIFBvb2wuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFRlc3RTdGVwLmNsYXNzLCBUZXN0LmNsYXNzKSk7CisJCWFkZEpvaW5Db25maWcoSm9pbkNvbmZpZy51cChNZWFzdXJlbWVudC5jbGFzcywgVGVzdFN0ZXAuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLnVwKFBhcmFtZXRlclNldC5jbGFzcywgTWVhc3VyZW1lbnQuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWwuY2xhc3MpKTsKKwkJYWRkSm9pbkNvbmZpZyhKb2luQ29uZmlnLmRvd24oTWVhc3VyZW1lbnQuY2xhc3MsIENoYW5uZWxHcm91cC5jbGFzcykpOworCisJfQorCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyL3NyYy90ZXN0L2phdmEvb3JnL2VjbGlwc2UvbWRtL2FwaS9vZHNhZGFwdGVyL3V0aWxzL09EU0NvbnZlcnRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNDb252ZXJ0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliZDk5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm1kbS5hcGkub2RzYWRhcHRlci9zcmMvdGVzdC9qYXZhL29yZy9lY2xpcHNlL21kbS9hcGkvb2RzYWRhcHRlci91dGlscy9PRFNDb252ZXJ0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTkgQ29udHJpYnV0b3JzIHRvIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24KKyAqCisgKiBTZWUgdGhlIE5PVElDRSBmaWxlKHMpIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsCisgKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworcGFja2FnZSBvcmcuZWNsaXBzZS5tZG0uYXBpLm9kc2FkYXB0ZXIudXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5lcTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnZlcmlmeTsKKworaW1wb3J0IGphdmEudGltZS5Mb2NhbERhdGVUaW1lOworCitpbXBvcnQgb3JnLmFzYW0ub2RzLlRTX1VuaW9uU2VxOworaW1wb3J0IG9yZy5hc2FtLm9kcy5UU19WYWx1ZVNlcTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5tZG0uYXBpLmJhc2UucXVlcnkuQWdncmVnYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UubWRtLmFwaS5vZHNhZGFwdGVyLnF1ZXJ5Lk9EU0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIE9EU0NvbnZlcnRlclRlc3QgeworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZVllYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTQXR0cmlidXRlIGF0dHIgPSBtb2NrKE9EU0F0dHJpYnV0ZS5jbGFzcyk7CisKKwkJT0RTQ29udmVydGVyLmZyb21PRFNWYWx1ZVNlcShhdHRyLCBBZ2dyZWdhdGlvbi5OT05FLCAiIiwgZ2V0VFNfVmFsdWVTZXFGcm9tRGF0ZXMoIjIwMTciKSk7CisKKwkJdmVyaWZ5KGF0dHIpLmNyZWF0ZVZhbHVlKGVxKCIiKSwgZXEodHJ1ZSksIGVxKExvY2FsRGF0ZVRpbWUub2YoMjAxNywgMSwgMSwgMCwgMCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGcm9tT0RTVmFsdWVTZXFPRFNEYXRlTW9udGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTQXR0cmlidXRlIGF0dHIgPSBtb2NrKE9EU0F0dHJpYnV0ZS5jbGFzcyk7CisKKwkJT0RTQ29udmVydGVyLmZyb21PRFNWYWx1ZVNlcShhdHRyLCBBZ2dyZWdhdGlvbi5OT05FLCAiIiwgZ2V0VFNfVmFsdWVTZXFGcm9tRGF0ZXMoIjIwMTcxMCIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgMSwgMCwgMCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGcm9tT0RTVmFsdWVTZXFPRFNEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9EU0F0dHJpYnV0ZSBhdHRyID0gbW9jayhPRFNBdHRyaWJ1dGUuY2xhc3MpOworCisJCU9EU0NvbnZlcnRlci5mcm9tT0RTVmFsdWVTZXEoYXR0ciwgQWdncmVnYXRpb24uTk9ORSwgIiIsIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKCIyMDE3MTAwNCIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgNCwgMCwgMCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RGcm9tT0RTVmFsdWVTZXFPRFNEYXRlSG91cigpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNBdHRyaWJ1dGUgYXR0ciA9IG1vY2soT0RTQXR0cmlidXRlLmNsYXNzKTsKKworCQlPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHIsIEFnZ3JlZ2F0aW9uLk5PTkUsICIiLCBnZXRUU19WYWx1ZVNlcUZyb21EYXRlcygiMjAxNzEwMDQxMiIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgNCwgMTIsIDApKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZU1pbnV0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNBdHRyaWJ1dGUgYXR0ciA9IG1vY2soT0RTQXR0cmlidXRlLmNsYXNzKTsKKworCQlPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHIsIEFnZ3JlZ2F0aW9uLk5PTkUsICIiLCBnZXRUU19WYWx1ZVNlcUZyb21EYXRlcygiMjAxNzEwMDQxMjEzIikpOworCisJCXZlcmlmeShhdHRyKS5jcmVhdGVWYWx1ZShlcSgiIiksIGVxKHRydWUpLCBlcShMb2NhbERhdGVUaW1lLm9mKDIwMTcsIDEwLCA0LCAxMiwgMTMpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZVNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworCQlPRFNBdHRyaWJ1dGUgYXR0ciA9IG1vY2soT0RTQXR0cmlidXRlLmNsYXNzKTsKKworCQlPRFNDb252ZXJ0ZXIuZnJvbU9EU1ZhbHVlU2VxKGF0dHIsIEFnZ3JlZ2F0aW9uLk5PTkUsICIiLCBnZXRUU19WYWx1ZVNlcUZyb21EYXRlcygiMjAxNzEwMDQxMjEzMTQiKSk7CisKKwkJdmVyaWZ5KGF0dHIpLmNyZWF0ZVZhbHVlKGVxKCIiKSwgZXEodHJ1ZSksIGVxKExvY2FsRGF0ZVRpbWUub2YoMjAxNywgMTAsIDQsIDEyLCAxMywgMTQsIDApKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxT0RTRGF0ZU1pbGxpc2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9EU0F0dHJpYnV0ZSBhdHRyID0gbW9jayhPRFNBdHRyaWJ1dGUuY2xhc3MpOworCisJCU9EU0NvbnZlcnRlci5mcm9tT0RTVmFsdWVTZXEoYXR0ciwgQWdncmVnYXRpb24uTk9ORSwgIiIsIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKCIyMDE3MTAwNDEyMTMxNDEyMyIpKTsKKworCQl2ZXJpZnkoYXR0cikuY3JlYXRlVmFsdWUoZXEoIiIpLCBlcSh0cnVlKSwgZXEoTG9jYWxEYXRlVGltZS5vZigyMDE3LCAxMCwgNCwgMTIsIDEzLCAxNCwgMTIzXzAwMF8wMDApKSk7CisJfQorCisJQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisJcHVibGljIHZvaWQgdGVzdEZyb21PRFNWYWx1ZVNlcUludmFsaWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT0RTQXR0cmlidXRlIGF0dHIgPSBtb2NrKE9EU0F0dHJpYnV0ZS5jbGFzcyk7CisKKwkJT0RTQ29udmVydGVyLmZyb21PRFNWYWx1ZVNlcShhdHRyLCBBZ2dyZWdhdGlvbi5OT05FLCAiIiwgZ2V0VFNfVmFsdWVTZXFGcm9tRGF0ZXMoIjIwMTcxMDA0MSIpKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKwlwdWJsaWMgdm9pZCB0ZXN0RnJvbU9EU1ZhbHVlU2VxSW52YWxpZE1vbnRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCU9EU0F0dHJpYnV0ZSBhdHRyID0gbW9jayhPRFNBdHRyaWJ1dGUuY2xhc3MpOworCisJCU9EU0NvbnZlcnRlci5mcm9tT0RTVmFsdWVTZXEoYXR0ciwgQWdncmVnYXRpb24uTk9ORSwgIiIsIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKCIyMDE3MTMwNCIpKTsKKwl9CisKKwlwcml2YXRlIFRTX1ZhbHVlU2VxIGdldFRTX1ZhbHVlU2VxRnJvbURhdGVzKFN0cmluZy4uLiBkYXRlcykgeworCQlUU19VbmlvblNlcSB1ID0gbmV3IFRTX1VuaW9uU2VxKCk7CisJCXUuZGF0ZVZhbChkYXRlcyk7CisJCXJldHVybiBuZXcgVFNfVmFsdWVTZXEodSwgbmV3IHNob3J0W10geyAxNSB9KTsKKwl9Cit9Cg==